Der Hintergrundfilter funktioniert nicht für verschachtelte Elemente in Chrome

Lesezeit: 6 Minuten

Benutzeravatar von Tonald Drump
Tonald Drump

Ich habe ein div.outer und in einem div.innerbeide mit position: absolute; Und backdrop-filter: blur(8px);.

https://jsbin.com/nihakiqocu/1/edit?html,css,output

Safari (links) liefert das gewünschte Ergebnis – beide Divs verwischen, was sich hinter ihnen befindet.

Chrome (rechts) wendet jedoch nur die Unschärfe von an div.outer:

SafariChrom

Ich habe eine Lösung: ein weiteres Div hinzufügen div.outer und bewegend backdrop-filter: blur(8px); zu dieser neuen Abteilung.

Ich würde mich jedoch über eine Lösung freuen, die keine Änderung des DOM vom ersten jsbin erfordert. Weiß jemand außerdem, was dies verursacht? Handelt es sich um einen Chrome-Fehler?

https://jsbin.com/rasudijame/1/edit?html,css,output

PS: Es funktioniert auf iOS Chrome, aber nicht auf Android Chrome und auch nicht auf Mac OS Chrome

  • backdrop-filter hat schlechte Unterstützung: kann ich benutzen.

    – Dämonenbestie

    2. April 2020 um 18:18 Uhr

  • Haben Sie versucht, das zu verwenden? -webkit- Präfix?

    – Dämonenbestie

    2. April 2020 um 18:19 Uhr

  • Außerdem funktioniert es einwandfrei auf iOS Safari, Chrome und Firefox.

    – Dämonenbestie

    2. April 2020 um 18:21 Uhr

  • Ich verwende sowohl -webkit- als auch die normale Version. Seltsamerweise funktioniert es auf iOS Chrome, aber nicht auf Android Chrome und auch nicht auf Mac OS Chrome (alle aktuellen Versionen, die laut caniuse den Hintergrundfilter unterstützen sollten)

    – Tonald Drump

    2. April 2020 um 18:40 Uhr


  • Es handelt sich um einen verfolgten Fehler in Chrome, siehe: bugs.chromium.org/p/chromium/issues/detail?id=993971

    – Maometto

    9. Juni 2020 um 16:18

Platzieren Sie den Hintergrundfilter auf dem CSS-Pseudoelement. Dies ermöglicht verschachtelte Hintergrundfilter. Sie können es auch verwenden z-index: -1; um Ihren Hintergrund hinter Ihren Elementen zu positionieren

div {
  height: 100px;
  width: 100px;
}
.wrapper {
  position: absolute;
}
.outer, .inner {
  position: relative;
}
.outer::before {
  content: '';
  position: absolute;
  width: 100%;
  height: 100%;
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
}
.outer {
  background: rgba(255, 0, 0, .5);
}
.inner::before {
  content: '';
  position: absolute;
  width: 100%;
  height: 100%;
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  
}
.inner {
  background: rgba(0, 0, 255, .5);
  top: 50px;
  left: 50px;
}
main {
  position: relative;
}
<main>
  <div class="wrapper">
    <div class="outer">
      <div class="inner"></div>
    </div>
  </div>

  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus in id quos, est voluptatibus minus porro sunt totam quod commodi odit maxime similique, dolorum aut quo atque. Deleniti, voluptas animi.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus in id quos, est voluptatibus minus porro sunt totam quod commodi odit maxime similique, dolorum aut quo atque. Deleniti, voluptas animi.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus in id quos, est voluptatibus minus porro sunt totam quod commodi odit maxime similique, dolorum aut quo atque. Deleniti, voluptas animi.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus in id quos, est voluptatibus minus porro sunt totam quod commodi odit maxime similique, dolorum aut quo atque. Deleniti, voluptas animi.</p>
  <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus in id quos, est voluptatibus minus porro sunt totam quod commodi odit maxime similique, dolorum aut quo atque. Deleniti, voluptas animi.</p>
</main>

