Backdrop-filter (Blur) hat auf .menu-panel keine Wirkung, obwohl die Hintergrundtransparenz funktioniert

Ich passe ein lang laufendes Custom-Theme an und wollte dem Burger-/Sidebar-Menü (.menu-panel) denselben halbtransparenten, unscharfen Look geben, der bei .d-header bereits gut funktioniert. Die Transparenz funktioniert, aber der Blur-Effekt nicht – und ich möchte dies als Feedback markieren, da einige Aspekte der Kern-Styles für diese Komponente die Umsetzung schwieriger gemacht haben, als erwartet.

Was ich erreichen möchte

Ein halbtransparentes Menü-Panel mit backdrop-filter: blur() im Hintergrund, sodass der Seiteninhalt durch das Panel noch angedeutet wird, ähnlich dem gefrosten-Glas-Look, den viele native Apps verwenden. Sowohl der Durchsichteffekt als auch der Blur-Effekt sind mir wichtig – Transparenz ohne Blur sieht über dichten Themenlisten einfach nur unordentlich aus.

Was bereits funktioniert

Bei .d-header reicht dies und es funktioniert zuverlässig (getestet auf iOS Safari und Desktop Chrome):

.d-header {
  background-color: color-mix(in srgb, var(--header_background) 50%, transparent);
  -webkit-backdrop-filter: blur(3px) saturate(1.2);
  backdrop-filter: blur(3px) saturate(1.2);
}

Was nicht funktioniert

Das exakt gleiche Rezept, angewendet auf .menu-panel, liefert mir die Transparenz, aber nie den Blur-Effekt, auf iOS Safari:

.menu-panel {
  background-color: color-mix(in srgb, var(--secondary) 85%, transparent) !important;
  -webkit-backdrop-filter: blur(6px) saturate(1.2);
  backdrop-filter: blur(6px) saturate(1.2);
  border-radius: 14px;
}

Dinge, die ich versucht habe, um den Blur-Effekt zum Vorschein zu bringen, von denen keines geholfen hat:

  • Hinzufügen von !important zu den backdrop-filter/-webkit-backdrop-filter-Deklarationen selbst.
  • Erzwingen einer dedizierten Kompositing-Ebene mit transform: translateZ(0) kombiniert mit overflow: hidden (eine gängige Safari-Workaround für andere backdrop-filter-Probleme) – das hat hier keinen Unterschied gemacht, also habe ich es wieder entfernt, anstatt einen Hack zu behalten, der sich nicht bewährt hat.
  • Bestätigt, dass ich das richtige Element anspreche: Laut menu-panel.scss wird der undurchsichtige Hintergrund direkt auf .menu-panel gesetzt (nicht auf einem Kind-Element wie .panel-body), was ich anfangs falsch verstanden und dann korrigiert habe.

Wenn jemand weiß, warum sich .menu-panel hier anders verhält als .d-header, oder ein funktionierendes Rezept hat, würde ich mich freuen, es zu hören.

Zweites Problem: Hardcodierte Hintergründe auf einzelnen Menüzeilen

Selbst wenn der Hintergrund des Panels selbst transparent gemacht wird, werden mehrere Elemente darin weiterhin undurchsichtig gerendert, da der Kern ihre Hintergründe direkt setzt, anstatt über den Hintergrund des Panels selbst:

  • .user-notifications-list .read und .bookmark – Gelesene Benachrichtigungen und Lesezeichen im Benutzer-Menü erhalten direkt background-color: var(--secondary), sodass jede Zeile als undurchsichtiger Block auf dem halbtransparenten Panel erscheint.
  • .hamburger-panel .sidebar-footer-wrapper .sidebar-footer-container – Der Profil-/Login-Footer am unteren Rand der Sidebar hat dasselbe Problem.

Ich kann (und habe) diese in meinem Theme überschrieben, aber das bedeutet, jedes hardcodierte var(--secondary) in menu-panel.scss einzeln herauszufinden, und es wird erneut kaputt gehen, wenn der Kern das nächste Mal ein neues Element mit demselben Muster hinzufügt. Es würde sehr helfen, wenn diese auf eine CSS-Custom-Property zurückfielen, z. B. etwas wie --d-menu-panel-background mit var(--secondary) als Standardwert, sodass ein Theme nur eine Variable neu definieren muss, um das gesamte Panel – einschließlich seiner Zeilen – konsistent transparent zu machen, anstatt einzelne Selektoren zu verfolgen.

Ich teile gerne Screenshots des Vorher/Nachher-Zustands, falls nützlich, und teste jeden vorgeschlagenen Fix auf meiner Seite.

1 „Gefällt mir“

Nachfrage: Dasselbe Fehlen von sichtbarer Transparenz/Unschärfe tritt nun auch bei einem anderen Element auf, das den gleichen Stilpfad wie .menu-panel nutzt – dem Eingabefeld des Such-Dropdowns in der Kopfzeile (.search-input-wrapper, Teil des Glimmer-Suchmenüs).

Rezept (identisches Muster wie bei der funktionierenden .d-header und bei .menu-panel oben):

.search-menu .search-input-wrapper {
  background: color-mix(in srgb, var(--header_background) 85%, transparent) !important;
  -webkit-backdrop-filter: blur(6px) saturate(1.2);
  backdrop-filter: blur(6px) saturate(1.2);
  border-radius: 14px;
  box-shadow: 0 0 0 1px var(--primary-low-mid);
  overflow: hidden;
}

