12 Kommentare

details - Der Teufel steckt im Detail

HTML5 brachte viele neue Elemente, darunter 2009/10 auch einen Aufklappmechanismus mit details und summary, der nur mit HTML funktionierte.

Leider steckte der Teufel im Detail:
Viele Anwendungsfälle erforderten dann doch den Einsatz von JavaScript. 😟

Mittlerweile gibt es viele neue Pseudoelemente und ein „altes“ HTML-Attribut, die reine HTML- und CSS-Lösungen ermöglichen.
Zeit unseren Wiki-Artikel wieder zu überarbeiten und erneut vorzustellen:

1. Summary - aber wie Stylen?

Ein summary-Element erhält defaultmäßig ein dreieckiges Symbol in Textfarbe, dass beim Anklicken und Aufklappen seine Richtung ändert.

Dieses Symbol ist ein Pseudoelement, dass sich in den meisten Browsern über den ::marker-Selektor formatieren lässt, aber eben nicht in allen:

summary::-webkit-details-marker,	
summary::marker {
  content:  " ↓ "; /* "Pfeil"-Symbols anstelle des Dreiecks */
  color: green;
  font-size: 2em;
  font-weight: bold;
  transition: all 0.5s;  
}	

details[open] > summary::-webkit-details-marker,
details[open] > summary::marker {
  content:  " ↑ ";
  color: red;
}

Für den Safari benötigt man – zumindest für die content-Eigenschaft – im Jahre 2026 immer noch den proprietären Präfix -webkit-

Oft ist es besser den Marker auszublenden und durch ein anderes – frei stylebares Pseudoelement zu ersetzen:

2. Aufklappen oder sanft ausfahren?

Beim Aufklappen eines details-Elements gab es weitere CSS-Probleme: Der zu öffnende Inhalt konnte nur durch ein zusätzliches wrapper-div unabhängig vom summary-Element gestaltet werden. Dies ist mit dem neuen ::details-content-Selektor mittlerweile in allen Browsern möglich.

Beim Aufklappen war kein weicher Übergang in Form eines langsamen Aufschieben möglich.

details .content {
  height: 0;
}

details[open]  .content {
  height:  100%;
}

Dies scheitert aus einem einfachen Grund:

  • Prozentwerte bei height beziehen sich immer auf die Höhe des Elternelements
  • In diesem Fall hat das Elternelement (details) aber keine feste Höhe
    → Der Browser kann 100% nicht berechnen, weil es keine feste Referenz gibt.

In den früheren Fassungen unseres Tutorials gab es Ansätze, wie man mit JavaScript die tatsächliche Höhe des Inhalts ermittelt. Alternativ musste man das händisch ermitteln und als Magic number ins CSS schreiben - immer mit der Gefahr, dass der Wert irgendwann mal nicht passt.

details::details-content {
  height: 0;
  overflow-y: clip;
  transition: 1s allow-discrete;
}

details[open]::details-content {
	height: 15em;
  height: calc-size(auto, size);
}

Die neue CSS-Funktion calc-size() löst dieses Problem; allerdings noch nicht im Firefox und Safari.
😟

3. Exklusives Akkordion

Kann man mit reinem HTML mehrere details-Element so koppeln, dass sich beim Aufklappen eines Elements die anderen shcließen?

Ja, mit dem von Radio-buttons bekannten name-Attribut ist dies in allen Browsern möglich! Ganz ohne einsatz von JavaSript!

Jetzt endlich kann man details endlich uneingeschränkt nutzen!

BTW

Divi, ein Pagebuilder für Wordpress löst das so:

<div class="et_pb_module et_pb_accordion et_pb_accordion_0 custom_toggle_styling">				
  <div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_0 et_pb_toggle_close">
    <h5 class="et_pb_toggle_title">...</h5>
    <div class="et_pb_toggle_content clearfix">
      <p>...</p>
    </div>
  </div>
</div>

Mir fehlen die Worte.

eingeordnet unter:

veröffentlicht von Matthias Scharwies

  1. Hallo

    2. Aufklappen oder sanft ausfahren?

    […]

    details::details-content {
      height: 0;
      overflow-y: clip;
      transition: 1s allow-discrete;
    }
    
    details[open]::details-content {
    	height: 15em;
      height: calc-size(auto, size);
    }
    

    Die neue CSS-Funktion calc-size() löst dieses Problem; allerdings noch nicht im Firefox und Safari.

    Im LibreWolf 149.0-1, der dem Firefox 149 entsprechen sollte, öffnet und schließt sich das Details-Element auf smoothe Art. Das Update auf diese Version kam am letzten Freitag. Vielleicht kam das Feature erst mit dieser Version. 🤔

    Danke jedenfalls für die Darstellung der Entwicklung. 👍

    BTW

    Divi, ein Pagebuilder für Wordpress löst das so:

    <div class="et_pb_module et_pb_accordion et_pb_accordion_0 custom_toggle_styling">				
      <div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_0 et_pb_toggle_close">
        <h5 class="et_pb_toggle_title">...</h5>
        <div class="et_pb_toggle_content clearfix">
          <p>...</p>
        </div>
      </div>
    </div>
    

    Mir fehlen die Worte.

    Och, habe schon schlimmeres gesehen. Sachen, wo du dich fragst, wie weit Hühner wohl noch scheißen sollen.

    Tschö, Auge

    --
    „Habe ich mir das nur eingebildet, oder kann der kleine Hund wirklich sprechen?“ fragte Schnapper. „Er behauptet, nicht dazu imstande zu sein“ erwiderte Victor. Schnapper zögerte (…) „Nun …“ sagte er schließlich, „ich schätze, er muss es am besten wissen.“ Terry Prattchett, Voll im Bilde
    1. Servus!

      Die neue CSS-Funktion calc-size() löst dieses Problem; allerdings noch nicht im Firefox und Safari.

      Im LibreWolf 149.0-1, der dem Firefox 149 entsprechen sollte, öffnet und schließt sich das Details-Element auf smoothe Art. Das Update auf diese Version kam am letzten Freitag. Vielleicht kam das Feature erst mit dieser Version. 🤔

      https://caniuse.com/mdn-css_types_calc-size

      Ich glaube, dass das der Fallback mit der magic number von height: 17em ist.

      Danke jedenfalls für die Darstellung der Entwicklung. 👍

      Gern geschehen!

      BTW

      Divi, ein Pagebuilder für Wordpress löst das so:

      <div class="et_pb_module et_pb_accordion et_pb_accordion_0 custom_toggle_styling">				
        <div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_0 et_pb_toggle_close">
          <h5 class="et_pb_toggle_title">...</h5>
          <div class="et_pb_toggle_content clearfix">
            <p>...</p>
          </div>
        </div>
      </div>
      

      Mir fehlen die Worte.

      Och, habe schon schlimmeres gesehen. Sachen, wo du dich fragst, wie weit Hühner wohl noch scheißen sollen.

      Was mich so fuchst - ich hatte das 2019 mit details realisiert; anschließend ist ein Profi für viel Geld rübergegangen.

      Herzliche Grüße
      Matthias Scharwies

      1. Hallo

        Die neue CSS-Funktion calc-size() löst dieses Problem; allerdings noch nicht im Firefox und Safari.

        Im LibreWolf 149.0-1, der dem Firefox 149 entsprechen sollte, öffnet und schließt sich das Details-Element auf smoothe Art.

        Ich glaube, dass das der Fallback mit der magic number von height: 17em ist.

        Nachdem ich es nach langem suchen gefunden habe[1], ja, isses. Schade. Es sieht auch nicht so aus, als würde das in absehbarer Zeit etwas werden.

        BTW

        Divi, ein Pagebuilder für Wordpress löst das so:

        <div class="et_pb_module et_pb_accordion et_pb_accordion_0 custom_toggle_styling">				
          <div class="et_pb_toggle et_pb_module et_pb_accordion_item et_pb_accordion_item_0 et_pb_toggle_close">
            <h5 class="et_pb_toggle_title">...</h5>
            <div class="et_pb_toggle_content clearfix">
              <p>...</p>
            </div>
          </div>
        </div>
        

        Mir fehlen die Worte.

        Och, habe schon schlimmeres gesehen. Sachen, wo du dich fragst, wie weit Hühner wohl noch scheißen sollen.

        Was mich so fuchst - ich hatte das 2019 mit details realisiert; anschließend ist ein Profi für viel Geld rübergegangen.

        Das kann ich nachvollziehen. Mich wurmt es auch, wenn eines meiner Projekte abgelöst wird und der Ersatz erkennbar technisch schlechter ist.

        Tschö, Auge

        --
        „Habe ich mir das nur eingebildet, oder kann der kleine Hund wirklich sprechen?“ fragte Schnapper. „Er behauptet, nicht dazu imstande zu sein“ erwiderte Victor. Schnapper zögerte (…) „Nun …“ sagte er schließlich, „ich schätze, er muss es am besten wissen.“ Terry Prattchett, Voll im Bilde

        1. Der Abschnitt für Pseudoelemente war in keinen Entwickerwerkzeugen zugeklappt. Ich habe das nicht gleich gesehen und mir einen Wolf nach der Angabe height: 17em; gesucht. ↩︎

  2. @@Matthias Scharwies

    Es ist problematisch, über einen Browser zu schreiben, ohne auf diesem zu testen. Da kommt dann auch mal Mist raus.

    Für den Safari benötigt man im Jahre 2026 immer noch den proprietären Präfix -webkit-

    Testseite

    Safari 26.3 zeigt keine Smileys, sondern immer noch die Dreiecke.
    Nix mit ::-webkit-details-marker.


    Auf iOS wird’s noch ekliger: Im geschlossenen Zustand wird statt ▶︎ das Emoji ▶️ gesetzt. Im geöffneten Zustand hingegen kein Emoji, sondern ▼. Unter Steve wäre das nicht passiert.

    Was dagegen hilft, ist ::marker { font: 1em/0 monospace }.

    Ja, das geht ohne -webkit-Präfix. Es ist nicht so, dass Safari ::marker nicht kennt.

    🖖 Live long and prosper

    --
    In our chants of “ICE out now”
    Our city’s heart and soul persists
    Through broken glass and bloody tears
    On the streets of Minneapolis

    — Bruce Springsteen, Streets of Minneapolis
    1. Servus!

      @@Matthias

      Für den Safari benötigt man im Jahre 2026 immer noch den proprietären Präfix -webkit-

      @Bertie könntest du bitte noch mal schauen?

      Was dagegen hilft, ist ::marker { font: 1em/0 monospace }.

      Ja, das geht ohne -webkit-Präfix. Es ist nicht so, dass Safari ::marker

      Herzliche Grüße
      Matthias Scharwies

      1. Salü zusammen

        Auf iPhone und iPad mit aktuellem Betriebssystem erscheinen bei mir in Gunnars Testseite einfache ▶︎ und ▼.

        Mit oder ohne -webkit-Präfix sehe ich keinen Unterschied.

        Von ::marker interpretiert Safari einzig color und font-size, wie caniuse schreibt.

        Für andere Symbole funktionieren auf meinen Desktop- und Mobil-Safari einzig aus dem Wiki-Artikel die Tricks in den Beispielen «CSS-Ersatz durch Pseudoelement», «Tooltip mit details», «Akkordeon» und «Exklusives Akkordeon».

        Also falls das Symbol auch in Safari wichtig sein sollte: So etwas einsetzen wie Sonderzeichen, Emoji oder ein inline-SVG per summary::after { content: " ↓ "; … .

        Gruss, Bertie

    2. Dieser Beitrag wurde gelöscht: Der Beitrag ist ein Duplikat eines anderen Beitrags.
  3. @@Matthias Scharwies

    details - Der Teufel steckt im Detail (falsch: mit Bindestrich)

    Hier steckt der Teufel auch schon im Titel. Nicht im, sondern nach „details“.

    Die Zeichenfolge Leerzeichen – Bindestrich – Leerzeichen im Text[1] ist immer falsch; dort muss ein Gedankenstrich (Halbgeviertstrich) stehen:

    details – Der Teufel steckt im Detail

    Dasselbe bei:

    • 1. Summary - aber wie Stylen?
    • ins CSS schreiben - immer mit der Gefahr, dass der Wert irgendwann mal nicht passt.

    Na kucke, geht doch:

    • Oft ist es besser den Marker auszublenden und durch ein anderes – frei stylebares Pseudoelement zu ersetzen

    Da ist es schon richtig – fast: Der schließende Gedankenstrich fehlt (und ein Komma auch): Oft ist es besser, den Marker auszublenden und durch ein anderes – frei stylebares – Pseudoelement zu ersetzen.

    Wenn das nach zu viel Mut zur Lücke aussieht, tut’s auch ein Komma: Oft ist es besser, den Marker auszublenden und durch ein anderes, frei stylebares Pseudoelement zu ersetzen.

    🖖 Live long and prosper

    --
    In our chants of “ICE out now”
    Our city’s heart and soul persists
    Through broken glass and bloody tears
    On the streets of Minneapolis

    — Bruce Springsteen, Streets of Minneapolis

    1. nicht in Code, wo - für das Minuszeichen steht. ↩︎

    1. FYI: MDN nutzt für die Darstellung des ::marker-Elements (zumindest ab und an) eine Transformation und dreht den jeweils um 90°. Beispielsweise mit

      [open] :is(.left-sidebar details) > summary {
      	&::before { transform: rotate(90deg); }
      }
      
      
      1. Hallo Marker,

        offensichtlich tun sie das nicht, aber ich glaube, so hattest Du es auch gemeint. Die Transformation gilt für ::before, nicht ::marker, und das muss auch so sein, weil ::marker ein ziemlicher Sturschädel ist, was CSS angeht.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Ja, ich hatte es so gmeint. Jedenfalls „ungefähr so“.

          Vor kuzrem habe ich übrigens irgendwo gelesen, daß ::marker wohl etwas wie die Oberfläche eines Konstrukts sein soll, das anscheinend als eigentliches Anezeige-Element (etwas wie?) ein display: list-item in sich trägt. — Was ein (der?) Grund für die Sturheit sein könnte.

          1. Servus!

            Ja, ich hatte es so gmeint. Jedenfalls „ungefähr so“.

            Der Blog-Artikel sollte ja auf den ausführlicheren Wiki-Artikel hinweisen:

            Sowohl dort als auch im MDN-Artikel wird ::marker ausgeblendet und dann
            mit einem ::after, bzw ::before-Pseudoelement gearbeitet.

            Vor kuzrem habe ich übrigens irgendwo gelesen, daß ::marker wohl etwas wie die Oberfläche eines Konstrukts sein soll, das anscheinend als eigentliches Anezeige-Element (etwas wie?) ein display: list-item in sich trägt. — Was ein (der?) Grund für die Sturheit sein könnte.

            Ja, das steht alles im dort verlinkten Wiki-Artikel zum ::marker-Selektor:

            Herzliche Grüße
            Matthias Scharwies