Und hier ist Codepen

  • Wenn dies bei niemandem funktioniert, habe ich festgestellt, dass die Lösung für mich darin besteht, den Z-Index eines Elements weiter unten im Stapel zu reduzieren (oder zu entfernen). Keine Ahnung warum, aber eine Glasschicht (z 1000) funktionierte nicht mit einem früheren Geschwister (z 100), aber durch die Reduzierung des Geschwisters auf z 10 wurde das Problem behoben.

    – Mike Stop macht weiter

    19. April 2021 um 18:06 Uhr


  • @MikeStopContinues, kannst du das bitte erklären? Ich bin auf dieses Problem gestoßen!

    – Sibidharan

    15. September 2021 um 16:08 Uhr

  • @Sibidharan Es ist lange her, dass ich mich mit diesem Problem befasst habe, aber ich kann Folgendes sagen: Ich verwende jetzt zwei feste Header, einen für den Filtereffekt und einen für den Inhalt. Das scheint bei mir zu funktionieren. Etwas wie: <header><div class="glass"/><nav /></header>. Stellen Sie die Position der Kopfzeile auf „Fixed“ und die Position der untergeordneten Elemente auf „Absolut“ ein, und Sie sollten kein Problem damit haben, dass alles funktioniert.

    – Mike Stop macht weiter

    17. September 2021 um 7:32 Uhr

  • @MikeStopContinues Ich habe es behoben. Alles gut 🙂 Deine Antworten haben mir geholfen. Danke schön.

    – Sibidharan

    17. September 2021 um 7:41 Uhr


  • Ich hatte dieses Problem und es hat sehr lange gedauert, es zu beheben. In meinem Fall gab es zwei Schuldige: opacity Und drop-shadow. Durch das Festlegen der Deckkraft wird der Unschärfeeffekt unterbrochen, daher sollten Sie ihn (genau wie in dieser Antwort) verwenden rgba(r, g, b, *opacity here*). Das zweite ist drop-shadow. Wenn das Element, das ich verwischen wollte, auch vorhanden war drop-shadow Es fügt Schatten hinzu, aber die Unschärfe verschwindet. Ich hoffe das hilft.

    – alpersunter

    3. Januar 2022 um 21:10 Uhr


KawaLos Benutzeravatar
KawaLo

Diese Antwort vervollständigt die von @Michał (die bei mir funktioniert hat). Kurze Antwort: Chrome verhindert freiwillig das Stapeln verschachtelter Hintergrundfilter.

Warum sich Chrome so verhält

A sehr ähnliches Problem wurde im Chromium Bugs Tracker gemeldet. Zitieren einer Antwort auf diesen Fehlerbericht:

Der Hintergrundfilter filtert alles dahinter, bis hin zur „Hintergrundwurzel“, die aus mehreren Triggern besteht. Einer dieser Auslöser ist ein weiteres Hintergrundfilterelement.

Also im Grunde, wenn Sie hinzufügen backdrop-filter Für ein Element wird es zum neuen Hintergrundstamm: Verschachtelte Hintergrundfilter werden NICHT auf seine Vorfahren angewendet, da sie nicht über den Stamm „sehen“ können.

<elem1>
  <!-- Here, backdrop filter will apply to elem1, -->
  <!-- as it is an ancestor of elem2 -->
  <elem2 style="backdrop-filter: ...">
    <!-- Here, backdrop filter will apply to elem2, -->
    <!-- but not elem1, as elem2 is now the new Backdrop root -->
    <elem3 style="backdrop-filter: ...">
    </elem3>
  </elem2>
</elem1>

Chrome folgt tatsächlich einer W3C-Empfehlung (so scheint es zumindest). Wenn Sie die Motivation haben, können Sie den vollständigen Grund für dieses Verhalten unter lesen dieser W3C-Entwurf.

Warum die akzeptierte Antwort funktioniert

Der :before ist ein Pseudoelement, das heißt, es hat kein untergeordnetes Element. Selbst wenn es zum Hintergrundstamm wird, blockiert es daher nicht die Anwendung verschachtelter Filter auf seine Vorgänger.

Warum es in anderen Browsern funktioniert

Ab Mai 2023 konnte ich dieses Verhalten auf Chrome, Safari und Firefox testen. Nur Chrome scheint diesem W3C-Entwurf zu folgen, da Elemente in Safari und Firefox korrekt unscharf gemacht wurden. Den Antworten auf den Fehlerbericht zufolge weichen Safari und Firefox jedoch von den Spezifikationen ab.

Zusammenfassung

Wenn Sie möchten, dass ein Element mit einem Hintergrundfilter verschachtelte Hintergründe zulässt (z. B. eine transparente Navigationsleiste mit einem Dropdown-Menü, die beide einen Unschärfe-/Transparenzeffekt haben), sollten Sie den Filter auf ein Pseudoelement anwenden, wie @Michał vorgeschlagen hat :

/* replace */
.parent {
  backdrop-filter: /*...*/;
}

/* with */
.parent::before {
    content: '';
    position: absolute;
    width: 100%;
    height: 100%;
    top: 0;
    left: 0;
    backdrop-filter: /*...*/;
    z-index: -1;
}

Hinweis: Dies ist nur erforderlich, wenn der übergeordnete Container verschachtelte Elemente mit einem Hintergrundfiltersatz enthält, nicht jedoch bei „Blätter“-Elementen.

1452870cookie-checkDer Hintergrundfilter funktioniert nicht für verschachtelte Elemente in Chrome

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy