Getönte Bilder mit mehreren Hintergründen

Avatar of Chris Coyier
Chris Coyier am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Die `background`-Eigenschaft in CSS kann durch Kommas getrennte Werte akzeptieren. „Mehrere“ Hintergründe, wenn Sie so wollen. Sie können sie auch als überlagerte Hintergründe betrachten, da sie eine Stapelreihenfolge haben. Wenn wir eine transparente Farbe über ein Bild legen, können wir dieses Bild „tönen“. Aber es ist nicht ganz so offensichtlich, wie man vielleicht vermutet.

Meine erste intuitive Vermutung, dies zu tun, wäre so:

/* Warning: this doesn't work */
.tinted-image {
  background: 
    /* top, transparent red */ 
    rgba(255, 0, 0, 0.25),
    /* bottom, image */
    url(image.jpg);
}

Leider ist das nicht gültig. Ich bin mir nicht ganz sicher warum. Vor einiger Zeit, als ich auf Twitter darüber jammerte, erhielt ich eine Vielzahl von Ideen/Gründen/Ausreden. Keine davon überzeugte mich wirklich. Es stimmt zwar, dass man `background-color` nicht durch Kommas trennen kann, aber ich glaube nicht, dass das hier relevant ist, da ich die `background`-Kurzform durch Kommas trenne und nicht speziell `background-color` (ganz zu schweigen davon, dass die Reihenfolge der Werte andersherum funktioniert).

Ich vermute, der eigentliche Grund, warum das so entschieden wurde, ist, dass es für Autoren zu einfach wäre, es zu vermasseln. `background: green, url(image.jpg);` würde in gewissem Sinne „fehlschlagen“, da es den Hintergrund einfach grün überfluten würde. Das Erzwingen der Farbe als letzte macht die Farbe eher zu einem „Fallback“ als zu einer Schicht wie jede andere.

Leider können wir auch die Farbe nicht einfach unten belassen und die Deckkraft des Bildes anpassen, um etwas von dieser Farbe durchscheinen zu lassen, da `background-opacity` keine Sache ist. (Obwohl Sie es so ähnlich fälschen können.)

Es gibt jedoch einen Weg!

Anstatt eine transparente Füllfarbe mit rgba() oder hsla() zu verwenden, können wir einen Farbverlauf verwenden. Farbverläufe sind technisch gesehen `background-image`s und unterliegen daher nicht der Regel, dass sie nicht an erster Stelle (ganz oben) in der Stapelreihenfolge stehen können.

/* Working method */
.tinted-image {
  background: 
    /* top, transparent red, faked with gradient */ 
    linear-gradient(
      rgba(255, 0, 0, 0.45), 
      rgba(255, 0, 0, 0.45)
    ),
    /* bottom, image */
    url(image.jpg);
}

Siehe den Stift Getöntes Bild mit mehreren Hintergründen von Chris Coyier (@chriscoyier) auf CodePen

Hey, was funktioniert, funktioniert, oder?