2017-11-21 2 views
0

Die aktuelle colorcontrast Funktion vergleicht nur mit drei Farben. Suche nach der besten Lösung, um mit mehreren Parametern wie @function colorcontrast($color, $rest...) { für color: colorcontrast(yellow, blue, orange, tomato, deekskyblue); zu bauen, aber nicht sicher, wie man mit allen aufgelisteten Farben vergleicht.Wie man Sass Farbvergleichsfunktion mit mehreren Parametern machen kann?

@function brightness($color) { 
    @return ((red($color) * .299) + (green($color) * .587) + (blue($color) * .114))/255 * 100%; 
} 
@function colorcontrast($color, $dark, $light) { 
    $color-brightness: brightness($color); 
    $light-text-brightness: brightness($light); 
    $dark-text-brightness: brightness($dark); 
    @return if(abs($color-brightness - $light-text-brightness) > abs($color-brightness - $dark-text-brightness), $light, $dark); 
} 

.my-div{ 
    padding: 1rem; 
    background-color: yellow; 
    color: colorcontrast(yellow, #000, #fff); 
} 
+0

Sie können variadic Argumente in Sass verwenden. Tun Sie einfach den Variablennamen und drei Punkte. Ex. '@function colorcontrast ($ color, $ args ...) {...}' – watzon

+0

Yah, aber leider bin ich völlig stecken zu vergleichen Vergleich mit mehreren Farben – Muhammed

Antwort

1

Alles, was Sie brauchen, ist die Berechnung der Kontraste für alle Farben der Liste in einer Schleife. Und wählen Sie eine Farbe mit dem besten Kontrast zur Grundfarbe.

@function brightness($color) { 
    @return ((red($color) * .299) + (green($color) * .587) + (blue($color) * .114))/255 * 100%; 
} 

@function color-contrast($base-color, $colors...) { 
    // $colors... - means variadic arguments as Chris W says 

    // Suppose that the best color is the first in the colors list 
    $best-color: nth($colors, 1); 
    $best-color-brightness: brightness($best-color); 

    $base-color-brightness: brightness($base-color); 

    @each $color in $colors { 
     $color-brightness: brightness($color); 

     // If the new color ($color) is more contrast than the previous one, 
     // remember it as the $best-color 
     @if(abs($base-color-brightness - $color-brightness) > abs($base-color-brightness - $best-color-brightness)) { 
     $best-color: $color; 
     $best-color-brightness: $color-brightness; 
     } 
    } 

    @return $best-color; 
} 

SassMeister demo.
Documentation für @each Direktive.

+0

Vielen Dank für Ihre Antwort. Könnten Sie mir bitte mitteilen, warum wir '$ base-color-brightness: Helligkeit ($ base-color)' zweimal benutzen? – Muhammed

+0

Können wir einige Ideen zu Ihrer Antwort von diesem Schnipsel https://www.sassmeister.com/gist/fbf10a893625e8bc32d81a324d09a0a5 implementieren? – Muhammed

+0

Muhammed Athimannil, '$ base-color-lightness' berechnet nur einmal in Zeile 12 (siehe sassmeister-Demo). – 3rdthemagical