2012-06-07 21 views
128

Ich habe folgendes Sass mixin, die eine Hälfte komplette Änderung eines ist RGBa Beispiel:Sass - Konvertieren von Hex zu RGBa für Hintergrundopazität

@mixin background-opacity($color, $opacity: .3) { 
    background: rgb(200, 54, 54); /* The Fallback */ 
    background: rgba(200, 54, 54, $opacity); 
} 

I $opacity ok angewendet haben, aber jetzt bin ich ein stecken mit dem $color Teil. Die Farben, die ich in das Mixin senden werde, sind HEX nicht RGB.

werden Mein Beispiel nützlich sein:

element { 
    @include background-opacity(#333, .5); 
} 

Wie kann ich HEX-Werte innerhalb dieser mixin verwenden?

Antwort

277

Die rgba() function kann auch Dezimal-RGB-Werte eine einzelne hex Farbe annehmen. Zum Beispiel funktionieren würde dies ganz gut:

@mixin background-opacity($color, $opacity: 0.3) { 
    background: $color; /* The Fallback */ 
    background: rgba($color, $opacity); 
} 

element { 
    @include background-opacity(#333, 0.5); 
} 

Wenn Sie jemals die Hex-Farbe in RGB-Komponenten brechen müssen, obwohl, können Sie die red(), green() und blue() Funktionen verwenden zu tun, so:

$red: red($color); 
$green: green($color); 
$blue: blue($color); 

background: rgb($red, $green, $blue); /* same as using "background: $color" */ 
+0

Ich schwöre, ich versuchte dies und die r, b, g Funktionen und es hat nicht funktioniert. Ich habe dynamische Farben von einem Drupal-Back-End verwendet, die jedoch etwas kaputt gemacht haben könnten. Dennoch, sortierte es am Ende und die Antwort fand ich nach weiterer Forschung +1 –

+1

ABER, was ist das Hexäquivalent von # ($ Farbe + $ Deckkraft)? - Das könnte nützlich sein. machbar? – somedirection

+2

Nach meinem besten Wissen fügt RGBA * Opazität * hinzu, was bedeutet, dass Sie Elemente dahinter sehen können. Mit dem Standard 'hex' können Sie dies nicht tun. –

6

können Sie diese Lösung versuchen, die besten ... url (github)

// Transparent Background 
// From: http://stackoverflow.com/questions/6902944/sass-mixin-for-background-transparency-back-to-ie8 

// Extend this class to save bytes 
.transparent-background { 
    background-color: transparent; 
    zoom: 1; 
} 

// The mixin 
@mixin transparent($color, $alpha) { 
    $rgba: rgba($color, $alpha); 
    $ie-hex-str: ie-hex-str($rgba); 
    @extend .transparent-background; 
    background-color: $rgba; 
    filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#{$ie-hex-str},endColorstr=#{$ie-hex-str}); 
} 

// Loop through opacities from 90 to 10 on an alpha scale 
@mixin transparent-shades($name, $color) { 
    @each $alpha in 90, 80, 70, 60, 50, 40, 30, 20, 10 { 
    .#{$name}-#{$alpha} { 
     @include transparent($color, $alpha/100); 
    } 
    } 
} 

// Generate semi-transparent backgrounds for the colors we want 
@include transparent-shades('dark', #000000); 
@include transparent-shades('light', #ffffff); 
+5

Ihre Antwort ist gut, aber unnötig kompliziert zu sein scheint. Ich nehme an, dass die transparenten Farben für meine Frage nicht relevant sind, obwohl Sie erklären können, worum es bei der transparenten Hintergrundklasse geht. Ich nehme an, ich brauche es nicht, wenn ich die Transparent-Farbmischung nicht verwende? –

+0

@RickDonohoe, soweit ich mich erinnere, Z-Index: 1, und transparenter Hintergrund ist ein Fallback für IE <9. Ich denke, dass m.Eloutafi das in separate Klasse putted, für weitere Verwendung in anderen Bedürfnissen. Watch Zeile in Antwort, wo es beginnt mit "From:" ... –

73

Es gibt eine eingebaute mixin: transparentize($color, $amount);

background-color: transparentize(#F05353, .3); 

Die Menge zwischen 0 bis 1 sein sollte;

Official Sass Documentation (Module: Sass::Script::Functions)

+1

Ich mag das! Ideal für moderne Browser-Implementierung. –

+11

als eine Randnotiz: der $ Betrag ist, wie viel es subtrahieren wird, nicht der Wert, den Sie setzen möchten – MMachinegun

+3

Arbeitete großartig, außer die Menge scheint die inverse Bedeutung zu sein, die Sie '90%' transparent machen wollen, um das Ergebnis zu erhalten .1' –

7

SASS hat einen eingebauten in rgba() function Werte zu bewerten.

rgba($color, $alpha) 

z.

rgba(#00aaff, 0.5) => rgba(0, 170, 255, 0.5) 

Ein Beispiel Ihre eigenen Variablen:

$my-color: #00aaff; 
$my-opacity: 0.5; 

.my-element { 
    background-color: rgba($my-color, $my-opacity); 
} 

Ausgänge:

.my-element { 
    background-color: rgba(0, 170, 255, 0.5); 
}