mehrere CSS-Filter gleichzeitig verwenden?

76

Ich experimentiere mit CSS-Filtern.

Und ich möchte die Unschärfe und die Graustufen gleichzeitig verwenden, aber ich kann nicht beide gleichzeitig auf demselben Bild verwenden?

Siehe Geige hier ...

http://jsfiddle.net/joshmoto/fw0m9fzu/1/

.blur {
    filter: blur(5px);
    -webkit-filter: blur(5px);
    -moz-filter: blur(5px);
    -o-filter: blur(5px);
    -ms-filter: blur(5px);
}

.grayscale {
    filter: grayscale(1);
    -webkit-filter: grayscale(1);
    -moz-filter: grayscale(1);
    -o-filter: grayscale(1);
    -ms-filter: grayscale(1);
}


.blur-grayscale {
    filter: blur(5px) grayscale(1);
    -webkit-filter: blur(5px) grayscale(1);
    -moz-filter: blur(5px) grayscale(1);
    -o-filter: blur(5px) grayscale(1);
    -ms-filter: blur(5px) grayscale(1);
}
Joshmoto
quelle
Doh, habe es gerade getestet und beide arbeiten jetzt. Siehe aktualisierte Geige. Danke
Joshmoto
Sie sollten dies in Ihre eigene Antwort schreiben und diese Antwort akzeptieren, anstatt Ihre Frage zu bearbeiten.
René

Antworten:

121

Da es sich um eine Eigenschaft mit dem Namen handelt filter, überschreiben Sie sie jedes Mal, wenn Sie einen Stil hinzufügen möchten.

CSS Version 1

Glücklicherweise können Sie in einigen Eigenschaften wie Hintergrundbild und Filter mehrere Stile hinzufügen! Damit dies funktioniert, müssen Sie alle Filterstile in einer durch Leerzeichen getrennten Filtereigenschaft platzieren.

.grayscale.blur {
    filter: blur(5px) grayscale(1);
}

CSS Version 2

Eine alternative, flexible Lösung wäre, absichtlich eine "Div-Suppe" zu erstellen und verschiedene Filter im HTML-Stapel festzulegen. z.B

<div class='demo__blurwrap' style='filter: blur(5px);'>
    <div class="demo__graywrap" style='filter: grayscale(1);'>
        <img src="awesome_image.jpeg" alt="">
    </div>
</div>

CSS Version 3

edit : habe gerade gemerkt, dass ich diese Version gerade mit Transformationen geschrieben habe, aber die gleiche Idee gilt.

Eine weitere Lösung ist CSS vars. Ich würde nicht sagen, dass es ideal ist, aber es ist ein schönes Experiment. Der Hauptnachteil ist, dass Sie viele Variablen deklarieren müssen, standardmäßige lange Regeln für haben transformund verschachtelte Transformationen definitiv brechen.

Javascript

Wenn Sie JavaScript zum Rendern der Stile verwenden, können Sie die aktuell angewendeten Filter mit getComputedStyle lesen und der Mischung weitere hinzufügen.

Und ein relevanter Artikel - dies ist eher für Animationen gedacht und wird von vielen Browsern noch nicht unterstützt: Additive Animationen

Und noch ein relevanter Artikel über CSS-Tricks: Houdini

René
quelle
1
Ich denke, ich habe es gelöst, danke. Ihre Top-Antwort macht den Trick
Joshmoto
Ja, ich mag Ihren Vorschlag "Vielleicht in der Zukunft", der ideal wäre.
MSC
Und das gleiche für Transformationen wäre auch toll :)
Yunzen
Basiert dieser Abschnitt "vielleicht in der Zukunft" auf irgendetwas? Kommt es von irgendeiner vorgeschlagenen Ergänzung der Spezifikation? Irgendeine proprietäre Implementierung? Oder ist es nur ein Teil des nicht relevanten Nachdenkens?
Jimbo Jonny
@ JimboJonny Es ist lange her, dass ich diese Antwort geschrieben habe. Wenn ich mich richtig erinnere, habe ich sie als Vorschlag in einer CSSWG-Mailingliste gesehen. Aber es ist wahrscheinlich am nächsten an "nicht relevanten Überlegungen"
René
2

Ich versuche, Dienstprogrammklassen in Vanilla CSS zu erstellen, und dies wäre hilfreich, aber es sieht so aus, als ob dies nicht auf diese Weise möglich ist.

<img class="brightness-20 image-grayscale-100">
.brightness-20 {
    filter:brightness(20%);
}
.image-grayscale-100 {
    filter: grayscale(100%);
}

Ich bin mir nicht sicher, warum sie nicht einfach eine spezifischere Eigenschaft erstellt haben wie:

filter-brightness: 20%; filter-grayscale: 100%

Nach einigen weiteren Arbeiten kam ich auf diese Lösung:

/*Initalize Variables No Adjustments*/
:root {
    --blur:0px;
    --contrast:100%;
    --brightness:100%;
    --contrast:100%;
    --dropshadow:0px 0px 0px black;
    --grayscale:0%;
    --hue-rotate:0deg;
    --invert:0%;
    --opacity:100%;
    --saturate:100%;
    --sepia:0%;
}
/*Apply Defult Variables To Image*/
.filter {
    filter: blur(var(--blur)) contrast(var(--contrast)) brightness(var(--brightness)) contrast(var(--contrast)) drop-shadow(var(--dropshadow)) grayscale(var(--grayscale)) hue-rotate(var(--hue-rotate)) invert(var(--invert)) opacity(var(--opacity)) saturate(var(--saturate)) sepia(var(--sepia)); 
}
/*Override Defults*/
.brightness-20 {
    --brightness:20%;
}
.image-grayscale-100 {
    --grayscale: 100%;
}
Billy Mitchell
quelle