.search-menu .search-input {
  background: transparent !important;
}

Was korrekt gerendert wird: Der Haarscharfe Rand (box-shadow) und der border-radius erscheinen beide exakt wie erwartet – der Selektor trifft also das richtige Element und die Regel wird angewendet, statt stillschweigend überschrieben zu werden.

Was nicht gerendert wird: Keine sichtbare Transparenz und keine sichtbare Unschärfe des Inhalts hinter dem Feld, dasselbe Symptom wie bei .menu-panel (Seitenleiste/Hamburger-Panel), das oben gemeldet wurde. .d-header, das die exakt gleichen drei Zeilen (background-color über color-mix, -webkit-backdrop-filter, backdrop-filter) verwendet, funktioniert weiterhin einwandfrei.

Dadurch wird mein Verdacht immer stärker, dass es nicht spezifisch an .menu-panel selbst liegt, sondern an etwas, das diese Dropdown-/Overlay-artigen Elemente gemeinsam haben (ein Stapelkontext, der woanders im Kern erstellt wird, eine Kompositionsschicht, die kein korrektes umgebendes Blockelement für backdrop-filter ist, oder Ähnliches) – und nicht an unserem eigenen Selektor oder den Eigenschaftswerten, da die exakt gleichen drei CSS-Eigenschaften sich je nach dem Kern-Element, an dem sie befestigt sind, unterschiedlich verhalten.

Hat jemand schon einmal das Problem gehabt, dass backdrop-filter/transparenter Hintergrund speziell im Such-Dropdown oder in anderen Overlays der .menu-panel-Familie nicht gerendert wird, obwohl dasselbe Rezept in der Kopfzeile funktioniert?

Das Problem ist, dass jede gelesene Benachrichtigung eine eigene Hintergrundfarbe hat, die ebenfalls überschrieben werden muss. Dies sollte zusätzlich zu deinen anderen Änderungen helfen.

.user-menu .quick-access-panel .read {
  background: transparent;
}

Ähnlich verhält es sich mit der Sucheingabe: Dort wird ein separater Hintergrund angewendet, der entfernt werden müsste:

.search-menu .search-input, .search-menu-container .search-input {
  background: transparent;
}

Wir haben einen Leitfaden, der Schritt für Schritt erklärt, wie man solche CSS-Änderungen vornimmt. Er könnte hilfreich sein: Making custom CSS changes on your site

1 „Gefällt mir“

Vielen Dank! — Beide Fixes haben exakt so funktioniert, wie beschrieben.

Für alle, die auf dasselbe Problem stoßen: Neben den beiden von dir geposteten Overrides hatte ich zusätzlich ein verschachteltes .results-Element innerhalb von .search-menu-panel, das unabhängig von .menu-panel einen eigenen undurchsichtigen Hintergrund gemalt hat und dieselbe Behandlung benötigte:

.search-menu-panel .results {
  background: transparent !important;
}

Mit diesem und deinen zwei Snippets funktioniert die Transparenz jetzt überall sauber — Sidebar, Hamburger-Panel, Schnellzugriffs-Benachrichtigungen und das vollständige Such-Dropdown einschließlich der Ergebnisliste. Der Text bleibt dabei durchgehend gut lesbar, daher ist das Thema Opazität für uns jetzt vollständig gelöst.

Der eine Punkt, der noch offen ist, ist das ursprüngliche Thema dieses Threads: backdrop-filter/Blur selbst. Selbst wenn alle Hintergründe jetzt korrekt transparent sind, zeigt keines dieser Elemente einen Blur-Effekt — dasselbe Symptom wie zuvor und weiterhin im Gegensatz zu .d-header, wo das identische backdrop-filter-Rezept einwandfrei gerendert wird. Die Transparenzseite ist also gelöst, aber die Blur-Seite bleibt offen.

Nochmals vielen Dank, dass du dir die Zeit genommen hast, das zu untersuchen — wirklich hilfreich.

1 „Gefällt mir“

Ja, das ist etwas komplizierter … Wenn ein Element wie der Header ein backdrop-filter erhält, wird es zur Wurzel für den Effekt. Daher können nachgeordnete Elemente, die innerhalb dieser Wurzel verschachtelt sind (wie die Dropdown-Panel), nur den Inhalt innerhalb dieser Wurzel unscharf darstellen … Sie können den Seiteninhalt jenseits des Headers nicht sehen, selbst wenn die Panels über den Header hinausragen, weshalb dort keine Unschärfe entsteht.

Stattdessen kannst du ein Pseudoelement auf dem Header verwenden, um diese Wurzelbeschränkung zu umgehen.

.d-header {
  position: relative;
  isolation: isolate;
  background-color: transparent;

  &::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-color: color-mix(in srgb, var(--header_background) 70%, transparent);
    backdrop-filter: blur(12px);
    pointer-events: none;
  }
}

.menu-panel {
  background-color: color-mix(in srgb, var(--secondary) 70%, transparent);
  backdrop-filter: blur(12px);
}

.user-menu .quick-access-panel .read {
  background: transparent;
}
1 „Gefällt mir“

(Beitrag vom Autor gelöscht)

1 „Gefällt mir“