<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Alexander Lehner – Oida, is des org!</title><description>Web Development Blog mit Fokus auf Accessibility.</description><link>https://www.oidaisdes.org/</link><language>de-at</language><item><title>Dialoge mit dem closedby-Attribut aufwerten</title><link>https://www.oidaisdes.org/de/blog/dialog-closedby-attribute</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/dialog-closedby-attribute</guid><description>Ganz einfach Light-Dismiss aktivieren oder ein versehentliches Schließen über die Escape-Taste verhindern.</description><pubDate>Sat, 28 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das native HTML-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  ist einfach großartig. Damit lassen sich auf einfache
Weise barrierefreie Modal-Dialoge erstellen, die für alle Nutzer:innen gut funktionieren. Und es wird
&lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Reference/Elements/dialog&quot;&gt;seit 2022 von allen modernen Browsern unterstützt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aber es wird noch besser: Mit dem neuen Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closedby&lt;/code&gt;  könnt ihr festlegen, durch welche
Aktionen der Dialog geschlossen wird. Ihr könnt ein Light-Dismiss-Verhalten hinzufügen oder genau das Gegenteil tun:
z.B. verhindern, dass der Dialog durch Drücken der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste geschlossen wird.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_Z1NUbqr.webp&quot; srcset=&quot;/_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_Z1FNTgA.webp 640w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_jlO9b.webp 750w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_1CSVna.webp 828w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_Z1Y8AMY.webp 1080w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_foBIH.webp 1280w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_Z1NUbqr.webp 1600w&quot; alt=&quot;Zwei weiße Sprechblasen auf pinkem Hintergrund.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1064&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Miguel Á. Padriñán / pexels.com&lt;/p&gt;
&lt;p&gt;Wir sehen uns die technische Spezifikation sowie ein paar Anwendungsfälle für das neue Attribut an.&lt;/p&gt;
&lt;h2 id=&quot;so-funktioniert-es&quot;&gt;So funktioniert es&lt;/h2&gt;
&lt;p&gt;Die &lt;a href=&quot;https://html.spec.whatwg.org/multipage/interactive-elements.html#the-dialog-element&quot;&gt;HTML-Spezifikation&lt;/a&gt;
definiert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closedby&lt;/code&gt;  als ein enumeriertes Attribut mit den folgenden Werten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;any&lt;/code&gt;  – Durch Close-Requests oder Klicken außerhalb des Dialogs wird dieser geschlossen.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closerequest&lt;/code&gt;  – Close-Requests schließen den Dialog.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt;  – Der Dialog wird durch keine Benutzeraktion automatisch geschlossen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn ihr das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closedby&lt;/code&gt;  nicht für einen Modaldialog definiert, verhält dieser sich
so, als wäre der Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closerequest&lt;/code&gt; . Das bedeutet, dass der Dialog durch Drücken
der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste auf Desktop-Plattformen oder durch eine „Zurück“- oder „Schließen“-Geste auf
mobilen Plattformen geschlossen wird.&lt;/p&gt;
&lt;h2 id=&quot;anwendungsfälle&quot;&gt;Anwendungsfälle&lt;/h2&gt;
&lt;h3 id=&quot;light-dismiss-für-informations-dialoge&quot;&gt;Light-Dismiss für Informations-Dialoge&lt;/h3&gt;
&lt;p&gt;Manche Dialoge dienen lediglich der Darstellung von Information. Von Benutzer:innen wird nicht erwartet, dass diese
eine Entscheidung treffen oder ein Formular ausfüllen. Meiner Meinung nach ein idealer Anwendungsfall für
Light-Dismiss: Das Dialogfeld sollte sich schließen, wenn man außerhalb des Feldes klickt oder tippt.&lt;/p&gt;
&lt;p&gt;Bevor es das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closedby&lt;/code&gt;  Attribut gab, war zusätzlicher JavaScript-Code erforderlich, um das
Schließen des Dialoges zu implementieren. Ein Beispiel findet ihr in meinem Artikel
&lt;a href=&quot;/de/blog/native-dialog-element/&quot;&gt;„Warum du das native Dialog-Element nutzen solltest“&lt;/a&gt;. Zum Glück benötigen wir jetzt
nur noch den folgenden HTML-Code:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; closedby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;any&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    &amp;lt;!-- content --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Genial! 🥳&lt;/p&gt;
&lt;h3 id=&quot;versehentliches-schließen-verhindern&quot;&gt;Versehentliches Schließen verhindern&lt;/h3&gt;
&lt;p&gt;Dialogfelder eignen sich hervorragend, um Arbeitsabläufe wie beispielsweise die Dateneingabe über ein Formular zu kapseln.
Auch den Onboarding-Prozess für eine Webanwendung könnt ihr mithilfe eines Dialogs abwickeln.&lt;/p&gt;
&lt;p&gt;In diesen Fällen solltet ihr verhindern, dass Nutzer:innen den Dialog versehentlich schließen, z.B. über
die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste. Andernfalls gingen die Daten verloren, die bereits in das Formular eingegeben
wurden. Oder man könnte den Onboarding-Dialog nicht erneut aufrufen.&lt;/p&gt;
&lt;p&gt;Daher solltet ihr &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closedby=“none”&lt;/code&gt;  auf das Dialogelement setzen. Nun können Nutzer das
Dialogfeld nur noch über einen von der Entwicklerin festgelegten Mechanismus schließen, beispielsweise über eine
Schaltfläche zum Schließen. Hier ein Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;mydialog&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; closedby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    &amp;lt;!-- content --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; commandfor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;mydialog&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; command&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;close&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        Continue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vielleicht kennt ihr die Attribute &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;command&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;commandfor&lt;/code&gt;  für
Button-Elemente noch nicht. Sie sind Teil eines neuen Web-Features namens
&lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/API/Invoker_Commands_API&quot;&gt;Invoker Commands API&lt;/a&gt;.
Ihr müsst sie nicht unbedingt verwenden. Aber ich mag ihre Einfachheit und Eleganz, deshalb wollte ich sie in mein
Codebeispiel aufnehmen. 😉&lt;/p&gt;
&lt;h2 id=&quot;browser-unterstützung&quot;&gt;Browser-Unterstützung&lt;/h2&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closedby&lt;/code&gt;  Attribut wird bereits &lt;a href=&quot;https://caniuse.com/wf-dialog-closedby&quot;&gt;von Firefox, Chrome und Edge unterstützt&lt;/a&gt;.
Dank &lt;a href=&quot;https://wpt.fyi/interop-2026&quot;&gt;Interop 2026&lt;/a&gt; sollte auch Safari/WebKit bis Ende des Jahres nachziehen.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Reference/Elements/dialog#closedby&quot;&gt;Das closedby-Attribut (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/de/blog/accessibility-engineering-web-platform/&quot;&gt;„Accessibility Engineering — Lass die Web-Plattform die Arbeit machen“&lt;/a&gt; (Abschnitt: „Das dialog Element: Immer oben auf“)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/de/blog/native-dialog-and-popover/&quot;&gt;„Native Dialoge und die Popover API — Das solltet ihr wissen“&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>css</category><category>dialog</category><category>html</category><category>keyboard</category><category>sreenreader</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_speech_bubbles.jpg" length="0" type="image/jpeg"/></item><item><title>Best Practices für CSS Scope in Angular-Applikationen</title><link>https://www.oidaisdes.org/de/blog/css-scope-angular-best-practices</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/css-scope-angular-best-practices</guid><description>Wie ihr effiziente Donut-Scopes definiert und Komponenten von Drittanbietern einfach überschreiben könnt.</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die neue &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  CSS-At-Regel wird seit Dezember 2025 von allen gängigen Browsern unterstützt.
Dieses großartige neue Feature macht es super einfach, Styles auf bestimmte DOM-Teilbereiche, wie beispielsweise den Inhalt
einer Komponente, anzuwenden.&lt;/p&gt;
&lt;p&gt;In der Arbeit implementiere ich hauptsächlich Webanwendungen mit dem Angular-Framework. In den letzten Monaten habe ich begonnen,
die &lt;a href=&quot;https://angular.dev/guide/components/styling#style-scoping&quot;&gt;View Encapsulation von Angular&lt;/a&gt; zu deaktivieren und stattdessen
das native CSS-Feature zu verwenden. Nun möchte ich meine Erfahrungen und einige Best Practices mit euch teilen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-aditya-aiyar-donuts.C_8mSwN1_hmyth.webp&quot; srcset=&quot;/_astro/pexels-aditya-aiyar-donuts.C_8mSwN1_ZhaK5p.webp 640w, /_astro/pexels-aditya-aiyar-donuts.C_8mSwN1_Z1nOj3D.webp 750w, /_astro/pexels-aditya-aiyar-donuts.C_8mSwN1_Z1Wushy.webp 828w, /_astro/pexels-aditya-aiyar-donuts.C_8mSwN1_Z2hJy79.webp 1080w, /_astro/pexels-aditya-aiyar-donuts.C_8mSwN1_Z1NuK6e.webp 1280w, /_astro/pexels-aditya-aiyar-donuts.C_8mSwN1_hmyth.webp 1600w&quot; alt=&quot;Eine Box mit mehreren Donuts in unterschiedlichen Farben.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Aditya Aiyar / pexels.com&lt;/p&gt;
&lt;p&gt;Wenn ihr mit CSS Scope nicht vertraut seid, lest bitte zuerst meinen Artikel
&lt;a href=&quot;/de/blog/css-scope-view-encapsulation/&quot;&gt;„Wird das CSS Scope Feature die View Encapsulation von Angular ersetzen?“&lt;/a&gt;.
Darin erkläre ich die Grundlagen der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  CSS-At-Regel und ihren Einsatz in Angular.&lt;/p&gt;
&lt;h2 id=&quot;demo-projekt-css-scope-sandbox&quot;&gt;Demo-Projekt: CSS Scope Sandbox&lt;/h2&gt;
&lt;p&gt;Ich habe ein &lt;a href=&quot;https://github.com/alexlehner86/angular-css-scope-sandbox&quot;&gt;Projekt mit zwei Angular-Anwendungen&lt;/a&gt; erstellt,
die denselben Inhalt anzeigen. Der einzige Unterschied besteht darin, dass die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-without-css-scope&lt;/code&gt;  die
standardmäßige View Encapsulation des Angular-Frameworks verwendet. Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-with-css-scope&lt;/code&gt;  hingegen
deaktiviert diese Funktion und verwendet stattdessen die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Regel.&lt;/p&gt;
&lt;p&gt;Hier ist die deployte Anwendung mit CSS Scope. Schaut euch den Code mit den Entwicklertools eures Browsers an:&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/angular-css-scope-sandbox/&quot; title=&quot;Demo: App mit CSS @scope&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Ich finde es toll, wie übersichtlich und aufgeräumt das DOM aussieht. Es ist viel einfacher, die Seitenstruktur zu verstehen
und die Styles eines Elements zu überprüfen.&lt;/p&gt;
&lt;p&gt;Die CSS-Selektoren, die ihr in den Browser-Entwicklertools seht, stimmen mit denen überein, die ihr im Quellcode definiert
habt. Keine seltsamen Ergänzungen von benutzerdefinierten Attributen wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;_ngcontent-xxx&lt;/code&gt;  mehr.&lt;/p&gt;
&lt;p&gt;Was sind also die Best Practices für CSS Scope, die ich empfehlen würde?&lt;/p&gt;
&lt;h2 id=&quot;best-practice-1-effiziente-donut-scopes&quot;&gt;Best Practice 1: Effiziente Donut Scopes&lt;/h2&gt;
&lt;p&gt;Zunächst müssen wir die View Encapsulation für jede unserer Komponenten deaktivieren. Hier ist ein Beispiel aus meiner Demo:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    selector:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;app-beer-item-list&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    encapsulation:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; ViewEncapsulation&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; BeerItemList&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt werden die CSS-Selektoren nicht mehr mit benutzerdefinierten Attributen erweitert und die Komponenten-Styles werden global
angewendet. Als Nächstes müssen wir stattdessen die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  At-Regel verwenden, um die Styles zu kapseln.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (app-beer-item-list) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    :scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;grid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dadurch wird das Containerelement &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-beer-item-list&lt;/code&gt;  der Komponente als &lt;span class=&quot;c-italic&quot;&gt;Scoping Root&lt;/span&gt; 
definiert, welche die obere Grenze des Teilbaums bestimmt, auf den wir abzielen.&lt;/p&gt;
&lt;p&gt;Aber was ist mit den Inhalten, die von den Kind-Komponenten im Template gerendert werden? Die Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;BeerItemList&lt;/code&gt; 
enthält die Kind-Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;app-beer-item-details&amp;gt;&lt;/code&gt; . Wir möchten nicht, dass die Styles der
übergeordneten Komponente den Inhalt ihrer Kind-Komponenten beeinflusst.&lt;/p&gt;
&lt;p&gt;Mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  At-Regel können wir ein &lt;span class=&quot;c-italic&quot;&gt;Scoping Limit&lt;/span&gt;  definieren, das die untere
Grenze festlegt. Diese Art von Scope – mit einer oberen und einer unteren Grenze – wird als
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/At-rules/@scope#scope_roots_and_scope_limits&quot;&gt;Donut Scope&lt;/a&gt; bezeichnet:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (app-beer-item-list) to (app-beer-item-details &amp;gt; *) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    :scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;grid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    app-beer-item-details&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        background&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--canvas-bg-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieser Scope umfasst das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;app-beer-item-details&amp;gt;&lt;/code&gt;  Container-Element, schließt jedoch den Inhalt der
Kind-Komponente aus.&lt;/p&gt;
&lt;p&gt;Was passiert, wenn ihr eine Komponente stylt, die mehrere Kind-Komponenten im Template enthält? Die App-Komponente in meiner Demo
enthält beispielsweise die Kind-Komponenten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;AppFooter&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;AppHeader&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;BeerItemList&lt;/code&gt; . Ihr müsstet jede Kind-Komponente als untere Grenze definieren, was sehr schnell lästig
werden würde.&lt;/p&gt;
&lt;p&gt;Um die Verwendung von CSS-Scope zu vereinfachen, habe ich die Angular-Direktive &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CustomNgHostDirective&lt;/code&gt; 
erstellt. Die Direktive fügt das benutzerdefinierte Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;data-ng-host&lt;/code&gt;  zum Container-HTML-Element einer
Komponente hinzu. Wendet die Direktive einfach mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;hostDirectives&lt;/code&gt;  auf eine Komponente an:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    selector:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;app-beer-item-details&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    encapsulation:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; ViewEncapsulation&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    hostDirectives:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;CustomNgHostDirective&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; BeerItemDetails&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt können wir das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;data-ng-host&lt;/code&gt;  für eine effiziente Definition der unteren Grenze
einer &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  At-Regel verwenden. Zum Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (app-beer-item-list) to ([data-ng-host] &amp;gt; *) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    :scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;grid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    app-beer-item-details&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        background&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--canvas-bg-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;best-practice-2-ohne-ng-deep-in-den-untiefen-des-doms-wühlen&quot;&gt;Best Practice 2: Ohne &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::ng-deep&lt;/code&gt;  in den Untiefen des DOMs wühlen&lt;/h2&gt;
&lt;p&gt;Wenn ihr die View Encapsulation von Angular verwendet, gelten Komponenten-Styles normalerweise nur für das HTML im eigenen
Template der Komponente. Mit der Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::ng-deep&lt;/code&gt;  könnt ihr die View Encapsulation für eine
bestimmte Regel deaktivieren. Diese Pseudoklasse ist jedoch seit einiger Zeit
&lt;a href=&quot;https://angular.dev/guide/components/styling#ng-deep&quot;&gt;deprecated&lt;/a&gt; und sollte nicht mehr verwendet werden.&lt;/p&gt;
&lt;p&gt;Mit CSS Scopes übernehmt ihr wieder die Kontrolle! Ihr könnt den Gültigkeitsbereich so definieren, dass ihr beispielsweise die
internen Styles einer Drittanbieter-Bibliothek sicher überschreiben könnt.&lt;/p&gt;
&lt;p&gt;Beispiel: Angenommen, ihr verwendet eine &lt;a href=&quot;https://material.angular.dev/components/table/overview&quot;&gt;Angular Material-Tabelle&lt;/a&gt;,
um tabellarische Daten anzuzeigen. Ihr seid mit dem Design weitgehend zufrieden, möchtet aber die Hintergrundfarben ein wenig
anpassen. So könnten die Styles eurer Komponente aussehen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (app-fancy-table) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    table&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;mat-table&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        thead tr {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            background-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;lightblue&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;best-practice-3-geteilte-styles-als-globale-css-klassen-definieren&quot;&gt;Best Practice 3: Geteilte Styles als globale CSS-Klassen definieren&lt;/h2&gt;
&lt;p&gt;Ihr müsst nicht alle eure Styles mit CSS Scope in der CSS-Datei einer Komponente definieren. Besser ist, wenn ihr mehrmals
genutzte Styles in globalen Dateien, z. B. im &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;src/styles&lt;/code&gt;  Ordner, ablegt und sie für die gesamte
Anwendung bereitstellt.&lt;/p&gt;
&lt;p&gt;Ich persönlich bevorzuge es, SCSS-Dateien mit allgemeinen Styles für jeden Inhaltstyp oder Element zu erstellen. Zum
Beispiel: &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;_details.scss&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;_forms.scss&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;_table.scss&lt;/code&gt; .
Sie enthalten Styles für bestimmte HTML-Selektoren wie etwa &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;details&lt;/code&gt;  sowie globale CSS-Klassen wie
z.B. &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.default-expansion-panel&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;Um es den Komponenten zu erleichtern, diese allgemeinen Styles bei Bedarf zu überschreiben, habe ich sie in einem eigenen
Cascade-Layer abgelegt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@use&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; &amp;quot;sass:meta&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; reset, general, components;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; general {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    @include&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; meta.load-css(&amp;quot;base/details&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    @include&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; meta.load-css(&amp;quot;base/forms&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    @include&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; meta.load-css(&amp;quot;base/table&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Erfahrt mehr über Cascade Layers in meinem Artikel &lt;a href=&quot;/de/blog/cascade-layers-in-angular/&quot;&gt;„CSS Cascade Layers in Angular verwenden“&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Alternativ könnt ihr auch SCSS-Features wie &lt;a href=&quot;https://sass-lang.com/documentation/at-rules/extend/&quot;&gt;Platzhalter&lt;/a&gt; oder
&lt;a href=&quot;https://sass-lang.com/documentation/at-rules/mixin/&quot;&gt;Mixins&lt;/a&gt; verwenden, um wiederverwendbare Styles zu erstellen. Ich kann bestätigen,
dass das Einfügen eines Mixins mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@include&lt;/code&gt;  auch im Kontext der nativen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt; 
At-Regel funktioniert.&lt;/p&gt;
&lt;p&gt;Leider hat die Verwendung eines SCSS-Platzhalters mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@extend&lt;/code&gt;  für mich im Kontext von CSS Scope nicht
funktioniert. Der SCSS-Präprozessor berücksichtigt offenbar noch nicht die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  At-Regel, was zu ungültigen
Styles führt. Zumindest war das bei mir mit Angular 21 der Fall. Vielleicht wird das in Zukunft noch behoben.&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Wie ihr seht, ist es ziemlich einfach, die View Encapsulation von Angular zu deaktivieren und Komponenten-Styles innerhalb
einer &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  At-Regel zu definieren. Der generierte HTML- und CSS-Code ist viel besser lesbar und lässt
sich viel einfacher debuggen.&lt;/p&gt;
&lt;p&gt;Oder mit anderen Worten: Angulars View Encapsulation ist tot! Lang lebe CSS Scope! 🤩&lt;/p&gt;</content:encoded><category>angular</category><category>css</category><category>encapsulation</category><category>scope</category><category>styling</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_donuts2.jpg" length="0" type="image/jpeg"/></item><item><title>Nutze die Temporal API in Angular ohne Einbindung eines Polyfills</title><link>https://www.oidaisdes.org/de/blog/use-temporal-api-in-angular</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/use-temporal-api-in-angular</guid><description>Wie ihr Typ-Definitionen für Temporal verwenden könnt, ohne die Bundle-Größe eurer App zu vergrößern.</description><pubDate>Sat, 31 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  API nimmt Fahrt auf! Vor kurzem wurden Chrome und Edge 144 mit Temporal-Unterstützung
releast. Damit haben sie endlich zu Firefox aufgeholt, der die Temporal API bereits im Mai 2025 aktiv geschalten hat. Auch die
&lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=223166&quot;&gt;Implementierung in WebKit/Safari&lt;/a&gt; macht Fortschritte.&lt;/p&gt;
&lt;p&gt;Also ich kann es kaum erwarten, endlich das schreckliche &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Date&lt;/code&gt;  Objekt hinter mir zu lassen und das
moderne Datums- und Zeit-Management von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  zu nutzen, einschließlich integrierter Zeitzonen-
und Kalenderdarstellung. Ihr wisst nicht, wovon ich rede? Dann lest zuerst meinen
Artikel &lt;a href=&quot;/de/blog/temporal-api-first-look/&quot;&gt;„Datums- und Zeitverwaltung mit der Temporal API“&lt;/a&gt;!&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_1HQlQm.webp&quot; srcset=&quot;/_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_1IcPmA.webp 640w, /_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_Z1czQrn.webp 750w, /_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_1PsU9K.webp 828w, /_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_1B0Sav.webp 1080w, /_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_Z1ABr3y.webp 1280w, /_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_iorYw.webp 1668w, /_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_2pN7Cv.webp 2048w, /_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_Zj0KAo.webp 2560w, /_astro/pexels-lukaszmartenka-wrist-watch.Iaq1nJzD_1HQlQm.webp 5544w&quot; alt=&quot;Nahaufnahme einer analogen Armbanduhr.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 5544px) 5544px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;5544&quot; height=&quot;3696&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Łukasz Martenka / pexels.com&lt;/p&gt;
&lt;p&gt;In meinem aktuellen Projekt in der Arbeit entwickle ich eine neue Webanwendung mit &lt;a href=&quot;https://angular.dev/&quot;&gt;Angular 21&lt;/a&gt;, die
Safari nicht unterstützen muss. Die perfekte Gelegenheit, um voll auf die Temporal API zu setzen.&lt;/p&gt;
&lt;p&gt;Es gibt aber ein Problem: Der &lt;a href=&quot;https://github.com/tc39/proposal-temporal&quot;&gt;Temporal-Vorschlag&lt;/a&gt; befindet sich noch in Phase 3 des
TC39-Vorschlagsprozesses. Daher enthält die aktuelle TypeScript-Version noch keine Typen für Temporal-Objekte. Wenn ich
versuche, &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  in meiner Angular-Anwendung zu verwenden, lehnt der TypeScript-Compiler das mit
den Worten ab: &lt;span class=&quot;c-italic&quot;&gt;„Name ‚Temporal‘ nicht gefunden.“&lt;/span&gt;  😢&lt;/p&gt;
&lt;p&gt;Nach einigem Herumprobieren habe ich eine Lösung gefunden: Ich zeige euch, wie ihr Typ-Definitionen für
Temporal hinzufügen könnt, ohne dass die Bundle-Größe eurer App explodiert. 🤩&lt;/p&gt;
&lt;h2 id=&quot;schritt-1-den-temporal-polyfill-installieren&quot;&gt;Schritt 1: Den Temporal Polyfill installieren&lt;/h2&gt;
&lt;p&gt;Installiert das Paket &lt;a href=&quot;https://www.npmjs.com/package/@js-temporal/polyfill&quot;&gt;@js-temporal/polyfill&lt;/a&gt; als Entwickler-Dependency
in eurem Angular-Projekt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; --save-dev&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; @js-temporal/polyfill&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Dokumentation empfiehlt, den Polyfill auf folgende Weise zu importieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;@js-temporal/polyfill&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tut das nicht! Der Polyfill enthält den kompletten JavaScript-Code für alle Objekte und Methoden der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt; 
API. Dieser Import würde die Bundle-Größe eurer Anwendung um &lt;strong&gt;etwa 150 kB&lt;/strong&gt; erhöhen.&lt;/p&gt;
&lt;p&gt;Stattdessen macht ihr folgendes.&lt;/p&gt;
&lt;h2 id=&quot;schritt-2-ein-globales-temporal-objekt-deklarieren&quot;&gt;Schritt 2: Ein globales &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  Objekt deklarieren&lt;/h2&gt;
&lt;p&gt;Erstellt eine neue Datei &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;src/types/temporal.d.ts&lt;/code&gt;  im Repository und fügt den folgenden Code ein:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Temporal&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; TemporalType&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;@js-temporal/polyfill&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;declare&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; global&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Temporal&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; typeof&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; TemporalType&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wir importieren nur die Typ-Definitionen für den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  Namespace aus dem Polyfill-Paket. Dann
deklarieren wir eine globale Konstante namens &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  und weisen ihr den importierten Typ zu. Auf diese
Weise teilen wir TypeScript mit, dass der Temporal-Namespace existiert und mehrere Objekte
wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Instant&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Now&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ZonedDateTime&lt;/code&gt;  enthält.&lt;/p&gt;
&lt;p&gt;Jetzt könnt ihr alle Features der Temporal API in jeder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.ts&lt;/code&gt;  Datei ohne zusätzlichen Import verwenden.
Zum Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; zdt&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ZonedDateTime&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;2026-01-30T12:34:56-04:00[America/New_York]&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Während der Laufzeit der Webanwendung wird das tatsächliche globale &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  Objekt des Browsers verwendet.&lt;/p&gt;
&lt;h2 id=&quot;schritt-3-typen-aus-dem-temporal-namespace-verwenden&quot;&gt;Schritt 3: Typen aus dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  Namespace verwenden&lt;/h2&gt;
&lt;p&gt;Das letzte Puzzleteil: Wenn ihr Temporal-Typen für Variablen oder Klassen-Eigenschaften verwenden möchtet, müsst ihr die
Typ-Definitionen wie folgt importieren und einsetzen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Temporal&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; TemporalType&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;@js-temporal/polyfill&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;interface&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MyInterface&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    property&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; TemporalType&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;ZonedDateTime&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;demo-anwendung&quot;&gt;Demo-Anwendung&lt;/h2&gt;
&lt;p&gt;Ich habe eine einfache &lt;a href=&quot;https://github.com/alexlehner86/temporal-api-angular-app&quot;&gt;Demo-App&lt;/a&gt; mit Angular 21 erstellt, in der ich
die oben genannten Schritte befolgt habe. Sie enthält eine Zeitzonen-Auswahl und einen einfachen Datumsrechner. Beides war dank
der eleganten und mächtigen &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal&quot;&gt;Temporal API&lt;/a&gt;
superleicht zu implementieren.&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/temporal-api-angular-app/&quot; title=&quot;Demo: Temporal API Angular App&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Wenn ihr gerade mit der Arbeit an einer neuen Angular-Anwendung begonnen habt, probiert es doch aus! &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt; 
ist einfach großartig und ihr werdet euch schnell in die API verlieben. 😉&lt;/p&gt;</content:encoded><category>angular</category><category>calendar</category><category>date</category><category>javascript</category><category>temporal</category><category>typescript</category><category>time</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_wrist_watch.jpg" length="0" type="image/jpeg"/></item><item><title>Meine ersten Schritte als Astronaut</title><link>https://www.oidaisdes.org/de/blog/astro-framework-first-steps</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/astro-framework-first-steps</guid><description>Die Vorteile des Web-Frameworks Astro für die Gestaltung meines Web-Dev-Blogs.</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich bin jetzt offiziell Astronaut! Nun ja, kein echter Astronaut, der ins All fliegt. Sondern ein begeisterter Nutzer
des Web-Frameworks &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Viele Mitglieder der Astro-Community bezeichnen sich liebevoll als &lt;span class=&quot;c-italic&quot;&gt;„Astronauten“&lt;/span&gt;  – in Anlehnung an
den Namen des Frameworks. Und jetzt bin ich einer von ihnen! Nachdem ich meinen Weblog vier Jahre lang mit &lt;a href=&quot;https://www.gatsbyjs.com/&quot;&gt;Gatsby&lt;/a&gt;
gestaltet habe, war es an der Zeit für einen Neuanfang mit einem anderen Framework.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-cottonbro-astronaut.GBSE7KHP_qC0rG.webp&quot; srcset=&quot;/_astro/pexels-cottonbro-astronaut.GBSE7KHP_27B4Ch.webp 640w, /_astro/pexels-cottonbro-astronaut.GBSE7KHP_10WvE3.webp 750w, /_astro/pexels-cottonbro-astronaut.GBSE7KHP_rhmq8.webp 828w, /_astro/pexels-cottonbro-astronaut.GBSE7KHP_16LbC7.webp 1080w, /_astro/pexels-cottonbro-astronaut.GBSE7KHP_Oc7Lp.webp 1280w, /_astro/pexels-cottonbro-astronaut.GBSE7KHP_Z1IDPsT.webp 1668w, /_astro/pexels-cottonbro-astronaut.GBSE7KHP_Z1jrNz8.webp 2048w, /_astro/pexels-cottonbro-astronaut.GBSE7KHP_8I1j3.webp 2560w, /_astro/pexels-cottonbro-astronaut.GBSE7KHP_qC0rG.webp 3500w&quot; alt=&quot;Ein Mann in einem weißen Ledermantel, der einen Astronauten-Helm trägt.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 3500px) 3500px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;3500&quot; height=&quot;2333&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © cottonbro / pexels.com&lt;/p&gt;
&lt;p&gt;Ich erkläre euch, warum ich Gatsby hinter mir gelassen habe und was mir an Astro gefällt.&lt;/p&gt;
&lt;h2 id=&quot;warum-nicht-länger-gatsby&quot;&gt;Warum nicht länger Gatsby?&lt;/h2&gt;
&lt;p&gt;Ich muss zugeben, dass ich einfach faul war! Im Jänner 2022 habe ich meinen Weblog mit Gatsby 4 aufgesetzt. Nachdem ich mit der
Konfiguration zufrieden war und alles gut funktionierte, habe ich mich nie wieder um das Setup gekümmert. Auch die Abhängigkeiten
des Projekts habe ich nie aktualisiert.&lt;/p&gt;
&lt;p&gt;Das Setup hat einfach funktioniert. Also habe ich meine Zeit lieber damit verbracht, mit neuen Web-Features zu experimentieren
und Blogbeiträge zu schreiben.&lt;/p&gt;
&lt;p&gt;Jetzt, vier Jahre später, musste ich mir eingestehen, dass meine Konfiguration völlig veraltet war! Die Gatsby-CLI fühlte sich
klobig und langsam an, und der Produktions-Build meines Weblogs dauerte bis zu 15 Minuten. Furchtbar!&lt;/p&gt;
&lt;p&gt;Mein erster Gedanke war, auf die neueste Gatsby-Version zu aktualisieren und meine Konfiguration zu optimieren. Aber dann stieß
ich auf GitHub-Issues wie &lt;a href=&quot;https://github.com/gatsbyjs/gatsby/discussions/39062&quot;&gt;„Ist GatsbyJS offiziell tot?“&lt;/a&gt; und
&lt;a href=&quot;https://github.com/gatsbyjs/gatsby/issues/38696&quot;&gt;„Wird Gatsby eingestellt?“&lt;/a&gt;. Anscheinend wird das Framework nicht mehr aktiv
weiterentwickelt und ist hoffnungslos veraltet.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;c-italic&quot;&gt;„Es ist Zeit für was Neues!“,&lt;/span&gt;  lautete meine Schlussfolgerung. Nach etwas Recherche zu verschiedenen
Frameworks für statische Seitengenerierung entschied ich mich für Astro.&lt;/p&gt;
&lt;h2 id=&quot;was-mir-an-anstro-gefällt&quot;&gt;Was mir an Anstro gefällt&lt;/h2&gt;
&lt;p&gt;Ich habe jetzt die Einrichtung meines Weblogs mit Astro abgeschlossen und dabei die Grundfunktionen beibehalten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Eine zweisprachige Website in Englisch und Deutsch.&lt;/li&gt;
&lt;li&gt;Eine Startseite mit einer kurzen Einführung und einer Liste der neuesten Blogbeiträge.&lt;/li&gt;
&lt;li&gt;Eine „Über mich”-Seite mit weiteren Informationen über mich und die Website.&lt;/li&gt;
&lt;li&gt;Ein Blogarchiv mit Links zu allen meinen veröffentlichten Beiträgen.&lt;/li&gt;
&lt;li&gt;Blogbeiträge, die aus Markdown-Dateien erstellt wurden.&lt;/li&gt;
&lt;li&gt;Automatische Erstellung von RSS-Dateien.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Umstellung auf Astro verlief ziemlich reibungslos – dank der vertrauten Komponentenstruktur und der integrierten Unterstützung
für Markdown. Besonders gefallen mir folgende Features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Das Framework bietet eine sehr detaillierte &lt;a href=&quot;https://docs.astro.build/en/getting-started/&quot;&gt;Dokumentation&lt;/a&gt;, einschließlich eines
interaktiven Tutorials zum Erstellen eines Blogs. Perfekt für meinen Anwendungsfall! Es gibt sogar mehrere Migrationsanleitungen,
z.B. &lt;a href=&quot;https://docs.astro.build/en/guides/migrate-to-astro/from-gatsby/&quot;&gt;Migration von Gatsby&lt;/a&gt;, in denen die wichtigsten Unterschiede
erläutert werden.&lt;/li&gt;
&lt;li&gt;Astro-Komponenten (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.astro&lt;/code&gt;  Dateien) erleichtern die Implementierung grundlegender Bausteine für verschiedene
Seiten. Wenn ihr mit JSX vertraut seid, werdet ihr euch sofort zurechtfinden! 🤩&lt;/li&gt;
&lt;li&gt;Standardmäßig rendert Astro eure Webseiten in schnelles, statisches HTML. Wenn ihr interaktive JavaScript-Logik benötigt, definiert
einfach eine &lt;a href=&quot;https://docs.astro.build/en/concepts/islands/&quot;&gt;Client-Insel&lt;/a&gt;: eine interaktive UI-Komponente, die separat vom Rest der
Seite hydriert wird. Damit habe ich meiner Blog-Archivseite eine Filterkomponente hinzugefügt. Hat wunderbar funktioniert!&lt;/li&gt;
&lt;li&gt;Es gibt eine lebendige Community und eine Menge Plugins.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;die-zukunft-sieht-rosig-aus&quot;&gt;Die Zukunft sieht rosig aus&lt;/h2&gt;
&lt;p&gt;Ich bin sehr glücklich mit meinem neuen Framework. Die Arbeit mit Astro macht einfach Spaß. Und ich habe das Gefühl, dass ich erst an
der Oberfläche dessen gekratzt habe, was möglich ist.&lt;/p&gt;
&lt;p&gt;Hoffentlich bleibt Astro noch lange Open Source und aktiv. Ich möchte nicht in ein paar Jahren wieder das Framework wechseln müssen. 😝&lt;/p&gt;</content:encoded><category>astro</category><category>dx</category><category>framework</category><category>tools</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_astronaut.jpg" length="0" type="image/jpeg"/></item><item><title>Flexible Menü-Animation mit verankerten Container Queries</title><link>https://www.oidaisdes.org/de/blog/anchored-container-queries</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/anchored-container-queries</guid><description>Wir können die aktuell aktive Fallback-Position mit CSS abfragen und andere Styles anwenden.</description><pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Chrome hat vor kurzem die neue Version 143 mit
&lt;a href=&quot;https://chromestatus.com/feature/5177580990496768&quot;&gt;Support für verankerte Container-Queries in CSS&lt;/a&gt; veröffentlicht. Mit
diesen Abfragen können wir den Inhalt eines verankerten Elements basierend auf der aktuellen Position relativ zum Anker
stylen. Einfach cool! 🤩&lt;/p&gt;
&lt;p&gt;Vor ein paar Monaten habe ich einen &lt;a href=&quot;/de/blog/accessible-popover-menu/&quot;&gt;Artikel über die Erstellung eines barrierefreien Menüs&lt;/a&gt; mit
der Popover API und CSS Anchor Positioning veröffentlicht. Damals habe ich gejammert, dass ich auf JavaScript zurückgreifen muss,
um die Skalierungs-Animation für verschiedene Positionen des Menüfelds relativ zum Menübutton umzusetzen.&lt;/p&gt;
&lt;p&gt;Jetzt ist das nicht mehr nötig! Ich zeige euch, wie ihr allein mit CSS die Animation des Menüfelds definieren könnt.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-snapwire-hands-with-anchors.BcKsEZ2y_Z1Ut9bf.webp&quot; srcset=&quot;/_astro/pexels-snapwire-hands-with-anchors.BcKsEZ2y_Z2spwf9.webp 640w, /_astro/pexels-snapwire-hands-with-anchors.BcKsEZ2y_Z6XciE.webp 750w, /_astro/pexels-snapwire-hands-with-anchors.BcKsEZ2y_8aydQ.webp 828w, /_astro/pexels-snapwire-hands-with-anchors.BcKsEZ2y_ZagQQO.webp 1080w, /_astro/pexels-snapwire-hands-with-anchors.BcKsEZ2y_1gXFmH.webp 1280w, /_astro/pexels-snapwire-hands-with-anchors.BcKsEZ2y_Z1Ut9bf.webp 1600w&quot; alt=&quot;Zwei Hände mit verschränkten Zeigefingern. Beide Zeigefinger haben ein schwarzes Anker-Tattoo.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1060&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Snapwire / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;die-grundlagen-verankerter-container-queries&quot;&gt;Die Grundlagen verankerter Container Queries&lt;/h2&gt;
&lt;p&gt;Das Dokument &lt;a href=&quot;https://www.w3.org/TR/css-anchor-position-2/&quot;&gt;CSS Anchor Positioning Module Level 2&lt;/a&gt; definiert den neuen
Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchored&lt;/code&gt;  für die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;container-type&lt;/code&gt;  Eigenschaft. Konkret heißt es:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;Establishes a query container for container queries, allowing for descendants of an anchor positioned element to be styled
based on certain features of the anchoring. (Currently, limited to which of the position-try-fallbacks are applied, if any.)&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In unserem Fall haben wir ein benutzerdefiniertes Menüfeld, das mit dem Menü-Button als Anker verbunden ist. Wenn
wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;container-type: anchored&lt;/code&gt;  für das Menüfeld setzen, wird es zum Abfrage-Container für die Position
des verankerten Elements.&lt;/p&gt;
&lt;p&gt;Dadurch können wir den Skalierungs-Effekt des Menüfelds an seine aktuelle Position anpassen, indem wir die neue
At-Regel &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@container anchored(fallback: …)&lt;/code&gt;  verwenden. Beispiel: Wenn das Menüfeld oben links neben
der Schaltfläche platziert ist, lassen wir es aus der unteren rechten Ecke herauswachsen.&lt;/p&gt;
&lt;p&gt;Bevor wir uns dem HTML- und CSS-Code widmen, werft erstmal einen Blick auf die fertige Demo des benutzerdefinierten Menüs.&lt;/p&gt;
&lt;h2 id=&quot;demo-barrierefreies-menü-mit-reiner-css-animation&quot;&gt;Demo: Barrierefreies Menü mit reiner CSS-Animation&lt;/h2&gt;
&lt;p&gt;Ich habe eine neue &lt;a href=&quot;https://codepen.io/alexlehner86/pen/KwzveJz&quot;&gt;CodePen-Demo&lt;/a&gt; erstellt, die viermal das gleiche Menüelement
enthält. Die Menü-Buttons sind grob bei den vier Ecken des Bildschirms platziert, damit ihr leicht testen könnt, wie die
Animation des Menüfelds dessen aktuelle Position berücksichtigt:&lt;/p&gt;
&lt;iframe title=&quot;Menu Anchor Positioning (with Container Query)&quot; src=&quot;https://codepen.io/alexlehner86/embed/KwzveJz?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/KwzveJz&quot;&gt;
Menu Anchor Positioning (with Container Query)&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Wenn euer Browser keine verankerten Container Queries unterstützt, wird das Menüfeld einfach nur eingeblendet. Ich zeige
euch, wie ihr den Skalierungseffekt als progressive Verbesserung implementiert.&lt;/p&gt;
&lt;h2 id=&quot;wie-ihr-flexible-animationen-mit-verankerten-container-queries-baut&quot;&gt;Wie ihr flexible Animationen mit verankerten Container Queries baut&lt;/h2&gt;
&lt;p&gt;Ich werde nicht alle Details meines barrierefreien Custom-Menüs wiederholen. Lest bitte zuerst meinen Artikel
&lt;a href=&quot;/de/blog/accessible-popover-menu/&quot;&gt;„Wir bauen ein barrierefreies Menü mit modernen Web-Features“&lt;/a&gt;, bevor es hier weitergeht.&lt;/p&gt;
&lt;h3 id=&quot;schritt-1-die-grundlegende-html-struktur&quot;&gt;Schritt 1: Die grundlegende HTML-Struktur&lt;/h3&gt;
&lt;p&gt;Damit die verankerte Container Query funktioniert, müssen wir die HTML-Struktur unseres Menüs leicht anpassen. Ich habe
zunächst versucht, direkt die Styles des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div[role=“menu”]&lt;/code&gt;  Elements zu ändern, aber es hat nicht
funktioniert. Warum ist das so?&lt;/p&gt;
&lt;p&gt;Die offizielle Spezifikation sagt eindeutig, dass eine verankerte Container Query nur das Stylen der &lt;strong&gt;Inhalte&lt;/strong&gt;
des positionierten Elements erlaubt. Das bedeutet, dass wir einen zusätzlichen inneren Container benötigen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;More options&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popovertarget&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-content-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;/* icon */&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-content-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-labelledby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popover&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-inner-box&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.menu-inner-box&lt;/code&gt;  Element ist ein Kind-Element des Menüfelds. Daher können wir
dessen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transform-origin&lt;/code&gt;  beliebig ändern, abhängig von der aktuellen Anker-Positionierung.&lt;/p&gt;
&lt;h3 id=&quot;schritt-2-animation-des-menüfelds&quot;&gt;Schritt 2: Animation des Menüfelds&lt;/h3&gt;
&lt;p&gt;Das Menüfeld sollte eingeblendet und vergrößert werden, wenn es geöffnet wird. Da wir die Transition auf ein Popover anwenden,
das von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt;  zu &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: flex&lt;/code&gt;  wechselt, müssen wir auch die
Eigenschaften &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;overlay&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt;  berücksichtigen. So sieht das Basis-Setup
für das Menüfeld aus:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* General animation and end of fade-out */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-property&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: opacity, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;overlay&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, display;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    transition-behavior: allow-discrete;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100ms&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-timing-function&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;linear&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wir definieren die Skalierungs-Animation separat für den inneren Container. Da das Menüfeld standardmäßig unterhalb und rechts
vom Menübutton positioniert wird, legen wir für den Skalierungseffekt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transform-origin: top left&lt;/code&gt;  fest:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; .menu-inner-box&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform-origin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-property&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: transform;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;inherit&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-timing-function&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;inherit&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Einblende-Animation soll 120 Millisekunden dauern und eine weiche kubisch-beziersche Zeitfunktion verwenden. Am Ende des
Übergangs ist das Popover vollständig sichtbar und auf 100 Prozent skaliert:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;popover-open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* End of fade-in and start of fade-out */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;120ms&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-timing-function&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cubic-bezier&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;popover-open&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; .menu-inner-box&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Da das Menüfeld von einem verborgenen in einen sichtbaren Zustand wechselt, gibt es keine berechneten Werte, die der Übergang
als Ausgangspunkt verwenden kann. Daher nutzen wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@starting-style&lt;/code&gt; , um die initiale Deckkraft auf 0
und die anfängliche Skalierung auf 80 Prozent zu setzen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Start of fade-in */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@starting-style&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;popover-open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;popover-open&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; .menu-inner-box&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.8&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Damit funktioniert die Skalierungs-Animation schon mal für die Standardplatzierung des Menüfelds. Als Nächstes verwenden wir
verankerte Container Queries, um die Animation an verschiedene Positionen anzupassen.&lt;/p&gt;
&lt;h3 id=&quot;schritt-3-positions-fallbacks&quot;&gt;Schritt 3: Positions-Fallbacks&lt;/h3&gt;
&lt;p&gt;Unser Menü-Button ist bereits implizit als Ankerelement des Menüfelds definiert. Daher reicht es, wenn wir eine Default-Position
sowie mehrere Fallbacks für das Menüfeld definieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;fixed&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    position-area: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; span-end;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    position-try-fallbacks: flip-block, flip-inline, flip-block flip-inline;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wenn das verankerte Element (das Menüfeld) seinen Containing Block überläuft, probiert der Browser automatisch die Liste
der alternativen Positionen aus, die mithilfe der Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position-try-fallbacks&lt;/code&gt;  definiert wurden.
Er verwendet die erste Alternative, die nicht über den Containing Block bzw. den Viewport hinausragt.&lt;/p&gt;
&lt;p&gt;Wie können wir erkennen, welche Fallback-Position vom Browser ausgewählt wurde? Zunächst machen wir das Menüfeld zum
Abfrage-Container für seine Ankerposition:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    container-type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: anchored;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt können wir den aktiven Fallback des verankerten Elements abfragen und die Animation entsprechend anpassen. Hier ist ein
Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@container&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; anchored(fallback: flip-block) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; .menu-inner-box&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform-origin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;bottom&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diese At-Regel wird wirksam, wenn die Position des Menüfelds nur in der Blockachse umgedreht wird. Das Menüfeld befindet sich
nun oberhalb des Menü-Buttons und wirkt beim Einblenden so, als würde es von unten links herauswachsen. Genial! 😍&lt;/p&gt;
&lt;p&gt;Die restlichen Container Queries, die wir für alle Positionen benötigen, findet ihr im CSS-Code meiner
&lt;a href=&quot;https://codepen.io/alexlehner86/pen/KwzveJz&quot;&gt;CodePen-Demo&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;schritt-4-progressive-verbesserung&quot;&gt;Schritt 4: Progressive Verbesserung&lt;/h3&gt;
&lt;p&gt;Zu guter Letzt möchten wir sicherstellen, dass die Animation des Menüfelds auch funktioniert, wenn ein Browser noch keine
verankerten Container Queries unterstützt. Mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@supports&lt;/code&gt;  At-Regel definieren wir den
Skalierungseffekt sowie die Container Queries nur dann, wenn der Browser diese unterstützt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@supports&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;container-type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: anchored) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        container-type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: anchored;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* Styles related to the scaling effect animation */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Progressive Verbesserung war noch nie so einfach!&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Anchor_positioning/Using&quot;&gt;Using CSS anchor positioning (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/position-try-fallbacks&quot;&gt;position-try-fallbacks (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/anchored-container-queries&quot;&gt;Detect fallback positions with anchored container queries from Chrome 143&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>animation</category><category>css</category><category>html</category><category>menu</category><category>popover</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_hands_with_anchors.jpg" length="0" type="image/jpeg"/></item><item><title>Lasst uns Akkordeon spielen: Das HTML details-Element im Fokus</title><link>https://www.oidaisdes.org/de/blog/lets-play-accordion</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/lets-play-accordion</guid><description>Ein detaillierter Blick auf die neuen Features des nativen Offenlegungs-Elements.</description><pubDate>Sat, 27 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Inhalte auf einer Website zu platzieren kann eine Herausforderung sein. Ihr möchtet eure Nutzer:innen nicht mit zu vielen
Infos auf einmal überfordern. Hierbei können Abschnitte mit Ein-/Ausblendfunktion hilfreich sein. Ein typisches
Beispiel hierfür wäre eine FAQ-Seite mit einer Liste von erweiterbaren Fragen und Antworten.&lt;/p&gt;
&lt;p&gt;Wir können das native HTML-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt;  verwenden, um ein solches Offenlegungs-Widget zu
erstellen. Das Element gibt es schon seit vielen Jahren, aber früher war es schwierig, es zu stylen und zu animieren. Dank
&lt;a href=&quot;https://wpt.fyi/interop-2025&quot;&gt;Interop 2025&lt;/a&gt; haben Browser die Implementierung des Elements erheblich verbessert und neue
Features hinzugefügt.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-jefferson-lucena-accordion-player.Bn-TfkHc_Z2sD12B.webp&quot; srcset=&quot;/_astro/pexels-jefferson-lucena-accordion-player.Bn-TfkHc_Z1Sefrw.webp 640w, /_astro/pexels-jefferson-lucena-accordion-player.Bn-TfkHc_1YhjI0.webp 750w, /_astro/pexels-jefferson-lucena-accordion-player.Bn-TfkHc_ZOpVTx.webp 828w, /_astro/pexels-jefferson-lucena-accordion-player.Bn-TfkHc_Z1C553K.webp 1080w, /_astro/pexels-jefferson-lucena-accordion-player.Bn-TfkHc_1H4RTi.webp 1280w, /_astro/pexels-jefferson-lucena-accordion-player.Bn-TfkHc_Z2sD12B.webp 1600w&quot; alt=&quot;Ein älterer Mann sitzt auf einem Stuhl vor einer Tür und spielt Akkordeon.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Jefferson Lucena / pexels.com&lt;/p&gt;
&lt;p&gt;Ich werde kurz die Grundlagen des nativen HTML-Elements erläutern. Anschließend sehen wir uns die neuen Funktionen an. 🤩&lt;/p&gt;
&lt;h2 id=&quot;das-details-html-element&quot;&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt;  HTML-Element&lt;/h2&gt;
&lt;p&gt;Das native &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/details&quot;&gt;Details-Element&lt;/a&gt; erstellt ein
Offenlegungs-Widget. Die in diesem Element enthaltenen Informationen sind nur sichtbar, wenn das Widget in einen offenen Zustand
versetzt wird. Mit dem HTML-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;  geben wir dem Widget eine Beschriftung. Hier ein
Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;An interesting question?&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;A fascinating answer!&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mit nur wenigen Zeilen Code erhalten wir ein vollständig barrierefreies Offenlegungs-Widget. Es vermittelt seinen Namen, seine
Rolle und seinen aktuellen Status an assistive Technologien und ist vollständig über die Tastatur bedienbar.&lt;/p&gt;
&lt;h2 id=&quot;neue-features&quot;&gt;Neue Features&lt;/h2&gt;
&lt;h3 id=&quot;exklusive-akkordeons-mit-dem-name-attribut&quot;&gt;Exklusive Akkordeons mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;name&lt;/code&gt;  Attribut&lt;/h3&gt;
&lt;p&gt;Eine Akkordeon-Komponente ist ein gängiges UI-Muster, das auf vielen Websites zu finden ist. Es besteht aus mehreren Widgets,
die einzeln erweitert und reduziert werden können.&lt;/p&gt;
&lt;p&gt;Eine Variante des Akkordeon-Musters ist das &lt;span class=&quot;c-italic&quot;&gt;exklusive Akkordeon,&lt;/span&gt;  bei dem jeweils nur ein Abschnitt geöffnet
sein kann. Mit dem Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;name&lt;/code&gt;  könnt ihr eine Liste von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt;  Elementen
zum exklusiven Akkordeon machen. Hier ein Code-Ausschnitt aus meiner &lt;a href=&quot;https://codepen.io/alexlehner86/pen/gbbJLZd&quot;&gt;CodePen-Demo&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;faq&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;What is the Doctor&amp;#39;s real name?&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;I&amp;#39;ll never tell!&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;faq&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Who are the Daleks?&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;The Daleks are...&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt sind die einzelnen Offenlegungs-Widgets miteinander verknüpft. Wenn ihr einen der Abschnitte im Akkordeon öffnet, schließt
der Browser automatisch alle anderen Abschnitte. Probiert es selbst aus:&lt;/p&gt;
&lt;iframe title=&quot;FAQ Accordion with Details Element&quot; src=&quot;https://codepen.io/alexlehner86/embed/gbbJLZd?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/gbbJLZd&quot;&gt;
FAQ Accordion with Details Element&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;inhalte-mit-details-content-stylen&quot;&gt;Inhalte mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::details-content&lt;/code&gt;  stylen&lt;/h3&gt;
&lt;p&gt;Ihr könnt den erweiterbaren Inhalt des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt;  Elements ganz einfach mit dem neuen
CSS-Pseudo-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::details-content&lt;/code&gt;  stylen. Hier ist ein Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details-content&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;rgb&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;54&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;69&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;79&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    line-height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.3&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    padding-inline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Darüber hinaus können wir das Pseudo-Element verwenden, um das Öffnen und Schließen des Widgets zu animieren. Unser Ziel ist es,
den Inhalt sanft von null zur vollen Höhe anwachsen zu lassen. Um dies zu erreichen, sind wir auf die noch experimentelle
CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;interpolate-size&lt;/code&gt;  angewiesen, die derzeit
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/interpolate-size#browser_compatibility&quot;&gt;nur in Chromium-Browsern unterstützt wird&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aber keine Sorge! Wir können die Animation als progressive Verbesserung implementieren. Mithilfe
von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@supports&lt;/code&gt;  wenden wir die Animation nur an, wenn der Browser sie auch unterstützt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@supports&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (interpolate-size: allow-keywords) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    details&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        interpolate-size: allow-keywords;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        &amp;amp;::details-content {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            height: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            overflow-y&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;clip&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                height &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.35s&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ease&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                content-visibility &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.35s&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ease&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; allow-discrete;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    details&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]::&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details-content&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich weiß, dass in dem obigen CSS-Code viel passiert. Ich werde es Schritt für Schritt erklären:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Standardmäßig unterstützen Browser keine Animationen und Übergänge, die einen intrinsischen Größenwert
wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;auto&lt;/code&gt;  beinhalten. Wir aktivieren dieses Verhalten, indem
wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;interpolate-size: allow-keywords&lt;/code&gt;  setzen.&lt;/li&gt;
&lt;li&gt;Wir setzen die initiale Höhe des Inhalts auf null (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;height: 0&lt;/code&gt; ) und schneiden überstehenden Inhalt ab.&lt;/li&gt;
&lt;li&gt;Mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition&lt;/code&gt;  definieren wir die Animation der Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;height&lt;/code&gt; . Wir müssen
auch die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;content-visibility&lt;/code&gt;  einbeziehen, die vom Browser automatisch gesetzt wird, wenn das
Details-Element erweitert oder reduziert wird. Mehr Informationen findet ihr im Artikel
zu &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/transition-behavior&quot;&gt;transition-behavior&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Schließlich setzen wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;height: auto&lt;/code&gt;  für den Inhalt, wenn das Details-Element geöffnet ist.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Öffnet meine &lt;a href=&quot;https://codepen.io/alexlehner86/pen/gbbJLZd&quot;&gt;CodePen-Demo&lt;/a&gt; in Chrome oder Edge, um euch selbst von den flüssigen
Animationen zu überzeugen. 😎&lt;/p&gt;
&lt;h3 id=&quot;benutzerdefinierter-indikator-für-offengeschlossen&quot;&gt;Benutzerdefinierter Indikator für offen/geschlossen&lt;/h3&gt;
&lt;p&gt;Browser zeigen das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt;  Element in der Regel mit einem kleinen Dreieck an, das sich dreht,
um den geöffneten/geschlossenen Zustand anzuzeigen. Dieser Indikator sieht je nach Plattform und Browser anders aus.&lt;/p&gt;
&lt;p&gt;Um das Dreieck durch einen benutzerdefinierten Indikator zu ersetzen, müssen wir den Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: list-item&lt;/code&gt; 
des Elements &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;  überschreiben. Ich verwende Flexbox, da dies mein gewünschtes Layout unterstützt.
Ihr könnt aber beispielsweise auch &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: block&lt;/code&gt;  setzen.&lt;/p&gt;
&lt;p&gt;Darüber hinaus müssen wir auch die Pseudo-Elemente für das Standard-Dreieck ausblenden. Dazu
gehört &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::-webkit-details-marker&lt;/code&gt; , das im Safari-Browser verwendet wird:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; summary&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;flex&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    align-items&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    justify-content&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;space-between&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    gap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    &amp;amp;::marker,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    &amp;amp;::-webkit-details-marker {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        display: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Als Nächstes definieren wir unseren benutzerdefinierten Indikator. Ich möchte ein Pfeilsymbol anzeigen, das nach unten zeigt, wenn
das Offenlegungs-Widget geschlossen ist. Dank modernem CSS benötigen wir keine Bilder oder Icon-Fonts. Wir können die Form einfach
mit dem Pseudo-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::after&lt;/code&gt;  und der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;clip-path&lt;/code&gt;  zeichnen.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; summary::after&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    --shape-chevron-width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    --s&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calc&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--shape-chevron-width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    content&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    aspect-ratio&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;currentColor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    clip-path&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;polygon&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--s&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;50%&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--s&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;), &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;50%&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; calc&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--s&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    flex-shrink&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--shape-chevron-width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich habe ein Code-Beispiel von der Website &lt;a href=&quot;https://css-shape.com/chevron/&quot;&gt;CSS Shape&lt;/a&gt; adaptiert. Dort findet ihr unzählige
Code-Schnipsel für reine CSS-Formen, die mit einem einzigen Element und modernem CSS erstellt wurden. Schaut euch die Website
unbedingt einmal an! 🥰&lt;/p&gt;
&lt;p&gt;Schließlich möchten wir, dass das Pfeilsymbol nach oben zeigt, wenn das Offenlegungs-Widget geöffnet ist. Natürlich sollte
der Übergang animiert sein. Hier ist der Code:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    summary::after {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        rotate: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0deg&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: rotate &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.35s&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ease&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    &amp;amp;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;summary::after&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        rotate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-180deg&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span lang=&quot;fr&quot;&gt;Et voilà!&lt;/span&gt; Wir haben das Standard-Dreieck durch ein Pfeilsymbol ersetzt, das auf
allen Plattformen und Browsern gleich aussieht. Hier ist das Endergebnis:&lt;/p&gt;
&lt;iframe title=&quot;Accordion with Custom Arrows&quot; src=&quot;https://codepen.io/alexlehner86/embed/KwVPYOw?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/KwVPYOw&quot;&gt;
Accordion with Custom Arrows&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;flexbox-und-grid-layouts&quot;&gt;Flexbox und Grid-Layouts&lt;/h3&gt;
&lt;p&gt;Früher war es nicht möglich, den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt;  Wert des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt;  Elements
zu ändern. Diese Einschränkung wurde nun in allen gängigen Browsern
(z.B. &lt;a href=&quot;https://www.firefox.com/en-US/firefox/143.0/releasenotes/&quot;&gt;Firefox 143&lt;/a&gt;) aufgehoben.&lt;/p&gt;
&lt;p&gt;Endlich ist es möglich, Grid- oder Flex-Layouts für &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt;  zu verwenden.
Weitere Informationen findet ihr im Artikel
&lt;a href=&quot;https://developer.chrome.com/blog/styling-details&quot;&gt;„More options for styling &amp;lt;details&amp;gt;”&lt;/a&gt; im Chrome Developer Blog.&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Die Elemente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;details&amp;gt;&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;summary&amp;gt;&lt;/code&gt;  sind großartig! Dank der
neuen Features können wir ganz einfach Widgets zum Ein- und Ausblenden und sogar exklusive Akkordeons mit benutzerdefinierten
Stilen und Animationen erstellen.&lt;/p&gt;
&lt;p&gt;Das bedeutet: Es gibt eine weitere Art von Inhalten, die wir mit nativen Webfunktionen erstellen können. Wir brauchen keine
UI-Bibliotheken und deren lästige Neigung zu Breaking Changes mehr. Ich liebe das (native) Web! ❤️&lt;/p&gt;</content:encoded><category>accessibility</category><category>accordion</category><category>css</category><category>disclosure</category><category>html</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_accordion_player.jpg" length="0" type="image/jpeg"/></item><item><title>Eine barrierefreie Tabelle mit anklickbaren Zeilen bauen</title><link>https://www.oidaisdes.org/de/blog/table-with-clickable-rows</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/table-with-clickable-rows</guid><description>Erweitere die Reichweite der Schaltflächen, um Tastaturbedienung und Screenreader zu unterstützen.</description><pubDate>Mon, 25 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Tabellen auf Websites zeigen meistens statische Informationen in Zeilen und Spalten an. Aber was ist, wenn ihr die Zeilen
anklickbar machen möchtet, z.B. um weitere Informationen anzuzeigen? Euer erster Gedanke könnte sein,
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Element/click_event&quot;&gt;Klick-Ereignis-Handler&lt;/a&gt; auf die Tabellenzeilen
(&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;tr&amp;gt;&lt;/code&gt; ) zu setzen, um sie anklickbar zu machen. Bitte lasst die Finger davon!&lt;/p&gt;
&lt;p&gt;Eine Tabellenzeile mit einem Klick-Ereignis-Handler wird nicht auf magische Weise zu einem barrierefreien Steuerelement. Ihr
könnt die Zeile nicht mit der Tastatur ansteuern, geschweige denn das Klick-Ereignis mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ENTER&lt;/code&gt;  Taste
auslösen. Der Zweck des Klick-Ereignis-Handlers wäre für Screenreader-Nutzer:innen unklar. Was können wir also tun?&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_2KOwy.webp&quot; srcset=&quot;/_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_2cBSYI.webp 640w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_Z2u04mc.webp 750w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_wFhz6.webp 828w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_1jOAML.webp 1080w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_2jFsiu.webp 1280w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_2KOwy.webp 1600w&quot; alt=&quot;Eine Frau berührt den Bildschirm eines Smartphones mit ihrem Zeigefinger.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1068&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Kampus Production / pexels.com&lt;/p&gt;
&lt;p&gt;Um eine barrierefreie Tabelle mit anklickbaren Zeilen zu erstellen, nehmen wir einfach ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;button&amp;gt;&lt;/code&gt;  Element
und erhöhen dessen Reichweite, sodass es die gesamte Zeile abdeckt. Meine Lösung ist inspiriert von Adrian Rosellis Artikel
&lt;a href=&quot;https://adrianroselli.com/2023/11/dont-turn-a-table-into-an-aria-grid-just-for-a-clickable-row.html&quot;&gt;„Don’t Turn a Table into an ARIA Grid Just for a Clickable Row“&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;demo-tabelle-mit-anklickbaren-zeilen&quot;&gt;Demo: Tabelle mit anklickbaren Zeilen&lt;/h2&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://codepen.io/alexlehner86/pen/VYvdLZZ&quot;&gt;CodePen-Demo&lt;/a&gt; erstellt, die mehrere Filme von
&lt;a href=&quot;https://en.wikipedia.org/wiki/Studio_Ghibli&quot;&gt;Studio Ghibli&lt;/a&gt; in Tabellenform auflistet. Durch Anklicken einer Zeile öffnet sich
ein Dialogfeld mit weiteren Informationen zum Film:&lt;/p&gt;
&lt;iframe title=&quot;Table with Clickable Row&quot; src=&quot;https://codepen.io/alexlehner86/embed/VYvdLZZ?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/VYvdLZZ&quot;&gt;
Table with Clickable Row&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;der-aufbau-der-barrierefreien-tabelle&quot;&gt;Der Aufbau der barrierefreien Tabelle&lt;/h2&gt;
&lt;h3 id=&quot;die-ideale-lösung&quot;&gt;Die ideale Lösung&lt;/h3&gt;
&lt;p&gt;Wir fügen ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;button&amp;gt;&lt;/code&gt;  Element in die letzte Tabellenzelle jeder Zeile ein. Der barrierefreie Name
der Schaltfläche (&lt;span class=&quot;c-italic&quot; lang=&quot;en&quot;&gt;“More Information”&lt;/span&gt; ) zusammen mit der Zeilenüberschrift
(das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;th&amp;gt;&lt;/code&gt;  Element in der Zeile) informiert Screenreader-Nutzer:innen über den Zweck des Steuerelements:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Spirited Away&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;th&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;2001&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;2h 4m&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;info-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;More Information&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;/* icon */&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;td&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;tr&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der Button ist standardmäßig über die Tastatur bedienbar. Wir müssen lediglich visuell vermitteln, dass die gesamte Tabellenzeile
fokussiert ist. Dazu können wir die CSS-Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-within&lt;/code&gt;  verwenden:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; tbody&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; tr&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    &amp;amp;:focus-within, &amp;amp;:hover {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        outline: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.188rem&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; black&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        outline-offset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-0.313rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    button:focus&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf diese Weise wird die Tabellenzeile bei Hover mit der Maus hervorgehoben oder wenn die Schaltfläche innerhalb der Zeile den
Fokus erhält.&lt;/p&gt;
&lt;p&gt;Schließlich möchten wir die Schaltfläche auslösen, wenn jemand auf die Tabellenzeile klickt. Um dies zu erreichen, verwenden wir
das Pseudo-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::after&lt;/code&gt;  zusammen mit der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inset&lt;/code&gt; :&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; tbody&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; tr&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    button::after {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        content&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        inset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Pseudo-Element ist relativ zu seinem übergeordneten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;tr&amp;gt;&lt;/code&gt;  Element absolut positioniert und
deckt dank &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inset: 0&lt;/code&gt;  die gesamte Tabellenzeile ab. Jetzt zählt ein Klick auf die Tabellenzeile als Klick
auf die darin enthaltene Schaltfläche. Genial! 🤩&lt;/p&gt;
&lt;p&gt;Es gibt nur ein Problem: Das ganze &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=240961&quot;&gt;funktioniert (aktuell) nicht in Safari&lt;/a&gt;. Die
Definition &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position: relative&lt;/code&gt;  für das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;tr&amp;gt;&lt;/code&gt;  Element wird einfach ignoriert. 🤬&lt;/p&gt;
&lt;h3 id=&quot;die-safari-kompatible-version&quot;&gt;Die Safari-kompatible Version&lt;/h3&gt;
&lt;p&gt;Solange der WebKit-Fehler nicht behoben ist, benötigen wir einen Workaround. Ich habe eine
&lt;a href=&quot;https://codepen.io/alexlehner86/pen/NPGzQbK&quot;&gt;alternative CodePen-Demo&lt;/a&gt; erstellt, die auch in Safari funktioniert:&lt;/p&gt;
&lt;iframe title=&quot;Table with Clickable Row (Safari Support)&quot; src=&quot;https://codepen.io/alexlehner86/embed/NPGzQbK?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/NPGzQbK&quot;&gt;
Table with Clickable Row (Safari Support)&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Die Lösung ist etwas umständlich, aber sie funktioniert. Anstatt die Tabellenzeile als relativen Anker zu verwenden, positionieren
wir das Pseudo-Element relativ zu seinem übergeordneten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;td&amp;gt;&lt;/code&gt;  Element. Seht selbst:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    overflow&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;clip&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;table&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; tbody&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; tr&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    td:has(button) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    button::after&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        content&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        inset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100vw&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wir setzen die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;left&lt;/code&gt;  des Pseudo-Elements auf &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;auto&lt;/code&gt;  zurück und legen
seine Breite auf 100 % der Viewport-Breite fest. Zusätzlich setzen wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;overflow: clip&lt;/code&gt;  für die Tabelle,
um die Reichweite jeder Schaltfläche auf die tatsächliche Breite der Tabellenzeile zu beschränken.&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Wie ihr seht, ist es gar nicht so schwer, eine barrierefreie Tabelle mit anklickbaren Zeilen zu erstellen. Denkt immer daran, dass
nicht alle eure Nutzer:innen eine Maus oder ein Touch-Gerät verwenden. Testet daher immer auch mit der Tastatur und Screenreadern. 😉&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>html</category><category>keyboard</category><category>table</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_finger_tap_smartphone.jpg" length="0" type="image/jpeg"/></item><item><title>Wir bauen ein barrierefreies Menü mit modernen Web-Features</title><link>https://www.oidaisdes.org/de/blog/accessible-popover-menu</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessible-popover-menu</guid><description>Eine Schritt-für-Schritt-Anleitung auf Basis der Popover API und CSS Anchor Positioning.</description><pubDate>Mon, 14 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wir alle kennen Menüelemente auf Websites. Ein &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/menubar/&quot;&gt;Menü&lt;/a&gt; ist ein Widget, das
den Nutzer:innen eine Liste von Optionen bietet, z.B. eine Reihe von Aktionen. Solche Menüs verhalten sich wie native
Betriebssystem-Menüs und sollten nicht mit &lt;a href=&quot;/de/blog/accessible-navigation-menu/&quot;&gt;Navigationsmenüs&lt;/a&gt; verwechselt werden, die
üblicherweise im Header der Seite platziert werden.&lt;/p&gt;
&lt;p&gt;Leider verhält sich das vorhandene &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;menu&amp;gt;&lt;/code&gt;  Element nicht wie erwartet. Es gibt
&lt;a href=&quot;https://open-ui.org/components/menu.explainer/&quot;&gt;Pläne, das native Element anzupassen&lt;/a&gt;, aber in der Zwischenzeit müssen wir
unser eigenes Menü erstellen. Wir könnten eine Menükomponente aus einer UI-Bibliothek verwenden. Das würde eine weitere
Abhängigkeit im Projekt und möglicherweise &lt;span lang=&quot;en&quot;&gt;Breaking Changes&lt;/span&gt; in der Zukunft bedeuten. Lieber nicht.&lt;/p&gt;
&lt;p&gt;Aber es gibt gute Nachrichten! Dank neuer Web-Features wie der &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover API&lt;/a&gt;
und &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning&quot;&gt;CSS Anchor Positioning&lt;/a&gt; ist es viel einfacher
geworden, ein benutzerdefiniertes Menüelement zu erstellen. Lasst uns gemeinsam ein barrierefreies Menü erstellen!&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_14UB5b.webp&quot; srcset=&quot;/_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_utH8m.webp 640w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_Z2tTReH.webp 750w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_1uFmq9.webp 828w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_Z1WCApy.webp 1080w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_ZTSXNp.webp 1280w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_14UB5b.webp 1600w&quot; alt=&quot;Ein Skateboarder mitten im Sprung, wie ein Menüfeld das plötzlich auftaucht.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1007&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Zachary DeBottis / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;was-wir-erreichen-wollen&quot;&gt;Was wir erreichen wollen&lt;/h2&gt;
&lt;p&gt;Unser selbstgebautes Menü sollte die folgenden Anforderungen erfüllen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Das Menü ist komplett barrierefrei, sprich:
&lt;ul&gt;
&lt;li&gt;Es vermittelt seine Rolle und Status an assistive Technologien wie Bildschirmlesegeräte.&lt;/li&gt;
&lt;li&gt;Es unterstützt die Tastaturbedienung und hat einen sichtbaren Fokusindikator.&lt;/li&gt;
&lt;li&gt;Der Text und die grafischen Elemente haben einen ausreichenden Farbkontrast.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Innerhalb des Menüfelds können Nutzer:innen einen von mehreren Menüpunkten aktivieren. Der Einfachheit halber unterstützen
wir keine verschachtelten Menüs (vielleicht probiere ich das später mal aus).&lt;/li&gt;
&lt;li&gt;Das Menüfeld öffnet sich neben der Auslösetaste und bleibt beim Scrollen daran haften.&lt;/li&gt;
&lt;li&gt;Das Öffnen und Schließen des Menüfelds ist flüssig animiert.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ich zeige euch, wie ihr dies Schritt für Schritt erreichen könnt. Aber werft zuerst einmal einen Blick auf das Ergebnis.&lt;/p&gt;
&lt;h2 id=&quot;demo-barrierefreies-menü&quot;&gt;Demo: Barrierefreies Menü&lt;/h2&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://codepen.io/alexlehner86/pen/pvJKxQR&quot;&gt;CodePen-Demo&lt;/a&gt; erstellt, die viermal das gleiche Menüelement enthält.
Die Menübuttons sind grob bei den vier Ecken des Bildschirms platziert, damit ihr leicht testen könnt, wie die Platzierung
des Menüfelds den verfügbaren Platz berücksichtigt:&lt;/p&gt;
&lt;iframe title=&quot;Menu Anchor Positioning Testcase&quot; src=&quot;https://codepen.io/alexlehner86/embed/pvJKxQR?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/pvJKxQR&quot;&gt;
Menu Anchor Positioning Testcase&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;aufbau-des-menüelements-schritt-für-schritt&quot;&gt;Aufbau des Menüelements Schritt für Schritt&lt;/h2&gt;
&lt;h3 id=&quot;schritt-1-die-grundlegende-html-struktur&quot;&gt;Schritt 1: Die grundlegende HTML-Struktur&lt;/h3&gt;
&lt;p&gt;Wir definieren eine Icon-Schaltfläche mit einem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-label&lt;/code&gt; , um ihren Zweck für Screenreader-User:innen
zu kommunizieren. Daneben platzieren wir einen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Container mit mehreren Schaltflächen darin, was unser
Menüfeld darstellt. Die Attribute &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“menu”&lt;/code&gt;  für den Container und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“menuitem”&lt;/code&gt; 
für die einzelnen Schaltflächen vermitteln die korrekten Rollen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;More options&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;/* icon */&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-labelledby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;More information&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Share&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Download the file&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mit CSS gestalten wir unseren Menü-Button so, dass er eine ausreichende Zielgröße und Farbkontrast hat. Wir verwandeln das
Menüfeld in einen Flex-Container, der die Menüoptionen in einer Spalte anordnet. Hier ist ein Auszug:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button.menu-btn&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#00514c&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* other styling */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;flex&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    flex-direction&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;column&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    margin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.25rem&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* other styling */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Was haben wir bisher? Einen Icon-Button mit einer stets sichtbaren Liste von Schaltflächen daneben. Nun bauen wir auf dieser
Grundlage auf, um unser barrierefreies Menü zu erstellen.&lt;/p&gt;
&lt;h3 id=&quot;schritt-2-die-popover-api-für-das-menüfeld-nutzen&quot;&gt;Schritt 2: Die Popover API für das Menüfeld nutzen&lt;/h3&gt;
&lt;p&gt;Als Nächstes fügen wir das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut dem Menüfeld hinzu. Dadurch ist das Menüfeld beim Laden
der Seite zunächst ausgeblendet. Wenn das Popover angezeigt wird, wird es im &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Top_layer&quot;&gt;Top-Layer&lt;/a&gt;
eingefügt, sodass es über allen anderen Seiteninhalten angezeigt wird.&lt;/p&gt;
&lt;p&gt;Wir wollen, dass unser Menü-Button steuert, wann das Menüfeld ein- oder ausgeblendet wird. Um diese Verbindung herzustellen,
weisen wir dem Popover-Element eine &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;id&lt;/code&gt;  zu und setzen das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popovertarget&lt;/code&gt; 
mit diesem ID-Wert auf dem Menü-Button. Hier ist das Endergebnis:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popovertarget&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-content-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;More options&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;/* icon */&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popover&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-content-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-labelledby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    /* menu items */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diese einfachen Schritte bringen uns bereits eine Menge Features: Der Menü-Button öffnet und schließt das Panel, er übermittelt
seinen Status an assistive Technologien (wie es &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-expanded&lt;/code&gt;  tun würde), wir erhalten Light-Dismiss und
eine gewisse Tastaturbedienbarkeit. Weitere Infos enthält der MDN-Artikel
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API/Using&quot;&gt;Using the Popover API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ein wichtiger Hinweis zur Gestaltung von Popover-Inhalten: Wenn ihr ein Flexbox- oder Grid-Layout verwenden möchten, solltet ihr
den Wert der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt;  Eigenschaft des Popover nur ändern, wenn das Popover geöffnet ist. Andernfalls würdet
ihr den Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt;  überschreiben, wenn das Popover geschlossen ist, so dass es immer sichtbar ist.
Hier ist ein Code-Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    flex-direction&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;column&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    margin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.25rem&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* other styling */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    &amp;amp;:popover-open {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        display: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;flex&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;schritt-3-menü-platzierung-mit-css-anchor-positioning&quot;&gt;Schritt 3: Menü-Platzierung mit CSS Anchor Positioning&lt;/h3&gt;
&lt;p&gt;Um eine visuelle Verbindung zwischen Menü-Button und dem zugehörigen Menüfeld herzustellen, müssen wir sie nebeneinander platzieren.
Und wir wollen sicherstellen, dass das Menüfeld beim Button haften bleibt, z.B. beim Scrollen. Historisch gesehen würde dies die
Verwendung einer JavaScript-Overlay-Bibliothek erfordern. Wie nervig!&lt;/p&gt;
&lt;p&gt;Zum Glück erledigt das neue Feature &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_anchor_positioning&quot;&gt;CSS Anchor Positioning&lt;/a&gt;
diese Aufgabe für uns. Sie ist derzeit Teil der &lt;a href=&quot;https://wpt.fyi/interop-2025&quot;&gt;Interop 2025&lt;/a&gt; und sollte bis Ende des Jahres in allen
Browsern unterstützt werden.&lt;/p&gt;
&lt;p&gt;Generell müsst ihr ein Ankerelement mit der Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor-name&lt;/code&gt;  definieren. Dann bindet ihr ein anderes
Element mit der Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position-anchor&lt;/code&gt;  an diesen Anker an. Im Falle von Popover-Elementen müsst ihr
jedoch nichts von alledem tun. Ein Blick in die &lt;a href=&quot;https://www.w3.org/TR/css-anchor-position-1/#implicit&quot;&gt;Spezifikation&lt;/a&gt; zeigt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;Some specifications can define that, in certain circumstances, a particular element is
an &lt;strong&gt;implicit anchor element&lt;/strong&gt; for another element. Implicit anchor elements can be
referenced with the &lt;strong&gt;auto&lt;/strong&gt; keyword in position-anchor.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Genau das gilt für eine Schaltfläche, die als Popover-Steuerelement dient, wie unser Menü-Button. Das bedeutet: Wir sind startklar!
Unser Menü-Button ist bereits implizit als Ankerelement des Menüfelds definiert.&lt;/p&gt;
&lt;p&gt;Wo wollen wir das Menüfeld platzieren? Wie wäre es unterhalb und rechts von der Schaltfläche? Wir könnten dies mit der
CSS-Funktion &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor()&lt;/code&gt;  erreichen. Ich bevorzuge aber die elegantere &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position-area&lt;/code&gt;  Eigenschaft.
Werft einen Blick darauf:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    position-area: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; span-end;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stellt euch das Ankerelement und die sie umgebende Fläche als ein 3x3-Raster vor. Der erste Wert, den wir definieren, bezieht sich
auf die Blockachse, der zweite auf die Inline-Achse. So bedeutet &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position-area: end span-end&lt;/code&gt; , dass wir
unser Menüfeld am Ende der Blockachse (unterhalb des Buttons) platzieren und es von der Mitte bis zum Ende der Inline-Achse aufspannen.&lt;/p&gt;
&lt;p&gt;Aber was passiert, wenn der Menü-Button am rechten Bildschirmrand platziert ist? Oder wenn die Scroll-Position der Seite die Schaltfläche
am unteren Rand des Bildschirms platziert? In beiden Fällen reicht der Platz nicht aus, um das Menüfeld mit allen Optionen unterhalb
und rechts vom Menü-Button anzuzeigen.&lt;/p&gt;
&lt;p&gt;Mit Hilfe der Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position-try-fallbacks&lt;/code&gt;  können wir dieses Problem leicht lösen. Ihr definiert einfach
eine Liste mit einer oder mehreren alternativen Positionen. Wenn das Element andernfalls seinen Inhaltsblock überfüllen würde,
versucht der Browser, das positionierte Element in den verschiedenen Fallback-Positionen zu platzieren.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;position-try-fallbacks&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;flip-block&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;flip-inline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;flip-block&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; flip-inline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Im Grunde sagen wir dem Browser: Wenn unter dem Menü-Button nicht genug Platz ist, dann platziere das Menüfeld oberhalb der Schaltfläche.
Nicht genug Platz auf der rechten Seite? Ok, dann dreh die Inline-Achse um und lass das Menüfeld den Platz von links bis zur Mitte
abdecken. Und wenn keines von beiden alleine funktioniert, dann mach beides (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;flip-block flip-inline&lt;/code&gt; ).&lt;/p&gt;
&lt;h3 id=&quot;schritt-4-tastaturbedienbarkeit-mit-javascript&quot;&gt;Schritt 4: Tastaturbedienbarkeit mit JavaScript&lt;/h3&gt;
&lt;p&gt;Unser benutzerdefiniertes Menü sollte für Tastaturbenutzer:innen vollständig bedienbar sein. Das
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/menubar/&quot;&gt;ARIA APG Menu Pattern&lt;/a&gt; definiert die folgenden Anforderungen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wenn ein Menü geöffnet wird, wird der Tastaturfokus auf das erste Element gesetzt.&lt;/li&gt;
&lt;li&gt;Mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Tab&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Shift + Tab&lt;/code&gt;  kann der Fokus nicht zwischen den Menüoptionen verschoben
werden.&lt;/li&gt;
&lt;li&gt;Wenn sich der Fokus in einem Menü befindet, verschiebt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Pfeil-nach-unten&lt;/code&gt;  den Fokus zum nächsten Element,
wobei man optional vom letzten zum ersten Element wechselt.&lt;/li&gt;
&lt;li&gt;Wenn sich der Fokus in einem Menü befindet, verschiebt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Pfeil-nach-oben&lt;/code&gt;  den Fokus zum vorherigen Element,
wobei man optional vom ersten zum letzten Element wechselt.&lt;/li&gt;
&lt;li&gt;Wenn sich der Fokus auf einer Option im Menü befindet, bewegen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Tab&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Shift + Tab&lt;/code&gt; 
den Fokus aus dem Menü hinaus und alle Menüs und Untermenüs werden geschlossen.&lt;/li&gt;
&lt;li&gt;Mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Enter&lt;/code&gt;  wird die Menüoption aktiviert und das Menü geschlossen.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Escape&lt;/code&gt;  schließt das Menü, das den Fokus enthält, und fokussiert den Menü-Button.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für die letzte Anforderung ist dank der Popover API bereits gesorgt. Für den Rest müssen wir etwas JavaScript-Code implementieren
und unsere HTML-Struktur anpassen. Zunächst setzen wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;tabindex=“-1”&lt;/code&gt;  für alle Menüoptionen, um sie aus der
Fokusreihenfolge herauszunehmen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popover&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-content-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-labelledby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; tabindex&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;More information&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; tabindex&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Share&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; tabindex&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Download the file&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich habe eine JavaScript-Klasse namens &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;MenuNavigationHandler&lt;/code&gt;  geschrieben, welche die erforderliche
Interaktivität des benutzerdefinierten Menüelements kapselt. Einfach eine neue Instanz der Klasse erstellen, wobei ihr ein konkretes
Menüelement als Parameter übergebt. Hier ist ein Auszug aus dem Code:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MenuNavigationHandler&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    constructor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuBtn&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; document&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getAttribute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;aria-labelledby&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuItems&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Array&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;children&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;selectedItem&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;selectedItemIndex&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        // Handle interaction with menu&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;toggle&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;onMenuOpen&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;keydown&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;onMenuKeydown&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;click&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;onMenuClick&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    // Private methods&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; menus&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; document&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;div[role=&amp;quot;menu&amp;quot;]&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menus&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; MenuNavigationHandler&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;));&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der Konstruktor speichert Verweise auf den Menü-Button und das Menüfeld. Er fügt Event-Listener für das Popover-Toggle-Ereignis
sowie für Keydown- und Click-Ereignisse auf dem Menüfeld hinzu. Ihr könnt euch den gesamten Code in meiner
&lt;a href=&quot;https://codepen.io/alexlehner86/pen/pvJKxQR&quot;&gt;CodePen demo&lt;/a&gt; ansehen.&lt;/p&gt;
&lt;h3 id=&quot;schritt-5-flüssige-animationen-hinzufügen&quot;&gt;Schritt 5: Flüssige Animationen hinzufügen&lt;/h3&gt;
&lt;p&gt;Nicht zuletzt soll das benutzerdefinierte Menü gut aussehen und sich gut anfühlen. Wir verwenden CSS-Transitionen, um das Öffnen
und Schließen des Menüfelds zu animieren.&lt;/p&gt;
&lt;p&gt;Das Menüfeld sollte eingeblendet und vergrößert werden, wenn es geöffnet wird. Da wir die Transition auf ein Popover anwenden,
das von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt;  zu &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: flex&lt;/code&gt;  wechselt, müssen wir auch die
Eigenschaften &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;overlay&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt;  berücksichtigen.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: opacity, transform, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;overlay&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, display;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    transition-behavior: allow-discrete;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Einblende-Animation soll 120 Millisekunden dauern und eine weiche kubisch-beziersche Zeitfunktion verwenden. Am Ende
des Übergangs ist das Popover vollständig sichtbar und auf 100 Prozent skaliert:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;popover-open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* End of fade-in and start of fade-out */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;120ms&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-timing-function&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cubic-bezier&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Da das Menüfeld von einem verborgenen in einen sichtbaren Zustand wechselt, gibt es keine berechneten Werte, die der Übergang
als Ausgangspunkt verwenden kann. Daher nutzen wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@starting-style&lt;/code&gt; , um die initiale Deckkraft
auf 0 und die anfängliche Skalierung auf 80 Prozent zu setzen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@starting-style&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* Start of fade-in */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;popover-open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.8&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um nun die Endwerte für die Ausblendung zu definieren, lassen wir einfach die Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:popover-open&lt;/code&gt; 
weg und definieren die Stile für das Menüelement direkt. Wir wollen eine zügigere, lineare Animation, die nur 100 Millisekunden dauert:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* End of fade-out */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100ms&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition-timing-function&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;linear&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Na gut, die Animation sieht schon ziemlich cool aus. Wir könnten es dabei belassen. Aber ich möchte noch etwas erreichen: Das
Menüfeld soll aus dem Menü-Button herauswachsen. Da wir die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transform&lt;/code&gt;  für den Skalierungseffekt
verwenden, müssen wir einfach den Ursprung wie folgt definieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;transform-origin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: top left;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aber es gibt ein Problem! Der Ursprung sollte sich an die Platzierung des Menüfelds neben dem Menü-Button anpassen. Wenn sich das
Menüfeld zum Beispiel oberhalb und links von der Schaltfläche öffnet, müssen wir als Ursprung &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;bottom right&lt;/code&gt; 
festlegen.&lt;/p&gt;
&lt;p&gt;Leider wirken sich die von uns definierten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position-try-fallbacks&lt;/code&gt;  nicht auf die
Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transform-origin&lt;/code&gt;  aus. Ich habe auch versucht, benutzerdefinierte Positions-Optionen mit
der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@position-try&lt;/code&gt;  Regel zu definieren. Aber dann wurde mir klar, dass die Spezifikation (und die
Browser-Implementierung) nur eine sehr begrenzte Anzahl von Eigenschaften zulässt. Es hat einfach nicht funktioniert.&lt;/p&gt;
&lt;p&gt;In der &lt;a href=&quot;https://www.w3.org/TR/css-anchor-position-1/#fallback-rule&quot;&gt;Spezifikation&lt;/a&gt; gibt es aber einen Hinweis, der mich für die
Zukunft hoffen lässt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;It is expected that a future extension to container queries will allow querying an element based on the position fallback it’s
using, enabling the sort of conditional styling not allowed by this restricted list.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In der Zwischenzeit müssen wir auf das gute alte JavaScript zurückgreifen. Wenn das Menüfeld geöffnet wird, rufen wir die
folgende Methode der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;MenuNavigationHandler&lt;/code&gt;  Klasse auf, um den
passenden &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transform-origin&lt;/code&gt;  festzulegen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;setTransformOriginOnMenuPanel&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; menuPanelPos&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; menuTriggerBtnPos&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuBtn&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; originY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; menuTriggerBtnPos&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;y&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; menuPanelPos&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;y&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;bottom&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;top&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; originX&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; menuTriggerBtnPos&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; menuPanelPos&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;right&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;left&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;menuEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;setAttribute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;style&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;`transform-origin: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;originY&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; ${&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;originX&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;;`&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich weiß, es ist ein bisschen holprig. Aber es funktioniert! Zumindest in Chrome und Edge. Ich werde das ganze benutzerdefinierte
Menü in Firefox und Safari gründlich testen müssen, wenn sie endlich CSS Anchor Positioning unterstützen.&lt;/p&gt;
&lt;h2 id=&quot;bonus-benutzerdefiniertes-menü-in-angular&quot;&gt;Bonus: Benutzerdefiniertes Menü in Angular&lt;/h2&gt;
&lt;p&gt;Wenn ihr das JavaScript-Framework &lt;a href=&quot;https://angular.dev/&quot;&gt;Angular&lt;/a&gt; weder kennt noch euch dafür interessiert, dann überspringt
bitte diesen Abschnitt.&lt;/p&gt;
&lt;p&gt;Ihr seid immer noch hier? Gut, dann schaut euch mein &lt;a href=&quot;https://github.com/alexlehner86/accessible-popover-menu/&quot;&gt;Accessible Popover Menu project&lt;/a&gt;
an. Es enthält die benutzerdefinierten Direktiven &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CustomMenuTrigger&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CustomMenu&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CustomMenuItem&lt;/code&gt; . Diese Direktiven kapseln alle Funktionen, die ich bisher in diesem Artikel beschrieben habe.
Ihr könnt sie verwenden, um barrierefreie Menü-Komponenten in eurem Angular-Projekt zu erstellen.&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Die Popover-API und CSS Anchor Positioning sind einfach genial! Sie machen es so viel einfacher, komplexe Widgets wie ein
benutzerdefiniertes Menü zu erstellen, wie ich euch gezeigt habe. Ich werde noch einen gründlichen Testlauf in Firefox und Safari
durchführen, sobald diese ebenfalls die Ankerpositionierung unterstützen. Aber ich bin sehr optimistisch! 🤩&lt;/p&gt;
&lt;p&gt;Ich hoffe, dieser Artikel inspiriert euch dazu, selbst mit den neuen Web-Features zu experimentieren. Ich bin gespannt, welche Art
von Widgets und Komponenten ihr damit baut!&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 23.11.2025 &lt;/h2&gt; 
&lt;p&gt;Verankerte Container Queries werden ab Chrome 143 unterstützt. Also vergesst den Einsatz von JavaScript für Animationen in diesem
Artikel. Lest stattdessen meinen neuen Artikel
&lt;a href=&quot;/de/blog/anchored-container-queries/&quot;&gt;“Flexible Menü-Animation mit verankerten Container Queries”&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>html</category><category>menu</category><category>popover</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_skateboarder_jump.jpg" length="0" type="image/jpeg"/></item><item><title>Bringe Screen Reader mit der ARIA Notify API zum Sprechen</title><link>https://www.oidaisdes.org/de/blog/aria-notify-first-look</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/aria-notify-first-look</guid><description>Ein erster Blick auf die neue API, die eine Alternative zu ARIA-Live-Regionen darstellt.</description><pubDate>Thu, 22 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Du drückst auf den Suchen-Button und der Seiteninhalt wird aktualisiert, um die Ergebnisse anzuzeigen.
Oder du klickst auf die Schaltfläche &lt;span class=&quot;c-italic&quot;&gt;„Zum Warenkorb hinzufügen“&lt;/span&gt;  und das
Einkaufswagen-Symbol im Header erhält einen visuellen Indikator, dass ein Produkt hinzugefügt wurde.
Typische Abläufe auf modernen Websites.&lt;/p&gt;
&lt;p&gt;Eine sehende Person kann einfach die visuelle Veränderung des Seiteninhalts wahrnehmen. Aber was ist mit
blinden und sehbehinderten Nutzer:innen? Wie können sie wichtige Änderungen bemerken, die nicht den
Tastaturfokus erhalten? Aktuell müssen Webentwickler:innen
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Guides/Live_regions&quot;&gt;ARIA-Live-Regionen&lt;/a&gt;
verwenden, um Statusmeldungen zu erstellen, die von Screenreadern vorgelesen werden.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_1wVGnY.webp&quot; srcset=&quot;/_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_Z2p6vgj.webp 640w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_Z5JGJK.webp 750w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_Z5mTMC.webp 828w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_Z1jTfWC.webp 1080w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_ZgEpoJ.webp 1280w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_1wVGnY.webp 1600w&quot; alt=&quot;Eine Frau spricht in ein Megaphon.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Edmond Dantès / pexels.com*&lt;/p&gt;
&lt;p&gt;Leider sind ARIA-Live-Regionen eng an DOM-Elemente gekoppelt, die aktualisiert werden müssen. In manchen
Fällen wäre es jedoch einfacher, den Screenreader einfach einen bestimmten Text vorlesen zu lassen. Das
ist die Idee hinter der neuen &lt;a href=&quot;https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/Accessibility/AriaNotify/explainer.md&quot;&gt;ARIA Notify API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Microsoft Edge hat vor kurzem &lt;a href=&quot;https://blogs.windows.com/msedgedev/2025/05/05/creating-a-more-accessible-web-with-aria-notify/&quot;&gt;die neue API als Ursprungstest implementiert&lt;/a&gt;.
Also habe ich ein Demoprojekt erstellt, um die neue Funktionalität auszuprobieren. Das sind meine Eindrücke.&lt;/p&gt;
&lt;h2 id=&quot;wie-funktioniert-aria-notify&quot;&gt;Wie funktioniert ARIA Notify?&lt;/h2&gt;
&lt;p&gt;ARIA Notify ist eine imperative Benachrichtigungs-API, welche die Nutzung von ARIA-Live-Regionen ersetzen
soll, wenn eine visuelle Darstellung des Textes nicht notwendig ist. Die API bietet eine einfache
Möglichkeit, assistiven Technologien wie Screenreadern genau mitzuteilen, was sie den Nutzer:innen wann
vorlesen sollen.&lt;/p&gt;
&lt;p&gt;Entwickler:innen können die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ariaNotify()&lt;/code&gt;  Methode mit dem Text aufrufen, der vom
Screenreader vorgelesen werden soll. Hier ist ein Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ariaNotify&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;This is an audible notification&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Optional könnt ihr mit der Option &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;priority&lt;/code&gt;  angeben, wie der Screenreader die
Benachrichtigung im Vergleich zu anderen, noch ausstehenden Benachrichtigungen einstufen soll:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;ariaNotify&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Critical error&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;priority:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;high&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wollt ihr es ausprobieren?&lt;/p&gt;
&lt;h2 id=&quot;demo-online-shop-mit-warenkorb&quot;&gt;Demo: Online-Shop mit Warenkorb&lt;/h2&gt;
&lt;p&gt;Ich habe eine CodePen-Demo eines Online-Shops namens &lt;span class=&quot;c-italic&quot;&gt;„The Shop“&lt;/span&gt;  gebaut. Ihr könnt
Produkte wie &lt;span class=&quot;c-italic&quot;&gt;„Fancy Stuff“&lt;/span&gt;  oder &lt;span class=&quot;c-italic&quot;&gt;„Useless Junk“&lt;/span&gt;  in den
Einkaufswagen legen. Der Einkaufswagen zeigt visuell an, dass Produkte hinzugefügt wurden. Screenreader-Nutzer:innen
hören eine Meldung wie z.B. &lt;span class=&quot;c-italic&quot;&gt;„Artikel Fancy Stuff wurde dem Warenkorb hinzugefügt.“&lt;/span&gt; &lt;/p&gt;
&lt;iframe title=&quot;Shop Demo with ARIA Notify API&quot; src=&quot;https://codepen.io/alexlehner86/embed/VYYNQyr?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/VYYNQyr&quot;&gt;
Shop Demo with ARIA Notify API&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Während ich diesen Blogbeitrag schreibe, wird die ARIA Notify-API nur als Testversion in Microsoft Edge
unterstützt. Ihr müsst &lt;a href=&quot;https://www.microsoft.com/de-de/edge/download/insider&quot;&gt;Edge Canary&lt;/a&gt; installieren und
den Browser mit dem folgenden Befehl starten:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;shell&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;&amp;quot;C:\Users\[username]\AppData\Local\Microsoft\Edge SxS\Application\msedge.exe&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; --enable-blink-features=AriaNotify&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Flag &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt; -enable-blink-features=AriaNotify&lt;/code&gt;  aktiviert die ARIA Notify API. Nun sollte
euer Screenreader eine Meldung ausgeben, wenn ihr ein Produkt in den Einkaufswagen legt. Ich habe das
erfolgreich mit den aktuellen Versionen von &lt;a href=&quot;https://www.nvaccess.org/download/&quot;&gt;NVDA&lt;/a&gt; und
&lt;a href=&quot;https://www.freedomscientific.com/products/software/jaws/&quot;&gt;JAWS&lt;/a&gt; getestet.&lt;/p&gt;
&lt;h2 id=&quot;erste-eindrücke&quot;&gt;Erste Eindrücke&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mir gefällt, wie direkt und einfach zu nutzen die neue API ist. Man ruft einfach &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ariaNotify()&lt;/code&gt; 
auf und der Screenreader liest die Nachricht vor. Großartig! 🤩&lt;/li&gt;
&lt;li&gt;Das W3C wird bald die Liste an ausreichenden Techniken auf
&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/status-messages.html&quot;&gt;WCAG 4.1.3 Status Messages&lt;/a&gt;
aktualisieren müssen. 😅&lt;/li&gt;
&lt;li&gt;Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;priority&lt;/code&gt;  Option hat in meinen Testfällen nicht wirklich einen Unterschied
gemacht. Ich habe eine &lt;a href=&quot;https://codepen.io/alexlehner86/pen/KwwYGwJ&quot;&gt;zweite Demo&lt;/a&gt; mit einem Toggle für hohe
oder normale Priorität erstellt. Aber die Screenreader-Ankündigungen kamen zur gleichen Zeit. Vielleicht
habe ich etwas missverstanden. 😩&lt;/li&gt;
&lt;li&gt;Webentwickler:innen müssen mit der neuen API sehr vorsichtig sein. Wenn es so einfach ist, einen Screenreader
einfach Text vorlesen zu lassen, dann besteht die Gefahr, dass die Nutzer:innen mit zu vielen Meldungen
überflutet werden. Ich denke da an Autoplay-Karussells, die ständig Statusmeldungen ausgeben! 😨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wie auch immer. Wir befinden uns noch in einer sehr frühen, experimentellen Phase. Ich werde abwarten, bis
auch andere Browser die neue API implementiert haben, und sie ein wenig reifen lassen. Dann werde ich es
auf mehr Plattformen testen, insbesondere auf mobilen Geräten.&lt;/p&gt;
&lt;p&gt;Generell bin ich begeistert und optimistisch, was die ARIA Notify API angeht.&lt;/p&gt;</content:encoded><category>accessibility</category><category>aria</category><category>javascript</category><category>screenreader</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_megaphone.jpg" length="0" type="image/jpeg"/></item><item><title>Datums- und Zeitverwaltung mit der Temporal API</title><link>https://www.oidaisdes.org/de/blog/temporal-api-first-look</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/temporal-api-first-look</guid><description>Sie ist zuverlässiger als Date und bietet Formatierungsoptionen und Zeitzonen-Unterstützung.</description><pubDate>Thu, 17 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hast du die Schnauze voll vom &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Date&lt;/code&gt;  Objekt in JavaScript? Ich auch! Zum Glück wird
sie bald von der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  API abgelöst. Diese umfasst mehrere Klassen für die
Datums- und Zeitverwaltung, einschließlich integrierter Zeitzonen- und Kalenderdarstellung.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-koolshooters-alarm-clock.DNReWSNw_Z1VcMh4.webp&quot; srcset=&quot;/_astro/pexels-koolshooters-alarm-clock.DNReWSNw_1NJApl.webp 640w, /_astro/pexels-koolshooters-alarm-clock.DNReWSNw_qeDqE.webp 750w, /_astro/pexels-koolshooters-alarm-clock.DNReWSNw_2o83eT.webp 828w, /_astro/pexels-koolshooters-alarm-clock.DNReWSNw_Z1jCX1k.webp 1080w, /_astro/pexels-koolshooters-alarm-clock.DNReWSNw_Z1cP0pB.webp 1280w, /_astro/pexels-koolshooters-alarm-clock.DNReWSNw_Z1VcMh4.webp 1600w&quot; alt=&quot;Eine Frau stützt ihre Arme auf einen Tisch und schaut auf den großen Wecker neben sich.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © KoolShooters / pexels.com&lt;/p&gt;
&lt;p&gt;Die neue API ist bereits in &lt;a href=&quot;https://blog.nightly.mozilla.org/&quot;&gt;Firefox Nightly&lt;/a&gt; verfügbar. Wir sehen uns
kurz die wichtigsten Funktionen von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  an. Danach zeige ich euch einige von
mir zusammengestellte Code-Beispiele.&lt;/p&gt;
&lt;h2 id=&quot;grober-überblick&quot;&gt;Grober Überblick&lt;/h2&gt;
&lt;p&gt;Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  API stellt über 200 Utility-Methoden über mehrere Klassen zur
Verfügung. Das ist eine ganze Menge! Ich werde daher nicht auf alle eingehen, sondern nur die wichtigsten
Funktionen nennen.&lt;/p&gt;
&lt;p&gt;Es gibt mehrere Objekte für die Arbeit mit einfachen Datums- und Zeitangaben, ohne Zeitzone:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal.PlainDate&lt;/code&gt;  stellt ein Kalenderdatum ohne Zeit oder Zeitzone dar.
Beispiel: 2025-04-14&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal.PlainTime&lt;/code&gt;  stellt eine Zeit ohne Datum oder Zeitzone dar. Beispiel:
21:10:30.025&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal.PlainDateTime&lt;/code&gt;  steht für ein Datum und eine Uhrzeit ohne Zeitzone.
Beispiel: 2025-04-14T21:10:30.025&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Zur Darstellung eines eindeutigen Zeitpunkts verwenden wir das Objekt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal.Instant&lt;/code&gt; .
Es ist semantisch identisch zu &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Date&lt;/code&gt; , aber präziser (im Nanosekundenbereich).&lt;/p&gt;
&lt;p&gt;Schließlich kommen wir zum Objekt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal.ZonedDateTime&lt;/code&gt; , das einen Zeitpunkt,
eine Zeitzone und ein Kalendersystem kombiniert. Beispiel: &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;2025-04-16T21:22:26.384+02:00[Europe/Vienna]&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;Außerdem können wir mit dem Objekt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal.Now&lt;/code&gt;  die aktuelle Zeit in
verschiedenen Formaten abrufen. Und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal.Duration&lt;/code&gt;  stellt eine
Differenz zwischen zwei Zeitpunkten dar, die wir auch in Datum/Zeit-Berechnungen verwenden können.&lt;/p&gt;
&lt;h2 id=&quot;code-beispiele&quot;&gt;Code-Beispiele&lt;/h2&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://github.com/alexlehner86/temporal-api-code-snippets/&quot;&gt;Liste von Code-Beispielen&lt;/a&gt;
für die Arbeit mit der neuen
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal&quot;&gt;Temporal API&lt;/a&gt;
in JavaScript zusammengestellt. Hier sind ein paar davon:&lt;/p&gt;
&lt;h3 id=&quot;ein-einfaches-datumsobjekt-erstellen-und-auf-teile-davon-zugreifen&quot;&gt;Ein einfaches Datumsobjekt erstellen und auf Teile davon zugreifen&lt;/h3&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; calendarDate&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;PlainDate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;2025-04-09&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;calendarDate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;day&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// 9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;calendarDate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;dayOfWeek&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;calendarDate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;month&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;calendarDate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;year&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// 2025&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;hinzufügen-einer-dauer-zu-einem-unveränderlichen-einfachen-zeitobjekt&quot;&gt;Hinzufügen einer Dauer zu einem unveränderlichen einfachen Zeitobjekt&lt;/h3&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; t1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;PlainTime&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;55&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;250&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// &amp;quot;14:55:10.25&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; t2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; t1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;seconds:&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 5000&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;t2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;toString&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// &amp;quot;16:18:30.25&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;sprachabhängige-formatierung-eines-datumzeit-objekts-mit-zeitzone&quot;&gt;Sprachabhängige Formatierung eines Datum/Zeit-Objekts mit Zeitzone&lt;/h3&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; datetime&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ZonedDateTime&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;2020-10-15T08:30Z[America/New_York]&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;datetime&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;toLocaleString&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;en-US&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// &amp;quot;10/15/2020, 4:30:00 AM EDT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;zwei-zeitpunkte-vergleichen&quot;&gt;Zwei Zeitpunkte vergleichen&lt;/h3&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; inst1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Instant&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;2022-07-10T12:00Z&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; inst2&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Instant&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;2023-01-01T15+01:00&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;inst1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;equals&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;inst2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);  &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Instant&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;compare&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;inst1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;inst2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// -1 (is before)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;runden-einer-dauer-auf-eine-bestimmte-einheit&quot;&gt;Runden einer Dauer auf eine bestimmte Einheit&lt;/h3&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; duration&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Temporal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;PlainTime&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;12:30&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;until&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;17:45&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// &amp;quot;PT5H15M&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;duration&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;round&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;hours&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// &amp;quot;PT5H&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;browser-unterstützung&quot;&gt;Browser-Unterstützung&lt;/h2&gt;
&lt;p&gt;Na, schon begeistert? Ich auf jeden Fall! Und es wird noch besser: Firefox wird bald der
erste Browser sein, der &lt;a href=&quot;https://groups.google.com/a/mozilla.org/g/dev-platform/c/RtsRo93ygO4/m/2YzM42GUBwAJ&quot;&gt;Temporal in einer stabilen Version ausliefert&lt;/a&gt;.
Firefox 139 soll am 27. Mai erscheinen.&lt;/p&gt;
&lt;p&gt;Die Implementierung in anderen Browsern ist noch in Arbeit
(&lt;a href=&quot;https://issues.chromium.org/issues/42201538&quot;&gt;Chromium&lt;/a&gt;, &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=223166&quot;&gt;WebKit/Safari&lt;/a&gt;).
Aber ich bin sicher, dass es nicht mehr lange dauert. In der Zwischenzeit: Macht euch
mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Temporal&lt;/code&gt;  in Firefox Nightly vertraut. 😉&lt;/p&gt;</content:encoded><category>calendar</category><category>date</category><category>javascript</category><category>temporal</category><category>time</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_alarm_clock.jpg" length="0" type="image/jpeg"/></item><item><title>Meine Lieblings-Tools zum Testen von Web-Accessibility</title><link>https://www.oidaisdes.org/de/blog/accessibility-testing-tools</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessibility-testing-tools</guid><description>Eine Auswahl an Bookmarklets, Browser-Erweiterungen und Tools zum Testen von Barrierefreiheit.</description><pubDate>Sun, 30 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Web-Accessibility hat viele Facetten: Die Bedienung mit der Tastatur und anderen Eingabegeräten,
Alternativtexte für Bilder, verständliche Überschriften und Fehlertexte, usw. Ebenso vielfältig ist das
Angebot an Tools, um die Barrierefreiheit von Websites zu testen.&lt;/p&gt;
&lt;p&gt;Eines gleich vorweg: Es gibt nicht das &lt;span class=&quot;c-italic&quot;&gt;eine Power-Tool&lt;/span&gt; , welches alle Barrieren
automatisch erkennt und am besten auch gleich behebt. Das gilt auch für KI-basierte Accessibility-Tools.
Ja, künstliche Intelligenz hat großes Potential, aber
&lt;a href=&quot;https://adrianroselli.com/2023/06/no-ai-will-not-fix-accessibility.html&quot;&gt;aktuelle Tools können keinen umfassenden Barrierefreiheits-Test&lt;/a&gt;
ersetzen. Auch wenn gewisse Leute im Rausch des
&lt;a href=&quot;https://www.forbes.com/sites/christianstadler/2024/09/06/the-generative-ai-hype-is-almost-over-whats-next/&quot;&gt;KI-Hypes&lt;/a&gt;
etwas anderes behaupten.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-thirdman-garden-tools.BBhn-nqG_1mivqq.webp&quot; srcset=&quot;/_astro/pexels-thirdman-garden-tools.BBhn-nqG_ZL8ANE.webp 640w, /_astro/pexels-thirdman-garden-tools.BBhn-nqG_Z2wRAX6.webp 750w, /_astro/pexels-thirdman-garden-tools.BBhn-nqG_1h7dE5.webp 828w, /_astro/pexels-thirdman-garden-tools.BBhn-nqG_Z2e3WOO.webp 1080w, /_astro/pexels-thirdman-garden-tools.BBhn-nqG_25jaXM.webp 1280w, /_astro/pexels-thirdman-garden-tools.BBhn-nqG_1mivqq.webp 1600w&quot; alt=&quot;Verschiedene Gartenwerkzeuge und Pflanzen auf einem Tisch.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Thirdman / pexels.com&lt;/p&gt;
&lt;p&gt;Damit das zarte Pflänzchen Barrierefreiheit gedeiht, brauchen wir die richtigen Werkzeuge. Hier ist meine
persönliche Auswahl an kostenlosen Bookmarklets, Browser-Erweiterungen und Tools zum Testen von Barrierefreiheit.&lt;/p&gt;
&lt;h2 id=&quot;struktur-und-semantik&quot;&gt;Struktur und Semantik&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wave.webaim.org/&quot;&gt;WAVE (Web Accessibility Evaluation Tools)&lt;/a&gt;: Ein Barrierefreiheits-Analysetool
von WebAIM. Als Browser-Erweiterung für Firefox, Chrome und Edge verfügbar. Besonders praktisch finde ich
die Struktur-Ansicht, wo man auf einen Blick sieht, ob sinnvolle Landmarks
(&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;header&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;main&lt;/code&gt;  etc.) und Überschriften-Ebenen
definiert wurden.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://firefox-source-docs.mozilla.org/devtools-user/accessibility_inspector/&quot;&gt;Firefox Accessibility Inspector&lt;/a&gt;
ist ein fixer Bestandteil der Firefox-Entwicklertools. Ihr wollt wissen, welche Informationen ein
interaktives Element an assistive Technologien übermittelt? Einfach Rechtsklick darauf
und &lt;span class=&quot;c-italic&quot;&gt;“Barrierefreiheit-Eigenschaften untersuchen”&lt;/span&gt;  auswählen. Firefox öffnet den
“Barrierefreiheit”-Tab in den Entwicklertools und springt zum zugehörigen Knoten im
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Accessibility_tree&quot;&gt;Accessiblity-Tree&lt;/a&gt;. Debugging war
noch nie so einfach! 😍&lt;/li&gt;
&lt;li&gt;Testen mit &lt;strong&gt;Screenreader&lt;/strong&gt;: Keine Barrierefreiheits-Prüfung ist komplett ohne
Screenreader-Tests. Angesichts begrenzter Budgets in Projekten, kann man nicht mit
&lt;a href=&quot;https://en.wikipedia.org/wiki/List_of_screen_readers&quot;&gt;allen Screenreadern auf allen Plattformen&lt;/a&gt; testen.
Auf der Basis &lt;a href=&quot;https://webaim.org/projects/screenreadersurvey10/&quot;&gt;aktueller Statistiken&lt;/a&gt; habe ich daher
folgende Testszenarien definiert:
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nvaccess.org/&quot;&gt;NVDA&lt;/a&gt; in Windows&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.apple.com/accessibility/vision/&quot;&gt;VoiceOver&lt;/a&gt; in iOS&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/accessibility/android/answer/6283677?hl=de&quot;&gt;TalkBack&lt;/a&gt; in Android&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Falls ihr noch nie mit dem Screenreader getestet habt, dann lest am besten meinen Artikel
&lt;a href=&quot;/de/blog/a11y-audits-screenreader/&quot;&gt;„5 Tipps für den Einstieg in Barrierefreiheits-Prüfungen mit dem Screenreader“&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ideal zum Testen der WCAG-Kriterien &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html&quot;&gt;1.3.1 Info und Beziehungen&lt;/a&gt;
und &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html&quot;&gt;4.1.2 Name, Rolle, Wert&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;tastaturbedienung&quot;&gt;Tastaturbedienung&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Testen mit &lt;strong&gt;Tastatur&lt;/strong&gt;: Mit der Tabulatortaste die interaktiven Elemente der Seite
(Buttons, Links etc.) durchgehen. Ist die Fokus-Reihenfolge sinnvoll? Können Tastatur-Nutzer:innen alle
interaktiven Elemente erreichen und aktivieren? Wird das fokussierte Element sichtbar hervorgehoben?
Am Smartphone oder Tablet könnt ihr einfach eine Bluetooth-Tastatur verbinden.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chromewebstore.google.com/detail/taba11y-tab-order-accessi/aocppmckdocdjkphmofnklcjhdidgmga&quot;&gt;taba11y&lt;/a&gt;:
Diese praktische Browser-Erweiterung berechnet die Tab-Reihenfolge aller interaktiven Elemente und stellt
sie visuell dar, entweder durch Zeichnen eines Pfades oder durch Hervorheben der Elemente.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ideal zum Testen der WCAG-Kriterien &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html&quot;&gt;2.1.1 Tastatur&lt;/a&gt;,
&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap&quot;&gt;2.1.2 Keine Tastaturfalle&lt;/a&gt;,
&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-order&quot;&gt;2.4.3 Fokus-Reihenfolge&lt;/a&gt; und
&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-visible&quot;&gt;2.4.7 Fokus sichtbar&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;responsive-inhalte&quot;&gt;Responsive Inhalte&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/edge/learning-center/how-to-change-font-size?form=MA13I2&quot;&gt;Browser-Einstellungen&lt;/a&gt;:
Ändere die Standardschriftgröße deines Browsers, um zu kontrollieren, ob die Website automatisch die
Textgröße anpasst. Die meisten Browser wie z.B. Edge erlauben nur die Auswahl aus vordefinierten
Optionen wie “Klein”, “Mittel” und “Groß”. Im &lt;a href=&quot;https://support.mozilla.org/en-US/kb/change-fonts-and-colors-websites-use&quot;&gt;Firefox&lt;/a&gt;
können Nutzer:innen hingegen einen konkreten Pixelwert als Standardschriftgröße definieren.&lt;/li&gt;
&lt;li&gt;Alternativ könnt ihr mit der Zoom-Funktion des Browsers (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;STRG&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;+&lt;/code&gt;  Taste) den gesamten Seiteninhalt proportional zur Schriftgröße vergrößern.&lt;/li&gt;
&lt;li&gt;Benutze das &lt;a href=&quot;https://codepen.io/stevef/full/YLMqbo&quot;&gt;Textabstände-Bookmarklet&lt;/a&gt; oder eine Browser-Erweiterung
(z.B. &lt;a href=&quot;https://chromewebstore.google.com/detail/editor-for-textlayout/amnelgbfbdlfjeaobejkfmjjnmeddaoj&quot;&gt;Editor for Textlayout&lt;/a&gt;),
um die Werte für Zeilenhöhe, Abstand nach Absätzen, Buchstabenabstand und Wortabstand auf die maximal
geforderten Werte zu setzen. Es sollten keine Inhalte abgeschnitten werden oder einander überlappen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ideal zum Testen der WCAG-Kriterien &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html&quot;&gt;1.4.4 Textgröße ändern&lt;/a&gt;,
&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/reflow&quot;&gt;1.4.10 Automatischer Umbruch (Reflow)&lt;/a&gt;
und &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/text-spacing&quot;&gt;1.4.12 Textabstand&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;zielgröße-von-interaktiven-elementen&quot;&gt;Zielgröße von interaktiven Elementen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://html5accessibility.com/stuff/2023/08/28/quick-and-very-dirty-target-size-checker/&quot;&gt;Target Size Bookmarklet&lt;/a&gt;:
Es identifiziert interaktive Elemente, errechnet deren Mittelpunkt und zeichnet einen halbtransparenten
Kreis von 24 mal 24 Pixeln um den Mittelpunkt des Elements: Ein grüner Kreis mit dickem Rand bedeutet, dass
die Zielgröße ausreicht. Elemente mit blauem Kreis sollten manuell untersucht werden.&lt;/li&gt;
&lt;li&gt;Auf diese Weise findet ihr viel schneller Buttons und Links, bei denen Nutzer:innen mit motorischer
Beeinträchtigung Probleme beim Anklicken oder Antippen haben könnten.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ideal zum Testen des WCAG-Kriteriums &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum&quot;&gt;2.5.8 Zielgröße (Minimum)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;mindestkontrast&quot;&gt;Mindestkontrast&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/overview&quot;&gt;Chrome Lighthouse&lt;/a&gt; ist Teil der Entwickler-Tools
in Chrome. Der Accessibility-Check von Lighthouse findet zuverlässig einen Großteil der Elemente mit zu
geringem Kontrastverhältnis.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/de-de/windows/powertoys/#color-picker&quot;&gt;PowerToys Farbwähler&lt;/a&gt;:
Die Microsoft PowerToys sind eine Sammlung von Hilfsprogrammen für Poweruser. Mit der
Tastenkombination &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;WIN&lt;/code&gt; +&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Umschalt&lt;/code&gt; +&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;C&lt;/code&gt; 
könnt ihr jederzeit den Farbwähler aktivieren und den Farbwert eines Pixels am Bildschirm auslesen.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webaim.org/resources/contrastchecker/&quot;&gt;WebAIM Contrast Checker&lt;/a&gt;: Einfaches Tool, um das
Kontrastverhältnis einer Schriftfarbe zur Hintergrundfarbe zu prüfen. Besonders praktisch ist das Feature,
dass man die gewählten Farbwerte inklusive Auswertung als Permalink teilen kann.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ideal zum Testen der WCAG-Kriterien &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html&quot;&gt;1.4.3 Kontrast (Minimum)&lt;/a&gt;
und &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast&quot;&gt;1.4.11 Nicht-Text-Kontrast&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;weitere-links&quot;&gt;Weitere Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/test-evaluate/tools/list/&quot;&gt;Web Accessibility Evaluation Tools List  (W3C)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://accessibility.huit.harvard.edu/testing&quot;&gt;Accessibility Testing Tools and Practices (Harvard University)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>bookmarklet</category><category>browser</category><category>screenreader</category><category>testing</category><category>tools</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_garden_tools.jpg" length="0" type="image/jpeg"/></item><item><title>Accessibility Engineering — Lass die Web-Plattform die Arbeit machen</title><link>https://www.oidaisdes.org/de/blog/accessibility-engineering-web-platform</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessibility-engineering-web-platform</guid><description>Nutze die Fähigkeiten nativer Buttons, Dialoge, Formularelemente und ausklappbarer Widgets.</description><pubDate>Mon, 03 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Web-Entwickler:innen haben es schwer. Du bekommst ein paar schriftliche Anforderungen und ein visuelles
Design. Du beginnst mit der Umsetzung: Du fügst HTML-Elemente hinzu, gestaltest sie mit CSS und
implementierst Geschäftslogik mit JavaScript. Du machst dir Gedanken über Usability, Web-Sicherheit,
Geschwindigkeit, Datenverwaltung und so weiter.&lt;/p&gt;
&lt;p&gt;Du atmest tief durch und sagst zu dir selbst: &lt;span class=&quot;c-italic&quot;&gt;„Ich schaffe das!“&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;Plötzlich ruft dein Projektmanager an: &lt;span class=&quot;c-italic&quot;&gt;„Die Website wird doch barrierefrei sein, oder?“&lt;/span&gt; 
Du gerätst in Panik und tippst das Wort Barrierefreiheit in die Suchmaschine ein. Du wirst mit Informationen
überflutet. Einige davon sind widersprüchlich. Du bittest ChatGPT um Hilfe. Es zeigt dir übertrieben
komplexen Code, der mit &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA&quot;&gt;ARIA-Attributen&lt;/a&gt;
gespickt ist. Seufz! Du denkst: &lt;span class=&quot;c-italic&quot;&gt;„Das wird eine Menge Arbeit!“&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;Ich habe gute Nachrichten für dich: Barrierefreiheit muss nicht anstrengend sein. Sie kann sogar ganz einfach
und, ich wage zu behaupten, wunderschön sein. Die &lt;a href=&quot;https://en.wikipedia.org/wiki/Web_platform&quot;&gt;Web-Plattform&lt;/a&gt;
ist dein Verbündeter. Lass sie einfach die Arbeit machen!&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-thisisengineering-code-woman.CY19Z2LT_Z1212uI.webp&quot; srcset=&quot;/_astro/pexels-thisisengineering-code-woman.CY19Z2LT_1Xeumo.webp 640w, /_astro/pexels-thisisengineering-code-woman.CY19Z2LT_Z1x5agx.webp 750w, /_astro/pexels-thisisengineering-code-woman.CY19Z2LT_1tAbEK.webp 828w, /_astro/pexels-thisisengineering-code-woman.CY19Z2LT_f2IKu.webp 1080w, /_astro/pexels-thisisengineering-code-woman.CY19Z2LT_5Y5Dg.webp 1280w, /_astro/pexels-thisisengineering-code-woman.CY19Z2LT_Z1212uI.webp 1600w&quot; alt=&quot;Code-Zeilen werden auf eine Frau projiziert, die in die Kamera blickt.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © ThisIsEngineering / pexels.com&lt;/p&gt;
&lt;p&gt;Wir werden einen kurzen Blick auf die Grundlagen des Webs werfen und wie man sie effizient einsetzt.
Dann gebe ich euch einige konkrete Beispiele für Web-Features mit eingebauter Barrierefreiheit.&lt;/p&gt;
&lt;h2 id=&quot;die-grundlegenden-werkzeuge-des-accessibility-engineering&quot;&gt;Die grundlegenden Werkzeuge des Accessibility Engineering&lt;/h2&gt;
&lt;p&gt;Die Web-Plattform ist eine Sammlung von Technologien, die vom &lt;a href=&quot;https://www.w3.org/&quot;&gt;World Wide Web Consortium&lt;/a&gt;
und anderen Gremien als offene Standards entwickelt wurden. Zu diesen Technologien gehören HTML, CSS,
JavaScript und WAI-ARIA. Diese Bausteine des Webs ermöglichen es uns, Websites zu gestalten, die für
alle Menschen zugänglich sind.&lt;/p&gt;
&lt;p&gt;Warum tun sich so viele Web-Entwickler:innen dann mit Barrierefreiheit so schwer?
Ich sehe dafür zwei Hauptgründe:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Übermäßige Abhängigkeit von externen Bibliotheken.&lt;/li&gt;
&lt;li&gt;Unzureichende Erfahrung mit nativen Web-Features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die meisten Junior-Developer lernen heutzutage Webentwicklung auf der Grundlage von Frameworks wie
&lt;a href=&quot;https://angular.dev/&quot;&gt;Angular&lt;/a&gt;, &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt; oder &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt;. Sie lernen
alles über Komponenten und Datenmanagement, machen sich aber kaum mit nativen HTML-Elementen und
fortgeschrittenen CSS-Features vertraut.&lt;/p&gt;
&lt;p&gt;Ich mache ihnen keinen Vorwurf! Moderne JavaScript-Frameworks und UI-Bibliotheken bieten mächtige Funktionen,
die uns bei der Implementierung komplexer Webanwendungen helfen. Aber sie sind eine weitere Ebene der
Abstraktion. Sie entfernen uns von den wesentlichen Bausteinen des Webs. Was können wir also tun?&lt;/p&gt;
&lt;h3 id=&quot;html-first-und-die-regel-der-geringsten-macht&quot;&gt;HTML First und die Regel der geringsten Macht&lt;/h3&gt;
&lt;p&gt;Die &lt;a href=&quot;https://en.wikipedia.org/wiki/Rule_of_least_power&quot;&gt;Regel der geringsten Macht&lt;/a&gt; besagt, dass man die
am wenigsten leistungsfähige Sprache wählen sollte, die für einen bestimmten Zweck geeignet ist. Was heißt
das für Web-Entwickler:innen? Wenn du etwas mit HTML machen kannst, verwende HTML. Du musst das Styling
anpassen? Verwende CSS. Etwas ist nicht allein mit HTML und CSS machbar? Dann verwende JavaScript und
&lt;a href=&quot;https://www.w3.org/WAI/standards-guidelines/aria/&quot;&gt;WAI-ARIA&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Native HTML-Elemente sind so konzipiert, dass sie in verschiedenen Browsern und mit diversen assistiven
Technologien wie Screenreadern funktionieren. Sie sind in der Regel robuster und zuverlässiger als
benutzerdefinierte Lösungen. Wenn du das nächste Mal ein neues Feature implementierst, solltest du nach
einer Lösung in der folgenden Reihenfolge suchen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HTML&lt;/li&gt;
&lt;li&gt;CSS&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;WAI-ARIA&lt;/li&gt;
&lt;li&gt;Externe Bibliotheken&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Als erstes suche ich immer nach einer nativen Lösung in den &lt;a href=&quot;https://developer.mozilla.org/&quot;&gt;MDN Web Docs&lt;/a&gt;.
Wenn ich etwas mit HTML und CSS allein nicht hinbekomme, recherchiere ich die richtige Verwendung von
ARIA-Attributen und JavaScript, um eine barrierefreie Lösung zu schaffen. Der
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/&quot;&gt;ARIA Authoring Practices Guide (APG)&lt;/a&gt; bietet alle Infos, die du brauchst.&lt;/p&gt;
&lt;p&gt;Warum stehen externe Bibliotheken an letzter Stelle der Liste? Weil sie eine zusätzliche Abhängigkeit für
dein Projekt schaffen. Sobald du dich für eine UI-Komponentenbibliothek entschieden hast, bist du daran
gebunden. Deshalb achte unbedingt darauf, eine barrierefreie UI-Bibliothek zu verwenden. Schau dir am besten
meine &lt;a href=&quot;/de/blog/accessible-ui-component-libraries/&quot;&gt;„Checkliste für barrierefreie UI-Komponenten-Bibliotheken“&lt;/a&gt; an.&lt;/p&gt;
&lt;h3 id=&quot;der-aktuelle-zustand-des-webs&quot;&gt;Der aktuelle Zustand des Webs&lt;/h3&gt;
&lt;p&gt;Die Web-Plattform entwickelt sich ständig weiter. Jeden Tag werden neue HTML-Elemente, CSS-Eigenschaften und
Web-APIs spezifiziert und von den Browsern implementiert. Initiativen wie &lt;a href=&quot;https://wpt.fyi/interop-2024&quot;&gt;Interop 2024&lt;/a&gt;
tragen dazu bei, die Interoperabilität des Webs zu verbessern.&lt;/p&gt;
&lt;p&gt;Für Web-Entwickler:innen ist es heute viel einfacher und unkomplizierter, barrierefreie Websites zu erstellen
als noch vor 10 Jahren. Ich gebe zu, nicht alles lässt sich allein mit HTML und CSS bewerkstelligen. Im Moment
braucht man noch ARIA und JavaScript, um eine &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/tabs/&quot;&gt;Tab-Liste&lt;/a&gt; oder
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/&quot;&gt;benutzerdefinierte Tooltips&lt;/a&gt; zu implementieren.&lt;/p&gt;
&lt;p&gt;Aber ich möchte mich auf das Positive konzentrieren! Werfen wir einen Blick auf einige native HTML-Features,
die es euch sehr einfach machen, robuste, barrierefreie Websites zu erstellen.&lt;/p&gt;
&lt;h2 id=&quot;beispiele-für-native-html-features&quot;&gt;Beispiele für native HTML-Features&lt;/h2&gt;
&lt;h3 id=&quot;das-button-element-ein-mächtiger-allrounder&quot;&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Element: Ein mächtiger Allrounder&lt;/h3&gt;
&lt;p&gt;Vielleicht ist das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Element schon älter als du! Es wurde erstmals im Dezember
1997 in der &lt;a href=&quot;https://www.w3.org/TR/REC-html40-971218/&quot;&gt;HTML 4.0-Spezifikation&lt;/a&gt; definiert. Das heißt,
Schaltflächen gibt es schon eine ganze Weile. Dennoch unterschätzen viele Entwickler:innen dieses mächtige
und vielseitige HTML-Element. Manche halten es sogar für eine gute Idee,
stattdessen ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Element zu verwenden. Horror! 😱&lt;/p&gt;
&lt;p&gt;Vielleicht denkst du jetzt: &lt;span class=&quot;c-italic&quot;&gt;„Na gut, Romeo! Warum bist du so verliebt in das Button-Element?“&lt;/span&gt; 
Lass mich mit der &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button&quot;&gt;kurzen Beschreibung von MDN&lt;/a&gt; antworten:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;The &amp;lt;button&amp;gt; HTML element is an interactive element activated by a user with a mouse, keyboard, finger,
voice command, or other assistive technology. Once activated, it then performs an action, such as submitting
a form or opening a dialog.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Element wurde so konzipiert, dass es für alle Nutzer:innen gut funktioniert.
Du kannst es mit der Maus anklicken. Du kannst eine Schaltfläche mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;TAB&lt;/code&gt;  Taste
fokussieren und sie mit der Eingabe- oder Leertaste aktivieren. Wenn du mit einem Screenreader zu einem Button
navigierst, wird er dir sagen, dass es sich um eine Schaltfläche handelt, die aktiviert werden kann.&lt;/p&gt;
&lt;p&gt;Browser wenden auch Standard-Styles auf HTML-Schaltflächen an. Einige Web-Entwickler:innen empfinden das als
lästig, weil sie das Styling mit CSS überschreiben müssen. Da verwenden sie lieber
das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Element und klatschen einen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;click&lt;/code&gt;  Event-Handler
darauf, weil sie glauben, das sei genug. Das ist es aber nicht!&lt;/p&gt;
&lt;p&gt;Es gibt große Unterschiede zwischen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Elementen!
Eine Schaltfläche löst den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;click&lt;/code&gt;  Event-Handler für alle Arten der Interaktion aus:
Maus, Tastatur, Screenreader usw. Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Element hingegen wird nur bei Maus- oder
Touch-Interaktion ausgelöst. Um ein &lt;a href=&quot;https://theadminbar.com/accessibility-weekly/divs-are-not-buttons/&quot;&gt;div-Element in eine barrierefreie Schaltfläche&lt;/a&gt;
zu verwandeln, ist folgendes notwendig:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Einen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;tabindex&lt;/code&gt;  hinzufügen, um das Element fokussierbar zu machen.&lt;/li&gt;
&lt;li&gt;Einen sichtbaren Fokusindikator anzeigen, wenn die Schaltfläche den Fokus erhält.&lt;/li&gt;
&lt;li&gt;Tastatur-Event-Handler für die Enter- und Leertaste definieren.&lt;/li&gt;
&lt;li&gt;Ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role&lt;/code&gt;  Attribut hinzufügen, um Screenreader-Nutzer:innen mitzuteilen,
dass es sich um eine Schaltfläche handelt.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wow, das sind eine Menge Arbeit und viele unnötige Code-Zeilen! Wenn du stattdessen eine native Schaltfläche
verwendest, ist dein Code einfacher zu lesen und zu pflegen. Immer noch nicht überzeugt? Dann lies meinen
Artikel &lt;a href=&quot;/de/blog/3-ways-web-devs-benefit-accessibility/&quot;&gt;„3 Gründe, warum auch Web-Entwickler:innen von Barrierefreiheit profitieren“&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das ist schon eine Menge Text über Buttons. Aber es gibt noch eine Sache, die ich erwähnen möchte:
Native Schaltflächen bekommen laufend mehr Superkräfte!&lt;/p&gt;
&lt;p&gt;Das letzte Upgrade verdanken wir der neuen &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover-API&lt;/a&gt;.
Du kannst das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popovertarget&lt;/code&gt;  Attribut verwenden, um das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Element
in einen Popover-Steuerungs-Button zu verwandeln. Hier eine Demo für Menü-Buttons
(funktioniert derzeit nur in Chromium-Browsern):&lt;/p&gt;
&lt;iframe title=&quot;Accessible Menu with Popover API&quot; src=&quot;https://codepen.io/alexlehner86/embed/rNQmERq?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/rNQmERq&quot;&gt;
Accessible Menu with Popover API&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Es gibt so viele Anwendungsfälle für Buttons mit angehängten Popovers: Menüs, Tooltips, Datumsauswahlen usw.
Wenn das Thema für dich neu ist, kannst du einen Blick auf die folgenden Artikel von mir werfen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/de/blog/popover-api-accessibility/&quot;&gt;„Einfach herausragend! Die neue Popover API und CSS Anchor Positioning“&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/de/blog/accessible-navigation-menu/&quot;&gt;„Barrierefreie Navigationsmenüs mit der Popover API erstellen“&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/de/blog/native-dialog-and-popover/&quot;&gt;„Native Dialoge und die Popover API — Das solltet ihr wissen“&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aber das ist noch nicht alles! Das nächste Button-Upgrade beschert uns die (derzeit noch experimentelle)
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API&quot;&gt;Invoker Commands API&lt;/a&gt;. Diese
API bietet die Möglichkeit, Schaltflächen deklarativ Aktionen zuzuweisen, wie das Öffnen oder Schließen eines
modalen Dialogs. Genial! 🥰&lt;/p&gt;
&lt;p&gt;Na schau an, was für ein Zufall! Dialoge sind das nächste native HTML-Feature auf meiner Liste.&lt;/p&gt;
&lt;h3 id=&quot;das-dialog-element-immer-oben-auf&quot;&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dialog&lt;/code&gt;  Element: Immer oben auf&lt;/h3&gt;
&lt;p&gt;Dialoge sind ein wesentlicher Bestandteil moderner Web-Oberflächen: Von einfachen Aufforderungen, eine Aktion
zu bestätigen, bis hin zu Fenstern mit komplexen Inhalten. Mit dem nativen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dialog&lt;/code&gt;  Element
ist es ganz einfach, einen barrierefreien Modal-Dialog über den anderen Seiteninhalten zu öffnen.&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/fancy-css-playground/#/dialog&quot; title=&quot;Demo Native Dialog Element&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Das Dialog-Element ist standardmäßig barrierefrei. Wenn du die Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;showModal()&lt;/code&gt; 
verwendest, um einen modalen Dialog zu öffnen, geschieht Folgendes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Der Browser setzt den Fokus automatisch auf das erste interaktive Element innerhalb des Dialogs.&lt;/li&gt;
&lt;li&gt;Ein Screenreader weist darauf hin, dass der neue Inhalt Teil eines Dialogs ist.&lt;/li&gt;
&lt;li&gt;Solange der Modal-Dialog geöffnet ist, können Nutzer:innen mit dem restlichen Inhalt der Seite nicht
interagieren. Das bedeutet, dass Tastaturnutzer:innen den Dialog nicht mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;TAB&lt;/code&gt;  Taste
verlassen können. Auch der virtuelle Cursor des Screenreaders kann sich nur innerhalb des Dialogs bewegen.&lt;/li&gt;
&lt;li&gt;Der Modal-Dialog kann standardmäßig mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste geschlossen werden.&lt;/li&gt;
&lt;li&gt;Nach dem Schließen wird der Fokus automatisch zurück auf das Bedienelement gesetzt, mit dem der Dialog
geöffnet wurde. Davon profitieren Tastatur- und Screenreader-Nutzer:innen, die sofort an der Stelle
weitermachen können, wo sie aufgehört hatten.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Natürlich musst du nicht unbedingt das native &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dialog&lt;/code&gt;  Element verwenden. Du kannst
auch ein benutzerdefiniertes, barrierefreies Dialogfeld mit ARIA und JavaScript implementieren. Aber warum
solltest du das tun? Komm schon! Sei clever und lass die Web-Plattform die Arbeit machen. 😉&lt;/p&gt;
&lt;p&gt;Wenn du mit dem nativen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dialog&lt;/code&gt;  Element nicht vertraut bist und mehr darüber erfahren
möchtest, lies meinen Artikel &lt;a href=&quot;/de/blog/native-dialog-element/&quot;&gt;„Warum du das native Dialog-Element nutzen solltest“&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;formularfelder-gute-zeiten-schlechte-zeiten&quot;&gt;Formularfelder: Gute Zeiten, schlechte Zeiten&lt;/h3&gt;
&lt;p&gt;Allzu oft verwenden Web-Entwickler:innen benutzerdefinierte Formularfelder, um Designanforderungen zu erfüllen –
und vernachlässigen dabei die Barrierefreiheit. Das können wir besser!&lt;/p&gt;
&lt;p&gt;Mit modernen Browsern kannst du auf die meisten
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Forms/Basic_native_form_controls&quot;&gt;nativen Formular-Elemente&lt;/a&gt;
dein eigenes Styling anwenden. Auf diese Weise können wir barrierefreie Webformulare erstellen, die auf
allen Plattformen ein einheitliches Aussehen haben.&lt;/p&gt;
&lt;p&gt;Native Formular-Elemente wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;input&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;select&lt;/code&gt;  sind
standardmäßig barrierefrei. Sie erhalten den Tastaturfokus und können mit der Eingabetaste oder der Leertaste
aktiviert werden, z.B. um eine Checkbox auszuwählen. Sie kommunizieren ihre Rolle und ihren aktuellen Status
an Screenreader.&lt;/p&gt;
&lt;p&gt;Die folgende Demo zeigt ein barrierefreies Webformular mit eigenem Styling für die native Auswahlliste und
die Radio-Buttons:&lt;/p&gt;
&lt;iframe title=&quot;Styling Native Form Controls&quot; src=&quot;https://codepen.io/alexlehner86/embed/mdqGLxZ?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/mdqGLxZ&quot;&gt;
Styling Native Form Controls&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Leider lassen sich nicht alle nativen Formular-Elemente leicht mit benutzerdefinierten Styles anpassen.
Mozilla bietet einen tollen Artikel über die &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn_web_development/Extensions/Forms/Styling_web_forms&quot;&gt;Gestaltung von Webformularen&lt;/a&gt;,
den ich sehr empfehlen kann. Darin werden native Formular-Elemente in drei Gruppen eingeteilt: „Die Guten“,
„Die Schlechten“ und „Die Hässlichen“.&lt;/p&gt;
&lt;p&gt;Meiner Meinung nach sind die nativen Elemente für Eingabefelder, Radio-Buttons, Checkboxen und einfache
Auswahllisten sehr gut gestaltbar. Es gibt keinen Grund, stattdessen benutzerdefinierte Elemente zu
verwenden. Es sei denn, du hast eine masochistische Veranlagung. Mehr Infos findest du in meinem Artikel
&lt;a href=&quot;/de/blog/styling-accessible-web-forms/&quot;&gt;„Barrierefreie Web-Formulare mit individuellem Design gestalten“&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Und was ist mit dem Rest? Einige native Formular-Elemente verfügen über interne Elemente, die nicht allein
mit CSS gestaltet werden können. Dazu gehören der Farbwähler, der Datumswähler, die Datei-Auswahl und
das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;select&lt;/code&gt;  Element. In diesen Fällen verstehe ich den Bedarf an benutzerdefinierten
Komponenten. Stellt nur sicher, dass sie barrierefrei sind.&lt;/p&gt;
&lt;p&gt;Zum Glück für uns wird das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;select&lt;/code&gt;  Element bald ein wichtiges Upgrade erhalten.
Eine anpassbare Version des Elements befindet sich offiziell in &lt;a href=&quot;https://github.com/whatwg/html/issues/9799&quot;&gt;Phase 2 der WHATWG&lt;/a&gt;,
mit starkem Cross-Browser-Interesse und einem in Chrome Canary verfügbaren Prototypen. Weitere Informationen
findest du in diesem &lt;a href=&quot;https://developer.chrome.com/blog/rfc-customizable-select&quot;&gt;Chrome-Blogbeitrag&lt;/a&gt;. 🤩&lt;/p&gt;
&lt;h3 id=&quot;disclosure--und-akkordeon-widgets-mit-nativem-html&quot;&gt;Disclosure- und Akkordeon-Widgets mit nativem HTML&lt;/h3&gt;
&lt;p&gt;Das native HTML-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;details&lt;/code&gt;  erzeugt ein Disclosure-Widget, dessen Inhalt nur
dann sichtbar ist, wenn das Widget geöffnet wurde. Der Inhalt des
verschachtelten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;summary&lt;/code&gt;  Elements liefert das Label für das Disclosure-Widget.
Die perfekten HTML-Elemente für eine FAQ-Seite oder einen ausklappbaren Info-Abschnitt in einem Artikel.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;What is HTML?&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;summary&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    HTML is the standard markup language for web pages, defined by the W3C and WHATWG.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;details&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Früher war es nicht möglich, den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt;  Typ des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;details&lt;/code&gt;  Elements
zu ändern. Diese Einschränkung wurde in Chromium-Browsern bereits gelockert, so dass du Grid- oder
Flex-Layouts verwenden kannst.
Der Artikel &lt;a href=&quot;https://developer.chrome.com/blog/styling-details&quot;&gt;„More options for styling &amp;lt;details&amp;gt;“&lt;/a&gt;
enthält eine wirklich coole Demo für ein exklusives Akkordeon.&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Also gut. Dieser Artikel ist viel länger geworden, als ich beabsichtigt hatte. 😂&lt;/p&gt;
&lt;p&gt;Ich hoffe, er hilft dir auf deinem Weg zum Accessibility Engineer. Die wichtigste Botschaft:
Native HTML-Elemente sind einfach klasse und (meistens) von Haus aus barrierefrei. Nutze sie!&lt;/p&gt;</content:encoded><category>accessibility</category><category>button</category><category>css</category><category>dialog</category><category>forms</category><category>html</category><category>popover</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_code_woman.jpg" length="0" type="image/jpeg"/></item><item><title>Platzhaltertext braucht guten Farbkontrast</title><link>https://www.oidaisdes.org/de/blog/placeholder-text-color-contrast</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/placeholder-text-color-contrast</guid><description>Nutze das ::placeholder CSS-Pseudo-Element, um die Barrierefreiheit deiner Website zu verbessern.</description><pubDate>Fri, 20 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Müssen Platzhaltertexte in Formularen den Anforderungen an hohen Farbkontrast genügen?
Die kurze Antwort lautet: &lt;span class=&quot;c-italic&quot;&gt;„Ja, natürlich!“&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;Die lange Antwort: Nicht alle Nutzer:innen haben eine perfekte Sehkraft. Vor allem mit zunehmendem Alter wird es
schwieriger, Text vom Hintergrund zu unterscheiden, wenn der Farbkontrast gering ist. Daher solltet ihr immer für
einen ausreichenden Kontrast zwischen Text und Hintergrund sorgen.&lt;/p&gt;
&lt;p&gt;Das gilt auch für Platzhaltertext in Webformularen oder Dokumenten. Der Platzhalter liefert in der Regel einen nützlichen
Hinweis, der beim Ausfüllen eines Eingabefeldes unterstützt. Er ist nicht rein dekorativ. Daher sollten alle Nutzer:innen
in der Lage sein, den Platzhaltertext wahrzunehmen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-egor-komarov-book-rules.CdOie-0l_261M1S.webp&quot; srcset=&quot;/_astro/pexels-egor-komarov-book-rules.CdOie-0l_1R9Jb5.webp 640w, /_astro/pexels-egor-komarov-book-rules.CdOie-0l_ZSFA7i.webp 750w, /_astro/pexels-egor-komarov-book-rules.CdOie-0l_ZSiNaa.webp 828w, /_astro/pexels-egor-komarov-book-rules.CdOie-0l_ZKOajI.webp 1080w, /_astro/pexels-egor-komarov-book-rules.CdOie-0l_hpFea.webp 1280w, /_astro/pexels-egor-komarov-book-rules.CdOie-0l_261M1S.webp 1600w&quot; alt=&quot;Ein aufgeschlagenes Buch auf einem Tisch. Das Wort &apos;rules&apos; ist deutlich lesbar.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Egor Komarov / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;anforderungen-an-den-minimalen-farbkontrast&quot;&gt;Anforderungen an den minimalen Farbkontrast&lt;/h2&gt;
&lt;p&gt;Das &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html&quot;&gt;Erfolgskriterium 1.4.3 Kontrast (Minimum)&lt;/a&gt; der WCAG 2.2
definiert Anforderungen an den Farbkontrast. Text muss mindestens ein Kontrastverhältnis von 4,5 zu 1 zum Hintergrund haben, oder
ein Kontrastverhältnis von 3 zu 1, wenn es sich um großen Text handelt. Das Understanding-Dokument sagt eindeutig:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;This Success Criterion applies to text in the page, &lt;strong&gt;including placeholder text&lt;/strong&gt; and text that is shown when
a pointer is hovering over an object or when an object has keyboard focus.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Es gibt viele Werkzeuge, mit denen ihr das Kontrastverhältnis zweier Farbwerte überprüfen könnt.
Ich verwende meistens den &lt;a href=&quot;https://webaim.org/resources/contrastchecker/&quot;&gt;WebAIM Contrast Checker&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;platzhaltertext-in-webformularen-gestalten&quot;&gt;Platzhaltertext in Webformularen gestalten&lt;/h2&gt;
&lt;p&gt;In den meisten Browsern wird Platzhaltertext standardmäßig in einer hellgrauen Farbe dargestellt. Auch UI-Bibliotheken verwenden
manchmal sehr helle Farben. Dies führt zu Platzhaltertext mit schlechtem Farbkontrast.&lt;/p&gt;
&lt;p&gt;Verwendet das CSS-Pseudo-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::placeholder&lt;/code&gt; , um eine Textfarbe mit ausreichendem Farbkontrast zu definieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;input::placeholder&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#5b5b5b&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ihr könnt auch den Schriftstil und die Schriftgröße des Platzhaltertextes ändern. Werft einen Blick auf meine Demo, in der
ihr das Standard-Styling des Browsers mit dem benutzerdefinierten Styling vergleichen könnt:&lt;/p&gt;
&lt;iframe title=&quot;Style placeholder text&quot; src=&quot;https://codepen.io/alexlehner86/embed/raBmOZq?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/raBmOZq&quot;&gt;
Style placeholder text&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Mit dieser kleinen Änderung könnt ihr schnell die Barrierefreiheit eurer Website verbessern. Manchmal ist es so einfach! 😊&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html&quot;&gt;Understanding Success Criterion 1.4.3 Contrast (Minimum)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/::placeholder&quot;&gt;CSS pseudo-element ::placeholder (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>css</category><category>forms</category><category>html</category><category>text</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_book_rules.jpg" length="0" type="image/jpeg"/></item><item><title>Barrierefreie Navigationsmenüs mit der Popover API erstellen</title><link>https://www.oidaisdes.org/de/blog/accessible-navigation-menu</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessible-navigation-menu</guid><description>Durch die Nutzung moderner Webfunktionen könnt ihr schnell und einfach Navigationsmenüs bauen.</description><pubDate>Thu, 17 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.w3.org/WAI/tutorials/menus/&quot;&gt;Navigationsmenüs&lt;/a&gt; sind ein wesentlicher Bestandteil jeder Website. Sie
sind meistens in der Kopfzeile platziert und bieten einen Überblick über die Seitenhierarchie einer Website.
Nutzer:innen können sich einen Überblick über den Inhalt verschaffen und schnell zu den wichtigsten
Abschnitten der Website navigieren.&lt;/p&gt;
&lt;p&gt;Viele Websites verwenden Fly-Out-Menüs (oder Drop-Down-Menüs), bei denen bestimmte Menüpunkte ein Untermenü öffnen,
wenn man sie anklickt oder den Mauszeiger über sie bewegt. Oft sind diese Menüs für Screenreader- und Tastatur-Nutzer:innen
nur sehr schlecht zugänglich. Aber wir können es besser machen!&lt;/p&gt;
&lt;p&gt;Ich zeige euch, wie ihr auf einfache Weise ein barrierefreies Fly-Out-Menü bauen könnt. Dazu nutzen wir die Fähigkeiten
moderner Web-Features wie der &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover API&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-valentinantonucci-compass.j3Ledd_M_ktfQM.webp&quot; srcset=&quot;/_astro/pexels-valentinantonucci-compass.j3Ledd_M_ZoukWc.webp 640w, /_astro/pexels-valentinantonucci-compass.j3Ledd_M_nKovY.webp 750w, /_astro/pexels-valentinantonucci-compass.j3Ledd_M_24kiYz.webp 828w, /_astro/pexels-valentinantonucci-compass.j3Ledd_M_26XeTz.webp 1080w, /_astro/pexels-valentinantonucci-compass.j3Ledd_M_Z1wStW7.webp 1280w, /_astro/pexels-valentinantonucci-compass.j3Ledd_M_ktfQM.webp 1600w&quot; alt=&quot;Eine Hand hält einen Kompass zur Navigation hoch. Im Hintergrund ist eine felsige Küste mit Bäumen zu sehen.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Valentin Antonucci / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;was-wir-erreichen-wollen&quot;&gt;Was wir erreichen wollen&lt;/h2&gt;
&lt;p&gt;Unser Navigationsmenü sollte für verschiedene Nutzergruppen einfach zu bedienen sein:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Die Untermenüs sollten &lt;strong&gt;über dem Inhalt der Website&lt;/strong&gt; erscheinen und nicht sofort verschwinden,
wenn die Maus den anklickbaren Bereich verlässt.&lt;/li&gt;
&lt;li&gt;Nutzer:innen von Bildschirmlesegeräten benötigen &lt;strong&gt;aussagekräftiges Markup&lt;/strong&gt;, um das Navigationsmenü
zu verstehen und zu bedienen.&lt;/li&gt;
&lt;li&gt;Tastaturnutzer:innen sollen das Menü &lt;strong&gt;allein mit der Tastatur&lt;/strong&gt; bedienen können.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;demo-barrierefreies-navigationsmenü&quot;&gt;Demo: Barrierefreies Navigationsmenü&lt;/h2&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://codepen.io/alexlehner86/full/ExqWMpb&quot;&gt;CodePen-Demo&lt;/a&gt; eines barrierefreien Navigationsmenüs mit
der Popover-API erstellt. Öffnet die Demo auf einem Desktop-Bildschirm oder einem Tablet im Querformat, um das Fly-Out-Menü
zu sehen. Auf kleineren Geräten wird die Demo stattdessen ein mobiles Menü anzeigen.&lt;/p&gt;
&lt;img src=&quot;/_astro/screenshot_accesible_nav_menu.DAYKAu7L_Z20tV3V.webp&quot; srcset=&quot;/_astro/screenshot_accesible_nav_menu.DAYKAu7L_1D9XeT.webp 640w, /_astro/screenshot_accesible_nav_menu.DAYKAu7L_EYIG.webp 750w, /_astro/screenshot_accesible_nav_menu.DAYKAu7L_lCgjY.webp 828w, /_astro/screenshot_accesible_nav_menu.DAYKAu7L_Pfjay.webp 1080w, /_astro/screenshot_accesible_nav_menu.DAYKAu7L_Z20tV3V.webp 1211w&quot; alt=&quot;Screenshot der Demo-Seite des barrierefreien Navigationsmenüs. Das Untermenü des Menüpunkts Solutions ist geöffnet.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1211px) 1211px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1211&quot; height=&quot;685&quot;&gt;
&lt;p&gt;&lt;em&gt;Foto: © Alexander Lehner&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Das Navigationsmenü ist für Maus-, Tastatur- und Screenreader-Nutzer:innen leicht zu bedienen. Schauen wir uns die
wichtigsten Elemente an.&lt;/p&gt;
&lt;h3 id=&quot;aussagekräftiges-markup&quot;&gt;Aussagekräftiges Markup&lt;/h3&gt;
&lt;p&gt;Wir verwenden das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;nav&lt;/code&gt;  Element, um die Rolle des Menüs zu vermitteln. Die Menüpunkte
befinden sich in einer ungeordneten Liste (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ul&lt;/code&gt;  Element). So können assistive Technologien die
Anzahl der Menüpunkte vorlesen und entsprechende Navigationsfunktionen bereitstellen.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;main-nav&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popovertarget&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;nav-panel-solutions&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Solutions&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;nav-panel-solutions&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popover&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;#&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Products&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Listenelemente enthalten entweder einen direkten Link zu einer Unterseite, oder sie enthalten
ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Element, das ein Untermenü mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut öffnet.
Die Schaltfläche ist mit dem Popover-Inhalt über das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popovertarget&lt;/code&gt;  verknüpft.&lt;/p&gt;
&lt;p&gt;Einer der großen Vorteile der Popover-API: Sie teilt den assistiven Technologien automatisch mit, ob das Untermenü
gerade ein- oder ausgeklappt ist. Weitere Informationen findet ihr im Artikel
&lt;a href=&quot;https://hidde.blog/popover-accessibility/&quot;&gt;„On popover accessibility: what the browser does and doesn’t do“&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;vermeidet-die-menu-rolle&quot;&gt;Vermeidet die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;menu&lt;/code&gt;  Rolle&lt;/h3&gt;
&lt;p&gt;In meiner Demo verwende ich die Rollen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;menu&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;menuitem&lt;/code&gt;  nicht
für das Navigationsmenü. Das ist Absicht! Diese ARIA-Rollen sind nur für Menü-Widgets gedacht, die sich wie native
Betriebssystem-Menüs verhalten.&lt;/p&gt;
&lt;p&gt;Lest den Artikel &lt;a href=&quot;https://adrianroselli.com/2017/10/dont-use-aria-menu-roles-for-site-nav.html&quot;&gt;„Don’t Use ARIA Menu Roles for Site Nav“&lt;/a&gt;
von Adrian Roselli für eine detaillierte Erklärung.&lt;/p&gt;
&lt;h3 id=&quot;visuelle-platzierung&quot;&gt;Visuelle Platzierung&lt;/h3&gt;
&lt;p&gt;Wenn ein Untermenü geöffnet wird, erscheint es automatisch im &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Top_layer&quot;&gt;Top-Layer&lt;/a&gt;,
einer separaten Ebene, die über allen anderen im Webdokument angezeigten Ebenen liegt. Ihr müsst euch nur um die
Platzierung und Größe des Untermenüs kümmern:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; nav.main-nav&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;popover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    top&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--header-height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    margin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Popover-Inhalte erscheinen standardmäßig in der Mitte des Bildschirms. Um unsere Untermenüs direkt unterhalb
der Kopfzeile zu platzieren, setzen wir für &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;top&lt;/code&gt;  die Höhe der Kopfzeile und entfernen
jeglichen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;margin&lt;/code&gt; . Anschließend setzen wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;width&lt;/code&gt;  auf &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;100%&lt;/code&gt; ,
damit das Untermenü die gesamte Breite der Seite einnimmt.&lt;/p&gt;
&lt;h3 id=&quot;tastaturbedienbarkeit&quot;&gt;Tastaturbedienbarkeit&lt;/h3&gt;
&lt;p&gt;Mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;TAB&lt;/code&gt;  Taste könnt ihr die Links und Schaltflächen im Navigationsmenü fokussieren. Nach dem
Öffnen eines Untermenüs ist dessen Inhalt der nächste in der Fokusreihenfolge. Durch Drücken der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste
wird das Untermenü geschlossen und der Fokus automatisch wieder auf die Trigger-Schaltfläche gesetzt. Alles dank der mächtigen
Popover-API! 🤩&lt;/p&gt;
&lt;h3 id=&quot;light-dismiss-der-untermenüs&quot;&gt;Light-Dismiss der Untermenüs&lt;/h3&gt;
&lt;p&gt;Ein weiteres integriertes Feature der Popover-API ist Light-Dismiss: Wenn ihr einen Bereich außerhalb des Untermenüs
anklickt, wird das Untermenü geschlossen und der Fokus auf das Trigger-Element zurückgesetzt. Ihr müsst euch nicht mehr
mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;focusout&lt;/code&gt;  Events in JavaScript herumschlagen.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/tutorials/menus/&quot;&gt;Navigation Menus Tutorial (W3C)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/&quot;&gt;Disclosure Pattern (ARIA APG)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/examples/disclosure-navigation/&quot;&gt;Example Disclosure Navigation Menu (ARIA APG)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover API (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>css</category><category>html</category><category>navigation</category><category>popover</category><category>popup</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_compass.jpg" length="0" type="image/jpeg"/></item><item><title>Offlinedaten einfach speichern mit idb und der IndexedDB API</title><link>https://www.oidaisdes.org/de/blog/offline-storage-indexeddb</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/offline-storage-indexeddb</guid><description>Die idb-Bibliothek macht es einfach, Daten auf dem Gerät zu speichern und sie für die Offline-Nutzung abzurufen.</description><pubDate>Mon, 09 Sep 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich nutze gerne die JavaScript-Bibliothek &lt;a href=&quot;https://www.npmjs.com/package/idb&quot;&gt;idb&lt;/a&gt;, einen minimalen Wrapper für
die &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API&quot;&gt;IndexedDB API&lt;/a&gt;. Ich habe sie schon in mehreren
Web-Applikationen verwendet, um Offline-Features bereitzustellen.&lt;/p&gt;
&lt;p&gt;Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;idb&lt;/code&gt;  Bibliothek macht es einfach, Daten auf dem Endgerät zu speichern und sie später über
ein &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot;&gt;Promise&lt;/a&gt; abzurufen. Sie
bietet auch großartige &lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;TypeScript&lt;/a&gt;-Typen und -Interfaces, welche die Erstellung
generischer Logik für die Interaktion mit dem Offline-Speicher unterstützen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-rdne-stock-project-boxes.D6BOtcUl_2pnqwD.webp&quot; srcset=&quot;/_astro/pexels-rdne-stock-project-boxes.D6BOtcUl_2rknVm.webp 640w, /_astro/pexels-rdne-stock-project-boxes.D6BOtcUl_13OqWF.webp 750w, /_astro/pexels-rdne-stock-project-boxes.D6BOtcUl_Z23ti31.webp 828w, /_astro/pexels-rdne-stock-project-boxes.D6BOtcUl_Z23eS1y.webp 1080w, /_astro/pexels-rdne-stock-project-boxes.D6BOtcUl_Z1VqUpP.webp 1280w, /_astro/pexels-rdne-stock-project-boxes.D6BOtcUl_2pnqwD.webp 1600w&quot; alt=&quot;Eine Frau sitzt auf dem Boden, umgeben von Pappkartons.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © RDNE Stock project / pexels.com&lt;/p&gt;
&lt;p&gt;Sehen wir uns an, wie wir eine Datenbank mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;idb&lt;/code&gt;  einrichten können. Danach zeige ich
euch einige Codebeispiele für wiederverwendbare generische Methoden zum Speichern und Abrufen von Daten.&lt;/p&gt;
&lt;h2 id=&quot;die-datenbank-einrichten&quot;&gt;Die Datenbank einrichten&lt;/h2&gt;
&lt;p&gt;Als erstes müsst ihr das Schema für die zu speichernden Daten definieren. Hier ist ein einfaches Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;DBSchema&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;idb&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; interface&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MyAwesomeDB&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; DBSchema&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    images&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MyImageData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        key&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    videos&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MyVideoData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        key&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich empfehle euch, die DB-Operationen in einer eigenen Klasse zu bündeln. Diese Klasse hat allein den Zweck, mit
der Datenbank zu interagieren. Das macht euren Code einfacher zu lesen und zu verstehen. In einer Angular-Anwendung
würde ich eine &lt;a href=&quot;https://angular.io/guide/architecture-services&quot;&gt;Serviceklasse&lt;/a&gt; wie diese erstellen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;IDBPDatabase&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;openDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;idb&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Injectable&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; OfflineStorageService&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    private&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; _databaseVersion&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    // The promise returned when opening the IndexedDB with openDB() method.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    private&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; _myDatabase$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;IDBPDatabase&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MyAwesomeDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; init&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_myDatabase$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; openDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MyAwesomeDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;            &amp;quot;my-awesome-database&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;            this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_databaseVersion&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;                // Initialize objects in database if opened for the first time.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;                upgrade&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;database&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;oldVersion&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        // Handle success and error case.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_myDatabase$&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            () &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; console&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;IndexedDB was successfully opened.&amp;quot;&amp;quot;)&lt;/span&gt;&lt;span style=&quot;color:#F44747&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            () &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;onOpeningDatabaseFailed&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;daten-speichern&quot;&gt;Daten speichern&lt;/h2&gt;
&lt;p&gt;Nehmen wir an, ihr wollt mehrere Objekte in einem
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore&quot;&gt;bestimmten Objektspeicher&lt;/a&gt;
der Datenbank ablegen. Dazu startet ihr eine &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Transaktion&lt;/code&gt;  mit Lese- und Schreibzugriff
und speichert dann die Objekte. Für diesen Vorgang könnt ihr eine generische Methode mit den
Parametern &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;storeName&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;items&lt;/code&gt;  definieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;StoreNames&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;StoreValue&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;idb&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Stores all items in the object store named &amp;quot;storeName&amp;quot;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; storeAllItemsInObjectStore&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; StoreNames&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MyAwesomeDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;storeName&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;items&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; StoreValue&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MyAwesomeDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt;[])&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_myDatabase$&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;database&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; transaction&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; database&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;transaction&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;storeName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;readwrite&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        items&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;forEach&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; transaction&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;store&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;add&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Methode verwendet die Typen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;StoreNames&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;StoreValue&lt;/code&gt;  aus
der &lt;span class=&quot;c-italic&quot;&gt;idb-Bibliothek&lt;/span&gt; . Diese stellen sicher, dass der an die Methode übergebene
Parameter &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;storeName&lt;/code&gt;  tatsächlich Teil der Datenbank ist und dass die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;items&lt;/code&gt; 
die erwartete Datenstruktur haben. Hier ist ein Beispiel für die Verwendung dieser generischen Methode:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; storeImages&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;items&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;MyImageData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[]): &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;storeAllItemsInObjectStore&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;images&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;items&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;daten-abrufen&quot;&gt;Daten abrufen&lt;/h2&gt;
&lt;p&gt;Beim Abrufen von Daten aus der lokalen Datenbank ziehe ich es vor, das native &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Promise&lt;/code&gt;  in
ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Observable&lt;/code&gt;  umzuwandeln. Das erleichtert die Integration des Offline-Speichers in eine auf
Observables basierende Application-State-Logik (z.B. &lt;a href=&quot;https://ngrx.io/&quot;&gt;NgRx store&lt;/a&gt;). Hier ist eine generische Methode,
die ein bestimmtes Element aus einem Objektspeicher, verpackt in ein Observable, zurückgibt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;StoreKey&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;StoreNames&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;StoreValue&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;idb&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Observable&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;catchError&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;switchMap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;rxjs&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;// Retrieves the item identified via &amp;quot;itemKey&amp;quot; from the object store named &amp;quot;storeName&amp;quot;. Resolves with undefined if no match is found, the database is unavailable, or there&amp;#39;s an error.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; getItemFromObjectStore&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; StoreNames&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MyAwesomeDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt;&amp;gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    storeName&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    itemKey&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; StoreKey&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MyAwesomeDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Observable&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;StoreValue&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MyAwesomeDB&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; undefined&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_myDatabase$&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; null&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_myDatabase$&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        switchMap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;database&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;database&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;storeName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;itemKey&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;))),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        catchError&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            console&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; of&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ihr könnt die generische Methode folgendermaßen verwenden:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; getImage&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;imageId&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;): &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Observable&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;MyImageData&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; undefined&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    return this.getItemFromObjectStore(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;images&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, imageId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Viel Spaß mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;IndexedDB&lt;/code&gt;  und der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;idb&lt;/code&gt;  Bibliothek!&lt;/p&gt;</content:encoded><category>angular</category><category>database</category><category>javascript</category><category>storage</category><category>typescript</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_cardboard_boxes.jpg" length="0" type="image/jpeg"/></item><item><title>Native Dialoge und die Popover API — Das solltet ihr wissen</title><link>https://www.oidaisdes.org/de/blog/native-dialog-and-popover</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/native-dialog-and-popover</guid><description>Wie ihr Dialoge und Popovers animiert, sie korrekt verschachtelt und Dialoge beim Hintergrund-Klick schließt.</description><pubDate>Sat, 15 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das moderne Web ist großartig! Wir können leicht barrierefreie, robuste Modal-Dialoge mit dem
nativen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  Element erstellen. Ihr möchtet ein Menü oder einen Tooltip über dem
anderen Seiteninhalt öffnen? Kein Problem! Das HTML-Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  verwandelt jedes
Element in ein Popup.&lt;/p&gt;
&lt;p&gt;In den letzten Monaten habe ich einige Dialoge mit dem
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog&quot;&gt;nativen HTML-Element&lt;/a&gt; erstellt. Und im April, als
die &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover API&lt;/a&gt; endlich browserübergreifend unterstützt
wurde, begann ich mit Popover in verschiedenen Projekten zu experimentieren. Mir wurde schnell klar: Diese Web-Features
erleichtern uns Web-Entwickler:innen das Leben sehr, aber es gibt auch einige Herausforderungen. Vor allem, wenn man
beide Features miteinander kombiniert!&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_1tEsns.webp&quot; srcset=&quot;/_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_2lr7ao.webp 640w, /_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_Z1tSbGe.webp 750w, /_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_SzIl2.webp 828w, /_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_Z24dIPh.webp 1080w, /_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_1G02WE.webp 1280w, /_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_1WhTAA.webp 1668w, /_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_QdSox.webp 2048w, /_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_1NyFMT.webp 2560w, /_astro/pexels-rama-khandkar-pancakes.C-xTiqnN_1tEsns.webp 4032w&quot; alt=&quot;Mehrere übereinander gestapelte Pfannkuchen.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 4032px) 4032px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;4032&quot; height=&quot;3024&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Rama Khandkar / pexels.com&lt;/p&gt;
&lt;p&gt;Ich werde kurz darauf eingehen, wie Dialoge und Popovers miteinander interagieren. Dann werde ich meine hart
erarbeiteten Erkenntnisse mit euch teilen. Wenn ihr mit den Features noch nicht vertraut seid, empfehle ich euch, meine
Blogbeiträge &lt;a href=&quot;/de/blog/native-dialog-element/&quot;&gt;„Warum du das native Dialog-Element nutzen solltest“&lt;/a&gt; und
&lt;a href=&quot;/de/blog/popover-api-accessibility/&quot;&gt;„Einfach herausragend! Die neue Popover API und CSS Anchor Positioning“&lt;/a&gt; zu lesen.&lt;/p&gt;
&lt;h2 id=&quot;die-grundlagen-wie-dialog--und-popover-elemente-interagieren&quot;&gt;Die Grundlagen: Wie Dialog- und Popover-Elemente interagieren&lt;/h2&gt;
&lt;p&gt;Wenn ihr einen Modal-Dialog mit der Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;showModal()&lt;/code&gt;  öffnet, wird das Dialogfeld zum
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Top_layer&quot;&gt;Top-Layer&lt;/a&gt; hinzugefügt und über anderen Seiteninhalten
gerendert. Dasselbe geschieht, wenn ihr Popover-Inhalte mit der Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;showPopover()&lt;/code&gt;  anzeigt.&lt;/p&gt;
&lt;p&gt;Was passiert nun, wenn ein Element im Top-Layer bereits geöffnet ist und ihr ein weiteres Element hinzufügt? Die
Elemente werden in der Reihenfolge übereinander gelegt, in der sie dem Top-Layer hinzugefügt wurden. Das zuletzt
hinzugefügte Element erscheint immer oben. Mit der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;z-index&lt;/code&gt;  könnt ihr diese
Reihenfolge auch nicht verändern. Es zählt allein, wann ein Element dem Top-Layer hinzugefügt wurde.&lt;/p&gt;
&lt;p&gt;Um ein Beispiel zu geben: Eine Schaltfläche öffnet ein Menüfeld als Popover. Dieses Menü enthält eine Option, die einen
Modal-Dialog öffnet, der über dem Menü-Panel gerendert wird. Dieses Dialogfeld enthält eine Schaltfläche, die ein
Tooltip-Popover über dem Dialogfeld öffnet. Und so weiter, und so fort. 😉&lt;/p&gt;
&lt;h2 id=&quot;was-ihr-über-dialoge-und-popovers-wissen-solltet&quot;&gt;Was ihr über Dialoge und Popovers wissen solltet&lt;/h2&gt;
&lt;h3 id=&quot;animation-als-progressive-enhancement&quot;&gt;Animation als &lt;span lang=&quot;en&quot;&gt;Progressive Enhancement&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Alles sieht besser aus mit flüssigen Animationen. Es gibt nur ein Problem: Dialoge und Popovers
haben &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt;  gesetzt, wenn sie ausgeblendet sind, und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: block&lt;/code&gt; ,
wenn sie angezeigt werden. Und wir alle wissen, dass man Inhalte nicht von oder zu &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt; 
animieren kann. Richtig? Falsch!&lt;/p&gt;
&lt;p&gt;Die neue &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@starting-style&lt;/code&gt;  Regel zusammen mit der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition-behavior&lt;/code&gt; 
ermöglicht die Animation von Dialogen und Popovers. Ich habe beide Features in meinem Blogbeitrag
&lt;a href=&quot;/de/blog/accessible-popover-alert/&quot;&gt;„Barrierefreie Alerts leicht gemacht mit der Popover API“&lt;/a&gt; ausführlich beschrieben.&lt;/p&gt;
&lt;p&gt;Seht euch meine Demo für einen Modal-Dialog mit sanfter Ein- und Ausblend-Animation an. Zum Zeitpunkt des Verfassens dieses
Artikels funktioniert das nur in Chrome und Edge:&lt;/p&gt;
&lt;iframe title=&quot;Dialog Animation Demo&quot; src=&quot;https://codepen.io/alexlehner86/embed/jOoaZRK?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/jOoaZRK&quot;&gt;
Dialog Animation Demo&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Ihr könnt Transitionen für das Dialogfeld (oder Popover) selbst sowie für den Hintergrund definieren. Hier ist der CSS-Code
für die Animation des Dialogs:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    --duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;150ms&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    --start-opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    --start-scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.8&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* End values for fade out. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--start-opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--start-scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        opacity &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;ease-out&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        transform &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;cubic-bezier&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        overlay&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) allow-discrete,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        display &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) allow-discrete;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* End values for fade in; start values for fade out. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    @starting-style {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        /* Start values vor fade in. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--start-opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--start-scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Und so animiert ihr den Hintergrund des Dialogs:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Styling for backdrop behind the dialog */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dialog::backdrop&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;rgb&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; / &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.32&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* End value for fade out. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: opacity &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        overlay&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) allow-discrete,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        display &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--duration&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) allow-discrete;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;::backdrop&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* End value for fade in; start value for fade out. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* This starting-style rule cannot be nested inside the above selector because the nesting selector cannot represent pseudo-elements. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@starting-style&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    dialog&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;::backdrop&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        /* Start value vor fade in. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Aber was ist mit der Browser-Unterstützung? Keine Sorge! Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@starting-style&lt;/code&gt;  Regel und die
Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition-behavior&lt;/code&gt;  sind perfekte Beispiele für &lt;span lang=&quot;en&quot;&gt;Progressive Enhancement&lt;/span&gt;.
Wenn ein Browser die neuen Features nicht unterstützt, wird das Dialog- oder Popover-Element trotzdem gerendert, allerdings
ohne die Animation.&lt;/p&gt;
&lt;h3 id=&quot;den-dialog-automatisch-schließen-bei-klick-auf-den-hintergrund&quot;&gt;Den Dialog automatisch schließen bei Klick auf den Hintergrund&lt;/h3&gt;
&lt;p&gt;Das native &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  Element hat einige tolle Funktionen eingebaut:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wenn ein Modal-Dialog geöffnet wird, setzt der Browser den Fokus auf das erste interaktive Element innerhalb des Dialogs.&lt;/li&gt;
&lt;li&gt;Beim Schließen des Modal-Dialogs wird der Fokus wieder auf das Element gesetzt, das den Dialog geöffnet hat.&lt;/li&gt;
&lt;li&gt;Benutzer können den Modal-Dialog mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste schließen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eine wichtige Funktion wird jedoch standardmäßig nicht unterstützt: Automatisches Schließen des Dialogs, wenn die
Nutzer:innen auf den Hintergrund klicken. In meinem &lt;a href=&quot;/de/blog/native-dialog-element/&quot;&gt;ersten Blogbeitrag über Dialoge&lt;/a&gt; habe
ich folgende Implementierung dieses Light-Dismiss-Verhaltens vorgestellt: Man ermittelt die Koordinaten des Klicks und
vergleicht sie mit dem Rechteck des Dialogs.&lt;/p&gt;
&lt;p&gt;Vor kurzem bin ich auf eine elegantere Lösung gestoßen: Ihr definiert einen
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener&quot;&gt;Klick-Event-Listener&lt;/a&gt; für den Dialog und
überprüft dann den Tag-Namen des Ereignis-Ziels. Hier ist der JavaScript-Code für die Funktion:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; onDialogClick&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;stopPropagation&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;tagName&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; ===&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;quot;DIALOG&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        dialogElementRef&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ein Klick auf den Dialog-Hintergrund wird als Klick auf das Dialogelement registriert. Damit dies funktioniert, muss der
Inhalt des Dialogs von einem zusätzlichen Element umschlossen werden. Andernfalls würde ein Klick in bestimmte Bereiche des
Dialogs diesen auch schließen.&lt;/p&gt;
&lt;p&gt;Schaut euch die CodePen-Demo oben an, in der ich dieses benutzerdefinierte Verhalten ebenfalls implementiert habe.&lt;/p&gt;
&lt;h3 id=&quot;wie-ihr-popover-inhalte-korrekt-in-modal-dialogen-verschachtelt&quot;&gt;Wie ihr Popover-Inhalte korrekt in Modal-Dialogen verschachtelt&lt;/h3&gt;
&lt;p&gt;Unlängst habe ich für einen Kunden an einem Webprojekt gearbeitet, das eine Liste von Elementen enthält. Die Nutzer:innen
können auf eines der Elemente klicken, um einen Modal-Dialog mit weiteren Details zu öffnen. Dieser Dialog enthält eine
Schaltfläche, mit der man das Element zur Favoritenliste hinzufügen kann. Dann wird am unteren Rand des Bildschirms eine
&lt;a href=&quot;https://m3.material.io/components/snackbar/overview&quot;&gt;Snackbar&lt;/a&gt; angezeigt, die auch eine Rückgängig-Schaltfläche enthält.&lt;/p&gt;
&lt;p&gt;Als hipper, moderner Webentwickler wollte ich natürlich das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  Element in
Kombination mit einem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Element für die Snackbar verwenden. Nachdem ich alles implementiert
hatte, begann ich, die Rückgängig-Funktion zu testen und war verblüfft: Obwohl die Snackbar mit der Rückgängig-Schaltfläche
sichtbar war und über dem Modal-Dialog angezeigt wurde, konnte ich nicht mit ihr
interagieren. Ich so: &lt;span class=&quot;c-italic&quot;&gt;„Was zum Teufel ist hier los?!“&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;Nach etwas Recherche habe ich die Ursache des Problems gefunden. Aber bevor ich euch die Lösung verrate, seht euch diese
Demo mit einer Minimalversion des oben beschriebenen Webprojekts an. Der Dialog enthält zwei Schaltflächen: Die erste öffnet
eine Snackbar, mit der ihr nicht interagieren könnt. Die zweite Schaltfläche öffnet eine Snackbar mit einer funktionierenden
Rückgängig-Taste. Könnt ihr den Unterschied erkennen?&lt;/p&gt;
&lt;iframe title=&quot;Dialog with Popover Demo&quot; src=&quot;https://codepen.io/alexlehner86/embed/mdYqZdW?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/mdYqZdW&quot;&gt;
Dialog with Popover Demo&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Ich erkläre euch was los ist: Im Allgemeinen hat die Position eines &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Elements im DOM keinen
Einfluss auf seine Sichtbarkeit. Wenn ihr das Popover einblendet, fügt der Browser es dem Top-Layer hinzu und es erscheint
über allen anderen Inhalten. Aber nur weil ihr etwas sehen könnt, heißt das nicht, dass ihr damit interagieren könnt. Die
Antwort findet sich in der
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal&quot;&gt;Beschreibung der Methode showModal()&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;The showModal() method of the HTMLDialogElement interface displays the dialog as a modal […]. Interaction outside the
dialog is blocked and &lt;strong&gt;the content outside it is rendered inert&lt;/strong&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das heißt, wenn ihr das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Element für die Snackbar außerhalb des Dialogs platziert, wird
es inaktiv gemacht. Alle Eingabe-Events der Nutzer:innen für das Element und seine Inhalte werden ignoriert. Was könnt ihr
also tun? Platziert das Popover-Element einfach innerhalb des Dialogelements. Jetzt betrachtet der Browser es als Teil des
Dialoginhalts und macht es nicht mehr inaktiv.&lt;/p&gt;
&lt;h3 id=&quot;manuelle-popovers-innerhalb-von-dialogen-solltet-ihr-immer-schließen&quot;&gt;Manuelle Popovers innerhalb von Dialogen solltet ihr immer schließen&lt;/h3&gt;
&lt;p&gt;Eine letzte Bemerkung zu manuellen Popovers, die in einem Modal-Dialog eingebettet sind. Wenn ihr den Dialog schließt,
dann schließt auch immer das Popover mit der Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;hidePopover()&lt;/code&gt; . Andernfalls wäre das Popover
zwar nicht sichtbar, aber immer noch offen und würde im Top-Layer verbleiben.&lt;/p&gt;
&lt;p&gt;Wenn ihr nun den Dialog erneut öffnet, wird er über dem Popover im Top-Layer platziert. Selbst wenn ihr also versucht, das
Popover erneut mit der Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;showPopover()&lt;/code&gt;  zu öffnen, wird nichts passieren! Das Popover ist
bereits geöffnet und befindet sich im Top-Layer unterhalb des Modal-Dialogs. Was für ein Schlamassel!&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Das native &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  Element und das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut sind sehr
mächtige und praktische Features. Aber es gibt auch einige Besonderheiten. Ich hoffe, meine Erkenntnisse helfen euch dabei,
diese großartigen Features in euren eigenen Projekten zu nutzen. Viel Spaß beim Coden! 😊&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 28.03.2026 &lt;/h2&gt; 
&lt;p&gt;Verwendet das neue &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closedby&lt;/code&gt;  Attribut anstelle von JavaScript, um Light-Dismiss-Verhalten zu
implementieren. Das Feature sollte bis Ende des Jahres browserübergreifend unterstützt werden. Erfahrt mehr in meinem neuen
Artikel &lt;a href=&quot;/de/blog/dialog-closedby-attribute/&quot;&gt;„Dialoge mit dem closedby-Attribut aufwerten“&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>accessibility</category><category>animation</category><category>css</category><category>dialog</category><category>html</category><category>popover</category><category>popup</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_pancakes.jpg" length="0" type="image/jpeg"/></item><item><title>Wird das CSS Scope Feature die View Encapsulation von Angular ersetzen?</title><link>https://www.oidaisdes.org/de/blog/css-scope-view-encapsulation</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/css-scope-view-encapsulation</guid><description>Lerne Natives Scoping anzuwenden und Code zu erstellen, der einfacher zu lesen und zu debuggen ist.</description><pubDate>Thu, 02 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Entwickler:innen sind oft bequem. Wir lieben Tools und Features, die uns das Leben leichter machen. Das gilt
insbesondere für die Gestaltung von Webinhalten mit CSS.&lt;/p&gt;
&lt;p&gt;Eine große Herausforderung ist die Definition von CSS-Regeln, die nur bestimmte Bereiche stylen, ohne
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity&quot;&gt;allzu spezifische Selektoren&lt;/a&gt; zu schreiben, die nur
schwer zu überschreiben sind. Außerdem sollte man Selektoren nicht zu eng an die DOM-Struktur koppeln, da diese
anfällig für Änderungen ist.&lt;/p&gt;
&lt;p&gt;Verschiedene JavaScript-Frameworks haben unterschiedliche Lösungen für dieses Problem entwickelt: React verwendet
&lt;a href=&quot;https://create-react-app.dev/docs/adding-a-css-modules-stylesheet/&quot;&gt;CSS-Module&lt;/a&gt;, die das Scoping von CSS ermöglichen,
indem sie automatisch einen eindeutigen Klassennamen für Komponenten-Styles erstellen. In Angular werden die Styles
&lt;a href=&quot;https://angular.io/guide/view-encapsulation&quot;&gt;mit benutzerdefinierten HTML-Attributen gekapselt&lt;/a&gt;, so dass sie sich
nicht auf den Rest der Applikation auswirken.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-cottonbro-donuts.CcURM5kp_Zxe2C7.webp&quot; srcset=&quot;/_astro/pexels-cottonbro-donuts.CcURM5kp_fw0Sb.webp 640w, /_astro/pexels-cottonbro-donuts.CcURM5kp_26wuM6.webp 750w, /_astro/pexels-cottonbro-donuts.CcURM5kp_Z14g2U8.webp 828w, /_astro/pexels-cottonbro-donuts.CcURM5kp_AoECN.webp 1080w, /_astro/pexels-cottonbro-donuts.CcURM5kp_ZKm1.webp 1280w, /_astro/pexels-cottonbro-donuts.CcURM5kp_Zxe2C7.webp 1600w&quot; alt=&quot;Eine Schachtel mit sechs Donuts in verschiedenen Farben.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © cottonbro studio / pexels.com&lt;/p&gt;
&lt;p&gt;Aber warum ist das Scoping von Styles nicht allein mit CSS möglich? Mittlerweile geht das! Mithilfe der neuen
CSS-Regel &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  können wir Styles auf bestimmte DOM-Abschnitte beschränken. Ihr könnt sogar
untere Grenzen für den Geltungsbereich festlegen und einen sogenannten &lt;span class=&quot;c-italic&quot;&gt;Donut Scope&lt;/span&gt;  schaffen.&lt;/p&gt;
&lt;p&gt;Ich erkläre euch die Grundlagen dieses neuen Features und erprobe ihre Anwendung in einer Angular-Demo.&lt;/p&gt;
&lt;h2 id=&quot;demo-css-scope-vs-view-encapsulation&quot;&gt;Demo: CSS Scope vs View Encapsulation&lt;/h2&gt;
&lt;p&gt;Meine &lt;a href=&quot;https://github.com/alexlehner86/test-css-scope&quot;&gt;Demo-Anwendung&lt;/a&gt; wurde mit Angular 17 erstellt. Sie enthält einen
Header und einen Hauptabschnitt mit einigen Absätzen, Links und mehreren Rezeptblöcken.&lt;/p&gt;
&lt;p&gt;Die Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipe-card&lt;/code&gt;  (gelber Hintergrund) verwendet die neue Scope-Funktion, um nur
die HTML-Elemente in ihrem eigenen Teilbaum anzusprechen. Wichtig: Zum Zeitpunkt des Verfassens dieses Artikels
&lt;a href=&quot;https://caniuse.com/css-cascade-scope&quot;&gt;funktioniert Scope nur in Chrome, Edge und Safari&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Zum Vergleich habe ich auch die Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipe-card-old&lt;/code&gt;  (blauer Hintergrund) definiert,
welche die Standard-View-Encapsulation von Angular verwendet. Untersucht die Elemente mit den Entwicklerwerkzeugen
eures Browsers.&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/test-css-scope/&quot; title=&quot;CSS Scope vs View Encapsulation Demo&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Wie die Demo zeigt, können wir mit CSS-Scope einfache Selektoren mit geringer Spezifität und ohne zusätzliche
Klassennamen schreiben. Schauen wir uns nun genauer an, wie das Ganze funktioniert.&lt;/p&gt;
&lt;h2 id=&quot;die-grundlagen-von-css-scoping&quot;&gt;Die Grundlagen von CSS-Scoping&lt;/h2&gt;
&lt;p&gt;Das neue CSS-Scope-Feature ist im Modul &lt;a href=&quot;https://www.w3.org/TR/css-cascade-6/&quot;&gt;CSS Cascading and Inheritance Level 6&lt;/a&gt;
definiert, das zum Zeitpunkt des Verfassens dieses Beitrags noch ein Arbeitsentwurf ist. Es besagt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;A &lt;strong&gt;scope&lt;/strong&gt; is a subtree or fragment of a document, which can be used by selectors for more targeted matching. A scope is formed by determining: The &lt;strong&gt;scoping root node&lt;/strong&gt;, which acts as the upper bound of the scope, and optionally the &lt;strong&gt;scoping limit elements&lt;/strong&gt;, which act as the lower bounds.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das heißt, ihr müsst das Root-Element des DOM-Teilbaums definieren, auf den ihr eure Styles anwenden möchtet.
Optional könnt ihr auch innere Elemente auflisten, welche die untere Grenze des Scopes darstellen.&lt;/p&gt;
&lt;h3 id=&quot;die-scope-css-regel&quot;&gt;Die @scope CSS-Regel&lt;/h3&gt;
&lt;p&gt;Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipe-card&lt;/code&gt;  Komponente in meiner Demo enthält Überschriften, Absätze und eine
ungeordnete Liste. Wir stylen sie mit dem folgenden CSS-Code:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (app-recipe-card) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    h3&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--highlight-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        font-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.3rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    p&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        margin-block&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 1em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    ul&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        list-style&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;square&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        margin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        padding-inline-start&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.25rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    li::marker&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--highlight-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der obige &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Block definiert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipe-card&lt;/code&gt;  als
die &lt;span class=&quot;c-italic&quot;&gt;Scoping Root&lt;/span&gt; , welche die obere Grenze des Teilbaums bestimmt, auf den wir abzielen. Nun
beziehen sich alle enthaltenen Style-Regeln, wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;h3 { … }&lt;/code&gt; , nur auf diesen begrenzten Abschnitt
des DOM.&lt;/p&gt;
&lt;h3 id=&quot;einen-donut-scope-erzeugen&quot;&gt;Einen Donut Scope erzeugen&lt;/h3&gt;
&lt;p&gt;Manchmal reicht es nicht aus, nur einen Scoping-Root zu setzen. In &lt;a href=&quot;https://angular.io&quot;&gt;Angular&lt;/a&gt; und &lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt;
verschachteln wir meistens Komponenten innerhalb anderer Komponenten, um komplexe Benutzeroberflächen zu erstellen. Wie
können wir sicherstellen, dass sich das Styling der Eltern-Komponente nicht auf ihre Kind-Komponenten auswirkt?&lt;/p&gt;
&lt;p&gt;Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Regel akzeptiert auch ein &lt;span class=&quot;c-italic&quot;&gt;Scoping Limit&lt;/span&gt; , das die untere
Begrenzung bestimmt. In meiner Demo sind die Rezeptblöcke in der Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipes-list&lt;/code&gt; 
eingebunden. Hier ist ein Teil des CSS-Codes:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (app-recipes-list) to (app-recipe-card, app-recipe-card-old) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    p&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        font-style&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;italic&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf diese Weise werden nur die von der übergeordneten Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipes-list&lt;/code&gt;  definierten
Absätze kursiv gesetzt. Die Absätze innerhalb der untergeordneten Komponenten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipe-card&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipe-card-old&lt;/code&gt;  sind davon nicht betroffen.&lt;/p&gt;
&lt;p&gt;Diese Art von Scoping – mit einer oberen und unteren Grenze – wird als &lt;span class=&quot;c-italic&quot;&gt;Donut Scope&lt;/span&gt;  bezeichnet.
Ich kann euch den Artikel
&lt;a href=&quot;https://developer.chrome.com/docs/css-ui/at-scope&quot;&gt;“Limit the reach of your selectors with the CSS @scope at-rule”&lt;/a&gt;
von Bramus Van Damme empfehlen. Er enthält tolle Visualisierungen verschiedener Scope-Szenarien.&lt;/p&gt;
&lt;h3 id=&quot;der-scope-selektor&quot;&gt;Der :scope Selektor&lt;/h3&gt;
&lt;p&gt;Eine weitere nützliche Funktion ist der Selektor &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:scope&lt;/code&gt; . Damit könnt ihr innerhalb
des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Blocks auf das Root-Element des Scopings selbst abzielen. Hier ist ein Beispiel aus
meiner Demo:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (app-recipe-card) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    :scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        --highlight-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;rgb&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;194&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 34&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;block&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        background&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;lightgoldenrodyellow&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;black&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        padding&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;browser-unterstützung&quot;&gt;Browser-Unterstützung&lt;/h3&gt;
&lt;p&gt;Wie bitte? Ihr findet das Scope-Feature total genial und wollt es sofort in allen Projekten einsetzen? Leider müsst
ihr euch noch etwas gedulden.&lt;/p&gt;
&lt;p&gt;Im Moment wird die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Regel nur
&lt;a href=&quot;https://caniuse.com/css-cascade-scope&quot;&gt;von Chrome 118+, Edge 118+ und Safari 17.4+ unterstützt&lt;/a&gt;. Firefox unterstützt
das Feature noch nicht, aber &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1830512&quot;&gt;Mozilla arbeitet aktiv an der Implementierung&lt;/a&gt;.
Hoffen wir auf eine browserübergreifende Unterstützung im Laufe des Jahres!&lt;/p&gt;
&lt;h2 id=&quot;wie-ihr-scope-in-einer-angular-applikation-verwendet&quot;&gt;Wie ihr @scope in einer Angular-Applikation verwendet&lt;/h2&gt;
&lt;p&gt;In Angular sind &lt;a href=&quot;https://angular.io/guide/view-encapsulation&quot;&gt;Komponenten-Styles standardmäßig gekapselt&lt;/a&gt;.
Das Framework erstellt eigene HTML-Attribute wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;_ngcontent-pmm-6&lt;/code&gt; , fügt sie in die generierten
HTML-Elemente ein und ändert die CSS-Selektoren der Komponente so, dass sie nur auf die View der Komponente angewendet werden.&lt;/p&gt;
&lt;p&gt;Wenn ihr stattdessen die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Regel verwenden möchtet, müsst ihr View Encapsulation für jede
Komponente manuell deaktivieren.&lt;/p&gt;
&lt;h3 id=&quot;die-view-encapsulation-abschalten&quot;&gt;Die View Encapsulation abschalten&lt;/h3&gt;
&lt;p&gt;Um die View Encapsulation zu deaktivieren, müsst ihr im &lt;a href=&quot;https://angular.io/api/core/Component&quot;&gt;Dekorator der Komponente&lt;/a&gt;
für &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;encapsulation&lt;/code&gt;  den Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ViewEncapsulation.None&lt;/code&gt;  setzen.
Hier ein Beispiel aus meiner Demo:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    selector:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;app-recipe-card&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    standalone:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    templateUrl:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;./recipe-card.component.html&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    styleUrl:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;./recipe-card.component.css&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    encapsulation:&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; ViewEncapsulation&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; RecipeCardComponent&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    @&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Input&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;({ &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;required:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; }) &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;recipe&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;!:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Recipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt werden eure CSS-Selektoren nicht mehr mit eigenen Attributen erweitert und die Styles der Komponente werden global
angewendet. Ihr solltet nun die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Regel verwenden, um die Styles zu kapseln.&lt;/p&gt;
&lt;h3 id=&quot;vergleich-des-html--und-css-outputs&quot;&gt;Vergleich des HTML- und CSS-Outputs&lt;/h3&gt;
&lt;p&gt;Wie wir gesehen haben, erfordert der Einsatz von CSS-Scope ein wenig Aufwand bei der Erstellung einer Komponente. Es ist
komfortabler, einfach die Standard-View-Encapsulation von Angular zu verwenden.&lt;/p&gt;
&lt;p&gt;Aber ich wage zu behaupten, dass die Vorteile von CSS-Scope diesen kleinen Aufwand rechtfertigen. Werfen wir einen Blick
auf den HTML- und CSS-Code, der für die Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipe-card&lt;/code&gt;  in meiner Demo erzeugt wird:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;app-recipe-card&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Pizza Margherita&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;The best pizza in town!&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h4&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Ingredients&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h4&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Cutting edge CSS features!&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        /* More list items */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;app-recipe-card&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Generated CSS code (excerpt) */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@scope&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (app-recipe-card) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    h3&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--highlight-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        font-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.3rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vergleichen wir das mit dem HTML- und CSS-Code, der für die Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;app-recipe-card-old&lt;/code&gt; 
erzeugt wird:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;app-recipe-card-old&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; _nghost-ng-c2291633987&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; _ngcontent-ng-c2291633987&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Pizza Margherita (Old)&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; _ngcontent-ng-c2291633987&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;The (second) best pizza in town!&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h4&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; _ngcontent-ng-c2291633987&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Ingredients&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h4&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; _ngcontent-ng-c2291633987&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; _ngcontent-ng-c2291633987&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;DOM cluttering view encapsulation&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        /* More list items */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;app-recipe-card-old&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Generated CSS code (excerpt) */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_ngcontent-ng-c2291633987&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--highlight-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    font-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.3rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stellt euch nun vor, ihr müsst eure Applikation debuggen. Die Rezeptblöcke werden nicht richtig gerendert.
Ihr öffnet die Entwicklertools eures Browsers und untersucht das DOM und die angewandten Styles. Welcher Code wäre
leichter zu lesen und zu verstehen?&lt;/p&gt;
&lt;p&gt;Ich glaube, dass mich die unzähligen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;_ngcontent-ng-c2291633987&lt;/code&gt;  Attribute sehr ablenken würden.
Es würde mir leichter fallen, den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope (app-recipe-card) { h3 }&lt;/code&gt;  Selektor zu verstehen als
den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;h3[_ngcontent-ng-c2291633987]&lt;/code&gt;  Selektor. 😉&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Zurück zu meiner ursprüngliche Frage: Wird das CSS Scope Feature die View Encapsulation von Angular ersetzen? Vielleicht.
Ich weiß es wirklich nicht. Im Idealfall wird das Angular-Team seinen Standard-Mechanismus zur View Encapsulation anpassen
und die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Regel verwenden.&lt;/p&gt;
&lt;p&gt;Unabhängig davon, was das Angular-Team tut: Es ist jetzt schon sehr einfach, die View Encapsulation für eine Komponente
abzuschalten und die Styles innerhalb eines &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@scope&lt;/code&gt;  Blocks zu definieren. Der generierte HTML- und
CSS-Code ist besser lesbar und viel einfacher zu debuggen. Außerdem verringert es die Dateigröße der Webanwendung.&lt;/p&gt;
&lt;p&gt;Für mich steht fest: Sobald CSS-Scope browserübergreifend unterstützt wird, werde ich es in meinen Projekten einsetzen. 🤩&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 24.02.2026 &lt;/h2&gt; 
&lt;p&gt;Natives CSS Scope wird nun browserübergreifend unterstützt. Erfahrt mehr über dieses großartige Feature in meinem neuen
Artikel &lt;a href=&quot;/de/blog/css-scope-angular-best-practices/&quot;&gt;„Best Practices für CSS Scope in Angular-Applikationen”&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>angular</category><category>css</category><category>encapsulation</category><category>react</category><category>scope</category><category>styling</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_donuts.jpg" length="0" type="image/jpeg"/></item><item><title>Verschiedene Farbthemen mit einem zweifarbigen Fokusindikator unterstützen</title><link>https://www.oidaisdes.org/de/blog/two-color-focus-indicator</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/two-color-focus-indicator</guid><description>So erzeugt ihr einen barrierefreien, universellen Fokusindikator, der im hellen und dunklen Modus funktioniert.</description><pubDate>Thu, 21 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Benutzt ihr die Tastatur, um im Internet zu surfen? Wenn ja, dann werdet ihr es zu schätzen wissen, wenn der Fokusindikator
deutlich sichtbar ist. Dieses Barrierefreiheits-Feature ist besonders wichtig für Menschen mit motorischen Beeinträchtigungen,
welche die Tastatur statt der Maus nutzen, um auf einer Webseite zu navigieren.&lt;/p&gt;
&lt;p&gt;Ich empfehle generell, die Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-visible&lt;/code&gt;  zu verwenden, um eigene Fokusindikatoren
zu definieren. Weitere Informationen findet ihr in meinem Artikel
&lt;a href=&quot;/de/blog/highly-visible-keyboard-focus/&quot;&gt;„Gestalte deutlich sichtbaren Tastaturfokus mit :focus-visible“&lt;/a&gt;. Aber wie berücksichtigt
man verschiedene Farbthemen und den Dark Mode?&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-cottonbro-keyboard.S0lQaG98_ZWJYFF.webp&quot; srcset=&quot;/_astro/pexels-cottonbro-keyboard.S0lQaG98_ZWudMY.webp 640w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_HnbJ1.webp 750w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_ZlgvEo.webp 828w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_Z27NIX3.webp 1080w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_5c0oj.webp 1280w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_ZWJYFF.webp 1600w&quot; alt=&quot;Nahaufnahme von den Händen einer Person, die auf einer Laptop-Tastatur schreibt.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © cottonbro / pexels.com&lt;/p&gt;
&lt;p&gt;Die elegante Lösung lautet: Definiert einen zweifarbigen Fokusindikator, der einen ausreichenden Kontrast zu jedem einfarbigen
Hintergrund aufweist. Die &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Techniques/css/C40&quot;&gt;Technik C40 des W3C&lt;/a&gt; empfiehlt diese Lösung als
eine Möglichkeit, die WCAG-Kriterien &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-visible&quot;&gt;2.4.7: Fokus sichtbar&lt;/a&gt;
und &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html&quot;&gt;2.4.13: Fokus-Erscheinungsbild&lt;/a&gt; zu erfüllen.&lt;/p&gt;
&lt;h2 id=&quot;demo-zweifarbiger-fokusindikator&quot;&gt;Demo: Zweifarbiger Fokusindikator&lt;/h2&gt;
&lt;p&gt;Hier ist meine &lt;a href=&quot;https://codepen.io/alexlehner86/pen/wvZJbBd&quot;&gt;Demo&lt;/a&gt; einer barrierefreien zweifarbigen Fokusanzeige. Mit der
Checkbox „Dark Mode“ könnt ihr zwischen hellem und dunklem Modus umschalten. Fokussiert die Schaltfläche und den Link mit der
Tab-Taste und beobachtet den Fokusindikator:&lt;/p&gt;
&lt;iframe title=&quot;Zweifarbiger Fokusindikator&quot; src=&quot;https://codepen.io/alexlehner86/embed/wvZJbBd?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;Öffne das Code-Beispiel &lt;a href=&quot;https://codepen.io/alexlehner86/pen/wvZJbBd&quot; lang=&quot;en&quot;&gt;
Two-color focus indicator&lt;/a&gt; von Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
auf &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Wie funktioniert das Ganze?&lt;/p&gt;
&lt;h2 id=&quot;die-nicht-allzu-geheimen-css-zutaten&quot;&gt;Die (nicht allzu) geheimen CSS-Zutaten&lt;/h2&gt;
&lt;p&gt;Um den zweifarbigen Fokusindikator zu erstellen, kombiniert einfach die CSS-Eigenschaften &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;outline&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;box-shadow&lt;/code&gt; , um eine helle und dunkle Linie um das fokussierte Element zu zeichnen.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:is&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;], &lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:focus-visible&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* inner indicator */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; #fff&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline-offset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* outer indicator */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    box-shadow&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 5px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; #000&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eine der Linien bietet immer einen ausreichenden Kontrast zur aktuellen Hintergrundfarbe. In meiner Demo habe ich eine
einfache Kombination aus reinem Weiß und Schwarz verwendet. Ihr könnt aber auch andere Farben verwenden, wie
die W3C-Technik erklärt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;As long as the two indicator colors have a &lt;strong&gt;contrast ratio of at least 9:1 with each other&lt;/strong&gt;, at least
one of the two colors is guaranteed to meet 3:1 contrast with any solid background color.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Der zweifarbige Fokusindikator funktioniert sogar im &lt;span lang=&quot;en&quot;&gt;Forced Colors Modus&lt;/span&gt;.
Wenn ihr mit diesem Feature nicht vertraut seid, lest meinen Artikel
&lt;a href=&quot;/de/blog/forced-colors-mode/&quot;&gt;„CSS-Tricks für bessere Sichtbarkeit im Forced Colors Modus“&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>accessibility</category><category>contrast</category><category>css</category><category>design</category><category>keyboard</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_keyboard.jpg" length="0" type="image/jpeg"/></item><item><title>Optimiert eure Designs mit Barrierefreiheits-Anmerkungen</title><link>https://www.oidaisdes.org/de/blog/design-a11y-annotations</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/design-a11y-annotations</guid><description>Markiert Überschriften, Alternativtexte, Links und Buttons in euren Prototypen.</description><pubDate>Mon, 26 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Barrierefreiheit ist ein Gemeinschaftsprojekt. Damit eine Website für alle Nutzer:innen gut bedienbar ist, sollte
Accessibility im gesamten Entwicklungsprozess berücksichtigt werden. Wie können Designer:innen am besten dazu beitragen?&lt;/p&gt;
&lt;p&gt;Als Web-Entwickler und Requirements Engineer arbeite ich eng mit UI/UX-Designer:innen zusammen. Auf Basis der Anforderungen
erarbeiten sie Entwürfe und
&lt;a href=&quot;https://medium.com/sketch-app-sources/what-is-a-design-prototype-the-complete-guide-f79cce54c50e&quot;&gt;Prototypen für die Benutzeroberfläche&lt;/a&gt;,
die Entwickler:innen später implementieren. Diese Arbeit ist oft sehr visuell dominiert:
Welche Farben kommen zum Einsatz? Wie berücksichtigen wir die Corporate Identity des Kunden optimal?&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-amina-filkins-women-tablet.DcIZdccM_IvtbN.webp&quot; srcset=&quot;/_astro/pexels-amina-filkins-women-tablet.DcIZdccM_ZQeMxb.webp 640w, /_astro/pexels-amina-filkins-women-tablet.DcIZdccM_1i9DrM.webp 750w, /_astro/pexels-amina-filkins-women-tablet.DcIZdccM_ZIXHK1.webp 828w, /_astro/pexels-amina-filkins-women-tablet.DcIZdccM_Z282HSm.webp 1080w, /_astro/pexels-amina-filkins-women-tablet.DcIZdccM_ZrNyxk.webp 1280w, /_astro/pexels-amina-filkins-women-tablet.DcIZdccM_IvtbN.webp 1600w&quot; alt=&quot;Zwei Mitarbeiterinnen eines Blumengeschäfts betrachten das Tablet vor ihnen auf dem Tisch.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Amina Filkins / pexels.com&lt;/p&gt;
&lt;p&gt;Bei Barrierefreiheit denken Designer:innen daher oft an die &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html&quot;&gt;Verwendung von Farbe&lt;/a&gt;
und &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum&quot;&gt;ausreichende Kontrastverhältnisse&lt;/a&gt;. Doch Designs können
noch mehr: Barrierefreiheits-Anmerkungen vermitteln wichtige Informationen über die Struktur und Semantik der Website.&lt;/p&gt;
&lt;h2 id=&quot;das-a11y-annotation-kit-für-figma&quot;&gt;Das A11y Annotation Kit für Figma&lt;/h2&gt;
&lt;p&gt;Es gibt verschiedene Programme zum Erstellen von Prototypen. Meine Kolleg:innen arbeiten gerne mit &lt;a href=&quot;https://www.figma.com&quot;&gt;Figma&lt;/a&gt;,
einer kollaborativen Plattform für UI/UX Design.&lt;/p&gt;
&lt;p&gt;Um dort Überlegungen zur Barrierefreiheit zu dokumentieren, können Designer:innen selbst passende Elemente definieren oder mit
fertigen Bibliotheken wie dem &lt;a href=&quot;https://www.figma.com/community/file/953682768192596304/a11y-annotation-kit&quot;&gt;A11y Annotation Kit&lt;/a&gt;
arbeiten. Dieses bietet eine breite Palette an Tools, um semantische Informationen im Design auszuzeichnen. Sehen wir uns ein
paar davon näher an.&lt;/p&gt;
&lt;h2 id=&quot;überschriften-auszeichnen&quot;&gt;Überschriften auszeichnen&lt;/h2&gt;
&lt;p&gt;Sehende Nutzer:innen scannen meist instinktiv eine Website nach Überschriften, um das zu finden, wonach sie suchen. Auch für
blinde und sehbeeinträchtigte Nutzer:innen sind Überschriften von zentraler Bedeutung: Laut der
&lt;a href=&quot;https://webaim.org/projects/screenreadersurvey10/#heading&quot;&gt;letzten Umfrage von WebAIM&lt;/a&gt; sagen 9 von 10 Screenreader-Nutzer:innen,
dass sinnvoll eingesetzte Überschriften-Ebenen für sie sehr oder eher nützlich seien.&lt;/p&gt;
&lt;p&gt;Überschriften müssen semantisch korrekt ausgezeichnet werden, damit Screenreader sie als Überschrift ankündigen können. Bei
Websites passiert das mit den HTML-Tags &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;h1&lt;/code&gt;  bis &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;h6&lt;/code&gt; . Nutzer:innen können dann
etwa mit Tastaturkürzel von Überschrift zu Überschrift springen und sich somit schnell einen Überblick verschaffen.&lt;/p&gt;
&lt;p&gt;Designer:innen sollten sich daher möglichst früh überlegen, wie der Inhalt einer Seite
&lt;a href=&quot;https://www.w3.org/WAI/tutorials/page-structure/headings/&quot;&gt;sinnvoll mit Überschriften strukturiert&lt;/a&gt;
werden kann. Im finalen Design sollten alle Überschriften sowie ihre Ebene (1 bis 6) markiert sein. Hier ein Beispiel:&lt;/p&gt;
&lt;img src=&quot;/_astro/website_a11y_annotation_headings_en.CJ7XkyJo_24aujK.webp&quot; srcset=&quot;/_astro/website_a11y_annotation_headings_en.CJ7XkyJo_2lm5Ar.webp 640w, /_astro/website_a11y_annotation_headings_en.CJ7XkyJo_CxWlq.webp 750w, /_astro/website_a11y_annotation_headings_en.CJ7XkyJo_2qxcsH.webp 828w, /_astro/website_a11y_annotation_headings_en.CJ7XkyJo_Ceylf.webp 1080w, /_astro/website_a11y_annotation_headings_en.CJ7XkyJo_Z2eAqOo.webp 1280w, /_astro/website_a11y_annotation_headings_en.CJ7XkyJo_28Vsbz.webp 1668w, /_astro/website_a11y_annotation_headings_en.CJ7XkyJo_Z1UAc19.webp 2048w, /_astro/website_a11y_annotation_headings_en.CJ7XkyJo_1ObMss.webp 2560w, /_astro/website_a11y_annotation_headings_en.CJ7XkyJo_24aujK.webp 2596w&quot; alt=&quot;Ein Design mit zwei Überschriften, die als h2 und h3 markiert sind.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 2596px) 2596px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;2596&quot; height=&quot;1460&quot;&gt;
&lt;p&gt;&lt;em&gt;Screenshot: © Alexander Lehner&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Zwei Fragen werden euch dabei ständig begleiten: Was macht eine Überschrift zur Überschrift? Welche Überschriften-Hierarchie
ist sinnvoll? Um euch das Leben etwas zu erleichtern, hier ein paar Tipps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Überschriften strukturieren den Inhalt der Seite:&lt;/strong&gt; Eine Überschrift leitet einen neuen Inhaltsabschnitt ein
und sollte diesen beschreiben. Große Schrift, Fettdruck oder eine eigene Zeile machen einen Text nicht automatisch zur Überschrift!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Überspringt niemals eine Überschriften-Ebene!&lt;/strong&gt; Die wichtigste Überschrift sollte als &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;h1&lt;/code&gt; 
ausgezeichnet werden, danach folgt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;h2&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;h3&lt;/code&gt; , usw. Überschriften mit gleichem oder
höherem Rang beginnen einen neuen Abschnitt. Überschriften mit niedrigerem Rang beginnen neue Unterabschnitte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Styling und Semantik trennen:&lt;/strong&gt; Die visuelle Darstellung einer Überschrift sollte niemals darüber entscheiden,
welche Überschriften-Ebene verwendet wird! Mein Tipp: Definiert eigene Überschriften-Klassen
wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;heading-sm&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;heading-md&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;heading-lg&lt;/code&gt; , usw.
Somit könnt ihr Überschriften unabhängig von ihrer Position in der Hierarchie stylen.&lt;/li&gt;
&lt;li&gt;In manchen Fällen kann auch eine &lt;a href=&quot;https://www.tpgi.com/the-anatomy-of-visually-hidden/&quot;&gt;visuell verborgene Überschrift&lt;/a&gt;
Sinn machen, um die Seitenstruktur zu verbessern.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seid kreativ!&lt;/strong&gt; Eine perfekte Überschriften-Struktur ist harte Arbeit. Macht einen Entwurf. Holt euch Feedback
von außen. Verfeinert eure Designs schrittweise. Es ist noch kein Meister vom Himmel gefallen 😉&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;alternativtext-für-bilder&quot;&gt;Alternativtext für Bilder&lt;/h2&gt;
&lt;p&gt;Fehlende oder schlechte Alternativtexte zählen zu den häufigsten Barrieren auf Websites. Laut der Studie
&lt;a href=&quot;https://webaim.org/projects/million/&quot;&gt;WebAIM Million 2023&lt;/a&gt; weisen über ein Drittel der Bilder auf beliebten Websites
einen fehlenden, fragwürdigen oder sich wiederholenden Alternativtext auf.&lt;/p&gt;
&lt;p&gt;Design-Prototypen sollten daher Alternativtexte für Bildinhalte definieren, so dass visuell vermittelte Informationen
auch für Screenreader-Nutzer:innen zugänglich sind. Hierbei solltet ihr folgende Punkte beachten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Funktionale Bilder:&lt;/strong&gt; Wenn ein Button oder Link nur ein Bild oder Icon enthält, dann muss der
Alternativtext den Zweck des Elements beschreiben.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Informative Bilder:&lt;/strong&gt; Das sind Bilder, die relevante Informationen vermitteln. Hier sollte das Design einen
konkreten Alternativtext vorgeben oder zumindest definieren, dass ein sinnvoller Alternativtext definiert werden muss.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dekorative Bilder:&lt;/strong&gt; Wenn Bilder nur die Seite aufhübschen sollen, dann müssen sie vor assistiven Technologien
verborgen werden. Die Barrierefreiheits-Anmerkung kann dies mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;alt=&amp;quot;&amp;quot;&lt;/code&gt;  darstellen.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;/_astro/website_a11y_annotation_alt_text_en.90qyzNBT_ZjaGkM.webp&quot; srcset=&quot;/_astro/website_a11y_annotation_alt_text_en.90qyzNBT_14iVll.webp 640w, /_astro/website_a11y_annotation_alt_text_en.90qyzNBT_ZDubSF.webp 750w, /_astro/website_a11y_annotation_alt_text_en.90qyzNBT_19u3dB.webp 828w, /_astro/website_a11y_annotation_alt_text_en.90qyzNBT_ujvAI.webp 1080w, /_astro/website_a11y_annotation_alt_text_en.90qyzNBT_Z1dAXVX.webp 1280w, /_astro/website_a11y_annotation_alt_text_en.90qyzNBT_Z1UgdJV.webp 1668w, /_astro/website_a11y_annotation_alt_text_en.90qyzNBT_ZTAJ8I.webp 2048w, /_astro/website_a11y_annotation_alt_text_en.90qyzNBT_ZjaGkM.webp 2277w&quot; alt=&quot;Ein Design mit mehreren Bildern, für die Alternativtexte definiert sind.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 2277px) 2277px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;2277&quot; height=&quot;1281&quot;&gt;
&lt;p&gt;&lt;em&gt;Screenshot: © Alexander Lehner&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Weitere Infos sowie einige Negativbeispiele findet ihr in meinem
Artikel &lt;a href=&quot;/de/blog/how-not-to-use-images/&quot;&gt;„Ein Bild sagt mehr als tausend Worte – außer du bist blind!“&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;button-oder-link&quot;&gt;Button oder Link?&lt;/h2&gt;
&lt;p&gt;Links sind unterstrichen. Buttons sind klickbare Boxen. Oder? 🤔&lt;/p&gt;
&lt;p&gt;Visuell sind Links und Buttons oft nicht klar voneinander zu unterscheiden. In manchen Designs sehen Links wie klassische
Buttons aus, und umgekehrt. Für sehende Nutzer:innen ist das meistens kein Problem: Hauptsache sie verstehen, dass es sich
um interaktive Elemente handelt.&lt;/p&gt;
&lt;p&gt;Für assistive Technologien ist die semantische Rolle der Elemente jedoch besonders wichtig. Je nachdem, ob der Screenreader
ein Element als Link oder Button ankündigt, erwarten Nutzer:innen ein anderes Verhalten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Links&lt;/strong&gt; führen zu einer neuen Ressource, z.B. einer anderen Website oder einem anderen Abschnitt auf
derselben Seite. Man verlässt den aktuellen Kontext.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buttons&lt;/strong&gt; lösen hingegen eine Aktion im selben Kontext aus, z.B. ein Popup-Menü oder das Abspielen eines Videos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das heißt: Das Aussehen ist zweitrangig. Die Funktion des Elements ist entscheidend. Ich empfehle euch den Artikel
&lt;a href=&quot;https://marcysutton.com/links-vs-buttons-in-modern-web-applications&quot;&gt;„Links vs. Buttons in Modern Web Applications“&lt;/a&gt;,
der noch tiefer in das Thema eintaucht.&lt;/p&gt;
&lt;p&gt;Also liebe Designer: Markiert Links und Buttons entsprechend ihrer Funktion. Und erklärt am besten in der Legende
des Designs, dass Entwicklerinnen dafür native Elemente verwenden sollten. Also &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;a&lt;/code&gt;  für Links
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  für Buttons. Eure Nutzer:innen werden es euch danken! 🤩&lt;/p&gt;</content:encoded><category>accessibility</category><category>design</category><category>figma</category><category>html</category><category>semantics</category><category>UI</category><category>UX</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_women_tablet.jpg" length="0" type="image/jpeg"/></item><item><title>Barrierefreie Alerts leicht gemacht mit der Popover API</title><link>https://www.oidaisdes.org/de/blog/accessible-popover-alert</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessible-popover-alert</guid><description>Informiere Nutzer über wichtige Ereignisse, ohne ihren Workflow zu unterbrechen.</description><pubDate>Sat, 06 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Benachrichtigungen (Alerts) sind ein &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/alert/&quot;&gt;gängiges Element&lt;/a&gt; auf Websites.
Sie lenken die Aufmerksamkeit der Nutzer:innen auf eine wichtige Nachricht, ohne den aktuellen Workflow zu unterbrechen.
Zum Beispiel: &lt;span class=&quot;c-italic&quot;&gt;„Artikel wurde dem Warenkorb hinzugefügt“&lt;/span&gt; 
oder &lt;span class=&quot;c-italic&quot;&gt;„Login ist fehlgeschlagen: Prüfen Sie Benutzernamen/Kennwort“&lt;/span&gt; .&lt;/p&gt;
&lt;p&gt;Dank der neuen &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover API&lt;/a&gt; und der neuen Möglichkeiten von
CSS-Animationen wird es bald viel einfacher werden, barrierefreie und schön animierte Alerts zu erstellen. Ich habe eine
Demo vorbereitet, die ihr ausprobieren könnt.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-thirdman-megaphone.BBPypX9V_Z1WRkFx.webp&quot; srcset=&quot;/_astro/pexels-thirdman-megaphone.BBPypX9V_tA1Q6.webp 640w, /_astro/pexels-thirdman-megaphone.BBPypX9V_29sro6.webp 750w, /_astro/pexels-thirdman-megaphone.BBPypX9V_15NIYG.webp 828w, /_astro/pexels-thirdman-megaphone.BBPypX9V_1Wg3Q1.webp 1080w, /_astro/pexels-thirdman-megaphone.BBPypX9V_ZTUkAy.webp 1280w, /_astro/pexels-thirdman-megaphone.BBPypX9V_Z1WRkFx.webp 1600w&quot; alt=&quot;Ein Mann spricht in ein Megaphon.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Thirdman / pexels.com&lt;/p&gt;
&lt;p&gt;Falls ihr mit der Popover API noch nicht vertraut seid, solltet ihr zuerst meinen Artikel
&lt;a href=&quot;/de/blog/popover-api-accessibility/&quot;&gt;„Einfach herausragend! Die neue Popover API und CSS Anchor Positioning“&lt;/a&gt; lesen.
Ich werde hier die Grundlagen nicht wiederholen und mich stattdessen auf den speziellen Anwendungsfall konzentrieren.&lt;/p&gt;
&lt;h2 id=&quot;barrierefreie-alerts-demo&quot;&gt;Barrierefreie Alerts Demo&lt;/h2&gt;
&lt;p&gt;Hier ist meine Demo für barrierefreie Alerts mit der Popover API. Ihr könnt sowohl die Nachricht als auch die Dauer
und Position der Meldung anpassen. Probiert es aus:&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/accessible-popover-alert/&quot; title=&quot;Barrierefreie Alerts Demo&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Das Alert erscheint über allen anderen Elementen der Seite und wird von Screenreadern automatisch vorgelesen. Ich
habe dieses Verhalten mit &lt;a href=&quot;https://www.freedomscientific.com/products/software/jaws/&quot;&gt;JAWS&lt;/a&gt;,
&lt;a href=&quot;https://www.nvaccess.org/download/&quot;&gt;NVDA&lt;/a&gt;, &lt;a href=&quot;https://support.google.com/accessibility/android/answer/6283677?hl=en&quot;&gt;TalkBack&lt;/a&gt;
und &lt;a href=&quot;https://en.wikipedia.org/wiki/VoiceOver&quot;&gt;VoiceOver&lt;/a&gt;. getestet. Die aktuelle Tätigkeit des Nutzers wird nicht
unterbrochen und das Alert verschwindet nach einiger Zeit.&lt;/p&gt;
&lt;h2 id=&quot;details-der-implementierung&quot;&gt;Details der Implementierung&lt;/h2&gt;
&lt;p&gt;Schauen wir uns nun die verschiedenen Bausteine an, mit denen ich die barrierefreien, animierten Alerts gestaltet habe.&lt;/p&gt;
&lt;h3 id=&quot;dynamisches-html-erzeugen&quot;&gt;Dynamisches HTML erzeugen&lt;/h3&gt;
&lt;p&gt;Ich habe einen &lt;a href=&quot;https://angular.io/guide/architecture-services&quot;&gt;Angular-Service&lt;/a&gt; implementiert, der das Popover-Element
mit JavaScript-Methoden wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;createElement()&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;appendChild()&lt;/code&gt;  dynamisch
erzeugt. Im &lt;a href=&quot;https://github.com/alexlehner86/accessible-popover-alert/blob/main/src/app/services/alert.service.ts&quot;&gt;Demo-Code&lt;/a&gt;
findet ihr weitere Details. Ihr müsst nicht mit dem Angular-Framework vertraut sein, um das Wichtigste zu verstehen.&lt;/p&gt;
&lt;p&gt;Der folgende HTML-Code wird einem Container am Ende des body-Elements hinzugefügt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;manual&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;alert&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;alert top-right&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    This is a very important message&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut verwandelt das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Element in ein Popover, das
zunächst vom Browser ausgeblendet wird. Wir zeigen das Popover-Alert an, indem wir die Methode
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/showPopover&quot;&gt;showPopover()&lt;/a&gt; des Elements aufrufen.&lt;/p&gt;
&lt;p&gt;Mittels &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover=“manual”&lt;/code&gt;  definieren wir einen manuellen Popover-Status für das Element. Damit
verhindern wir Light-Dismiss, also das automatische Schließen des Popovers, wenn Nutzer:innen mit anderen Elementen auf der
Seite interagieren. Stattdessen schließen wir das Popover programmatisch mit der Methode
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/hidePopover&quot;&gt;hidePopover()&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;semantisches-markup&quot;&gt;Semantisches Markup&lt;/h3&gt;
&lt;p&gt;Setzt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“alert”&lt;/code&gt;  auf das Popover-Element, um es als Alert zu definieren. Das Dokument
&lt;a href=&quot;https://www.w3.org/TR/wai-aria-1.2/#alert&quot;&gt;Accessible Rich Internet Applications (WAI-ARIA) 1.2&lt;/a&gt;
beschreibt die Alert-Rolle wie folgt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;A type of &lt;strong&gt;live region&lt;/strong&gt; with important, and usually time-sensitive, information. […] Alerts are
assertive live regions, which means &lt;strong&gt;they cause immediate notification&lt;/strong&gt; for assistive technology users.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Im Allgemeinen verwenden wir &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions&quot;&gt;ARIA-Live-Regionen&lt;/a&gt;,
um dynamische Inhaltsänderungen zu kommunizieren. Das Setzen von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“alert”&lt;/code&gt;  hat denselben Effekt wie
das Setzen von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-live=“assertive”&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-atomic=“true”&lt;/code&gt; . Das heißt,
Screenreader lesen die Nachricht des Alerts sofort vor, sobald das Popover angezeigt wird.&lt;/p&gt;
&lt;h3 id=&quot;animation&quot;&gt;Animation&lt;/h3&gt;
&lt;p&gt;Jetzt machen wir noch den visuellen Feinschliff und fügen dem Popover-Element eine Animation hinzu. Es gibt aber ein Problem:
Popover werden anfangs durch &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt;  ausgeblendet. Was für ein Albtraum! Das erzeugt gleich
zwei Hindernisse:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ein Element mit dem Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt;  für die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt;  Eigenschaft wird nicht
gerendert. Daher hat es keine berechneten Werte für die verschiedenen CSS-Eigenschaften wie z.B. &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;opacity&lt;/code&gt; .
Wenn es keinen berechneten Wert gibt, haben wir keinen Ausgangspunkt für die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition&lt;/code&gt; .&lt;/li&gt;
&lt;li&gt;Das gleiche Problem besteht auch in umgekehrter Richtung: Wenn die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display&lt;/code&gt; 
auf &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt;  gesetzt wird, wird das Element sofort aus dem gerenderten HTML-Dokument entfernt, ohne dass
der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition&lt;/code&gt;  Effekt ausgelöst wird.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Glücklicherweise bietet die &lt;a href=&quot;https://drafts.csswg.org/css-transitions-2/&quot;&gt;CSS Transitions Level 2&lt;/a&gt; Spezifikation neue
Möglichkeiten für CSS-Übergänge. Sie definiert die neue &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@starting-style&lt;/code&gt;  Regel:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;The &lt;strong&gt;@starting-style rule&lt;/strong&gt; is a grouping rule. The style rules inside it are used to establish styles to
transition from, if the previous style change event did not establish a before-change style for the element whose styles are
being computed.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So können wir einen Ausgangszustand für den Übergang definieren, wenn sich der Anzeigetyp von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt; 
zu einem anderen Typ ändert.&lt;/p&gt;
&lt;p&gt;Der zweite Puzzlestein ist die neue &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition-behavior&lt;/code&gt;  Eigenschaft und ihr
Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;allow-discrete&lt;/code&gt; :&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;The &lt;strong&gt;transition-behavior&lt;/strong&gt; property specifies whether transitions will be started or not for discrete properties.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Diskrete Eigenschaften haben Werte, die nicht interpoliert werden können. Dies ist z.B. bei den Eigenschaften
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/display&quot;&gt;display&lt;/a&gt; und &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/overlay&quot;&gt;overlay&lt;/a&gt;
der Fall. Um Übergänge für sie zuzulassen, müssen wir den Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;allow-discrete&lt;/code&gt;  definieren.
Ihr könnt den Wert für &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition-behavior&lt;/code&gt;  auch als Teil einer Shorthand-Deklaration angeben.&lt;/p&gt;
&lt;p&gt;Wie passt das nun alles zusammen? Meine Demo enthält die Position “top-right”, bei der das Alert langsam sichtbar wird und
von rechts in den sichtbaren Bereich rutscht. Hier ist der CSS-Code für den Übergang:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.alert&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;popover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.top-right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* Final state of the exit animation */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: opacity &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5s&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        transform &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5s&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;        overlay&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0.5s&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; allow-discrete,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        display &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5s&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; allow-discrete;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.alert&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;popover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.top-right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;popover-open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* Final state of the show animation */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Needs to be after the previous [popover]:popover-open rule to take effect, as the specificity is the same */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@starting-style&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    .alert&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;popover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.top-right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;popover-open&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Im obigen Beispiel werden die Eigenschaften &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;opacity&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transform&lt;/code&gt;  für
die Dauer einer halben Sekunde animiert. Wir möchten, dass der Browser den animierten Inhalt anzeigt und das Popover im
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Top_layer&quot;&gt;Top Layer&lt;/a&gt; bleibt, solange die Animation läuft. Um dies zu
erreichen, definieren wir auch &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;overlay 0.5s allow-discrete&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display 0.5s allow-discrete&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;Achtung! Diese Funktionen sind experimentell und können sich in Zukunft ändern!&lt;/p&gt;
&lt;h2 id=&quot;browser-unterstützung&quot;&gt;Browser-Unterstützung&lt;/h2&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut wird bereits &lt;a href=&quot;https://caniuse.com/mdn-api_htmlelement_popover&quot;&gt;von allen wichtigen Browsern unterstützt&lt;/a&gt;.
Zum Zeitpunkt der Erstellung dieses Artikels hatte Firefox die Funktion nur in seinen experimentellen Nightly-Builds aktiviert.
Ich erwarte aber, dass Firefox die Funktion bald releast.&lt;/p&gt;
&lt;p&gt;Die neuen Funktionen für &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition&lt;/code&gt;  werden derzeit nur von
&lt;a href=&quot;https://caniuse.com/mdn-css_properties_transition-behavior&quot;&gt;Chrome und Edge&lt;/a&gt; unterstützt. Ich hoffe, dass sie Teil der
&lt;a href=&quot;https://github.com/web-platform-tests/interop/tree/main/2024&quot;&gt;Interop 2024&lt;/a&gt; sein werden und bis Ende des Jahres eine
browserübergreifende Kompatibilität erreichen.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/alert/&quot;&gt;Alert Pattern (ARIA Authoring Practices Guide)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover API (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drafts.csswg.org/css-transitions-2/&quot;&gt;CSS Transitions Level 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>angular</category><category>animation</category><category>css</category><category>html</category><category>popover</category><category>popup</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_megaphone2.jpg" length="0" type="image/jpeg"/></item><item><title>Der PDF Accessibility Checker: Stärken und Schwächen</title><link>https://www.oidaisdes.org/de/blog/pdf-accessibility-checker</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/pdf-accessibility-checker</guid><description>Das Tool erkennt grobe Barrierefreiheits-Mängel. Die manuelle Prüfung ersetzt es aber nicht.</description><pubDate>Wed, 06 Dec 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Von der Rechnung beim Online-Shoppen bis zum amtlichen Bescheid: PDF-Dokumente sind heute allgegenwärtig.
Zahlreiche Unternehmen und Organisation nutzen das Dateiformat, um Informationen darzustellen und auszutauschen.
Doch sind PDFs auch barrierefrei? Die kurze Antwort: Nicht automatisch!&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-antoni-shkraba-document.gEzVoALd_bKUuH.webp&quot; srcset=&quot;/_astro/pexels-antoni-shkraba-document.gEzVoALd_28pK1s.webp 640w, /_astro/pexels-antoni-shkraba-document.gEzVoALd_ZCpzgU.webp 750w, /_astro/pexels-antoni-shkraba-document.gEzVoALd_ZC2MjM.webp 828w, /_astro/pexels-antoni-shkraba-document.gEzVoALd_2p76X2.webp 1080w, /_astro/pexels-antoni-shkraba-document.gEzVoALd_Z1BPbi1.webp 1280w, /_astro/pexels-antoni-shkraba-document.gEzVoALd_bKUuH.webp 1600w&quot; alt=&quot;Ein Dokument mit Textblöcken und Grafiken.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © ANTONI SHKRABA production / pexels.com&lt;/p&gt;
&lt;p&gt;Der Standard &lt;a href=&quot;https://de.wikipedia.org/wiki/PDF/UA&quot;&gt;PDF/UA&lt;/a&gt; wurde 2012 veröffentlicht. Dieser
definiert, wie ein PDF-Dokument die Anforderungen an Barrierefreiheit erfüllen kann. Leider werden auch heute
noch zahlreiche Dokumente erstellt, welche diesen Standard nicht einhalten.&lt;/p&gt;
&lt;p&gt;Damit euch das nicht passiert, solltet ihr eure PDFs auf Barrierefreiheit prüfen. Diese Prüfung beginnt am
besten immer mit dem &lt;strong&gt;PDF Accessibility Checker&lt;/strong&gt;, kurz PAC. Dieses kostenlose Standardtool ist
vor kurzem in der Version 2024 erschienen: &lt;a href=&quot;https://pac.pdf-accessibility.org/de&quot;&gt;https://pac.pdf-accessibility.org/de&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ich nutze das Tool schon seit einigen Jahren und weiß seine Stärken zu schätzen. Allerdings ersetzt das
automatisierte Tool keine manuelle Prüfung, etwa mit Screenreader und Tastatur. Daher gebe ich euch einen kurzen
Überblick zu den Stärken und Schwächen des PDF Accessibility Checkers.&lt;/p&gt;
&lt;h2 id=&quot;stärken-des-prüftools&quot;&gt;Stärken des Prüftools&lt;/h2&gt;
&lt;p&gt;Der PAC ist ein Tool zur automatisierten Prüfung von PDF-Dokumenten auf Barrierefreiheit, gemäß dem Standard PDF/UA
(DIN/ISO 14289–1). Darüber hinaus werden relevante Punkte der &lt;span class=&quot;c-italic&quot;&gt;Web Content Accessibility Guidelines (WCAG)&lt;/span&gt; 
sowie zusätzliche Qualitätsmerkmale geprüft.&lt;/p&gt;
&lt;img src=&quot;/_astro/screenshot-pac-2024-details.DvnYDDOz_Z1TxCk0.webp&quot; srcset=&quot;/_astro/screenshot-pac-2024-details.DvnYDDOz_Z1GDlhy.webp 640w, /_astro/screenshot-pac-2024-details.DvnYDDOz_Zl1ahW.webp 750w, /_astro/screenshot-pac-2024-details.DvnYDDOz_lDAIx.webp 828w, /_astro/screenshot-pac-2024-details.DvnYDDOz_Z1Vkpy2.webp 1080w, /_astro/screenshot-pac-2024-details.DvnYDDOz_x0fMA.webp 1280w, /_astro/screenshot-pac-2024-details.DvnYDDOz_Z1TxCk0.webp 1536w&quot; alt=&quot;Ergebnis der Barrierefreiheits-Prüfung eines PDF-Dokuments mit dem PAC 2024.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1536px) 1536px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1536&quot; height=&quot;1012&quot;&gt;
&lt;p&gt;Dabei kann der PAC u.a. folgende Barrieren automatisch erkennen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Für das PDF-Dokument ist kein Titel gesetzt.&lt;/li&gt;
&lt;li&gt;Die Sprache des Dokuments ist nicht definiert.&lt;/li&gt;
&lt;li&gt;Die Inhalte des PDF-Dokuments sind nicht getaggt.&lt;/li&gt;
&lt;li&gt;Ein Bild verfügt über keinen Alternativtext.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Weiters vermittelt das Tool im WCAG-Reiter auch transparent, welche Richtlinien es überprüft und welche nicht. Richtlinien
wie z.B. &lt;span class=&quot;c-italic&quot;&gt;„2.1 Per Tastatur zugänglich“&lt;/span&gt;  und &lt;span class=&quot;c-italic&quot;&gt;„3.2 Vorhersehbar“&lt;/span&gt;  können nur
manuell geprüft werden.&lt;/p&gt;
&lt;h2 id=&quot;schwächen-des-prüftools&quot;&gt;Schwächen des Prüftools&lt;/h2&gt;
&lt;p&gt;Der PDF Accessibility Checker kann den Code eines PDF-Dokuments nach gewissen Regeln prüfen. Aber es kann den Inhalt des
Dokuments nicht inhaltlich verstehen und interpretieren. Das können automatisierte Prüftools generell nicht.&lt;/p&gt;
&lt;p&gt;Um die Schwächen des Tools aufzuzeigen, habe ich ein Experiment durchgeführt: Wie viele Barrieren kann ich in ein PDF-Dokument
einbauen, ohne dass der PAC Alarm schlägt? Mein &lt;a href=&quot;/pdf/pdf_accessibility_test_de.pdf&quot;&gt;Test-Dokument&lt;/a&gt; besteht aus mehreren
Überschriften, Fließtext und einem Bild. Ihr könnt das Dokument herunterladen und selbst überprüfen.&lt;/p&gt;
&lt;p&gt;Sehen wir uns nun die einzelnen Barrieren im Detail an.&lt;/p&gt;
&lt;h3 id=&quot;kein-aussagekräftiger-titel&quot;&gt;Kein aussagekräftiger Titel&lt;/h3&gt;
&lt;p&gt;Mein Test-Dokument hat den Titel &lt;span class=&quot;c-italic&quot;&gt;„Ein schöner Titel“&lt;/span&gt; . PAC gibt sich damit zufrieden. Wenn jedoch
Screenreader-Nutzer:innen diesen Titel zu hören bekommen, werden sie nicht viel damit anfangen können.&lt;/p&gt;
&lt;p&gt;Der Titel einer Webseite oder eines Dokuments ist die erste Information, auf die Nutzer:innen stoßen. Der Titel sollte
den Inhalt beschreiben und den Nutzer:innen Orientierung bieten. Das hierbei relevante
&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html&quot;&gt;WCAG-Erfolgskriterium 2.4.2&lt;/a&gt; besagt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Webseiten haben einen Titel, der Thema oder Zweck beschreibt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Daher muss bei einer manuellen Prüfung ein Mensch einschätzen, ob der gesetzte Titel des PDF-Dokuments aussagekräftig
genug ist.&lt;/p&gt;
&lt;h3 id=&quot;falsch-getaggte-überschriften&quot;&gt;Falsch getaggte Überschriften&lt;/h3&gt;
&lt;p&gt;Wie PAC korrekt feststellt, ist der gesamte Inhalt meines Test-Dokuments getaggt. Das bedeutet: Für jedes Element im PDF ist
definiert, welche Art von Inhalt es darstellt. Diese Information ist u.a. für Screenreader-Nutzer:innen essenziell, um den
Inhalt korrekt erfassen und schnell im Dokument navigieren zu können.&lt;/p&gt;
&lt;p&gt;Allerdings habe ich PAC reingelegt: Alle Überschriften, wie z.B. &lt;span class=&quot;c-italic&quot;&gt;„Das ist eine wunderschöne Überschrift“&lt;/span&gt; ,
sind mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;P&amp;gt;&lt;/code&gt;  Tag als Fließtext ausgezeichnet. Während sehende Menschen die Überschriften
visuell als solche erfassen können, ist diese Information semantisch nicht erfasst. Das
&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html&quot;&gt;WCAG-Erfolgskriterium 1.3.1&lt;/a&gt; fordert:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Informationen, Struktur und Beziehungen, die über die Darstellung vermittelt werden, können durch Software bestimmt werden
oder stehen in Textform zur Verfügung.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Automatisierte Tools wie der PAC können nicht einschätzen, was als Überschrift getaggt sein sollte und was nicht. Daher sollte
sich ein Mensch das PDF-Dokument von einem Screenreader vorlesen lassen. Zusätzlich bietet auch PAC selbst die nützliche
Screenreader-Vorschau-Funktion, welche die Tagging-Struktur visualisiert.&lt;/p&gt;
&lt;img src=&quot;/_astro/screenshot-pac-2024-test-pdf.E-FqPNgp_ZhxVSN.webp&quot; srcset=&quot;/_astro/screenshot-pac-2024-test-pdf.E-FqPNgp_Z1SrN8L.webp 640w, /_astro/screenshot-pac-2024-test-pdf.E-FqPNgp_Z1ShUiC.webp 750w, /_astro/screenshot-pac-2024-test-pdf.E-FqPNgp_1mYc10.webp 828w, /_astro/screenshot-pac-2024-test-pdf.E-FqPNgp_25Kcus.webp 1080w, /_astro/screenshot-pac-2024-test-pdf.E-FqPNgp_Z1QHm1u.webp 1280w, /_astro/screenshot-pac-2024-test-pdf.E-FqPNgp_ZPH0RG.webp 1668w, /_astro/screenshot-pac-2024-test-pdf.E-FqPNgp_ZhxVSN.webp 1813w&quot; alt=&quot;Vergleich der Screenreader-Vorschau mit der visuellen Darstellung des Test-Dokuments.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1813px) 1813px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1813&quot; height=&quot;1008&quot;&gt;
&lt;h3 id=&quot;keine-logische-lesereihenfolge&quot;&gt;Keine logische Lesereihenfolge&lt;/h3&gt;
&lt;p&gt;Seht euch den Screenshot oben nochmal genau an. Na, fällt euch was auf? Genau, das Bild befindet sich visuell an einer anderen
Stelle als in der Screenreader-Vorschau.&lt;/p&gt;
&lt;p&gt;In einem getaggten PDF wird die Lesereihenfolge separat gespeichert. Besonders bei Dokumenten mit komplexen Layouts kann damit
eine logische Lesereihenfolge definiert werden. Wenn etwa blinde Nutzer:innen mit Screenreader durch das Dokument
navigieren, folgt der virtuelle Cursor des Screenreaders dieser Reihenfolge.&lt;/p&gt;
&lt;p&gt;Daher definiert das &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html&quot;&gt;WCAG-Erfolgskriterium 1.3.2&lt;/a&gt;
folgende Bedingung für Barrierefreiheit:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wenn die Reihenfolge, in der Inhalte präsentiert werden, sich auf deren Bedeutung auswirkt, kann die korrekte Leseabfolge
durch Software bestimmt werden.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bei einer manuellen Prüfung sollte daher ein Mensch mit aktiviertem Screenreader sequenziell durch das Dokument navigieren
und dabei überlegen, ob die Abfolge der Inhalte Sinn macht. Die visuelle Anordnung dient hier als Richtschnur. Es kann
jedoch auch eine davon abweichende Lesereihenfolge sinnvoll sein.&lt;/p&gt;
&lt;h3 id=&quot;alternativtext-beschreibt-das-bild-nicht&quot;&gt;Alternativtext beschreibt das Bild nicht&lt;/h3&gt;
&lt;p&gt;Der PDF Accessibility Checker prüft Bilder nur darauf, ob diese korrekt getaggt sind und ein Alternativtext definiert ist.
Das &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html&quot;&gt;WCAG-Erfolgskriterium 1.1.1&lt;/a&gt; verlangt aber mehr:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Alle Nicht-Text-Inhalte, die dem Benutzer präsentiert werden, haben eine Textalternative, die einem äquivalenten Zweck
dient, mit Ausnahme der unten aufgelisteten Situationen. […]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Das Bild in meinem Test-Dokument zeigt das blaue, offene Meer vor der Küste Mallorcas. Der Alternativtext des Bildes lautet
hingegen &lt;span class=&quot;c-italic&quot;&gt;„Eine staubtrockene Wüste“&lt;/span&gt; . Ein automatisiertes Tool kann nicht erkennen, dass das Quatsch ist.&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Der &lt;strong&gt;PDF Accessibility Checker&lt;/strong&gt; ist ein großartiges Tool, um ein PDF-Dokument auf grobe Mängel zu prüfen.
Die manuelle Prüfung ersetzt es aber nicht. Eine umfassende Prüfung der Barrierefreiheit sollte sowohl automatisierte als
auch manuelle Prüfschritte umfassen.&lt;/p&gt;
&lt;p&gt;PS: Testet auch die &lt;a href=&quot;/pdf/pdf_accessibility_test_de_korr.pdf&quot;&gt;korrigierte Fassung meines Test-Dokuments&lt;/a&gt; mit dem Screenreader,
um die verbesserte Nutzererfahrung selbst zu erleben.&lt;/p&gt;</content:encoded><category>accessibility</category><category>documents</category><category>pdf</category><category>tags</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_document_with_charts.jpg" length="0" type="image/jpeg"/></item><item><title>Wie Ihr die WCAG 2.2 erfüllt — Ein paar praktische Beispiele</title><link>https://www.oidaisdes.org/de/blog/how-to-meet-wcag-2-2</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/how-to-meet-wcag-2-2</guid><description>Ein kurzer Überblick über die neuen Erfolgskriterien und praktische Beispiele für konkrete Anwendungsfälle.</description><pubDate>Tue, 17 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Die neue Version 2.2 der &lt;span class=&quot;c-italic&quot;&gt;Web Content Accessibility Guidelines&lt;/span&gt;  wurde vor kurzem veröffentlicht.
Sie definiert 9 neue Erfolgskriterien und streicht das alte Kriterium &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/parsing.html&quot;&gt;4.1.1 Parsing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ich werde euch nicht mit einem weiteren &lt;span class=&quot;c-italic&quot;&gt;„WCAG 2.2 ist endlich da!“&lt;/span&gt; -Artikel langweilen. Andere
Expert:innen für Barrierefreiheit, die mehr Erfahrung haben als ich, haben bereits die Änderungen im Vergleich zu WCAG 2.1
erläutert (siehe die Links am Ende).&lt;/p&gt;
&lt;p&gt;Stattdessen möchte ich mich auf einzelne neue Kriterien konzentrieren und euch praktische Beispiele geben, wie ihr diese
erfüllen könnt.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-george-milton-hiding-behind-book.3VEi1jrR_E7qNa.webp&quot; srcset=&quot;/_astro/pexels-george-milton-hiding-behind-book.3VEi1jrR_Z2jyY7k.webp 640w, /_astro/pexels-george-milton-hiding-behind-book.3VEi1jrR_Oa5l8.webp 750w, /_astro/pexels-george-milton-hiding-behind-book.3VEi1jrR_108Qwq.webp 828w, /_astro/pexels-george-milton-hiding-behind-book.3VEi1jrR_Z1xfqfJ.webp 1080w, /_astro/pexels-george-milton-hiding-behind-book.3VEi1jrR_Z2lJSPC.webp 1280w, /_astro/pexels-george-milton-hiding-behind-book.3VEi1jrR_E7qNa.webp 1600w&quot; alt=&quot;Das Gesicht einer Frau, das zur Hälfte von einem Buch mit grünem Umschlag verdeckt wird.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © George Milton / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;die-neuen-kriterien-der-wcag-22&quot;&gt;Die neuen Kriterien der WCAG 2.2&lt;/h2&gt;
&lt;p&gt;Mehrere neue Kriterien zielen darauf ab, die Bedienbarkeit von Websites und Apps zu verbessern: Fokus-Indikatoren sollten
klar erkennbar sein und die fokussierten Bedienelemente sollten nicht durch andere Inhalte auf der Seite verdeckt werden.&lt;/p&gt;
&lt;p&gt;Die Bedienelemente sollten so groß sein, dass sie leicht aktiviert werden können, ohne versehentlich ein benachbartes Ziel zu
aktivieren. Wenn eine Website Funktionalitäten anbietet, die eine Ziehbewegung zur Bedienung verwenden, dann muss sie eine
alternative Möglichkeit für Maus- und Tastatur-Nutzer:innen anbieten.&lt;/p&gt;
&lt;p&gt;Hier ist eine Liste aller neuen Erfolgskriterien, die sich auf die Bedienbarkeit beziehen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html&quot;&gt;2.4.11 Fokus nicht verdeckt (Minimum) (AA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html&quot;&gt;2.4.12 Fokus nicht verdeckt (Erweitert) (AAA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html&quot;&gt;2.4.13 Fokus-Erscheinungsbild (AAA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html&quot;&gt;2.5.7 Ziehbewegungen (AA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html&quot;&gt;2.5.8 Zielgröße (Minimum) (AA)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die folgenden Erfolgskriterien zielen darauf ab, die Zugänglichkeit für Menschen mit kognitiven Beeinträchtigungen zu verbessern:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html&quot;&gt;3.2.6 Konsistente Hilfe (A)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html&quot;&gt;3.3.7 Redundante Eingabe (A)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html&quot;&gt;3.3.8 Barrierefreie Authentifizierung (Minimum) (AA)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html&quot;&gt;3.3.9 Barrierefreie Authentifizierung (Erweitert) (AAA)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Schauen wir uns nun einige praktische Beispiele für die neuen Erfolgskriterien an.&lt;/p&gt;
&lt;h2 id=&quot;praktische-beispiele&quot;&gt;Praktische Beispiele&lt;/h2&gt;
&lt;h3 id=&quot;anwendungsfall-fixierte-kopfzeile&quot;&gt;Anwendungsfall: Fixierte Kopfzeile&lt;/h3&gt;
&lt;p&gt;Viele Websites enthalten einen Header, der am oberen Rand der Seite verbleibt, auch wenn die Seite gescrollt wird. Eine gute gemachte,
fixierte Kopfzeile verbessert die Benutzerfreundlichkeit der Website. Stellt euch einen Benutzer vor, der einen
langen Artikel liest: Wenn er am Ende der Seite angelangt ist, muss er nicht wieder nach oben scrollen, um auf die Hauptnavigation
im Header zuzugreifen.&lt;/p&gt;
&lt;p&gt;Leider kann eine fixierte Kopfzeile allen Nutzer:innen, die keine Maus benutzen können, das Leben schwer machen. Wenn sie auf eine
Website mit der Tastatur navigieren, müssen sie immer sehen, was den Tastaturfokus hat. Eine fixierte Kopf- oder Fußzeile kann dazu
führen, dass fokussierte Elemente hinter diesen Elementen verschwinden.&lt;/p&gt;
&lt;p&gt;Doch es gibt eine einfache und elegante Lösung für dieses Problem: Die CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;scroll-padding&lt;/code&gt; 
ermöglicht es, Offsets für den optimalen Sichtbereich des Scrollports zu definieren — den Bereich, der als Zielbereich für die
Platzierung von Elementen im Sichtfeld des Benutzers verwendet wird. Ihr braucht nur folgendes:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;html&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    scroll-padding&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4rem&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hier ist eine Demo einer Website mit fixierter Kopf- und Fußzeile. Versucht mit der Tabulatortaste zu navigieren und achtet
darauf, wie der Browser den fokussierten Link im sichtbaren Bereich hält:&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/fancy-css-playground/#/scrollpadding&quot; title=&quot;Scroll Padding Demo&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Auf diese Weise erfüllt die Website die Kriterien &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html&quot;&gt;2.4.11 Fokus nicht verdeckt (Minimum) (AA)&lt;/a&gt;
und &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html&quot;&gt;2.4.12 Fokus nicht verdeckt (Erweitert) (AAA)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Eine weitere verwandte CSS-Eigenschaft ist &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;scroll-margin&lt;/code&gt; . Ihr könnt sie verwenden, um z.B. Inhalte unter
einem Banner mit fester Position freizulegen, wie die WCAG-Technik C43 zeigt:
&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Techniques/css/C43&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Using CSS margin and scroll-margin to un-obscure content“&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;anwendungsfall-interaktive-karte-mit-ziehen-zum-verschieben&quot;&gt;Anwendungsfall: Interaktive Karte mit Ziehen-zum-Verschieben&lt;/h3&gt;
&lt;p&gt;Bei einer interaktiven Karte können Nutzer:innen normalerweise die Ansicht der Karte mit der Maus oder durch Berührung verschieben.
Aber manche Menschen können Ziehbewegungen nicht präzise ausführen. Oder sie verwenden ein spezielles Eingabegerät, z.B. einen
Trackball oder einen Kopfzeiger, was die Ziehbewegung umständlich und fehleranfällig macht.&lt;/p&gt;
&lt;p&gt;Eine barrierefreie Karte sollte auch Schaltflächen zum Verschieben der Ansicht nach oben/unten/links/rechts enthalten, um dem
Erfolgskriterium &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html&quot;&gt;2.5.7 Ziehbewegungen (AA)&lt;/a&gt; zu entsprechen.
Nutzer:innen mit motorischen Beeinträchtigungen können die Steuerelemente einfach mit der Tabulatortaste ansteuern und den
Kartenausschnitt damit verschieben.&lt;/p&gt;
&lt;p&gt;Seht euch meine &lt;a href=&quot;https://alexlehner86.github.io/cascade-layers-angular-demo/&quot;&gt;Demo&lt;/a&gt; einer Karte mit Zoom- und Verschiebe-Buttons an:&lt;/p&gt;
&lt;img src=&quot;/_astro/screenshot-map-with-move-controls.CgWrftFQ_TiFWn.webp&quot; srcset=&quot;/_astro/screenshot-map-with-move-controls.CgWrftFQ_Z24sWCa.webp 640w, /_astro/screenshot-map-with-move-controls.CgWrftFQ_2jOr93.webp 750w, /_astro/screenshot-map-with-move-controls.CgWrftFQ_YhVaf.webp 828w, /_astro/screenshot-map-with-move-controls.CgWrftFQ_TiFWn.webp 852w&quot; alt=&quot;Screenshot einer interaktiven Karte mit hoch/runter/links/rechts Schaltflächen.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 852px) 852px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;852&quot; height=&quot;415&quot;&gt;
&lt;p&gt;&lt;em&gt;Foto: © Alexander Lehner&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Wie der Screenshot oben zeigt, wird die fokussierte Schaltfläche durch einen dicken Umriss und einen Farbwechsel deutlich
hervorgehoben. Lest den nächsten Abschnitt, um mehr über barrierefreie Fokusindikatoren zu erfahren.&lt;/p&gt;
&lt;h3 id=&quot;anwendungsfall-gut-sichtbare-fokus-indikatoren&quot;&gt;Anwendungsfall: Gut sichtbare Fokus-Indikatoren&lt;/h3&gt;
&lt;p&gt;Gut wahrnehmbare Fokus-Indikatoren zählen zu den grundlegenden Features von barrierefreien Websites und Apps. Das
Erfolgskriterium &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html&quot;&gt;2.4.7 Fokus sichtbar (AA)&lt;/a&gt; besagt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;Any keyboard operable user interface has a mode of operation where the &lt;strong&gt;keyboard focus indicator is visible&lt;/strong&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Dieses Kriterium gibt es schon seit fast 15 Jahren, seit der Veröffentlichung der WCAG 2.0. Leider gibt es immer noch viele Websites,
die keine oder kaum sichtbare Fokus-Indikatoren aufweisen. Einer der Gründe dafür könnte sein, dass die WCAG nie normativ definiert
haben, was „sichtbar“ in der Praxis bedeutet.&lt;/p&gt;
&lt;p&gt;Das neue Erfolgskriterium &lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html&quot;&gt;2.4.13 Fokus-Erscheinungsbild (AAA)&lt;/a&gt;
definiert endlich die Mindestabmessungen und das Design von Fokus-Indikatoren. Sie sollten ausreichend groß sein und einen
Kontrast von mindestens 3:1 zwischen dem fokussierten und dem unfokussierten Zustand eines Elements bieten.&lt;/p&gt;
&lt;p&gt;Oft lehnt eine Kundin oder ein Designer starke Fokus-Indikatoren aus ästhetischen Gründen ab. In diesem Fall empfehle ich die
Verwendung der CSS-Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-visible&lt;/code&gt; . Damit könnt ihr Fokus-Indikatoren nur dann anzeigen,
wenn sie benötigt werden (z.B. bei der Tastaturnavigation). Seht euch meine Demo an,
die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus&lt;/code&gt;  mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-visible&lt;/code&gt;  vergleicht.&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/fancy-css-playground/#/a11yfeatures&quot; title=&quot;Demo zur die focus-visible Pseudo-Klasse&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Wenn ihr weitere Details erfahren wollte, dann lest meinen Artikel
&lt;a href=&quot;/de/blog/highly-visible-keyboard-focus/&quot;&gt;„Gestalte deutlich sichtbaren Tastaturfokus mit :focus-visible“&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/WCAG22/&quot;&gt;Web Content Accessibility Guidelines (WCAG) 2.2, W3C Recommendation, 5. Oktober 2023&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tetralogical.com/blog/2023/10/05/whats-new-wcag-2.2/&quot;&gt;What’s new in WCAG 2.2 (TetraLogical)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.levelaccess.com/blog/wcag-22-aa-summary-and-checklist-for-website-owners/&quot;&gt;WCAG 2.2 AA: Summary and Checklist for Website Owners (Level Access)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-padding&quot;&gt;MDN: CSS scroll-padding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible&quot;&gt;MDN: CSS :focus-visible&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>css</category><category>design</category><category>html</category><category>standards</category><category>wcag</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_hiding_behind_book.jpg" length="0" type="image/jpeg"/></item><item><title>Warum ich Zertifizierungen für Barrierefreiheit sinnvoll finde</title><link>https://www.oidaisdes.org/de/blog/pro-accessibility-certifications</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/pro-accessibility-certifications</guid><description>Zertifizierungen bieten einen einheitlichen Standard und erhöhen die Glaubwürdigkeit von Expert:innen.</description><pubDate>Thu, 14 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Das Thema Barrierefreiheit gewinnt immer mehr an Bedeutung. Der &lt;a href=&quot;https://ec.europa.eu/social/main.jsp?catId=1202&quot;&gt;European Accessibility Act&lt;/a&gt;
schreibt ab 2025 verbindliche Anforderungen für Produkte und Dienstleistungen vor. Damit steigt auch der
Bedarf an Fachleuten, die Unternehmen bei der barrierefreien Gestaltung ihrer Websites und Apps unterstützen.&lt;/p&gt;
&lt;p&gt;Doch was zeichnet eine Barrierefreiheits-Expertin oder einen -Experten aus? Woher weiß ich, dass jemand tatsächlich Ahnung hat
oder nur mit Schlagwörtern um sich wirft?&lt;/p&gt;
&lt;p&gt;Aus meiner Sicht spielen &lt;strong&gt;anerkannte Zertifizierungen&lt;/strong&gt; hierbei eine wichtige Rolle. In diesem Artikel möchte ich auf die Vor- und
Nachteile von Accessibility-Zertifizierungen eingehen und eine Definition wagen, welche Skills man von Fachleuten erwarten kann.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-marcus-aurelius-woman-in-wheelchair.CN-B61og_2azenD.webp&quot; srcset=&quot;/_astro/pexels-marcus-aurelius-woman-in-wheelchair.CN-B61og_ZHdqzS.webp 640w, /_astro/pexels-marcus-aurelius-woman-in-wheelchair.CN-B61og_ZSQjVR.webp 750w, /_astro/pexels-marcus-aurelius-woman-in-wheelchair.CN-B61og_c89PQ.webp 828w, /_astro/pexels-marcus-aurelius-woman-in-wheelchair.CN-B61og_XqJ5z.webp 1080w, /_astro/pexels-marcus-aurelius-woman-in-wheelchair.CN-B61og_ZKSnkn.webp 1280w, /_astro/pexels-marcus-aurelius-woman-in-wheelchair.CN-B61og_2azenD.webp 1600w&quot; alt=&quot;Eine Frau im Rollstuhl. Sie balanciert einen Laptop auf ihren Knien.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Marcus Aurelius / pexels.com&lt;/p&gt;
&lt;p&gt;Hinweis: Ich habe 2019 das Zertifikat &lt;a href=&quot;https://www.incite.at/de/programm/certified-webaccessibility-expert/&quot;&gt;„Certified Web Accessibility Expert”&lt;/a&gt;
der UBIT-Akademie incite erworben. Seit Anfang 2023 bin ich „IAAP Certified Professional in Accessibility Core Competencies (CPACC)“
(&lt;a href=&quot;https://www.credly.com/badges/1839d107-b0d4-4788-ac7f-7d4905ed4f7e/linked_in_profile&quot;&gt;Nachweis bei Credly&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&quot;mindestanforderungen-an-expertinnen&quot;&gt;Mindestanforderungen an Expert:innen&lt;/h2&gt;
&lt;p&gt;Barrierefreiheits-Expert:innen sollten &lt;strong&gt;Empathie für Menschen mit Behinderung&lt;/strong&gt; mitbringen. Sie sollten ein aufrichtiges Interesse
am Alltag dieser Menschen haben und versuchen, sich in ihre jeweilige Situation hineinzuversetzen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wie surfen blinde Menschen mithilfe eines Screenreaders im Internet?&lt;/li&gt;
&lt;li&gt;Unter welchen Bedingungen können Personen mit motorischer Beeinträchtigung eine Website alleine mit der Tastatur bedienen?&lt;/li&gt;
&lt;li&gt;Wann sind Video- und Audioinhalte auch für gehörlose Menschen barrierefrei?&lt;/li&gt;
&lt;li&gt;usw.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Eine Expertin oder Experte muss die &lt;strong&gt;verschiedenen Nutzergruppen und assistiven Technologien&lt;/strong&gt; kennen. Dazu zählen
&lt;a href=&quot;https://de.wikipedia.org/wiki/Softwarelupe#Bildschirmlupe&quot;&gt;Bildschirmlupen&lt;/a&gt;,
&lt;a href=&quot;/de/blog/forced-colors-mode/&quot;&gt;Hochkontrast-Modus&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=dEbl5jvLKGQ&quot;&gt;Screenreader&lt;/a&gt;,
&lt;a href=&quot;https://www.w3.org/WAI/perspective-videos/voice/&quot;&gt;Spracheingabe-Software&lt;/a&gt;, &lt;a href=&quot;https://www.w3.org/WAI/perspective-videos/keyboard/&quot;&gt;Tastaturen&lt;/a&gt;,
und viele mehr.&lt;/p&gt;
&lt;p&gt;Wissen über die relevanten &lt;strong&gt;Normen und Gesetze&lt;/strong&gt; sind eine weitere Mindestanforderung. Dazu zählen sowohl die Erfolgskriterien
der &lt;a href=&quot;https://www.w3.org/WAI/standards-guidelines/wcag/&quot;&gt;Web Content Accessibility Guidelines (WCAG)&lt;/a&gt;, der europäische Standard
&lt;a href=&quot;https://www.etsi.org/deliver/etsi_en/301500_301599/301549/03.02.01_60/en_301549v030201p.pdf&quot;&gt;EN 301 549&lt;/a&gt; sowie relevante nationale
Gesetze wie etwa das österreichische &lt;a href=&quot;https://www.usp.gv.at/gesetzliche-neuerungen/Bundesgesetzblatt/barrierefreiheitsgesetz.html&quot;&gt;Barrierefreiheitsgesetz (BaFG)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Darüber hinaus sollten Accessibility-Expert:innen auch Erfahrung im &lt;strong&gt;Testen auf Barrierefreiheit&lt;/strong&gt; mitbringen. Sie müssen beurteilen
können, ob eine Website bzw. App konkrete Kriterien einhält, und Lösungswege für gefundene Barrieren aufzeigen können.&lt;/p&gt;
&lt;h2 id=&quot;barrierefreiheits-zertifizierungen&quot;&gt;Barrierefreiheits-Zertifizierungen&lt;/h2&gt;
&lt;p&gt;Verschiedene Institutionen bieten Zertifizierungen zum Thema Barrierefreiheit an. Es gibt nationale Zertifizierungsstellen wie etwa
die &lt;a href=&quot;https://www.incite.at/&quot;&gt;UBIT-Akademie incite&lt;/a&gt; in Österreich. Diese bietet die Zertifizierung
zum &lt;span class=&quot;c-italic&quot;&gt;Certified WebAccessibility Expert&lt;/span&gt;  an.&lt;/p&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.accessibilityassociation.org&quot;&gt;International Association of Accessibility Professionals (IAAP)&lt;/a&gt; bietet gleich
mehrere Zertifizierungen an, darunter etwa den &lt;span class=&quot;c-italic&quot;&gt;Certified Professional in Accessibility Core Competencies (CPACC)&lt;/span&gt; 
und den &lt;span class=&quot;c-italic&quot;&gt;Web Accessibility Specialist (WAS)&lt;/span&gt; . Accessibility-Expert:innen sollen gezielt beim Aufbau
von Expertise unterstützt werden.&lt;/p&gt;
&lt;p&gt;Welche Vor- und Nachteile bieten solche Zertifizierungen?&lt;/p&gt;
&lt;h3 id=&quot;vorteile&quot;&gt;Vorteile&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Erhöhte Glaubwürdigkeit&lt;/strong&gt;: Eine Zertifizierung ist ein Nachweis, dass man über bestimmte Fähigkeiten und Erfahrungen verfügt.
Dies unterstreicht die Glaubwürdigkeit von Expert:innen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Einheitlicher Standard&lt;/strong&gt;: Um eine Zertifizierung zu erwerben, müssen Interessierte in Prüfungen bzw. Einzelgesprächen ihr
Wissen über konkrete Inhalte unter Beweis stellen. Seriöse Institutionen definieren hierfür einen öffentlich zugänglichen
&lt;a href=&quot;https://iaap-dach.org/files/Downloads/IAAP-DACH%20CPACC%20Syllabus.de.V105%20August%202023.pdf&quot;&gt;Syllabus&lt;/a&gt;, der
diese Inhalte transparent macht.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Community für Austausch und Weiterbildung&lt;/strong&gt;: Die IAAP unterstützt die Vernetzung von Accessibility-Expert:innen mit
Online-Foren, Webinaren und verschiedenen Veranstaltungen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;nachteile&quot;&gt;Nachteile&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kosten&lt;/strong&gt;: Eine Zertifizierung ist nicht gratis. Der CPACC kostet zum Beispiel knapp 500 US-Dollar (für Mitglieder etwas
weniger). Nicht jeder kann sich das leisten. Im Vergleich zu vielen anderen Zertifizierungen im IT-Bereich finde ich den
Preis jedoch sehr moderat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kognitive Barriere&lt;/strong&gt;: Oft besteht eine Zertifizierung aus einem Multiple-Choice-Test mit unzähligen Fragen. Zum Beispiel
muss man beim CPACC ganze 100 Fragen in zwei Stunden beantworten. Das ist anstrengend. Für Menschen mit kognitiver Beeinträchtigung
kann das auch eine unüberwindbare Barriere darstellen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Aus meiner Sicht sind Barrierefreiheits-Zertifizierungen eine sinnvolle Sache. Sie stellen einen einheitlichen, transparenten
Nachweis für konkrete Fähigkeiten dar. Sie helfen Unternehmen dabei, echte Expertinnen von Schaumschlägern zu
unterscheiden.&lt;/p&gt;
&lt;p&gt;Müssen alle Accessibility-Expert:innen eine Zertifizierung machen? Natürlich nicht. Es gibt auch andere Mittel und Wege, seine
Expertise unter Beweis zu stellen. Etwa indem man schon viele Jahre barrierefreie Websites oder Apps gestaltet und diese als
Referenzen vorweisen kann.&lt;/p&gt;
&lt;p&gt;Ich bin jedenfalls froh über meine Zertifizierungen. Sie stellen zentrale Meilensteine in meiner Laufbahn als
Barrierefreiheits-Experte dar. Und das &lt;a href=&quot;https://www.credly.com/badges/1839d107-b0d4-4788-ac7f-7d4905ed4f7e/linked_in_profile&quot;&gt;erworbene Abzeichen&lt;/a&gt;
sieht einfach cool aus! 😉&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://iaap-dach.org/iaap-dach-2/zertifizierungen.html&quot;&gt;Übersicht IAAP-Zertifizierungen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.incite.at/de/programm/certified-webaccessibility-expert/&quot;&gt;Zertifizierung Certified WebAccessibility Expert (Österreich)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.edx.org/learn/web-accessibility/the-world-wide-web-consortium-w3c-introduction-to-web-accessibility&quot;&gt;W3C: Introduction to Web Accessibility&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>certification</category><category>experts</category><category>iaap</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_woman_in_wheelchair.jpg" length="0" type="image/jpeg"/></item><item><title>Wie ihr verkettete Datenabfragen und zeitgleiche Requests mit RxJS managt</title><link>https://www.oidaisdes.org/de/blog/rxjs-concurrent-request-sequence</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/rxjs-concurrent-request-sequence</guid><description>Die RxJS-Bibliothek bietet mächtige Operatoren, die euer Entwicklerleben erheblich erleichtern.</description><pubDate>Sun, 20 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Musstet ihr schon einmal Informationen aus mehreren Datenquellen oder verschiedenen API-Endpunkten abrufen? Habt ihre eine
Optimierung hinsichtlich &lt;a href=&quot;https://en.wikipedia.org/wiki/Concurrency_(computer_science)&quot;&gt;Parallelität&lt;/a&gt; und
voneinander abhängigen Datenabfragen vorgenommen?&lt;/p&gt;
&lt;p&gt;Wenn ihr mindestens eine dieser Fragen mit Ja beantwortet, solltet ihr jetzt weiterlesen. Ich zeige euch meine Lösung mit
dem &lt;a href=&quot;https://angular.io/&quot;&gt;Angular-Framework&lt;/a&gt; und &lt;a href=&quot;https://www.npmjs.com/package/rxjs&quot;&gt;RxJS&lt;/a&gt;. Lasst eure Datenabrufe fließen
wie eine Reihe miteinander verbundener Wasserfälle.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-quang-nguyen-vinh-waterfalls.BwiKyWRI_1Bt72X.webp&quot; srcset=&quot;/_astro/pexels-quang-nguyen-vinh-waterfalls.BwiKyWRI_ZeDcEo.webp 640w, /_astro/pexels-quang-nguyen-vinh-waterfalls.BwiKyWRI_1kegvB.webp 750w, /_astro/pexels-quang-nguyen-vinh-waterfalls.BwiKyWRI_ZIhvm2.webp 828w, /_astro/pexels-quang-nguyen-vinh-waterfalls.BwiKyWRI_Z2bEfuK.webp 1080w, /_astro/pexels-quang-nguyen-vinh-waterfalls.BwiKyWRI_Z2kHSBY.webp 1280w, /_astro/pexels-quang-nguyen-vinh-waterfalls.BwiKyWRI_1Bt72X.webp 1600w&quot; alt=&quot;Eine Reihe von Wasserfällen, die einen felsigen Abhang hinunterfließen.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Quang Nguyen Vinh / pexels.com&lt;/p&gt;
&lt;p&gt;Bevor wir uns einige Codebeispiele genauer ansehen, hier eine kurze Erklärung von RxJS.&lt;/p&gt;
&lt;h2 id=&quot;was-ist-rxjs-und-was-sind-observables&quot;&gt;Was ist RxJS und was sind Observables?&lt;/h2&gt;
&lt;p&gt;Der Name RxJS ist eine Abkürzung für &lt;span class=&quot;c-italic&quot;&gt;Reactive Extensions Library for JavaScript&lt;/span&gt; . In der
offiziellen &lt;a href=&quot;https://rxjs.dev/guide/overview&quot;&gt;RxJS-Einführung&lt;/a&gt; heißt es:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;RxJS is a library for composing asynchronous and event-based programs by using &lt;strong&gt;observable sequences&lt;/strong&gt;.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Der Begriff &lt;span lang=&quot;en&quot;&gt;„observable sequence“&lt;/span&gt; ist hier der Schlüssel. Er steht für die Idee einer aufrufbaren Sammlung
von zukünftigen Werten. Die entsprechende Funktionalität ist in der Klasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Observable&lt;/code&gt;  gekapselt.&lt;/p&gt;
&lt;p&gt;Ihr könnt zum Beispiel ein Observable erstellen, das den Wert eines Eingabefeldes bei jeder Wertänderung ausgibt. Oder ihr könnt
das &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise&quot;&gt;Promise&lt;/a&gt; eines
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch&quot;&gt;fetch-Aufrufs&lt;/a&gt; in ein Observable verpacken, welches den
Response-Wert ausgibt, wenn das Promise abgeschlossen ist.&lt;/p&gt;
&lt;p&gt;Ein weiteres wichtiges Konzept ist die Verwendung einer &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;pipe&lt;/code&gt; . Mit der &lt;a href=&quot;https://rxjs.dev/api/index/function/pipe&quot;&gt;Pipe-Funktion&lt;/a&gt;
eines Observables können wir eine Reihe von Aktionen auf dem Observable und seinem Datenstrom ausführen. Ihr solltet auf jeden Fall
die Grundlagen von RxJS mit der offiziellen Dokumentation lernen. Ich kann auch die Website &lt;a href=&quot;https://www.learnrxjs.io/&quot;&gt;Learn RxJS&lt;/a&gt;
empfehlen.&lt;/p&gt;
&lt;h2 id=&quot;die-herausforderung&quot;&gt;Die Herausforderung&lt;/h2&gt;
&lt;p&gt;In einem Kundenprojekt stand ich vor folgender Herausforderung: Die Webanwendung sollte es Nutzer:innen ermöglichen,
bestimmte Datensätze offline verfügbar zu machen. In einem ersten Schritt habe ich die App in eine
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps&quot;&gt;Progressive Web App&lt;/a&gt; umgewandelt und einen
&lt;a href=&quot;https://angular.io/guide/creating-injectable-service&quot;&gt;Service&lt;/a&gt; erstellt, der die Datenspeicherung mit
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/IndexedDB&quot;&gt;IndexedDB&lt;/a&gt; übernimmt.&lt;/p&gt;
&lt;p&gt;Dann wusste ich plötzlich nicht mehr weiter!&lt;/p&gt;
&lt;p&gt;Um ehrlich zu sein: Ich musste noch nie Daten von verschiedenen API-Endpunkten abrufen, bei denen sich das Ergebnis initialer Abfragen
auf hunderte weitere Abfragen auswirken würde. Ich musste die Abfragesequenz sowohl für die Parallelität als auch für gegenseitige
Abhängigkeiten optimieren.&lt;/p&gt;
&lt;p&gt;Nach einer Menge Online-Recherche und viel Ausprobieren bin ich zu einer zufriedenstellenden Lösung gekommen. Der folgende Quellcode
ist eine angepasste Version meines Kundenprojekts, die ich gerne mit euch teilen möchte.&lt;/p&gt;
&lt;h2 id=&quot;die-lösung&quot;&gt;Die Lösung&lt;/h2&gt;
&lt;p&gt;Geht ihr gerne ins Kino? Stellt euch eine Webanwendung vor, die das Kinoprogramm für verschiedene Kinos anzeigt. Ihr könnt sehen,
wann welcher Film läuft, Informationen über die Schauspieler:innen abrufen, Filmausschnitte ansehen und durch Screenshots blättern.
Ihr könnt auch allgemeine Informationen über die Kinos (z.B. Name, Standort) und ihre Kinosäle (z.B. Anzahl der Sitzplätze) lesen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-pixabay-popcorn.PJrHTrk2_ZuMqQj.webp&quot; srcset=&quot;/_astro/pexels-pixabay-popcorn.PJrHTrk2_ZJlpUA.webp 640w, /_astro/pexels-pixabay-popcorn.PJrHTrk2_gg3tj.webp 750w, /_astro/pexels-pixabay-popcorn.PJrHTrk2_nHbsP.webp 828w, /_astro/pexels-pixabay-popcorn.PJrHTrk2_Z23gquu.webp 1080w, /_astro/pexels-pixabay-popcorn.PJrHTrk2_Z3PznB.webp 1280w, /_astro/pexels-pixabay-popcorn.PJrHTrk2_ZuMqQj.webp 1600w&quot; alt=&quot;Mehrere Tüten Popcorn.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1200&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Pixabay / pexels.com&lt;/p&gt;
&lt;p&gt;Um all diese Daten abzurufen und offline zu speichern, müssen wir auf verschiedene Endpunkte zugreifen. Einige der Abfragen
(z.B. für jeden Film) hängen von Informationen ab, die in anderen Abfragen (z.B. für das Filmprogramm) abgerufen werden. Das bedeutet,
dass wir zunächst eine logische Reihenfolge für unsere Download-Sequenz festlegen müssen.&lt;/p&gt;
&lt;h3 id=&quot;schritt-1-die-zentrale-download-pipe&quot;&gt;Schritt 1: Die zentrale Download-Pipe&lt;/h3&gt;
&lt;p&gt;In meinem Projekt enthält die Klasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CinemaDownloadService&lt;/code&gt;  die gesamte Download-Logik. Der Service kann z.B.
von einer &lt;a href=&quot;https://angular.io/api/core/Component&quot;&gt;Angular-Komponente&lt;/a&gt; eingebunden werden. Er bietet die öffentliche
Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;downloadCinemaInfo&lt;/code&gt; , die alle notwendigen Informationen herunterlädt, um ein Kino und sein
Filmprogramm offline verfügbar zu machen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; downloadCinemaInfo&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cinemaId&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;): &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Observable&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    return this.downloadDataForCinemaId(cinemaId).pipe(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        switchMap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(this.downloadMovies),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        switchMap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(this.downloadActorBiographies),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        switchMap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(this.downloadFilmClips),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        switchMap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(this.downloadScreenshots),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Methode gibt ein Observable zurück, das die Datensammlung &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CinemaOfflineData&lt;/code&gt;  ausgibt, sobald alle
einzelnen Downloads abgeschlossen sind.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; interface&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    generalInfo&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; CinemaGeneralInfo&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    movieHalls&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MovieHall&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    movieProgram&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MovieProgram&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    movies&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Movie&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    actorBios&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Actor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    filmClips&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; FilmClip&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    screenshots&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MovieScreenshot&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um die Daten zu sammeln, lädt die Methode zunächst alle Informationen herunter, die direkt von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;cinemaId&lt;/code&gt; 
abhängen. Wir werden uns das gleich genauer ansehen. Anschließend verwendet sie eine &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;pipe&lt;/code&gt;  und
den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;switchMap&lt;/code&gt;  Operator, um die restlichen Daten herunterzuladen.&lt;/p&gt;
&lt;p&gt;Der &lt;a href=&quot;https://rxjs.dev/api/index/function/switchMap&quot;&gt;switchMap-Operator&lt;/a&gt; verwendet den vom Observable ausgegebenen Wert, um ein
neues Observable zu erstellen, welches das alte ersetzt. Kurz gesagt: Sobald wir mit einem bestimmten Download-Vorgang fertig sind,
starten wir einen neuen, der das Ergebnis des vorherigen Vorgangs enthält.&lt;/p&gt;
&lt;h3 id=&quot;schritt-2-basis-informationen-herunterladen&quot;&gt;Schritt 2: Basis-Informationen herunterladen&lt;/h3&gt;
&lt;p&gt;In einem ersten Schritt wollen wir die allgemeinen Informationen über das Kino, seine Kinosäle und das aktuelle Kinoprogramm
herunterladen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; downloadDataForCinemaId&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cinemaId&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;number&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;): &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Observable&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    return &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;forkJoin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_request&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;getCinemaGeneralInfo&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cinemaId&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            retryStrategy&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_request&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;getMovieHalls&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cinemaId&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            retryStrategy&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_request&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;getMovieProgram&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cinemaId&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            retryStrategy&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    ]).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        map&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(([&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;generalInfo&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movieHalls&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movieProgram&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;CinemaGeneralInfo&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MovieHall&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[], &lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MovieProgram&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;            const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;                generalInfo&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movieHalls&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movieProgram&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;                movies:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [], &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;actorBios:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;                filmClips:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [], &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;screenshots:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;            return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; data&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die einzelnen Backend-Abfragen werden über einen eigenständigen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;RequestService&lt;/code&gt;  gestellt, auf den wir
über &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;this._request&lt;/code&gt;  zugreifen. Die Details der Implementierung sind für diesen Beitrag nicht relevant. Alles,
was ihr wissen müsst, ist: Jede Request-Methode gibt ein Observable zurück, das den Response ausgibt und dann abgeschlossen wird.&lt;/p&gt;
&lt;p&gt;Wir verwenden den Operator &lt;a href=&quot;https://rxjs.dev/api/index/function/forkJoin&quot;&gt;forkJoin&lt;/a&gt;, um abzuwarten, bis alle Abfragen beendet sind.
Erst dann erstellen wir die erste Instanz unseres &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CinemaOfflineData&lt;/code&gt;  Objekts. Die übrigen Eigenschaften,
wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;movies&lt;/code&gt; , werden als leere Arrays initialisiert. Wir werden die entsprechenden Daten in den nächsten
Schritten unserer Download-Pipe herunterladen.&lt;/p&gt;
&lt;h3 id=&quot;schritt-3-zeitgleiche-requests-mit-mergemap-begrenzen&quot;&gt;Schritt 3: Zeitgleiche Requests mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;mergeMap&lt;/code&gt;  begrenzen&lt;/h3&gt;
&lt;p&gt;Nachdem wir das Kinoprogramm erfolgreich heruntergeladen haben, wollen wir Infos über alle darin enthaltenen Filme abrufen.
Je nach Größe des Kinos und des abgedeckten Zeitraums könnte dies Hunderte von Einzelabfragen bedeuten.&lt;/p&gt;
&lt;p&gt;Das moderne &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/HTTP_2&quot;&gt;HTTP/2-Protokoll&lt;/a&gt; unterstützt das vollständige Multiplexing
von Abfragen. Je nach eurem Backend-Server und der &lt;a href=&quot;https://medium.com/geekculture/how-to-calculate-server-max-requests-per-second-38a39bb96a85&quot;&gt;maximalen Anzahl von Abfragen pro Sekunde&lt;/a&gt;
kann es jedoch sinnvoll sein, die Anzahl der gleichzeitigen Abfragen zu begrenzen.&lt;/p&gt;
&lt;p&gt;Um dies zu erreichen, verwenden wir eine Kombination der folgenden RxJS-Funktionen: &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;from&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;mergeMap&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;reduce&lt;/code&gt; . Hier ist die vollständige Methode zum Herunterladen von Filminfos:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; downloadMovies&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Observable&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; movies&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Movie&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; movieIds&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getMovieIds&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movieProgram&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movieIds&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        mergeMap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            id&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_request&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getMovieInfo&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;               retryStrategy&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            MAX_CONCURRENT_BACKEND_REQUESTS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        reduce&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;accumulator&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;                accumulator&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;                return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; accumulator&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            movies&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        map&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movies&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; ({ &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movies&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; }))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich weiß, das ist ein ziemlicher Brocken! Schauen wir uns die Umsetzung Schritt für Schritt an:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wir holen uns die eindeutigen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;movieIds&lt;/code&gt;  aus dem bereits heruntergeladenen Filmprogramm. Dann verwenden
wir &lt;a href=&quot;https://rxjs.dev/api/index/function/from&quot;&gt;from&lt;/a&gt;, um das Array der Film-IDs in ein Observable zu verwandeln.&lt;/li&gt;
&lt;li&gt;Als Nächstes verwenden wir &lt;a href=&quot;https://rxjs.dev/api/index/function/mergeMap&quot;&gt;mergeMap&lt;/a&gt;, um für jeden Film eine Abfrage zu erstellen.
Wir übergeben die Konstante &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;MAX_CONCURRENT_BACKEND_REQUESTS&lt;/code&gt;  als zweiten Parameter, um die maximale Anzahl der
gleichzeitigen Abfragen zu begrenzen.&lt;/li&gt;
&lt;li&gt;Jedes einzelne Request-Observable nutzt den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;retryStrategy&lt;/code&gt;  Operator, um die Abfrage im Fehlerfall zu wiederholen.
Dabei handelt es sich um meinen eigenen, benutzerdefinierten Operator, der die &lt;a href=&quot;https://rxjs.dev/api/index/function/retry&quot;&gt;retry-Funktion&lt;/a&gt;
verwendet.&lt;/li&gt;
&lt;li&gt;Das nächste Element in unserer Observable-Pipe ist &lt;a href=&quot;https://rxjs.dev/api/index/function/reduce&quot;&gt;reduce&lt;/a&gt;.
Wir verwenden diese Funktion, um die Ergebnisse aller Backend-Abfragen in dem
Array &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;movies&lt;/code&gt;  zusammenzufassen.&lt;/li&gt;
&lt;li&gt;Zuletzt integrieren wir die Filmdaten in eine neue Instanz unseres &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CinemaOfflineData&lt;/code&gt;  Objekts, indem wir
den &lt;a href=&quot;https://rxjs.dev/api/index/function/map&quot;&gt;map-Operator&lt;/a&gt; verwenden.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jetzt kann die zentrale Download-Pipe zum nächsten Schritt übergehen: Den Download der Biografien aller Schauspieler:innen. Wir
ermitteln die eindeutigen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;actorIds&lt;/code&gt;  aus den Filmdaten und wenden die gleiche Download-Logik wie zuvor an:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; downloadActorBiographies&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Observable&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; actorBios&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Actor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[] &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; actorIds&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getActorIds&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;movies&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;actorIds&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        mergeMap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            id&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_request&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getActorBiography&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;pipe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;                retryStrategy&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            MAX_CONCURRENT_BACKEND_REQUESTS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        reduce&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;accumulator&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;                accumulator&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;                return&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; accumulator&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            actorBios&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        map&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;actorBios&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; ({ &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;actorBios&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; }))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wir wiederholen dieselben Schritte für die Filmausschnitte und Screenshots.&lt;/p&gt;
&lt;h3 id=&quot;schritt-4-das-download-observable-ausführen&quot;&gt;Schritt 4: Das Download-Observable ausführen&lt;/h3&gt;
&lt;p&gt;Um die gesamte Download-Logik auszuführen, müsst ihr die öffentliche Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;downloadCinemaInfo&lt;/code&gt;  aufrufen
und dann die subscribe-Methode für das zurückgegebene Observable aufrufen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;_cinemaDownloadService&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;downloadCinemaInfo&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cinemaId&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    .&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;subscribe&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;cinemaData&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; CinemaOfflineData&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        /* Store data offline, e.g., with IndexedDB */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das war’s! Ihr habt erfolgreich eine elegante Download-Logik erstellt, die für Parallelität und voneinander abhängige Daten
optimiert ist.&lt;/p&gt;
&lt;p&gt;Natürlich solltet ihr auch die Fehlerbehandlung mit &lt;a href=&quot;https://rxjs.dev/api/index/function/catchError&quot;&gt;catchError&lt;/a&gt; implementieren.
Weiters könntet ihr auch den Download-Prozess visualisieren, indem ihr mithilfe eines &lt;a href=&quot;https://rxjs.dev/api/index/class/Subject&quot;&gt;Subject&lt;/a&gt;
den aktuellen Status kommuniziert.&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Wie wir gesehen haben, bietet RxJS eine Reihe mächtiger Werkzeuge wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;mergeMap&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;reduce&lt;/code&gt; .
Sie helfen uns, effiziente und robuste Lösungen zu implementieren.&lt;/p&gt;
&lt;p&gt;Ihr könnt eine zentrale Download-Pipe definieren, die einen schnellen Überblick über die einzelnen Schritte bietet. Dann platziert ihr
die spezifische Download-Logik in isolierten privaten Funktionen. Damit könnt ihr euren Code sauber und wartbar halten.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://rxjs.dev/&quot;&gt;RxJS (Reactive Extensions Library for JavaScript)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.learnrxjs.io/&quot;&gt;Learn RxJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://netbasal.com/creating-custom-operators-in-rxjs-32f052d69457&quot;&gt;Creating Custom Operators in RxJS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>angular</category><category>api</category><category>backend</category><category>http</category><category>javascript</category><category>observables</category><category>rxjs</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_waterfalls.jpg" length="0" type="image/jpeg"/></item><item><title>Einfach herausragend! Die neue Popover API und CSS Anchor Positioning</title><link>https://www.oidaisdes.org/de/blog/popover-api-accessibility</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/popover-api-accessibility</guid><description>Noch nie war es so einfach, barrierefreie Menüs, Tooltips und Datumsauswahlen zu erstellen.</description><pubDate>Sun, 09 Jul 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Menüs, Tooltips, Datumsauswahlen oder Dialoge – das Web steckt voller Popover-Inhalte. Trotz ihrer weiten Verbreitung
existieren kaum native HTML-Elemente für diese Komponenten (außer für &lt;a href=&quot;/de/blog/native-dialog-element/&quot;&gt;Dialoge&lt;/a&gt;).
Und ihre Implementierung erfordert eine ganze Menge JavaScript.&lt;/p&gt;
&lt;p&gt;Doch die neue &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover API&lt;/a&gt; in Kombination mit
&lt;a href=&quot;https://www.w3.org/TR/css-anchor-position-1/&quot;&gt;CSS Anchor Positioning&lt;/a&gt; ändert alles. Die Darstellung von einzelnen
Elementen über anderen Seiteninhalten wird damit für Entwickler:innen zum Kinderspiel.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_14UB5b.webp&quot; srcset=&quot;/_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_utH8m.webp 640w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_Z2tTReH.webp 750w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_1uFmq9.webp 828w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_Z1WCApy.webp 1080w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_ZTSXNp.webp 1280w, /_astro/pexels-zachary-debottis-skateboarder-jump.s-LpGV1f_14UB5b.webp 1600w&quot; alt=&quot;Ein Skateboarder beim Sprung in der Luft.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1007&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Zachary DeBottis / pexels.com&lt;/p&gt;
&lt;p&gt;Ich habe zwei Demos mit Beispielen für Popover-Inhalte vorbereitet. Wir werden sowohl die technischen Aspekte als auch
die Barrierefreiheit der neuen Funktionen eingehend betrachten.&lt;/p&gt;
&lt;h2 id=&quot;was-können-wir-damit-machen&quot;&gt;Was können wir damit machen?&lt;/h2&gt;
&lt;p&gt;Ich mag das Motto: Zeigen, nicht erzählen! Deshalb habe ich zwei Demos erstellt, um die Möglichkeiten der neuen API zu
veranschaulichen.&lt;/p&gt;
&lt;p&gt;Im Moment funktionieren die Beispiele nur in &lt;a href=&quot;https://www.google.com/intl/de/chrome/canary/&quot;&gt;Chrome Canary&lt;/a&gt;, dem Nightly
Build für Entwickler:innen. Öffnet den Browser, ruft die Seite &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;chrome://flags&lt;/code&gt;  auf und aktiviert
dort die experimentellen Web-Plattform-Funktionen.&lt;/p&gt;
&lt;p&gt;Warnung: Die Anker-Positionierung ist noch sehr experimentell. Daher können die Demos eventuell nicht funktionieren,
falls sich die Spezifikation ändert.&lt;/p&gt;
&lt;h3 id=&quot;beispiel-1-benutzerdefinierter-tooltip&quot;&gt;Beispiel 1: Benutzerdefinierter Tooltip&lt;/h3&gt;
&lt;p&gt;Standard-Tooltips, die mit dem Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;title&lt;/code&gt;  erstellt werden, sind ziemlich langweilig. Deshalb
habe ich mich an einem schicken &lt;a href=&quot;https://codepen.io/alexlehner86/pen/dyQRJBv&quot;&gt;benutzerdefinierten Tooltip&lt;/a&gt; versucht.
Klickt auf die Info-Schaltfläche neben der Überschrift:&lt;/p&gt;
&lt;iframe title=&quot;Barrierefreier Tooltip mit der Popover API&quot; src=&quot;https://codepen.io/alexlehner86/embed/dyQRJBv?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/dyQRJBv&quot;&gt;
Accessible Tooltip with Popover API&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Ich habe mein Bestes gegeben, um den Tooltip barrierefrei zu gestalten. Dazu bin ich den Vorgaben des
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/&quot;&gt;Tooltip Pattern&lt;/a&gt; im ARIA Authoring Practices Guide gefolgt. Leider gibt
es noch keinen Konsens zur idealen Implementierung. Darüber hinaus bietet die Popover API noch keinen Mechanismus für Hover-
und Fokus-Events.&lt;/p&gt;
&lt;h3 id=&quot;beispiel-2-menü-mit-einer-reihe-von-aktionen&quot;&gt;Beispiel 2: Menü mit einer Reihe von Aktionen&lt;/h3&gt;
&lt;p&gt;Ich habe auch eine &lt;a href=&quot;https://codepen.io/alexlehner86/pen/rNQmERq&quot;&gt;Demo&lt;/a&gt; für ein barrierefreies Menü erstellt. Jeder Eintrag
in der Liste der ausgeliehenen Bücher enthält eine Schaltfläche, die ein Menüfeld mit einer Reihe von Aktionen für jedes Buch
einblendet:&lt;/p&gt;
&lt;iframe title=&quot;Barrierefreies Menü mit der Popover API&quot; src=&quot;https://codepen.io/alexlehner86/embed/rNQmERq?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/rNQmERq&quot;&gt;
Accessible Menu with Popover API&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Meine Implementierung folgt dem &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/menubar/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;Menu and Menubar Pattern&lt;/span&gt;&lt;/a&gt;,
das im ARIA Authoring Practices Guide definiert ist. Ich habe die entsprechenden ARIA-Rollen und -Eigenschaften verwendet
und auch (die meisten) der empfohlenen Tastatur-Interaktionen implementiert.&lt;/p&gt;
&lt;p&gt;Schauen wir uns nun die verschiedenen Bausteine an, die ich zur Erstellung dieser Komponenten verwendet habe.&lt;/p&gt;
&lt;h2 id=&quot;das-magische-popover-attribut&quot;&gt;Das magische &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut&lt;/h2&gt;
&lt;p&gt;Dieses HTML-Attribut verwandelt jedes Element in einen Popover-Inhalt. Die
&lt;a href=&quot;https://html.spec.whatwg.org/multipage/popover.html#the-popover-attribute&quot;&gt;HTML-Spezifikation&lt;/a&gt; besagt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;All HTML elements may have the &lt;strong&gt;popover&lt;/strong&gt; content attribute set. When specified, the element won’t be
rendered until it becomes shown, at which point it will be rendered on top of other page content.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Dieser Popover-Inhalt ist immer nicht-modal, d. h. Nutzer:innen können weiterhin mit dem Rest der Seite interagieren,
während das Popover geöffnet ist. Wenn ihr ein modales Popover (z. B. einen Bestätigungs-Dialog) anzeigen wollt, solltet
ihr das Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  verwenden.&lt;/p&gt;
&lt;h2 id=&quot;wie-ihr-ein-popover-erstellt&quot;&gt;Wie ihr ein Popover erstellt&lt;/h2&gt;
&lt;p&gt;Um ein Popover zu erstellen, fügt ihr das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  zu einem Element hinzu und definiert
eine &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;id&lt;/code&gt; . Anschließend setzt ihr das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popovertarget&lt;/code&gt;  mit dem Wert
der ID des Popovers auf jenes Element, welches das Popover öffnet. Ein Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popovertarget&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;popover-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    Info&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;popover-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popover&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    Hi, I&amp;#39;m a popover!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das war’s! Ihr habt gerade ein Popover mit ein paar Zeilen HTML und null JavaScript erstellt. Genial!&lt;/p&gt;
&lt;h3 id=&quot;eingebaute-features-der-popover-api&quot;&gt;Eingebaute Features der Popover API&lt;/h3&gt;
&lt;p&gt;Wenn ihr das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut verwendet, erhaltet ihr die folgenden Funktionen mit dazu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Platzierung im Top-Layer:&lt;/strong&gt; Popover-Inhalte werden automatisch im &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Top_layer&quot;&gt;Top-Layer&lt;/a&gt;
angezeigt, einer separaten Ebene, die über allen anderen Inhalten im Webdokument liegt. Ihr müsst euch nicht länger um
die DOM-Reihenfolge oder den z-Index Sorgen machen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Light-dismiss:&lt;/strong&gt; Wenn ihr außerhalb des Popover-Bereichs klickt, wird das Popover geschlossen und der Fokus wieder auf
das auslösende Element zurückgesetzt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Barrierefreie Tastaturbedienung:&lt;/strong&gt; Wenn das Popover geöffnet ist, könnt ihr die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste drücken,
um das Popover zu schließen und den Fokus wieder auf das auslösende Element zu setzen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Semantische Beziehung:&lt;/strong&gt; Die Verknüpfung eines Popover-Elements mit einer Schaltfläche erzeugt automatisch eine semantische
Beziehung für assistive Technologien. Quasi ein eingebautes &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-controls&lt;/code&gt; 
plus &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-expanded&lt;/code&gt; .&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;weitere-optionen-und-styling&quot;&gt;Weitere Optionen und Styling&lt;/h3&gt;
&lt;p&gt;Wenn ihr ein Popover mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popovertarget&lt;/code&gt;  erstellt, blendet die Schaltfläche das Popover standardmäßig ein
und aus. Alternativ könnt ihr auch einen expliziten Wert für das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popovertargetaction&lt;/code&gt;  festlegen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“hide”&lt;/strong&gt;: Die Schaltfläche blendet ein angezeigtes Popover aus. Das kann nützlich sein, wenn ihr innerhalb eines Popovers
eine Schaltfläche zum Schließen anbieten möchtet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“show”&lt;/strong&gt;: Die Schaltfläche blendet ein Popover ein.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“toggle”&lt;/strong&gt;: Die Schaltfläche blendet ein Popover ein und aus. Dies ist das Standardverhalten.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Darüber hinaus ist das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut eigentlich eine Abkürzung für &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover=“auto”&lt;/code&gt; .
Dieser Standardtyp von Popover erzwingt das Schließen anderer Auto-Popovers. Es kann über Light-Dismiss oder eine
Schließen-Schaltfläche ausgeblendet werden.&lt;/p&gt;
&lt;p&gt;Mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover=“manual”&lt;/code&gt;  könnt ihr ein manuelles Popover erstellen. Diese Popover werden nicht über
Light-Dismiss geschlossen und sie erzwingen auch nicht das Schließen anderer Popover. Ihr müsst sie durch eine explizite
Schließ-Aktion ausblenden. Ein möglicher Anwendungsfall für manuelle Popovers sind &lt;a href=&quot;https://m2.material.io/components/snackbars&quot;&gt;Alarm-Snackbars&lt;/a&gt;,
die vom Nutzer bestätigt werden müssen.&lt;/p&gt;
&lt;p&gt;Popovers bieten auch nützliche CSS-Funktionen: Mit dem Pseudoelement &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::backdrop&lt;/code&gt;  könnt ihr Effekte auf
den Seiteninhalt hinter dem Popover anwenden. Ihr könnt die Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:popover-open&lt;/code&gt;  verwenden,
um das Styling von eingeblendeten Popover-Elementen zu definieren.&lt;/p&gt;
&lt;h2 id=&quot;css-anchor-positioning&quot;&gt;CSS Anchor Positioning&lt;/h2&gt;
&lt;p&gt;Wenn ihr’s bis hierher geschafft habt, fragt ihr euch vielleicht: Was ist mit der Position des Popovers auf der Seite? Um
den eingeblendeten Inhalt relativ zu einem anderen Element zu positionieren, benötigen wir eine weitere neue, experimentelle
Funktion: Anker-Positionierung.&lt;/p&gt;
&lt;p&gt;Dieses Feature ist im CSS-Modul &lt;a href=&quot;https://www.w3.org/TR/css-anchor-position-1/&quot;&gt;CSS Anchor Positioning&lt;/a&gt; definiert. Im Moment
ist das Dokument noch ein &lt;span class=&quot;c-italic&quot;&gt;„Working Draft“&lt;/span&gt; , aber Chrome bietet die Funktion bereits hinter
dem Flag für experimentelle Web-Plattform-Funktionen an. Das Dokument besagt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;This specification defines &lt;strong&gt;‘anchor positioning’&lt;/strong&gt;, where a positioned element can size and position itself
relative to one or more “anchor elements” elsewhere on the page.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In meinen Demos habe ich die Anker-Positionierung verwendet, um den Tooltip und die Menüfelder neben ihren Toggle-Schaltflächen
zu platzieren. Sehen wir uns an, wie wir Anker definieren und sie im CSS-Code referenzieren können.&lt;/p&gt;
&lt;h3 id=&quot;wie-ihr-ein-anker-element-definiert&quot;&gt;Wie ihr ein Anker-Element definiert&lt;/h3&gt;
&lt;p&gt;Es gibt zwei verschiedene Wege, um Anker zu definieren. Ihr könnt ein HTML-Element in einen Anker verwandeln, indem ihr dem
Element eine &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;id&lt;/code&gt;  zuweist, und dann das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor&lt;/code&gt;  Attribut verwendet, um ein anderes
Element an diesen Anker zu binden. Hier ist ein Beispiel in Kombination mit einem Popover:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;toggle-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popovertarget&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;popover-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;toggle-btn&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    Info&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;popover-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; popover&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; anchor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;toggle-btn-1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    Hi, I&amp;#39;m a popover!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alternativ könnt ihr die CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor-name&lt;/code&gt;  verwenden, um einen Anker zu definieren. Diese
Eigenschaft akzeptiert einen &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/dashed-ident&quot;&gt;dashed-ident&lt;/a&gt; Wert wie
etwa &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—toggle-btn&lt;/code&gt; . Anschließend nutzt ihr die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position-anchor&lt;/code&gt; ,
um ein anderes Element an den Anker zu binden.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button.toggle-btn&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    anchor-name: --toggle-btn;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;popover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    position-anchor: --toggle-btn;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;inhalte-mit-der-anchor-funktion-positionieren&quot;&gt;Inhalte mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor()&lt;/code&gt;  Funktion positionieren&lt;/h3&gt;
&lt;p&gt;Gut, ihr habt jetzt ein HTML-Element als Anker definiert und ein Popover daran gebunden. Jetzt könnt ihr die
Funktion &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor()&lt;/code&gt;  verwenden, um das Popover zu positionieren. Die Funktion akzeptiert drei Argumente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anker-Element&lt;/strong&gt;: Dieser Wert gibt an, wo sich das Anker-Element befindet. Ihr könnt einen expliziten Ankernamen angeben.
Oder ihr lasst den Wert weg, um den impliziten Anker zu verwenden, der über das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor&lt;/code&gt;  oder
die CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position-anchor&lt;/code&gt;  definiert wurde.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Verankerungs-Seite&lt;/strong&gt;: Dieser Wert bezieht sich auf die Position der entsprechenden Seite des Anker-Elements. Zum
Beispiel: &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;bottom&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;left&lt;/code&gt; .&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fallback (optional)&lt;/strong&gt;: Ein Längen- oder prozentualer Wert, der als Fallback im Falle einer ungültigen Ankerfunktion dient.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das folgende Beispiel zeigt, wie ihr einen Tooltip unterhalb der Toggle-Schaltfläche platzieren und horizontal zentrieren
könnt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;tooltip&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;popover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    position-anchor: --toggle-btn;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    top&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: anchor(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;bottom&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: anchor(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    translate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-50%&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Spezifikation enthält noch weitere Funktionen wie die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor-scroll&lt;/code&gt;  und die
Funktion &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;anchor-size()&lt;/code&gt; . Aber der Blog-Beitrag ist schon lang genug, daher bin ich mal so frech und
lasse sie aus.&lt;/p&gt;
&lt;h2 id=&quot;barrierefreiheit-von-popovers&quot;&gt;Barrierefreiheit von Popovers&lt;/h2&gt;
&lt;p&gt;Sind Popovers barrierefrei? Wie meine Beispiele oben zeigen, könnt ihr mit der neuen Popover-API nutzerfreundliche,
barrierefreie Komponenten erstellen. Aber das passiert nicht von selbst.&lt;/p&gt;
&lt;h3 id=&quot;definiert-die-passende-semantische-rolle&quot;&gt;Definiert die passende semantische Rolle&lt;/h3&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut kann die Barrierefreiheit eurer Website auf jeden Fall verbessern. Zum Beispiel
durch die Möglichkeit, das Popover mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste zu schließen. Oder durch die semantische Beziehung
zwischen dem Toggle-Button und dem Popover, die durch das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popovertarget&lt;/code&gt;  erzeugt wird.&lt;/p&gt;
&lt;p&gt;Andererseits definiert das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut keine implizite Rolle für das HTML-Element, dem es
hinzugefügt wird. Das bedeutet: Denkt über euren konkreten Anwendungsfall nach und verwendet dann das passende
native HTML-Element oder die angemessene &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles&quot;&gt;ARIA-Rolle&lt;/a&gt;
(wie zum Beispiel &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;tooltip&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;menu&lt;/code&gt; ).&lt;/p&gt;
&lt;h3 id=&quot;screenreader-unterstützung&quot;&gt;Screenreader-Unterstützung&lt;/h3&gt;
&lt;p&gt;Wie erleben Nutzer:innen von Screenreadern die Interaktion mit Webinhalten, die mit der Popover-API erstellt wurden?
Aufgrund der begrenzten Browser-Unterstützung für die neuen Features habe ich meine Demos nur in den folgenden Szenarien
getestet:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nvaccess.org/download/&quot;&gt;NVDA&lt;/a&gt; 2023.1, Windows 11, Google Chrome Chanary 117.0.5876.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/accessibility/android/topic/10601571?hl=de&quot;&gt;TalkBack&lt;/a&gt;, Samsung Galaxy S20, Android 13,
Google Chrome Chanary 117.0.5876.0&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Beide Demos haben super funktioniert: Ich konnte mit der Tastatur durch den Tooltip und die Menüs navigieren, während NVDA
die semantischen Rollen und den aktuellen Status der Steuerelemente vorlas.&lt;/p&gt;
&lt;p&gt;Auch die Interaktion auf meinem Smartphone verlief reibungslos: Bei aktiviertem TalkBack navigierte ich mit
&lt;a href=&quot;https://support.google.com/accessibility/android/answer/6006598?hl=de&quot;&gt;Wischgesten&lt;/a&gt; durch die Seiten, während der
Screenreader mich über den Inhalt, die semantischen Rollen und den aktuellen Status der Bedienelemente informierte.&lt;/p&gt;
&lt;p&gt;Das stimmt mich wirklich optimistisch für die Zukunft des Webs! Ich werde noch weitere Tests mit anderen Browsern und
Screenreadern durchführen, sobald die Popover-API besser unterstützt wird.&lt;/p&gt;
&lt;h2 id=&quot;browser-unterstützung&quot;&gt;Browser-Unterstützung&lt;/h2&gt;
&lt;p&gt;Wann können wir die Popover-API und CSS Anchor Positioning produktiv einsetzen? Leider wird es noch einige Zeit dauern,
bis es eine browserübergreifende Unterstützung für diese Features geben wird.&lt;/p&gt;
&lt;p&gt;Laut &lt;a href=&quot;https://caniuse.com/mdn-api_htmlelement_popover&quot;&gt;caniuse.com&lt;/a&gt; wird das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;popover&lt;/code&gt;  Attribut
bereits von Chrome und Edge unterstützt. In der
&lt;a href=&quot;https://developer.apple.com/documentation/safari-technology-preview-release-notes/stp-release-170&quot;&gt;Safari 17 Technology Preview&lt;/a&gt;
wird das Attribut angekündigt, während &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Experimental_features&quot;&gt;Firefox&lt;/a&gt;
es nur als experimentelles Feature anführt (ihr müsst das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dom.element.popover.enabled&lt;/code&gt;  Flag setzen).&lt;/p&gt;
&lt;p&gt;Die browserübergreifende Unterstützung für &lt;a href=&quot;https://www.w3.org/TR/css-anchor-position-1/&quot;&gt;CSS Anchor Positioning&lt;/a&gt; wird wohl
noch länger dauern. Soweit ich weiß hat bisher nur Chrome das experimentelle Feature implementiert. Aufgrund des Status
als &lt;span lang=&quot;en&quot;&gt;„First Public Working Draft“&lt;/span&gt; kann sich die aktuelle Spezifikation in Zukunft noch ändern. Wir müssen
einfach abwarten und sehen was passiert.&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Die neue Popover-API in Kombination mit CSS Anchor Positioning wird unser Leben als Web-Entwickler:innen einfacher machen und
zu mehr Barrierefreiheit im Web beitragen.&lt;/p&gt;
&lt;p&gt;Trotz des noch experimentellen Status der neuen APIs solltet ihr sie selbst ausprobieren und euch mit den neuen Attributen und
Eigenschaften vertraut machen. Auf diese Weise seid ihr dann schon startklar, wenn die Features endlich von allen modernen
Browsern unterstützt werden. 😎&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Popover_API&quot;&gt;Popover API (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://html.spec.whatwg.org/multipage/popover.html#the-popover-attribute&quot;&gt;HTML specification for the popover attribute&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://open-ui.org/components/popover.research.explainer/&quot;&gt;Popover API Explainer (Open UI)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/css-anchor-position-1/&quot;&gt;CSS Anchor Positioning (Draft)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 05.04.2024 &lt;/h2&gt; 
&lt;p&gt;Code-Beispiele und Erläuterungen überarbeitet, um der aktualisierten CSS Anchor Positioning Spezifikation
(W3C Working Draft, 26. März 2024) sowie der Implementierung in Chrome Canary zu entsprechen.&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 18.04.2025 &lt;/h2&gt; 
&lt;p&gt;CSS Anchor Positioning ist Teil von &lt;a href=&quot;https://wpt.fyi/interop-2025&quot;&gt;Interop 2025&lt;/a&gt;. Deshalb bin ich mir
ziemlich sicher, dass wir bis zum Ende des Jahres eine browserübergreifende Unterstützung haben werden.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>html</category><category>keyboard</category><category>popover</category><category>popup</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_skateboarder_jump.jpg" length="0" type="image/jpeg"/></item><item><title>Wie ihr das volle Potential von Inline-SVG-Bildern entfaltet</title><link>https://www.oidaisdes.org/de/blog/unleash-power-of-inline-svg</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/unleash-power-of-inline-svg</guid><description>Ein Inline-SVG-Bild kann mit CSS leicht angepasst werden und ist sehr flexibel.</description><pubDate>Thu, 22 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;SVG-Bilder sind ein integraler Bestandteil des modernen Webdesigns. SVG, kurz
für &lt;span class=&quot;c-italic&quot;&gt;Scalable Vector Graphics&lt;/span&gt; , sind hoch skalierbar und haben eine geringe Dateigröße.
Ihr könnt sie sogar mit CSS stylen, wie ich euch zeigen werde.&lt;/p&gt;
&lt;p&gt;Ein SVG-Bild kann mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;img&amp;gt;&lt;/code&gt;  Tag oder der
CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;background-image&lt;/code&gt;  in eine Website eingebettet werden. In diesem Fall könnt ihr
aber das Styling des Bildes nicht ändern. Ich verwende lieber Inline-SVG-Bilder. Diese können mit CSS angepasst und
sogar animiert werden.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-andrea-piacquadio-painter.DIvHNElN_Z2kGcB1.webp&quot; srcset=&quot;/_astro/pexels-andrea-piacquadio-painter.DIvHNElN_Z22R9NA.webp 640w, /_astro/pexels-andrea-piacquadio-painter.DIvHNElN_ZEtGpt.webp 750w, /_astro/pexels-andrea-piacquadio-painter.DIvHNElN_1BcUX3.webp 828w, /_astro/pexels-andrea-piacquadio-painter.DIvHNElN_ZRUx6q.webp 1080w, /_astro/pexels-andrea-piacquadio-painter.DIvHNElN_2bUsKf.webp 1280w, /_astro/pexels-andrea-piacquadio-painter.DIvHNElN_Z2kGcB1.webp 1600w&quot; alt=&quot;Eine Frau malt eine Katzenfigur auf ein Stück Papier.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1095&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Andrea Piacquadio / pexels.com&lt;/p&gt;
&lt;p&gt;Wie kann man Inline-SVG-Bilder einbetten? Was sind die besten Methoden, um sie mit CSS-Eigenschaften und Variablen anzupassen?
Lest weiter, um die Antworten darauf zu erfahren.&lt;/p&gt;
&lt;h2 id=&quot;wie-ihr-ein-inline-svg-einbettet&quot;&gt;Wie ihr ein Inline-SVG einbettet&lt;/h2&gt;
&lt;p&gt;SVG-Bilder können mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;svg&amp;gt;&lt;/code&gt;  Tag direkt in ein HTML-Dokument eingebettet werden. Öffnet
einfach die Bilddatei in einem Code-Editor, kopiert den Code und fügt ihn in euer HTML-Template ein. Hier ist ein Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;svg&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;48&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;48&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; viewBox&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;0 -960 960 960&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; xmlns&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; d&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;m393-165 279-335H492l36-286-253 366h154l-36 255Zm-73 85 40-280H160l360-520h80l-40 320h240L400-80h-80Zm153-395Z&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;svg&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Websites werden oft mithilfe komponentenbasierter JavaScript-Frameworks wie &lt;a href=&quot;https://angular.io/&quot;&gt;Angular&lt;/a&gt; oder
&lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt; erstellt. Damit könnt ihr ein Inline-SVG in einer eigenen Komponente verpacken, die ihr dann
an verschiedenen Stellen eurer Website wiederverwenden könnt. Ein Beispiel dafür ist die
&lt;a href=&quot;https://mui.com/material-ui/material-icons/&quot;&gt;Material UI Icon-Bibliothek&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Die UI-Bibliothek &lt;a href=&quot;https://material.angular.io/components/icon/overview#svg-icons&quot;&gt;Angular Material&lt;/a&gt; geht sogar noch einen
Schritt weiter: Damit könnt ihr SVG-Dateien als Assets der Website hinzufügen. Die Anwendung lädt die Bilder später vom Server,
sodass der SVG-Code über die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;mat-icon&amp;gt;&lt;/code&gt;  Komponente in das HTML-Dokument eingebettet werden kann.&lt;/p&gt;
&lt;h2 id=&quot;demo-flexibles-styling-von-svg-icon-buttons&quot;&gt;Demo: Flexibles Styling von SVG-Icon-Buttons&lt;/h2&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://alexlehner86.github.io/fancy-css-playground/#/inlinesvg&quot;&gt;Demo&lt;/a&gt; mit Anwendungsfällen für Inline-SVGs
erstellt. Ihr könnt die Farbe der Icons über ein Farbwahlelement anpassen:&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/fancy-css-playground/#/inlinesvg&quot; title=&quot;Demo: Flexibles Styling von Inline-SVG-Bildern&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Wie das funktioniert? Indem ihr den &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;fill&lt;/code&gt;  des SVG-Bildes mit der
CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;color&lt;/code&gt;  verknüpft.&lt;/p&gt;
&lt;h2 id=&quot;svg-bilder-mit-css-stylen&quot;&gt;SVG-Bilder mit CSS stylen&lt;/h2&gt;
&lt;p&gt;Als erstes setzt ihr die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;fill&lt;/code&gt;  des SVG-Bildes auf den Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;currentColor&lt;/code&gt; .
Dieses spezielle Schlüsselwort steht für den Wert der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;color&lt;/code&gt;  CSS-Eigenschaft eines Elements. Auf diese
Weise werden die Vektoren des SVG-Bildes mit der Schriftfarbe des Elements gefüllt. Ihr könnt die Eigenschaft im SVG-Code setzen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;svg&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; fill&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;currentColor&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;48&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;48&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; viewBox&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;0 -960 960 960&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; xmlns&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; d&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;svg&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Oder ihr definiert die Eigenschaft im CSS-Code:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.icon&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; svg&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    fill&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;currentColor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt könnt ihr das Aussehen des SVG-Bildes über die CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;color&lt;/code&gt;  steuern. Das erleichtert
die Verwaltung von Farbthemen und verschiedenen Zuständen von Steuerelementen.&lt;/p&gt;
&lt;p&gt;Sagen wir, ihr verwendet eine Schaltfläche mit Icon und Text, wie in meiner Demo oben: Ihr könnt alle Elemente innerhalb der
Schaltfläche mit einer einzigen CSS-Regel einfärben. Verschiedene Zustände wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:hover&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus&lt;/code&gt; 
oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:disabled&lt;/code&gt;  sind einfach zu gestalten. Ihr könnt sogar den Farbwechsel animieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.primary-btn&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#f118a6&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;color&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0.5s&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ease&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.primary-btn:hover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.primary-btn:focus&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#920c64&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; currentColor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;css-variablen-für-mehrfarbige-bilder-verwenden&quot;&gt;CSS-Variablen für mehrfarbige Bilder verwenden&lt;/h2&gt;
&lt;p&gt;Ihr könnt sogar &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties&quot;&gt;CSS-Variablen&lt;/a&gt; innerhalb von
SVG-Code verwenden. Das kann nützlich sein, wenn euer SVG-Bild mehrere Farben enthält. In diesem Fall könnt ihr die Hauptfarbe
weiterhin mit der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;color&lt;/code&gt;  verknüpfen. Für die anderen Farben solltet ihr eigene
CSS-Variablen definieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;svg&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; fill&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;currentColor&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; viewBox&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;0 0 20 20&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; xmlns&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;http://www.w3.org/2000/svg&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; d&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; d&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; fill&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;var(--secondary-fill)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; d&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;svg&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Im Beispiel oben werden das erste und zweite &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;path&lt;/code&gt;  Element durch die definierte Schriftfarbe eingefärbt.
Die Füllung des dritten Pfades könnt ihr über die CSS-Variable &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—secondary-fill&lt;/code&gt;  steuern:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.icon&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;darkred&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    --secondary-fill&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der Artikel &lt;a href=&quot;https://frontstuff.io/multi-colored-svg-symbol-icons-with-css-variables&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Multi-Colored SVG Symbol Icons with CSS Variables“&lt;/span&gt;&lt;/a&gt;
gibt euch einen ausführlichen Einblick in das Konzept.&lt;/p&gt;
&lt;h2 id=&quot;macht-eure-bilder-barrierefrei&quot;&gt;Macht eure Bilder barrierefrei&lt;/h2&gt;
&lt;p&gt;Und nicht zuletzt: Vergesst nicht auf die Barrierefreiheit! Wenn das SVG-Bild rein dekorativ ist, dann
verwendet &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-hidden=“true”&lt;/code&gt; , um das Element vor assistiven Technologien zu verbergen.&lt;/p&gt;
&lt;p&gt;Wenn das Bild wichtige Informationen vermittelt, solltet ihr &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“img”&lt;/code&gt;  setzen und mit
dem Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-label&lt;/code&gt;  einen alternativen Text angeben. Lest den Artikel
&lt;a href=&quot;https://www.unimelb.edu.au/accessibility/techniques/accessible-svgs&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Accessible SVGs“&lt;/span&gt;&lt;/a&gt; für
weitere Informationen und Anwendungsfälle.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>design</category><category>html</category><category>images</category><category>svg</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_painter.jpg" length="0" type="image/jpeg"/></item><item><title>Nutze das inert Attribut um ungewollte Interaktionen zu verhindern</title><link>https://www.oidaisdes.org/de/blog/inert-attribute-prevents-interaction</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/inert-attribute-prevents-interaction</guid><description>Eine elegante Methode zur Verbesserung der Barrierefreiheit und des Nutzererlebnisses.</description><pubDate>Thu, 04 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Beim Webdesign ist es wichtig, den verfügbaren Platz effizient zu nutzen. Ihr wollt den Bildschirm nicht mit
zu viel Inhalt überladen. Das ist der Grund für gängige Muster wie einblendbare Untermenüs, ausklappbare Bereiche,
Popups oder Dialoge.&lt;/p&gt;
&lt;p&gt;Häufig werden diese Elemente als benutzerdefinierte Widgets implementiert. Sie verwenden CSS-Code
wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;opacity: 0&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;position: absolute; left: -10000px&lt;/code&gt; , um den
Inhalt nur visuell zu verbergen. Die Nutzer:innen können aber immer noch über die Tastatur oder mit Hilfe von
assistiven Technologien auf den Inhalt zugreifen. Was können wir dagegen tun?&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-roxanne-minnish-sloth.9-mxRGvj_23V2hw.webp&quot; srcset=&quot;/_astro/pexels-roxanne-minnish-sloth.9-mxRGvj_Z1yMF8N.webp 640w, /_astro/pexels-roxanne-minnish-sloth.9-mxRGvj_1JEsvG.webp 750w, /_astro/pexels-roxanne-minnish-sloth.9-mxRGvj_ts9jV.webp 828w, /_astro/pexels-roxanne-minnish-sloth.9-mxRGvj_Z1wqqXI.webp 1080w, /_astro/pexels-roxanne-minnish-sloth.9-mxRGvj_Z2ifqY3.webp 1280w, /_astro/pexels-roxanne-minnish-sloth.9-mxRGvj_23V2hw.webp 1600w&quot; alt=&quot;Ein Faultier hängt an einem Ast.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Roxanne Minnish / pexels.com&lt;/p&gt;
&lt;p&gt;Ihr könnt das HTML-Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inert&lt;/code&gt;  verwenden, um jegliche Interaktion mit versteckten Inhalten
zu verhindern. Eine Art digitales Faultier, sozusagen. Schauen wir uns das Attribut, das inzwischen von allen wichtigen
Browsern unterstützt wird, einmal genauer an.&lt;/p&gt;
&lt;h2 id=&quot;wie-das-inert-attribut-funktioniert&quot;&gt;Wie das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inert&lt;/code&gt;  Attribut funktioniert&lt;/h2&gt;
&lt;p&gt;Die inert-Eigenschaft ist ein globales HTML-Attribut, das den Browser anweist, jegliche Benutzerinteraktion mit einem
bestimmten Inhaltsbereich zu verhindern. Die &lt;a href=&quot;https://html.spec.whatwg.org/#the-inert-attribute&quot;&gt;HTML-Spezifikation&lt;/a&gt;
dazu lautet:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;The &lt;strong&gt;inert&lt;/strong&gt; attribute is a boolean attribute that indicates, by its presence, that the element and
all its flat tree descendants […] are to be made inert by the user agent.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das bedeutet: Alle Nutzereingabe-Events für das Element und seine Nachkommen werden ignoriert, einschließlich der
Fokus-Events und Events von assistiven Technologien.&lt;/p&gt;
&lt;p&gt;Ein Beispiel: Ihr platziert ein Registrierungs-Formular außerhalb des Bildschirms und lasst es erst in den sichtbaren
Bereich gleiten, wenn eine bestimmte Schaltfläche gedrückt wird. Durch Hinzufügen von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inert&lt;/code&gt; 
zum &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt;  Element wird sichergestellt, dass Tastatur-Nutzer:innen nicht versehentlich mit
dem Formular interagieren, während es sich außerhalb des Bildschirms befindet. Der Inhalt wird auch vor Screenreadern verborgen.&lt;/p&gt;
&lt;p&gt;Auch das native &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  Element macht davon Gebrauch. Wenn ihr einen Modaldialog
mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.showModal()&lt;/code&gt;  öffnet, wird der Browser automatisch alle anderen Inhalte inaktiv machen.
Mehr Infos liefert mein Blogartikel &lt;a href=&quot;/de/blog/native-dialog-element/&quot;&gt;„Warum du das native Dialog-Element nutzen solltest“&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;beispiel-animiertes-navigations-menü&quot;&gt;Beispiel: Animiertes Navigations-Menü&lt;/h2&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://alexlehner86.github.io/fancy-css-playground/#/inert&quot;&gt;Demo&lt;/a&gt; für ein animiertes Navigationsmenü
erstellt. Dort nutze ich das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inert&lt;/code&gt;  Attribut für die versteckten Untermenüs. Das Ganze
funktioniert perfekt für Tastatur- und Screenreader-Nutzer:innen.&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/fancy-css-playground/#/inert&quot; title=&quot;Anwendungsbeispiel für das inert Attribut&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Das Navigationsmenü ist als ungeordnete Liste innerhalb eines nav-Elements aufgebaut. Der HTML-Code für einen Menüpunkt
und sein verborgenes Untermenü sieht wie folgt aus:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-expanded&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-controls&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;sub_menu_research&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    Research&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;sub_menu_research&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;subMenu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; inert&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/black-holes&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Black Holes&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/climate-change&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Climate Change&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/modern-way-of-work&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Modern Way of Work&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Im CSS-Code referenziere ich auf das inert-Attribut, um das Untermenü auch visuell auszublenden:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.subMenu&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    overflow&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;hidden&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.subMenu&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;inert&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; ul&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateY&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wenn der Menüpunkt aktiviert wird, wird das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inert&lt;/code&gt;  Attribut entfernt und
das Untermenü eingeblendet:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.subMenu:not&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;inert&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]) &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; ul&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateY&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die Gleit-Animation könnt ihr ziemlich einfach und unkompliziert mit der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;transition&lt;/code&gt; 
erzeugen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.subMenu&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; ul&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: transform &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.4s&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ease-in-out&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hier findet ihr den &lt;a href=&quot;https://github.com/alexlehner86/fancy-css-playground/tree/main/src/pages/InertAttribute&quot;&gt;kompletten Quellcode&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;warum-nicht-mit-display-none&quot;&gt;Warum nicht mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt; ?&lt;/h2&gt;
&lt;p&gt;Einige von euch denken jetzt vielleicht: &lt;span class=&quot;c-italic&quot;&gt;„Warum sollte ich das inert-Attribut verwenden? Ich kann doch
einfach alles mit display: none ausblenden!“&lt;/span&gt;  Ihr habt Recht. Wenn man die
CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt;  auf ein Element anwendet, wird es vom Browser nicht gerendert
und wird vor assistiven Technologien verborgen. Der Nachteil: Ihr könnt das Element nicht mehr animieren.&lt;/p&gt;
&lt;p&gt;Die Nutzung des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inert&lt;/code&gt;  Attributs bietet hingegen mehr Flexibilität. Ihr könnt euren Inhalt ein-
und ausblenden, von der Seite reingleiten lassen oder jede erdenkliche anspruchsvolle Animation erstellen. Außerdem
könnt ihr das Attribut für Inhalte verwenden, die zwar sichtbar sind, mit denen aber nicht interagiert werden soll.
Zum Beispiel die teilweise sichtbare, vorherige bzw. nächste Folie in einem Karussell-Widget.&lt;/p&gt;
&lt;h2 id=&quot;browser-unterstützung&quot;&gt;Browser-Unterstützung&lt;/h2&gt;
&lt;p&gt;Seit Version 112 unterstützt nun auch Firefox endlich das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inert&lt;/code&gt;  Attribut. Das bedeutet,
dass nun &lt;a href=&quot;https://caniuse.com/mdn-api_htmlelement_inert&quot;&gt;alle modernen Browser&lt;/a&gt; dieses Feature unterstützen.&lt;/p&gt;
&lt;p&gt;Na dann: Los geht’s! Lasst uns coole Sachen damit bauen.&lt;/p&gt;</content:encoded><category>accessibility</category><category>animation</category><category>html</category><category>keyboard</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_sloth.jpg" length="0" type="image/jpeg"/></item><item><title>Wie das Description List Element die Accessibility und Entwickler-Erfahrung verbessert</title><link>https://www.oidaisdes.org/de/blog/description-list-html-element</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/description-list-html-element</guid><description>Gestaltet Listen von Schlüssel-Wert-Paaren, um euren Code besser lesbar zu machen und Screenreadern semantische Informationen zu vermitteln.</description><pubDate>Sun, 02 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Listen zählen zu den grundlegenden Bausteinen des Webs. Jede:r Web-Entwickler:in kennt die
HTML-Elemente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;  für
&lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Element/ul&quot;&gt;ungeordnete&lt;/a&gt;
und &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Element/ol&quot;&gt;geordnete Listen&lt;/a&gt;.
Doch wenige kennen ihren nahen Verwandten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dl&amp;gt;&lt;/code&gt; , die Beschreibungsliste.&lt;/p&gt;
&lt;p&gt;Ein typischer Anwendungsfall ist die Implementierung eines Glossars mit Begriffen und Definitionen.
Tatsächlich kann man aber noch viel mehr damit machen. Jede Liste von Schlüssel-Wert-Paaren kann als
Beschreibungsliste gestaltet werden. Es verbessert die DX, also
&lt;a href=&quot;https://medium.com/swlh/what-is-dx-developer-experience-401a0e44a9d9&quot;&gt;Entwickler-Erfahrung&lt;/a&gt;, indem es den Code besser
lesbar macht. Und es verbessert die Barrierefreiheit eurer Web-Inhalte.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_1wXcuY.webp&quot; srcset=&quot;/_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_145ewT.webp 640w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_ZU0eR2.webp 750w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_1ChllD.webp 828w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_1NmJIP.webp 1080w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_Z1heA8U.webp 1280w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_1wXcuY.webp 1600w&quot; alt=&quot;Zwei Personen besprechen den HTML-Code auf dem Laptop-Monitor vor ihnen.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1014&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Ketut Subiyanto / pexels.com&lt;/p&gt;
&lt;p&gt;Wir werfen einen Blick auf die Geschichte des Elements, wie es funktioniert und wie es sich auf die Barrierefreiheit
auswirkt.&lt;/p&gt;
&lt;h2 id=&quot;eine-kurze-geschichte-des-beschreibungsliste-elements&quot;&gt;Eine kurze Geschichte des Beschreibungsliste-Elements&lt;/h2&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dl&amp;gt;&lt;/code&gt;  Element gibt es seit &lt;a href=&quot;https://www.w3.org/MarkUp/HTMLPlus/htmlplus_34.html&quot;&gt;HTML+&lt;/a&gt;
im Jahr 1993. Das Dokument definierte das Element noch als „Definitionsliste“:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;A &lt;strong&gt;definition list&lt;/strong&gt; is a list of terms and corresponding definitions. Definition lists are
typically formatted with the term flush-left and the definition, formatted paragraph style, indented after the term.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Diese enge Definition ist auch heute noch in vielen Köpfen präsent. Aber sie gilt nicht mehr. Die Definition des Elements
wurde in &lt;a href=&quot;https://html.spec.whatwg.org/multipage/grouping-content.html#the-dl-element&quot;&gt;HTML5&lt;/a&gt; geändert, wodurch es vielseitiger wurde:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;The &lt;strong&gt;dl element&lt;/strong&gt; represents an association list consisting of zero or more name-value groups
(a &lt;strong&gt;description list&lt;/strong&gt;). […] Name-value groups may be terms and definitions, metadata topics and
values, questions and answers, or any other groups of name-value data.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das bedeutet, dass das Element zur Kennzeichnung einer beliebigen Liste von Schlüssel-Wert-Paaren verwendet werden kann.
Zum Beispiel eine Liste von Metadaten über einen Kunden: Name, Adresse, Telefonnummer usw.&lt;/p&gt;
&lt;h2 id=&quot;wie-ihr-das-dl-element-verwendet&quot;&gt;Wie ihr das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dl&amp;gt;&lt;/code&gt;  Element verwendet&lt;/h2&gt;
&lt;p&gt;Die &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl&quot;&gt;Beschreibungsliste&lt;/a&gt;
umfasst eine Liste an Begriffen und Beschreibungen, die mit den HTML-Elementen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dt&amp;gt;&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dd&amp;gt;&lt;/code&gt;  definiert werden. Hier ein Beispiel einer Liste an Metadaten:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dl&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Account Owner&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Martina Musterfrau&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Banking Institute&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Musterbank&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;IBAN&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;AT12 3456 7891 2345 6789&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Telephone&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;+43 1234 56 78&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dl&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Die semantischen HTML-Tags vermitteln wichtige Informationen an assistive Technologien. Screenreader können in der
Liste navigieren und die Beziehung zwischen Begriff und Beschreibung vermitteln. Aber auch Web-Entwickler:innen
profitieren von dem semantischen Markup. Stellt euch vor, das Beispiel oben würde als Abfolge
von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;div&amp;gt;&lt;/code&gt;  Elementen implementiert:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;metadata&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;term&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Account Owner&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Martina Musterfrau&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;term&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Banking Institute&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Musterbank&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;term&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;IBAN&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;AT12 3456 7891 2345 6789&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;term&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Telephone&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;+43 1234 56 78&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich hoffe, ihr stimmt mir zu: Semantisches HTML ist eindeutig leichter zu verstehen und ihr könnt damit besser arbeiten.
Ihr könnt die semantischen Tag-Namen auch für aussagekräftige und leicht verständliche CSS-Selektoren nutzen. Lest
meinen Artikel &lt;a href=&quot;/de/blog/3-ways-web-devs-benefit-accessibility/&quot;&gt;„3 Gründe, warum auch Web-Entwickler:innen von Barrierefreiheit profitieren“&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;styling-der-description-list&quot;&gt;Styling der Description List&lt;/h2&gt;
&lt;p&gt;Das Standard-Design von Beschreibungslisten ist eher fad. Aber keine Sorge! Ihr könnt das Element frei mit CSS gestalten.
Die HTML-Spezifikation erlaubt es, jedes Schlüssel-Wert-Paar in ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;div&amp;gt;&lt;/code&gt;  Element zu verpacken.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dl&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Account Owner&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Martina Musterfrau&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Banking Institute&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Musterbank&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;IBAN&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;AT12 3456 7891 2345 6789&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dl&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Diese Struktur des Inhalts erlaubt uns, ein responsives, horizontales Layout mit
&lt;a href=&quot;https://css-tricks.com/snippets/css/a-guide-to-flexbox/&quot;&gt;CSS-Flexbox&lt;/a&gt; zu gestalten:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;flex&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    flex-wrap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;wrap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    gap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; div&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    flex-grow&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;#6e2755&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    font-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.9rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    font-weight&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;bold&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    font-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    margin-inline-start&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So sieht die Liste am Ende aus:&lt;/p&gt;
&lt;iframe title=&quot;Flexbox styled Description List&quot; src=&quot;https://codepen.io/alexlehner86/embed/eYLwwaa?default-tab=result&quot; loading=&quot;lazy&quot;&gt;&lt;p&gt;See the Pen &lt;a href=&quot;https://codepen.io/alexlehner86/pen/eYLwwaa&quot;&gt;
Flexbox styled Description List&lt;/a&gt; by Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;screenreader-unterstützung&quot;&gt;Screenreader-Unterstützung&lt;/h2&gt;
&lt;p&gt;Das Beschreibungsliste-Element macht eure Inhalte besser zugänglich, insbesondere für Screenreader-Nutzer:innen.
Es gibt kleine Unterschiede zwischen Browsern und Screenreadern, aber insgesamt ist die Unterstützung ziemlich gut.
Adrian Roselli hat für seinen Artikel
&lt;a href=&quot;https://adrianroselli.com/2025/01/updated-brief-note-on-description-list-support.html&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Updated Brief Note on Description List Support“&lt;/span&gt;&lt;/a&gt;
ausführliche Screenreader-Tests durchgeführt.&lt;/p&gt;
&lt;p&gt;Ich will seiner Analyse nur einen Gedanken hinzufügen: Screenreader sind auch nur Software. Programme können Bugs
haben oder Features nicht vollständig implementieren (wie etwa den korrekten Umgang mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dl&amp;gt;&lt;/code&gt;  Element).
Aber das sollte uns nicht davon abhalten, dieses Feature in der Web-Entwicklung einzusetzen. Vor allem dann, wenn absehbar
ist, dass die Screenreader-Hersteller die Fehler in naher Zukunft beheben werden.&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 18.04.2025 &lt;/h2&gt; 
&lt;p&gt;Link zum aktualisierten Blogartikel von Adrian Roselli eingefügt.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>dx</category><category>html</category><category>layout</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_confused_couple.jpg" length="0" type="image/jpeg"/></item><item><title>Checkliste für barrierefreie UI-Komponenten-Bibliotheken</title><link>https://www.oidaisdes.org/de/blog/accessible-ui-component-libraries</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessible-ui-component-libraries</guid><description>Schaffe ein einheitliches, barrierefreies Design und beschleunige den Entwicklungsprozess.</description><pubDate>Wed, 22 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Barrierefreiheit ist eine Entscheidung. Designer:innen können Farben mit ausreichendem Kontrast verwenden oder
Farben aus rein ästhetischen Gründen wählen. Web-Entwickler:innen können eine Schaltfläche mit dem
nativen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Tag implementieren oder stattdessen das
generische &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Tag verwenden.&lt;/p&gt;
&lt;p&gt;Idealerweise wird Barrierefreiheit von Anfang an berücksichtigt. In den Anforderungen sind die Bedürfnisse von Menschen
mit Behinderungen klar formuliert. Designer:innen erstellen Mockups, die diese Anforderungen erfüllen. Die Entwickler:innen
implementieren die Funktionen mit semantischem Markup. Tester:innen überprüfen, ob die Webinhalte die Anforderungen
erfüllen.&lt;/p&gt;
&lt;p&gt;In der Realität wird Barrierefreiheit oft zu spät berücksichtigt. Dies kann besonders problematisch sein, wenn es um
&lt;a href=&quot;https://medium.com/sketch-app-sources/why-should-you-build-a-ui-component-library-854656b91a96&quot;&gt;UI-Komponenten-Bibliotheken&lt;/a&gt;
geht. Ich zeige euch, wie ihr die Barrierefreiheit der Bibliothek prüft, bevor ihr die erste Codezeile schreibt. Und was
ihr bei der Arbeit mit UI-Komponenten beachten solltet.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-alena-darmel-lego-bricks.UC7mr8Jx_1evWOM.webp&quot; srcset=&quot;/_astro/pexels-alena-darmel-lego-bricks.UC7mr8Jx_UWsjP.webp 640w, /_astro/pexels-alena-darmel-lego-bricks.UC7mr8Jx_ZrxtDQ.webp 750w, /_astro/pexels-alena-darmel-lego-bricks.UC7mr8Jx_1vkU9o.webp 828w, /_astro/pexels-alena-darmel-lego-bricks.UC7mr8Jx_1Q5M5w.webp 1080w, /_astro/pexels-alena-darmel-lego-bricks.UC7mr8Jx_1WSJGf.webp 1280w, /_astro/pexels-alena-darmel-lego-bricks.UC7mr8Jx_1evWOM.webp 1600w&quot; alt=&quot;Ein Spielzeug wird aus dutzenden Lego-Bausteinen zusammengesetzt.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Alena Darmel / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;die-vorteile-von-ui-bibliotheken&quot;&gt;Die Vorteile von UI-Bibliotheken&lt;/h2&gt;
&lt;p&gt;HTML-Elemente sind die Grundbausteine einer jeden Website. Sie decken aber nicht alle Arten von Inhalten und möglichen
Anwendungsfällen ab. Komplexe UI-Muster wie &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/accordion/&quot;&gt;Akkordeons&lt;/a&gt;,
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/carousel/&quot;&gt;Karussells&lt;/a&gt; oder &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/tabs/&quot;&gt;Tabs&lt;/a&gt;
erfordern ohnehin individuelle Implementierungen.&lt;/p&gt;
&lt;p&gt;Um die Entwicklung zu beschleunigen und ein einheitliches Erscheinungsbild zu gewährleisten, verwendet eine moderne
Webanwendung meist eine UI-Komponenten-Bibliothek. Diese besteht aus einer Reihe von Design-Elementen, die ihr in eurer
Anwendung verwenden könnt. Meistens könnt ihr auch ein Farbthema anwenden und die Funktionalität der Komponenten anpassen.&lt;/p&gt;
&lt;p&gt;Es gibt hunderte verschiedene Bibliotheken für die großen Web-Frameworks wie &lt;a href=&quot;https://angular.io/&quot;&gt;Angular&lt;/a&gt;,
&lt;a href=&quot;https://react.dev/&quot;&gt;React&lt;/a&gt; oder &lt;a href=&quot;https://vuejs.org/&quot;&gt;Vue.js&lt;/a&gt;. Zum Beispiel, wenn euch das Material-Designsystem gefällt,
könnt ihr &lt;a href=&quot;https://material.angular.io/&quot;&gt;Angular Material&lt;/a&gt;, &lt;a href=&quot;https://mui.com/&quot;&gt;Material UI&lt;/a&gt; oder
&lt;a href=&quot;https://matsp.github.io/material-components-vue/&quot;&gt;Material Components Vue&lt;/a&gt; verwenden.&lt;/p&gt;
&lt;h2 id=&quot;die-barrierefreiheit-der-bibliothek-prüfen&quot;&gt;Die Barrierefreiheit der Bibliothek prüfen&lt;/h2&gt;
&lt;p&gt;Hier ist eine Checkliste für die Auswahl einer barrierefreien UI-Komponenten-Bibliothek:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wird Barrierefreiheit auf der Website oder in der Dokumentation der Bibliothek erwähnt? Auf der Homepage von Angular
Material heißt es zum Beispiel: &lt;span class=&quot;c-italic&quot;&gt;„Internationalisierte und barrierefreie Komponenten für alle.“&lt;/span&gt; &lt;/li&gt;
&lt;li&gt;Wird in der Dokumentation erklärt, ob und wie die Komponenten barrierefrei implementiert wurden? Die Dokumentation von Angular
Material enthält &lt;a href=&quot;https://material.angular.io/components/tabs/overview#accessibility&quot;&gt;eigene Abschnitte zur Barrierefreiheit&lt;/a&gt;
für jede Komponente.&lt;/li&gt;
&lt;li&gt;Die Dokumentation enthält in der Regel Demoseiten und Beispiele für die verschiedenen Komponenten. Überprüft das Markup und
die &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html&quot;&gt;Barrierefreiheits-Eigenschaften&lt;/a&gt; mithilfe der Entwicklertools
des Browsers. Testet mit assistiven Technologien wie der Tastatur und verschiedenen Desktop- und mobilen Screenreadern.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;keine-garantie-für-komplette-barrierefreiheit&quot;&gt;Keine Garantie für komplette Barrierefreiheit!&lt;/h2&gt;
&lt;p&gt;Die Auswahl einer barrierefreien UI-Komponenten-Bibliothek ist ein wichtiger erster Schritt, um eure Web-Applikation
barrierefrei zu gestalten. Aber sie ist keine Garantie dafür. Jedes Mal, wenn ihr eine Komponente auf einer Seite verwendet,
solltet ihr die folgenden Fragen beantworten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wo und wie wird die Komponente verwendet? Denkt über den Kontext und die Reihenfolge der Inhalte nach.&lt;/li&gt;
&lt;li&gt;Steht die Art der Verwendung im Einklang mit dem eigentlichen Zweck der Komponente? Oder wollt ihr nur ein bestimmtes
Erscheinungsbild erreichen?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die visuelle Darstellung des Inhalts sollte nicht bestimmen, welche Komponente ihr verwendet. Es ist einfach, ein bestimmtes
Design mit CSS anzuwenden. Aber es ist fast unmöglich oder zumindest sehr mühsam, das semantische Markup einer Komponente und
die implementierte Tastaturinteraktion zu überschreiben.&lt;/p&gt;
&lt;p&gt;Hier ein Beispiel: Die Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;mat-chip-listbox&amp;gt;&lt;/code&gt;  von Angular Material bietet eine
Mehrfach-Auswahlliste, die das &lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/listbox/&quot;&gt;Listbox-Pattern&lt;/a&gt; anwendet. Das semantische
Markup vermittelt den assistiven Technologien, dass das Element mehrere Optionen bietet, von denen eine oder mehrere ausgewählt
werden können. Die gesamte Auswahlliste erhält den Tastaturfokus über die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;TAB&lt;/code&gt;  Taste. Mit den Pfeiltasten
wird der Fokus auf die nächste oder vorherige Option gesetzt.&lt;/p&gt;
&lt;p&gt;Stellt euch nun vor, euer Kunde sagt: &lt;span class=&quot;c-italic&quot;&gt;„Mir gefällt das Design der Chips-Komponente. Ich möchte, dass diese Auflistung
von Links genauso gestaltet wird!“&lt;/span&gt;  Glaubst du, dass diese Komponente wirklich für diesen Anwendungsfall geeignet ist?&lt;/p&gt;
&lt;p&gt;Es liegt in unserer Verantwortung als Web-Entwickler:innen, die jeweils passende Komponente auszuwählen. Und dem vermeintlich
einfachen Weg zu widerstehen, der zum Desaster werden würde! 😉&lt;/p&gt;</content:encoded><category>accessibility</category><category>angular</category><category>design</category><category>frameworks</category><category>html</category><category>react</category><category>ux</category><category>vuejs</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_lego_bricks.jpg" length="0" type="image/jpeg"/></item><item><title>Responsives Komponenten-Design mit CSS Container Queries</title><link>https://www.oidaisdes.org/de/blog/responsive-design-container-queries</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/responsive-design-container-queries</guid><description>Gestalte responsive, wiederverwendbare Komponenten, die sich an den verfügbaren Platz in ihrem Container anpassen.</description><pubDate>Fri, 17 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Alles ist im Fluss. Modernes Webdesign muss eine scheinbar unendliche Vielfalt an Bildschirmgrößen berücksichtigen.
Mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@media&lt;/code&gt;  Queries können wir Elemente auf der Grundlage von Merkmalen des Browser-Viewports
(Bildschirm-Breite etc.) gestalten.&lt;/p&gt;
&lt;p&gt;Was aber, wenn wir wiederverwendbare Komponenten erstellen möchten, die sich an ihren Container anpassen? Etwa eine
News-Karte, die sich über die gesamte Breite der Webseite erstrecken oder in eine schmale Spalte an der
Seite passen kann. Das geht jetzt!&lt;/p&gt;
&lt;p&gt;Mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CSS Container Queries&lt;/code&gt;  können wir responsive, wiederverwendbare Komponenten entwerfen, die sich
an den verfügbaren Platz anpassen. Seit dem &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Firefox/Releases/110&quot;&gt;Release von Firefox 110&lt;/a&gt;
wird das Feature nun von &lt;a href=&quot;https://caniuse.com/css-container-queries&quot;&gt;allen wichtigen Browsern unterstützt&lt;/a&gt;. Das ändert alles!
Schauen wir uns an, wie es funktioniert.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-pixabay-coffee-cans.W8tA7_oK_mscO5.webp&quot; srcset=&quot;/_astro/pexels-pixabay-coffee-cans.W8tA7_oK_214JJm.webp 640w, /_astro/pexels-pixabay-coffee-cans.W8tA7_oK_TqbL8.webp 750w, /_astro/pexels-pixabay-coffee-cans.W8tA7_oK_kK2xd.webp 828w, /_astro/pexels-pixabay-coffee-cans.W8tA7_oK_Z2cDTLl.webp 1080w, /_astro/pexels-pixabay-coffee-cans.W8tA7_oK_Z1Ip6Kq.webp 1280w, /_astro/pexels-pixabay-coffee-cans.W8tA7_oK_mscO5.webp 1600w&quot; alt=&quot;Übereinander gestapelte Kaffeedosen unterschiedlicher Größe.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Pixabay / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;die-größe-eines-containers-abfragen&quot;&gt;Die Größe eines Containers abfragen&lt;/h2&gt;
&lt;p&gt;Dank Container Queries können wir Styles auf Elemente anwenden, die auf der Größe ihres Containers und nicht auf dem
Viewport basieren. Das Feature ist im CSS-Modul &lt;a href=&quot;https://www.w3.org/TR/css-contain-3/#container-queries&quot;&gt;CSS Containment Module Level 3&lt;/a&gt;
definiert:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;While media queries provide a method to query aspects of the user agent or device environment that a document is being
displayed in (such as viewport dimensions or user preferences), &lt;strong&gt;container queries&lt;/strong&gt; allow testing aspects of
elements within the document (such as box dimensions or computed styles).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Wir können verschiedene Größenmerkmale von Containern wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;width&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;height&lt;/code&gt; 
oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;inline-size&lt;/code&gt;  abfragen. Die Spezifikation umfasst auch &lt;a href=&quot;https://www.w3.org/TR/css-contain-3/#style-container&quot;&gt;Container Style Queries&lt;/a&gt;,
die jedoch von den Browsern noch nicht unterstützt werden.&lt;/p&gt;
&lt;p&gt;Um eine Komponente auf Basis ihrer Container-Größe zu stylen, müssen wir das übergeordnete Element mit der
CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;container-type&lt;/code&gt;  ausweisen. Es wird empfohlen, den Container auch
mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;container-name&lt;/code&gt;  zu benennen. Hier ist ein Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.news-card&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    container-type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: inline-size;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    container-name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: news-card;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ihr könnt den Container-Typ und -Namen auch auf einmal mit der CSS-Kurzform &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;container&lt;/code&gt;  setzen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.news-card&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    container&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: news-card / inline-size;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jetzt können wir den Container mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@container&lt;/code&gt;  Deklaration abfragen und konditionale Styles
definieren. Zum Beispiel, wenn die Breite des Containers unter einem bestimmten Schwellenwert liegt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@container&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; news-card (max-width: 25rem) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    .card-image&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        flex-basis&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;demo-responsive-news-karte&quot;&gt;Demo: Responsive News-Karte&lt;/h2&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://codepen.io/alexlehner86/pen/abaOdLw&quot;&gt;Demo auf CodePen&lt;/a&gt; erstellt, die eine News-Karten-Komponente
zeigt. Wenn genügend Platz vorhanden ist, legt die Karte ihren Inhalt horizontal aus. Wenn die Breite des Containers unter
einen bestimmten Schwellenwert fällt, wird der Text unter das Bild verschoben.&lt;/p&gt;
&lt;iframe title=&quot;Code-Beispiel für CSS Container Queries&quot; src=&quot;https://codepen.io/alexlehner86/embed/abaOdLw?default-tab=result&quot; loading=&quot;lazy&quot; allowtransparency=&quot;true&quot;&gt;&lt;p&gt;Öffne das Code-Beispiel &lt;a href=&quot;https://codepen.io/alexlehner86/pen/abaOdLw&quot;&gt;
CSS Container Queries Demo&lt;/a&gt; von Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
auf &lt;a href=&quot;https://codepen.io&quot; lang=&quot;en&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;weitere-lektüre&quot;&gt;Weitere Lektüre&lt;/h2&gt;
&lt;p&gt;Es gibt noch viel mehr über Container Queries zu lernen. Seht euch die folgenden Anleitungen und Beispiele an:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ishadeed.com/article/container-queries-are-finally-here/&quot;&gt;“CSS container queries are finally here”, by Ahmad Shadeed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/early-days-of-container-style-queries/&quot;&gt;“Early Days of Container Style Queries”, by Geoff Graham&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.oddbird.net/2022/08/18/cq-syntax/&quot;&gt;“Use the Right Container Query Syntax”, by Miriam Suzanne&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.matuzo.at/blog/2022/100daysof-day56/&quot;&gt;“Day 56: container queries”, by Manuel Matuzović&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/cq-stable/&quot;&gt;“Container queries land in stable browsers”, by Una Kravets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Ich bin total begeistert von CSS Container Queries! Dabei habe ich bisher kaum an der Oberfläche aller möglichen
Anwendungsfälle gekratzt. Mein Ziel ist es, das Feature in mehr und mehr Projekten zu verwenden und mein Verständnis
dafür laufend zu verbessern.&lt;/p&gt;
&lt;p&gt;Eines ist aus meiner Sicht fix: Container Queries werden die Art und Weise wie wir CSS schreiben nachhaltig verändern.
Welche Ideen und Anwendungsfälle habt ihr bereits mit dem Feature umgesetzt?&lt;/p&gt;</content:encoded><category>css</category><category>components</category><category>design</category><category>layout</category><category>responsive</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_coffee_cans.jpg" length="0" type="image/jpeg"/></item><item><title>Bringe deine Layouts auf Linie mit CSS Subgrid</title><link>https://www.oidaisdes.org/de/blog/aligned-layouts-with-css-subgrid</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/aligned-layouts-with-css-subgrid</guid><description>Verschachtelte Grid-Container können ihre Zeilen und Spalten perfekt aufeinander ausrichten.</description><pubDate>Sun, 29 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout&quot;&gt;CSS Grid Layout&lt;/a&gt; ist ein zweidimensionales,
rasterbasiertes Layout-System für Websites. Es erleichtert die Anordnung von Inhalten in Zeilen und Spalten sowie die
Erstellung responsiver Layouts.&lt;/p&gt;
&lt;p&gt;Wer mit Grid-Layouts vertraut ist, kennt wahrscheinlich das folgende Problem: Ein Grid-Container kann in einem anderen
Grid platziert werden, um ein &lt;a href=&quot;https://gridbyexample.com/examples/example21/&quot;&gt;verschachteltes Grid-Layout&lt;/a&gt; zu erzeugen.
Leider passt sich der Inhalt des untergeordneten Grids nicht automatisch an das übergeordnete Grid an. Aber keine Sorge!
Wir können dieses Problem mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;subgrid&lt;/code&gt;  Feature lösen!&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-rodnae-productions-chess-board.DBARuRnP_Z2DAz8.webp&quot; srcset=&quot;/_astro/pexels-rodnae-productions-chess-board.DBARuRnP_ECszp.webp 640w, /_astro/pexels-rodnae-productions-chess-board.DBARuRnP_1WPcBH.webp 750w, /_astro/pexels-rodnae-productions-chess-board.DBARuRnP_Z1xQojE.webp 828w, /_astro/pexels-rodnae-productions-chess-board.DBARuRnP_ZEf0ue.webp 1080w, /_astro/pexels-rodnae-productions-chess-board.DBARuRnP_i2IxQ.webp 1280w, /_astro/pexels-rodnae-productions-chess-board.DBARuRnP_Z2DAz8.webp 1600w&quot; alt=&quot;Ein Schachbrett mit einem Raster aus Zeilen und Spalten.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © RODNAE Productions / pexels.com&lt;/p&gt;
&lt;p&gt;Die Subgrid-Funktion macht das Grid-Layout noch mächtiger und ermöglicht es, perfekt ausgerichtete Layouts zu erstellen.
Ich habe eine Demo für einen typischen Anwendungsfall vorbereitet. Schauen wir uns an, wie das Ganze funktioniert.&lt;/p&gt;
&lt;h2 id=&quot;die-grundlagen-des-grid-layouts&quot;&gt;Die Grundlagen des Grid-Layouts&lt;/h2&gt;
&lt;p&gt;Das Grid-Layout-System ist in der Spezifikation des &lt;a href=&quot;https://www.w3.org/TR/css-grid-2/&quot;&gt;CSS Grid Layout Moduls&lt;/a&gt; definiert:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;A &lt;strong&gt;two-dimensional grid-based layout system&lt;/strong&gt;, optimized for user interface design. In the grid layout model,
the children of a grid container can be positioned into arbitrary slots in a predefined flexible or fixed-size layout grid.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Ihr könnt ein HTML-Element mit der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: grid&lt;/code&gt;  in einen Grid-Container verwandeln.
Mit den Eigenschaften &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;grid-template-rows&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;grid-template-columns&lt;/code&gt;  könnt ihr
die Zeilen und Spalten definieren.&lt;/p&gt;
&lt;p&gt;Es gibt zahlreiche Möglichkeiten, ein Raster zu definieren und es mit Inhalten zu füllen. Alle möglichen Einstellungen und Szenarien
aufzulisten, würde den Rahmen dieses Artikels sprengen. Wenn ihr mehr erfahren möchtet, kann ich die Tutorials
&lt;a href=&quot;https://css-tricks.com/snippets/css/complete-guide-grid/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„A Complete Guide to CSS Grid“&lt;/span&gt;&lt;/a&gt; und
&lt;a href=&quot;https://learncssgrid.com/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Learn CSS Grid“&lt;/span&gt;&lt;/a&gt; empfehlen.&lt;/p&gt;
&lt;h2 id=&quot;was-ist-ein-subgrid-und-wozu-ist-es-gut&quot;&gt;Was ist ein Subgrid und wozu ist es gut?&lt;/h2&gt;
&lt;p&gt;Das Subgrid-Feature wurde im &lt;a href=&quot;https://www.w3.org/TR/css-grid-2/#subgrids&quot;&gt;CSS Grid Layout Modul Level 2&lt;/a&gt; hinzugefügt. Die
Spezifikation besagt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;A nested grid can defer the definition of its rows and/or columns to its parent grid container, making it a subgrid.
In this case, the grid items of the subgrid participate in sizing the parent grid, allowing the contents of both grids to align.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Um ein Subgrid zu definieren, setzt ihr einfach den Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;subgrid&lt;/code&gt;  für die
Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;grid-template-rows&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;grid-template-columns&lt;/code&gt; . Das war’s! Das
verschachtelte Grid verwendet nun die vom übergeordneten Grid definierten Spalten und/oder Zeilen und richtet seinen Inhalt
entsprechend aus.&lt;/p&gt;
&lt;h2 id=&quot;demo-punk-api-bier-liste&quot;&gt;Demo: Punk API Bier-Liste&lt;/h2&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://github.com/alexlehner86/punk-api-beer-list&quot;&gt;React-Demo&lt;/a&gt; erstellt, die eine Liste von Bieren in einem Raster
mit drei gleichgroßen Spalten anzeigt. Jede Zelle enthält Informationen über ein bestimmtes Bier. Seht euch die
&lt;a href=&quot;https://alexlehner86.github.io/punk-api-beer-list/&quot;&gt;Live-Version hier&lt;/a&gt; an (am besten auf einem Desktop-Bildschirm).&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/punk-api-beer-list/&quot; title=&quot;Demo-Seite: Bier-Liste mit Subgrid-Feature&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;der-übergeordnete-grid-container&quot;&gt;Der übergeordnete Grid-Container&lt;/h3&gt;
&lt;p&gt;Die Demo verwendet eine ungeordnete Liste als übergeordneten Grid-Container. Hier ist der
&lt;a href=&quot;https://reactjs.org/docs/introducing-jsx.html&quot;&gt;JSX-Code&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;styles&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;beerGrid&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;items&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; key&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;BeerItemDetails&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; item&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;    ))&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In meinem CSS-Code verwende ich die Funktionen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;repeat&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;minmax&lt;/code&gt; , um ein Raster
mit drei Spalten und einer variablen Anzahl von Zeilen zu erstellen. Jede Spalte ist gleich groß und hat eine Mindestbreite
von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;15rem&lt;/code&gt; .&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;ul.beerGrid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;grid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    gap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2.5rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    grid-template-columns&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;repeat&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;minmax&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;15rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1fr&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    grid-template-rows&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    list-style&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;die-bier-infokarten-zu-subgrids-machen&quot;&gt;Die Bier-Infokarten zu Subgrids machen&lt;/h3&gt;
&lt;p&gt;Jedes Listenelement wird mit der React-Komponente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;BeerItemDetails&lt;/code&gt;  gerendert. Diese Komponente besteht aus
einem Kopfbereich (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;hgroup&lt;/code&gt;  Element) und einem Detailbereich (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Element):&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;hgroup&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;styles&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;heading&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;tagline&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;hgroup&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;styles&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;flexRow&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    &amp;lt;!-- details --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In meinem CSS-Code definiere ich die Listenelemente als Grid-Container mit zwei Zeilen (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;grid-row: span 2&lt;/code&gt; ).
Die Deklaration &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;grid-template-rows: subgrid&lt;/code&gt;  weist den Browser an, die Kopfzeile und den Detailbereich jeder
Bier-Infokarte aufeinander auszurichten, wenn diese in derselben Zeile platziert werden.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;ul.beerGrid&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; li&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;grid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    grid-template-rows&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;subgrid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    grid-row&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: span &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    gap&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;einfache-entwicklung-mit-css-grid-inspector&quot;&gt;Einfache Entwicklung mit CSS Grid Inspector&lt;/h3&gt;
&lt;p&gt;Ich habe den &lt;a href=&quot;https://firefox-source-docs.mozilla.org/devtools-user/page_inspector/how_to/examine_grid_layouts/&quot;&gt;CSS Grid Inspector&lt;/a&gt;
(Firefox DevTools) intensiv genutzt. Dieses geniale Werkzeug hebt die Zeilen und Spalten eures Rasters hervor und macht es einfacher
zu verstehen, wie das übergeordnete Grid und seine Subgrids zusammenpassen.&lt;/p&gt;
&lt;p&gt;Die Chrome DevTools enthalten ein &lt;a href=&quot;https://developer.chrome.com/docs/devtools/css/grid/&quot;&gt;ähnliches Tool&lt;/a&gt;. Aber als leidenschaftlicher
Firefox-Nutzer musste ich natürlich das Firefox-Tool als erstes nennen. 😉&lt;/p&gt;
&lt;h2 id=&quot;browser-unterstützung-und-progressive-verbesserung&quot;&gt;Browser-Unterstützung und progressive Verbesserung&lt;/h2&gt;
&lt;p&gt;Zum Zeitpunkt der Veröffentlichung dieses Beitrags &lt;a href=&quot;https://caniuse.com/css-subgrid&quot;&gt;unterstützen nur Safari und Firefox&lt;/a&gt; das
Subgrid-Feature. Aber keine Sorge! Ihr müsst nicht warten, bis Chrome und Edge aufholen.&lt;/p&gt;
&lt;p&gt;Wendet das Prinzip der &lt;a href=&quot;https://de.wikipedia.org/wiki/Progressive_Verbesserung&quot;&gt;progressiven Verbesserung&lt;/a&gt; an, um ein Basis-Layout
bereitzustellen und gleichzeitig die Vorteile des Subgrid-Features in unterstützenden Browsern zu nutzen. Dazu verwenden
wir &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@supports&lt;/code&gt; , um die Browserunterstützung zu prüfen, bevor wir den Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;subgrid&lt;/code&gt; 
setzen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@supports&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;grid-template-rows&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;subgrid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    ul.beerGrid&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; li&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;grid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        grid-template-rows&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;subgrid&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/css-grid-2/&quot;&gt;CSS Grid Layout Modul Level 2 (Spezifikation)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/snippets/css/complete-guide-grid/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„A Complete Guide to CSS Grid“&lt;/span&gt; (CSS Tricks)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gridbyexample.com/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Grid by Example“&lt;/span&gt; (Rachel Andrew)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learncssgrid.com/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Learn CSS Grid“&lt;/span&gt; (Jonathan Suh)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ishadeed.com/article/learn-css-subgrid/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Learn CSS Subgrid“&lt;/span&gt; (Ahmad Shadeed)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>css</category><category>design</category><category>html</category><category>layout</category><category>react</category><category>ux</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_chess_board.jpg" length="0" type="image/jpeg"/></item><item><title>Gestalte ein barrierefreies News-Karussell als Angular Standalone Component</title><link>https://www.oidaisdes.org/de/blog/accessible-news-carousel</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessible-news-carousel</guid><description>Mit Angular, ARIA-Attributen und modernem CSS erstellen wir ein zugängliches, responsives Web-Karussell.</description><pubDate>Sun, 15 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ich liebe Karussells! Die bunten Freizeitpark-Attraktionen mit Tierfiguren und Wägelchen sind oft wunderschön gestaltet.
Kinder können Stunden über Stunden damit verbringen und sich im Kreis drehen. Die pure Freude!&lt;/p&gt;
&lt;p&gt;Kann ich dasselbe über Karussell-UI-Komponenten sagen? Nicht wirklich. Ich mag die meisten Web-Karussells nicht. Vor allem,
wenn sie automatisch den Inhalt wechseln. Außerdem sind die meisten von ihnen ein Accessibility-Albtraum. Also habe ich mir
gedacht: Das geht doch besser!&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-alexander-nadrilyanski-carousel.D_DxkHhP_6Xrmv.webp&quot; srcset=&quot;/_astro/pexels-alexander-nadrilyanski-carousel.D_DxkHhP_1pSCWl.webp 640w, /_astro/pexels-alexander-nadrilyanski-carousel.D_DxkHhP_Z2djl4k.webp 750w, /_astro/pexels-alexander-nadrilyanski-carousel.D_DxkHhP_Z1zbpFf.webp 828w, /_astro/pexels-alexander-nadrilyanski-carousel.D_DxkHhP_1XKNAx.webp 1080w, /_astro/pexels-alexander-nadrilyanski-carousel.D_DxkHhP_1s82oF.webp 1280w, /_astro/pexels-alexander-nadrilyanski-carousel.D_DxkHhP_6Xrmv.webp 1600w&quot; alt=&quot;Ein Karussell bei Nacht mit hellen Lichtern. Die Figuren eines Pferdes und eines Tigers sind zu sehen.&quot; loading=&quot;eager&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1064&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Alexander Nadrilyanski / pexels.com&lt;/p&gt;
&lt;p&gt;Ich habe ein &lt;a href=&quot;https://github.com/alexlehner86/accessible-news-carousel&quot;&gt;News-Karussell&lt;/a&gt; als
&lt;a href=&quot;https://angular.io/guide/standalone-components&quot;&gt;eigenständige Angular-Komponente&lt;/a&gt; erstellt. Die Komponente ist
barrierefrei, responsiv und bietet flüssige Animationen. Werfen wir einen Blick darauf, wie es aufgebaut ist und funktioniert.&lt;/p&gt;
&lt;h2 id=&quot;demo-barrierefreies-news-karussell&quot;&gt;Demo: Barrierefreies News-Karussell&lt;/h2&gt;
&lt;p&gt;Meine &lt;a href=&quot;https://alexlehner86.github.io/accessible-news-carousel/&quot;&gt;Demo-Anwendung&lt;/a&gt; zeigt eine Liste von Nachrichten an, jede
mit Überschrift, einem Textausschnitt und einem Hintergrundbild. Die Nutzer:innen können sich mit Wischgesten oder den
Navigations-Schaltflächen von Nachricht zu Nachricht bewegen.&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/accessible-news-carousel/&quot; title=&quot;Demo-Seite: Barrierefreies News-Karussell&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;anforderungen-an-design-und-barrierefreiheit&quot;&gt;Anforderungen an Design und Barrierefreiheit&lt;/h2&gt;
&lt;p&gt;Es gibt kein natives HTML-Element für Web-Karussells. Deshalb gibt es so viele verschiedene Implementierungen. Zumindest
hat das W3C in seinem „ARIA Authoring Practices Guide“ grundlegende Anforderungen definiert. Das
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/carousel/&quot;&gt;Karussell-Pattern&lt;/a&gt; lautet:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;A &lt;strong&gt;carousel&lt;/strong&gt; presents a set of items, referred to as slides, by sequentially displaying a subset
of one or more slides. Typically, one slide is displayed at a time, and users can activate a next or previous slide
control that hides the current slide and “rotates” the next or previous slide into view.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Diese abstrakte Definition gilt sowohl für einfache Bild-Rotatoren als auch für Diashows mit komplexem Inhalt. Im
Allgemeinen sollten Web-Karussells die folgenden Anforderungen erfüllen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Es sollte assistiven Technologien seine Struktur vermitteln.&lt;/li&gt;
&lt;li&gt;Es sollte den aktuell aktiven Inhalt anzeigen, sowohl visuell als auch für assistive Technologien.&lt;/li&gt;
&lt;li&gt;Die Nutzer:innen sollten nicht gezwungen sein, das
&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/pointer-gestures.html&quot;&gt;Karussell mit Wischgesten zu bedienen&lt;/a&gt;. Es sollte
simple Steuerelemente bieten, die man anklicken oder mit der Tastatur bedienen kann.&lt;/li&gt;
&lt;li&gt;Screenreader-Nutzer:innen sollten über dynamische Inhaltsänderungen (z.B. der Wechsel zur nächsten Slide) mittels
&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/status-messages.html&quot;&gt;Statusmeldung&lt;/a&gt; informiert werden.&lt;/li&gt;
&lt;li&gt;Wenn das Karussell den angezeigten Inhalt automatisch wechselt, sollte es auch eine Schaltfläche zum Anhalten und
erneuten Starten der Rotation haben.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ich hasse Bewegungen und Animationen, die automatisch starten. Deshalb wechselt der angezeigte Inhalt in meinem
News-Karussell nicht von selbst. Somit braucht es auch keine Pausentaste.&lt;/p&gt;
&lt;h2 id=&quot;struktur-und-semantische-auszeichnung&quot;&gt;Struktur und semantische Auszeichnung&lt;/h2&gt;
&lt;h3 id=&quot;der-karussell-container&quot;&gt;Der Karussell-Container&lt;/h3&gt;
&lt;p&gt;Die &lt;a href=&quot;https://www.w3.org/TR/wai-aria-1.2/&quot;&gt;ARIA-Spezifikation&lt;/a&gt; enthält keine &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;carousel&lt;/code&gt;  Rolle.
Daher müsst ihr &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“region”&lt;/code&gt;  definieren und die benutzerdefinierte
Beschreibung &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-roledescription=“Karussell”&lt;/code&gt;  bereitstellen. Ein verständliches Label wird
durch das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-label&lt;/code&gt;  bereitgestellt.&lt;/p&gt;
&lt;p&gt;In meiner &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;NewsCarouselComponent&lt;/code&gt;  nutze ich &lt;a href=&quot;https://angular.io/api/core/HostBinding&quot;&gt;HostBinding&lt;/a&gt;,
um diese Werte für den Container der Karussell-Komponente zu setzen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;* The aria label for the carousel container.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;* It should convey to screenreader users what the carousel is about.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;*/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;HostBinding&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;attr.aria-label&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) @&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Input&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; carouselLabel&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;string&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;HostBinding&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;attr.role&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;region&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;HostBinding&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;attr.aria-roledescription&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;get&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; carouselDescription&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;() { &lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;config&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;carouselDescription&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Karussell enthält zwei Icon-Schaltflächen, um zur vorherigen oder nächsten Slide zu navigieren.
Programmatisch ermittelbare Labels werden mit dem Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-label&lt;/code&gt;  für
die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Tags definiert.&lt;/p&gt;
&lt;h3 id=&quot;der-slide-container&quot;&gt;Der Slide-Container&lt;/h3&gt;
&lt;p&gt;Für jeden Slide-Container ist &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“group”&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-roledescription=“Slide”&lt;/code&gt; 
gesetzt. Das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-label&lt;/code&gt;  des Containers gibt die Nummer der Slide und die
Gesamtanzahl an (z.B. „2 von 5“).&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    *ngFor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;let item of newsItems; let i = index&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;news-item&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;group&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    [attr.aria-roledescription]&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;config.slideDescription&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    [attr.aria-label]&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;(i + 1) + &amp;#39; &amp;#39; + config.slideLabel + &amp;#39; &amp;#39; + newsItems.length&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    &amp;lt;!-- slide content --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der Nachteil von benutzerdefinierten Rollenbeschreibungen ist, dass sie nicht automatisch von Screenreadern übersetzt
werden. Wenn ihr eine mehrsprachige Website erstellt, müsst ihr dies berücksichtigen.
Meine &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;NewsCarouselComponent&lt;/code&gt;  hat einen Input-Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;config&lt;/code&gt;  mit
Standardwerten in Englisch, die überschrieben werden können.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Input&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; config: &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;NewsCarouselConfig&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    carouselDescription:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;carousel&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    slideDescription:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;slide&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    slideLabel:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;of&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    nextButtonLabel:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;Next slide&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    previousButtonLabel:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;Previous slide&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;vermeide-listen-elemente&quot;&gt;Vermeide Listen-Elemente&lt;/h3&gt;
&lt;p&gt;Häufig werden Slides als Liste ausgezeichnet. Screenreader lesen die Anzahl der Elemente in einer Liste vor,
ignorieren aber ausgeblendete Listenelemente. In meiner Komponente ist nur die sichtbare Slide auch für assistive
Technologien zugänglich. Die anderen Slides werden visuell und programmatisch mit der
CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;visibility: hidden&lt;/code&gt;  verborgen.&lt;/p&gt;
&lt;p&gt;Wenn ich alle Slides als &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;li&amp;gt;&lt;/code&gt;  Elemente innerhalb einer ungeordneten Liste
(&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;ul&amp;gt;&lt;/code&gt; ) implementiert hätte, würde der Screenreader das Vorhandensein einer Liste mit
nur einem Element verkünden. Das entspricht nicht der tatsächlichen Anzahl an Slides und wäre für die
Nutzer:innen verwirrend.&lt;/p&gt;
&lt;h3 id=&quot;aria-live-region&quot;&gt;ARIA Live-Region&lt;/h3&gt;
&lt;p&gt;Das Karussell sollte dynamische Inhaltsänderungen über Statusmeldungen an Screenreader-Nutzer:innen kommunizieren.
Zunächst habe ich versucht, das Container-Element für alle Slides zur
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions&quot;&gt;ARIA Live-Region&lt;/a&gt;
zu machen. Das Ergebnis war nicht optimal.&lt;/p&gt;
&lt;p&gt;Aufgrund der Implementierung der Slide-Animation mit Hilfe der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;visibility&lt;/code&gt; 
las der Screenreader die Überschrift der neuen Slide mehrmals vor oder las die ausgeblendete Slide erneut vor.&lt;/p&gt;
&lt;p&gt;Ich habe verschiedene Ansätze mit Eigenschaften wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-busy&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-relevant&lt;/code&gt; 
ausprobiert. Sie funktionierten immer nur bei einigen Browser- und Screenreader-Kombinationen. Daher entschied ich
mich schließlich für den einfachen Ansatz, eine &lt;a href=&quot;https://webaim.org/techniques/css/invisiblecontent/&quot;&gt;visuell verborgene&lt;/a&gt;
ARIA Live-Region an das Ende des Karussell-Containers zu setzen. Das ist zwar ein bisschen redundant, aber es funktioniert!&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    class&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;active-slide-live-region&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    aria-live&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;polite&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{config.slideDescription + &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; + (activeSlideIndex + 1) + &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; + config.slideLabel + &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; + newsItems.length + &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    {&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;{newsItems&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;[activeSlideIndex].heading}}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;tastaturbedienung-und-swipe-gesten&quot;&gt;Tastaturbedienung und Swipe-Gesten&lt;/h2&gt;
&lt;p&gt;Ich liebe wischen! Wenn ich online auf ein Karussell stoße, versuche ich instinktiv, über den Bildschirm zu wischen.
Swipe-Gesten an sich sind nicht böse. Aber ein Web-Karussell, das nur durch Wischgesten bedienbar ist, schon!&lt;/p&gt;
&lt;p&gt;Für viele Menschen mit motorischer Beeinträchtigung sind Wischgesten nicht barrierefrei. Sie bevorzugen
&lt;a href=&quot;https://www.accessguide.io/guide/single-pointer-gestures&quot;&gt;einfach klickbare Alternativen&lt;/a&gt; wie eine Schaltfläche. Außerdem
benötigen Tastatur-Nutzer:innen Steuerelemente, die sie mit der Tabulatortaste ansteuern und mit der Leer- oder Eingabetaste
aktivieren können.&lt;/p&gt;
&lt;p&gt;Deshalb versuche ich, alle glücklich zu machen! Meine Angular-Komponente implementiert Wischgesten mit
der &lt;a href=&quot;https://hammerjs.github.io/&quot;&gt;Hammer.js-Bibliothek&lt;/a&gt; und enthält auch Schaltflächen, um zur vorherigen oder nächsten
Slide zu navigieren.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;news-carousel-controls&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        [attr.aria-label]&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;config.previousButtonLabel&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        (click)&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;this.showPreviousSlide()&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        &amp;lt;!-- arrow icon --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        [attr.aria-label]&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;config.nextButtonLabel&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        (click)&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;this.showNextSlide()&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        &amp;lt;!-- arrow icon --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;slide-übergänge-mit-css-animationen&quot;&gt;Slide-Übergänge mit CSS-Animationen&lt;/h2&gt;
&lt;p&gt;Ich wollte schöne Übergänge zwischen den Slides mit sanften Ein- und Ausblend-Animationen erstellen. Angular bietet ein
eigenes &lt;a href=&quot;https://angular.io/guide/animations&quot;&gt;Animationsmodul&lt;/a&gt;. Mir war jedoch wichtig, die Build-Größe klein zu halten
und gleichzeitig effizient zu sein. Deshalb habe ich mich für
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Animations/Using_CSS_animations&quot;&gt;CSS-Animationen&lt;/a&gt; entschieden.&lt;/p&gt;
&lt;p&gt;Das Erstellen von Animationen mit CSS ist super einfach und elegant. Zuerst definiert ihr Keyframes für eure benannten
Animationen. Jeder Keyframe beschreibt, wie das animierte Element zu einem bestimmten Zeitpunkt während der
Animationssequenz dargestellt werden soll.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;// Keyframes for slide animation from left to right&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@keyframes&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; slide-in-from-left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    0% {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    100% {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@keyframes&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; slide-out-to-right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    0% {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        visibility&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;visible&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    100% {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translateX&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        visibility&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;hidden&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann wendet ihr diese Animationen mithilfe der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;animation&lt;/code&gt;  auf bestimmte
Slides an. Auf diese Weise könnt ihr eine Vielzahl von Animations-Eigenschaften (z.B. Name, Dauer, Richtung)
in einer einzigen CSS-Regel definieren.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;app-news-carousel&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; .news-carousel-items.animate-from-left&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; .news-item&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    &amp;amp;.active {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        animation&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: slide-in-from-left &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5s&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; forwards&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    &amp;amp;&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.moved-out&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        animation&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: slide-out-to-right &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5s&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; forwards&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        border-left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.125rem&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; white&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In dem obigen Beispiel werden zwei HTML-Elemente animiert: Das Element mit der Klasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;active&lt;/code&gt; 
gleitet von links ins Bild, während das andere Element mit der Klasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;moved-out&lt;/code&gt;  nach rechts
aus dem Bild gleitet.&lt;/p&gt;
&lt;h2 id=&quot;responsives-design-und-benutzerdefiniertes-styling&quot;&gt;Responsives Design und benutzerdefiniertes Styling&lt;/h2&gt;
&lt;h3 id=&quot;flexibles-layout-mit-max-width-und-container-queries&quot;&gt;Flexibles Layout mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;max-width&lt;/code&gt;  und Container Queries&lt;/h3&gt;
&lt;p&gt;Wenn ihr die Karussell-Komponente verwendet, könnt ihr die CSS-Variable &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—news-carousel-max-width&lt;/code&gt; 
setzen, um eine Basisbreite für den Karussell-Container zu definieren. Wenn keine Variable gesetzt ist, wird der
Fallback-Wert der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;var()&lt;/code&gt;  Funktion verwendet.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;app-news-carousel&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--news-carousel-height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;25rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--news-carousel-max-width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;50rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    max-width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mithilfe von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;max-width: 100%&lt;/code&gt;  stellen wir sicher, dass die Breite des Containers durch den
verfügbaren Raum seines übergeordneten Elements begrenzt wird. Auf diese Weise beansprucht das Karussell nie mehr Platz
als die Viewport-Breite des Geräts.&lt;/p&gt;
&lt;p&gt;Außerdem verwende ich &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries&quot;&gt;CSS Container Queries&lt;/a&gt;,
um das Styling des Karussells anzupassen, wenn die Breite des Containers unter einem bestimmten Schwellenwert liegt.
Dieses neue, mächtige Feature wird bald &lt;a href=&quot;https://caniuse.com/css-container-queries&quot;&gt;von allen modernen Browsern unterstützt&lt;/a&gt;
werden. Ich werde in einem separaten Blog-Beitrag näher darauf eingehen.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@container&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; news-carousel (max-width: 28rem) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    app-news-carousel&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; .news-item&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; .slide-text&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        bottom&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        border-radius&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;calc&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 1rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        p {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            display&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;eigenes-styling-mit-css-variablen&quot;&gt;Eigenes Styling mit CSS-Variablen&lt;/h3&gt;
&lt;p&gt;CSS-Variablen sind ideal für Komponenten-Bibliotheken. Sie können ein Standard-Styling definieren und den Nutzer:innen
erlauben, bestimmte Werte mit den entsprechenden Variable zu überschreiben. Eine Applikation kann die folgenden Styles
meiner &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;NewsCarouselComponent&lt;/code&gt;  über CSS-Variablen anpassen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—news-carousel-height&lt;/code&gt; : Die Höhe des Karussells.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—news-carousel-max-width&lt;/code&gt; : Legt die maximale Breite des Karussells fest. Die tatsächliche Breite des Karussells ist abhängig von seinem Container.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—news-carousel-button-background&lt;/code&gt; : Der Hintergrund (Farbe) der Navigations-Schaltflächen.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—news-carousel-button-color&lt;/code&gt; :  Die Farbe des Pfeilsymbols in den Navigations-Schaltflächen.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—carousel-text-background&lt;/code&gt; : Der Hintergrund (Farbe) des Textcontainers der Slides.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—carousel-text-color&lt;/code&gt; : Die Schriftfarbe des Textcontainers der Slides.&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;—news-carousel-slide-focus-color&lt;/code&gt; : Die Farbe des Fokusindikators der Slides.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;was-es-noch-zu-sagen-gibt&quot;&gt;Was es noch zu sagen gibt&lt;/h2&gt;
&lt;p&gt;Ich möchte eines klarstellen: Meine Karussell-Komponente stellt nur eine von mehreren Möglichkeiten dar, ein
barrierefreies, responsives Karussell zu implementieren. Natürlich bin ich davon überzeugt, dass meine Implementierung
einfach großartig ist. Aber natürlich gibt es auch andere valide Ansätze.&lt;/p&gt;
&lt;p&gt;Web-Standards, Browser und assistive Technologien entwickeln sich ständig weiter. In ein paar Jahren oder vielleicht
sogar in ein paar Monaten könnte es also eine bessere Lösung geben. Ich kann es kaum erwarten, sie zu sehen! 😊&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/&quot;&gt;ARIA Authoring Practices Guide (APG)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/wai-aria-1.2/&quot;&gt;ARIA 1.2 specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://angular.io/guide/standalone-components&quot;&gt;Angular standalone components&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Animations/Using_CSS_animations&quot;&gt;CSS Animations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries&quot;&gt;CSS Container Queries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>angular</category><category>animation</category><category>aria</category><category>carousel</category><category>css</category><category>html</category><category>keyboard</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_carousel.jpg" length="0" type="image/jpeg"/></item><item><title>Ein Rückblick auf 2022 — Mein erstes Jahr als Blogger</title><link>https://www.oidaisdes.org/de/blog/looking-back-at-2022</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/looking-back-at-2022</guid><description>Vor einem Jahr startete ich meinen Blog über Web-Entwicklung und Barrierefreiheit. Ein Rück- und Ausblick.</description><pubDate>Thu, 29 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Vor einem Jahr machte ich den Kurs &lt;span lang=&quot;en&quot;&gt;„Full Stack for Front-End Engineers”&lt;/span&gt; von
&lt;a href=&quot;https://frontendmasters.com&quot;&gt;Frontend Masters&lt;/a&gt;. Ich richtete meinen eigenen Webserver ein, kaufte eine Domain und startete
mithilfe von &lt;a href=&quot;https://www.gatsbyjs.com/&quot;&gt;Gatsby&lt;/a&gt; einen Blog über Webentwicklung. 12 Monate und 18 Blogartikel später möchte
ich das Jahr Revue passieren lassen und mir Ziele für 2023 setzen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-cottonbro-studio-raise-glasses.j9FrFmP3_XVntA.webp&quot; srcset=&quot;/_astro/pexels-cottonbro-studio-raise-glasses.j9FrFmP3_srM2U.webp 640w, /_astro/pexels-cottonbro-studio-raise-glasses.j9FrFmP3_1KEw5d.webp 750w, /_astro/pexels-cottonbro-studio-raise-glasses.j9FrFmP3_Z1K24Q9.webp 828w, /_astro/pexels-cottonbro-studio-raise-glasses.j9FrFmP3_mkXyu.webp 1080w, /_astro/pexels-cottonbro-studio-raise-glasses.j9FrFmP3_ZNbe8s.webp 1280w, /_astro/pexels-cottonbro-studio-raise-glasses.j9FrFmP3_XVntA.webp 1600w&quot; alt=&quot;Mehrere Leute feiern und stoßen mit Weingläsern an.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1069&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © cottonbro studio / pexels.com&lt;/p&gt;
&lt;p&gt;Das regelmäßige Schreiben macht mir großen Spaß. Tatsächlich bin ich 2006 nach Wien übersiedelt, um Journalismus zu
studieren. Ich habe auch für Medienunternehmen gearbeitet, aber es war nicht das Richtige für mich. Also bin ich zum Coden
zurückgekehrt. Jedenfalls fühlt es sich gut an, meine beiden Leidenschaften irgendwie vereinen zu können.&lt;/p&gt;
&lt;h2 id=&quot;was-ich-dieses-jahr-gelernt-habe&quot;&gt;Was ich dieses Jahr gelernt habe&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Erstens, wie ich meinen eigenen Webserver einrichte, eine Domain verwalte, ein SSL-Zertifikat erstelle und so weiter. Es war ein
gutes Gefühl, meine Komfortzone zu verlassen und etwas Neues auszuprobieren!&lt;/li&gt;
&lt;li&gt;Wie ich meinen Build/Deployment-Workflow mit &lt;a href=&quot;https://github.com/features/actions&quot;&gt;GitHub Actions&lt;/a&gt; automatisieren kann.&lt;/li&gt;
&lt;li&gt;Dass ich gerne mit neuen Features wie etwa dem nativen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  HTML-Element oder
der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-visible&lt;/code&gt;  CSS-Pseudo-Klasse experimentiere. Ich liebe die Herausforderung, das Konzept und die
Funktionalität möglichst einfach zu erklären und mit einer Demo zu veranschaulichen.&lt;/li&gt;
&lt;li&gt;Ich habe mich mit &lt;a href=&quot;https://en.wikipedia.org/wiki/RSS&quot;&gt;RSS&lt;/a&gt; vertraut gemacht und gelernt, einen eigenen RSS-Feed bereitzustellen.
Ihr könnt meinen &lt;a href=&quot;https://www.oidaisdes.org/rss.xml&quot;&gt;Blog hier abonnieren&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;meine-lieblings-blogartikel&quot;&gt;Meine Lieblings-Blogartikel&lt;/h2&gt;
&lt;p&gt;Es ist schwer, aus den 18 Blogartikeln, die ich in diesem Jahr geschrieben habe, meine Favoriten auszuwählen. Deshalb habe ich einfach
drei Beiträge ausgewählt, die ich für besonders relevant und spannend halte:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;/de/blog/common-aria-mistakes/&quot;&gt;„Häufige Probleme mit ARIA und wie ihr diese vermeidet”&lt;/a&gt;: Ich finde es toll,
dass mehr und mehr Unternehmen die Bedeutung von Barrierefreiheit erkennen. Leider übertreiben es einige mit ARIA-Attributen und
verschlimmern oft die Barrierefreiheit ihrer Website. Ich hoffe, mein Blogbeitrag hilft Entwickler:innen, ARIA besser zu verstehen und
schlechte Praktiken zu vermeiden.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/de/blog/cascade-layers-in-angular/&quot;&gt;„CSS Cascade Layers in Angular verwenden”&lt;/a&gt;: 2022 war ein fantastisches
Jahr für CSS. Zu den neuen, von modernen Browsern unterstützten Features zählen CSS Cascade Layers. Sie sind ein mächtiges Werkzeug zur
Ordnung von CSS-Styles und helfen, nervige Konflikte aufgrund der Spezifität oder Reihenfolge der Deklaration zu vermeiden.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/de/blog/lights-off-how-blind-users-navigate/&quot;&gt;„Licht aus! Wie blinde Menschen im Internet surfen”&lt;/a&gt;:
Vor ein paar Wochen habe ich für einen neuen Kunden einen Workshop zum Thema Barrierefreiheit gehalten. Ich öffnete meine
&lt;a href=&quot;https://alexlehner86.github.io/come-to-the-dark-side/home&quot;&gt;Demo-Seite&lt;/a&gt;, färbte alles schwarz und benutzte einen Screenreader, um auf
der Website zu navigieren. Die Teilnehmer waren wirklich erstaunt. Einer von ihnen sagte: &lt;span class=&quot;c-italic&quot;&gt;„Ich wusste gar nicht, dass blinde
Menschen das Internet überhaupt nutzen können!”&lt;/span&gt;  Das hat mir wieder einmal gezeigt: Die Menschen müssen die Auswirkungen von
Behinderungen selbst erfahren, um Barrierefreiheit wirklich zu schätzen.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;ziele-und-erwartungen-für-2023&quot;&gt;Ziele und Erwartungen für 2023&lt;/h2&gt;
&lt;p&gt;Als Web-Entwickler bin ich schon sehr gespannt auf das neue Jahr. Es kommen eine Menge neuer Features auf uns zu, die uns das Leben
leichter machen sollten. Als ein Mensch auf diesem Planeten hoffe ich einfach nur, dass der schreckliche Krieg in der Ukraine endet.
Und dass die Menschheit endlich den Klimawandel ernsthaft bekämpft.&lt;/p&gt;
&lt;p&gt;Wie auch immer, hier ist meine Liste an Zielen für 2023 sowie Themen, über die ich im kommenden Jahr schreiben möchte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ich will Interaktionen in sozialen Netzwerken in &lt;a href=&quot;https://www.freecodecamp.org/news/how-to-use-webmentions-with-gatsby-beginners-guide/&quot;&gt;Webmentions&lt;/a&gt;
umwandeln und in meinem Blog anzeigen.&lt;/li&gt;
&lt;li&gt;Flexbox oder Grid? Ich möchte mein Wissen über CSS-Layouts vertiefen und mit neuen Features
wie &lt;a href=&quot;https://ishadeed.com/article/learn-css-subgrid/&quot;&gt;CSS Subgrid&lt;/a&gt; experimentieren.&lt;/li&gt;
&lt;li&gt;Ich möchte mich als Requirements Engineer und Software Architekt weiterentwickeln und über meine Erfahrungen schreiben.&lt;/li&gt;
&lt;li&gt;An Entwickler-Konferenzen teilnehmen und vielleicht mal &lt;a href=&quot;https://www.freecodecamp.org/news/complete-guide-to-giving-your-first-conference-talk/&quot;&gt;einen Vortrag halten&lt;/a&gt;.
Lokale Events veranstalten wäre auch cool.&lt;/li&gt;
&lt;li&gt;Zu guter Letzt: Weiter über Barrierefreiheit schreiben.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>css</category><category>goals</category><category>html</category><category>retrospection</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_raise_glasses.jpg" length="0" type="image/jpeg"/></item><item><title>Ein Gespräch mit ChatGPT über Web-Barrierefreiheit und populäre Mythen</title><link>https://www.oidaisdes.org/de/blog/chatgpt-accessibility-myths</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/chatgpt-accessibility-myths</guid><description>Die künstliche Intelligenz beeindruckt mit durchdachten und gut formulierten Antworten. Aber sie ist nicht perfekt.</description><pubDate>Sat, 10 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Künstliche Intelligenz ist auf dem Vormarsch. Ob selbstfahrende Autos, Bilderzeugung oder Chatbots – KI wird immer mehr Teil
unseres Alltags. Der Gesprächsagent &lt;a href=&quot;https://openai.com/blog/chatgpt/&quot;&gt;ChatGPT&lt;/a&gt; zeigt, wie hochentwickelt und menschenähnlich
KI sein kann.&lt;/p&gt;
&lt;p&gt;Viele Menschen haben bereits &lt;a href=&quot;https://mastodon.social/tags/ChatGPT&quot;&gt;Gespräche mit der KI geführt&lt;/a&gt;. Sie beeindruckt mit
durchdachten und gut formulierten Antworten. Aber wie reagiert der Chatbot auf eher zugespitzte Fragen und vorgefasste Meinungen?
Um diese Frage zu beantworten, habe ich mich mit ChatGPT über einige weit verbreitete Barrierefreiheits-Mythen unterhalten.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-tara-winstead-robot-and-human.SFJ4qqCv_nau5r.webp&quot; srcset=&quot;/_astro/pexels-tara-winstead-robot-and-human.SFJ4qqCv_2cwYKl.webp 640w, /_astro/pexels-tara-winstead-robot-and-human.SFJ4qqCv_Z1W4HnS.webp 750w, /_astro/pexels-tara-winstead-robot-and-human.SFJ4qqCv_28ERfC.webp 828w, /_astro/pexels-tara-winstead-robot-and-human.SFJ4qqCv_2o5n6e.webp 1080w, /_astro/pexels-tara-winstead-robot-and-human.SFJ4qqCv_PSgwV.webp 1280w, /_astro/pexels-tara-winstead-robot-and-human.SFJ4qqCv_nau5r.webp 1600w&quot; alt=&quot;Eine menschliche Hand mit ausgestrecktem Zeigefinger nähert sich einer Roboterhand an.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Tara Winstead / pexels.com&lt;/p&gt;
&lt;p&gt;Ich habe das Gespräch auf Englisch geführt und danach vom KI-Übersetzungsdienst &lt;a href=&quot;https://www.deepl.com/&quot;&gt;Deepl.com&lt;/a&gt; ins Deutsche
übertragen lassen (die KI gendert leider nicht). Die Unterhaltung ist in mehrere Abschnitte unterteilt, beginnend mit allgemeinen Fragen,
gefolgt von vier weit verbreiteten Mythen über Barrierefreiheit. Am Ende des Artikels werde ich meine Gedanken zu ChatGPT mit euch teilen.&lt;/p&gt;
&lt;h2 id=&quot;mein-gespräch-mit-chatgpt&quot;&gt;Mein Gespräch mit ChatGPT&lt;/h2&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Hallo ChatGPT! Alle reden über Barrierefreiheit im Internet. Können Sie das Konzept in einfachen Worten erklären? &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Klar! Unter Barrierefreiheit im Web versteht man die Praxis, Websites und Webanwendungen für Menschen mit Behinderungen nutzbar zu machen. Dazu gehören unter anderem Menschen mit visuellen, auditiven, motorischen und kognitiven Beeinträchtigungen. Ziel der Barrierefreiheit im Internet ist es, allen Nutzern den Zugang zu den Inhalten und Funktionen einer Website zu ermöglichen, unabhängig von ihren jeweiligen Behinderungen.&lt;/p&gt;
&lt;p&gt;Dies kann erreicht werden, indem eine Reihe von Richtlinien und Standards befolgt werden, wie z. B. die Web Content Accessibility Guidelines (WCAG), die vom World Wide Web Consortium (W3C) entwickelt wurden. Diese Leitlinien enthalten eine Reihe spezifischer Kriterien, die Websites und Webanwendungen erfüllen sollten, um als zugänglich zu gelten. Durch die Einhaltung dieser Leitlinien können Website-Entwickler und -Designer sicherstellen, dass ihre Websites von einer Vielzahl von Nutzern verwendet werden können.&lt;/p&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Ich befürchte, dass die Webentwicklung dadurch teurer und übermäßig kompliziert wird. Was ist Ihre Meinung? &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Die Einbeziehung der Barrierefreiheit in die Gestaltung und Entwicklung einer Website oder Webanwendung muss nicht teuer oder übermäßig kompliziert sein. In der Tat kann die Einhaltung der Richtlinien für Barrierefreiheit im Internet oft die allgemeine Benutzerfreundlichkeit für alle Benutzer verbessern, nicht nur für Menschen mit Behinderungen. So kann beispielsweise die Verwendung klarer und anschaulicher Überschriften und Beschriftungen auf Formularen die Navigation und Nutzung der Website für alle erleichtern, nicht nur für Menschen mit Sehbehinderungen. Darüber hinaus kann die Verwendung einer geeigneten Formatierung und Struktur die Interpretation und das Lesen des Seiteninhalts durch Bildschirmlesesoftware erleichtern, was wiederum blinden oder sehbehinderten Nutzern zugute kommt.&lt;/p&gt;
&lt;h2 id=&quot;mythos-1-barrierefreiheit-betrifft-nur-eine-kleine-gruppe-von-nutzerinnen&quot;&gt;Mythos #1: Barrierefreiheit betrifft nur eine kleine Gruppe von Nutzer:innen&lt;/h2&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Ok, das hört sich gut an. Was sind die wichtigsten Vorteile einer barrierefrei gestalteten Website? &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Eine barrierefrei gestaltete Website hat mehrere Vorteile. Für Nutzer mit Behinderungen ist der offensichtlichste Vorteil die Möglichkeit, auf die Inhalte und Funktionen der Website zuzugreifen und sie zu nutzen. Dies kann ihre allgemeine Erfahrung bei der Nutzung des Internets verbessern und es ihnen ermöglichen, an Online-Aktivitäten teilzunehmen, die ihnen vorher vielleicht nicht möglich waren.&lt;/p&gt;
&lt;p&gt;Eine barrierefreie Website ist nicht nur für Menschen mit Behinderungen von Vorteil, sondern kann auch für Unternehmen und Organisationen von Nutzen sein. Eine barrierefreie Website kann zum Beispiel die Suchmaschinenoptimierung (SEO) der Website verbessern, so dass sie für Suchmaschinen besser sichtbar wird und möglicherweise mehr Besucher auf die Website gelangen. Eine barrierefreie Website kann auch das potenzielle Publikum für die Website vergrößern, da sie von einer größeren Anzahl von Nutzern verwendet werden kann. Dies kann besonders für Unternehmen und Organisationen von Vorteil sein, die sich an eine vielfältige Bevölkerung wenden oder gesetzlich verpflichtet sind, barrierefreie Dienstleistungen anzubieten.&lt;/p&gt;
&lt;p&gt;Schließlich kann die Einbeziehung der Barrierefreiheit in die Gestaltung einer Website auch die allgemeine Benutzererfahrung für alle Benutzer verbessern, unabhängig von deren Behinderung. Dies kann zu einer höheren Kundenzufriedenheit und -treue sowie zu potenziellen Kosteneinsparungen führen, da der Bedarf an Kundensupport sinkt.&lt;/p&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Ich bin mir nicht sicher. Ist Barrierefreiheit nicht nur für eine kleine Gruppe von Menschen von Vorteil? &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Es stimmt zwar, dass die Barrierefreiheit im Internet in erster Linie Nutzern mit Behinderungen zugute kommt, aber die potenzielle Zielgruppe für barrierefreie Websites ist eigentlich recht groß. Nach Angaben der Weltgesundheitsorganisation leben etwa 15 % der Weltbevölkerung mit irgendeiner Form von Behinderung. Das bedeutet, dass die potenzielle Zielgruppe für barrierefreie Websites, gemessen an der reinen Anzahl, sehr groß ist.&lt;/p&gt;
&lt;p&gt;Darüber hinaus kann die Barrierefreiheit von Websites einer Vielzahl von Nutzern mit unterschiedlichen Behinderungen zugute kommen, z. B. mit Seh-, Hör-, Bewegungs- und kognitiven Beeinträchtigungen sowie Nutzern, die zwar keine dauerhafte, aber eine vorübergehende Beeinträchtigung (z. B. einen gebrochenen Arm) oder situationsbedingte Einschränkungen (z. B. die Nutzung einer Website auf einem mobilen Gerät von unterwegs) haben. Insgesamt ist die potenzielle Zielgruppe für barrierefreie Websites viel größer, als viele Menschen denken.&lt;/p&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Sie sagten, dass die potenzielle Zielgruppe für barrierefreie Websites sehr groß ist. Aber nutzen Menschen mit Behinderungen das Internet wirklich so häufig? &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Ja, Menschen mit Behinderungen nutzen das Internet in ähnlichem Maße wie Menschen ohne Behinderungen. Eine Studie des Pew Research Center ergab, dass in den Vereinigten Staaten etwa 88 % der Erwachsenen mit Behinderungen das Internet nutzen, verglichen mit 91 % der Erwachsenen ohne Behinderungen. Dies zeigt, dass Menschen mit Behinderungen das Internet genauso häufig nutzen wie Menschen ohne Behinderungen, und unterstreicht, wie wichtig es ist, dafür zu sorgen, dass Websites für alle Nutzer zugänglich sind.&lt;/p&gt;
&lt;p&gt;Darüber hinaus wird die Nutzung des Internets durch Menschen mit Behinderungen in den kommenden Jahren wahrscheinlich zunehmen, da Fortschritte bei unterstützenden Technologien und die Verbreitung mobiler Geräte den Internetzugang für Menschen mit Behinderungen erleichtern. Dies bedeutet, dass die potenzielle Zielgruppe für barrierefreie Websites weiter wachsen wird, so dass die Barrierefreiheit des Internets für Unternehmen und Organisationen immer wichtiger wird.&lt;/p&gt;
&lt;h2 id=&quot;mythos-2-barrierefreiheit-ist-einfach-und-sollte-der-letzte-schritt-sein&quot;&gt;Mythos #2: Barrierefreiheit ist einfach und sollte der letzte Schritt sein&lt;/h2&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Also gut, sagen wir, ich möchte barrierefreie Websites erstellen. Wie schwer kann das sein? Ich denke, Barrierefreiheit kann bis zum Ende des Entwicklungsprozesses warten, nachdem alle anderen Arbeiten erledigt sind. &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Es ist zwar durchaus möglich, eine Website nachträglich barrierefrei zu gestalten, aber im Allgemeinen ist es viel einfacher und effektiver, die Barrierefreiheit von Anfang an in den Design- und Entwicklungsprozess einzubeziehen. Der Grund dafür ist, dass Barrierefreiheit nicht nur eine Frage des Hinzufügens von ein paar Barrierefreiheitsmerkmalen am Ende des Entwicklungsprozesses ist, sondern dass Barrierefreiheit in jeder Phase des Design- und Entwicklungsprozesses berücksichtigt werden muss.&lt;/p&gt;
&lt;p&gt;Bei der Gestaltung des Layouts und des Inhalts einer Website ist es beispielsweise wichtig zu berücksichtigen, wie die Website von Menschen mit Behinderungen genutzt wird, und sicherzustellen, dass das Design von einer Vielzahl von Nutzern verwendet werden kann. Dies kann die Verwendung klarer und anschaulicher Überschriften und Beschriftungen, die Bereitstellung von Alternativtexten für Bilder und die Verwendung einer geeigneten Formatierung und Strukturierung beinhalten, um den Inhalt für Bildschirmlesesoftware leicht lesbar zu machen.&lt;/p&gt;
&lt;p&gt;Während des Entwicklungsprozesses ist es auch wichtig, die Website zu testen, um sicherzustellen, dass sie den Normen und Richtlinien für Barrierefreiheit entspricht. Dies kann mit einer Kombination aus automatisierten Testwerkzeugen und manuellen Tests durch Personen mit Behinderungen oder anderen Fachkenntnissen erfolgen. Wenn die Barrierefreiheit von Anfang an in den Entwurfs- und Entwicklungsprozess einbezogen wird, ist es viel wahrscheinlicher, dass die endgültige Website für alle Benutzer zugänglich ist.&lt;/p&gt;
&lt;p&gt;Insgesamt ist es zwar möglich, eine Website nachträglich zugänglich zu machen, aber es ist viel einfacher und effektiver, die Barrierefreiheit von Anfang an zu berücksichtigen. So kann sichergestellt werden, dass die Website von einem breiten Spektrum von Nutzern verwendet werden kann und den einschlägigen Normen und Richtlinien für Barrierefreiheit entspricht.&lt;/p&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Aber die Barrierefreiheit ist so restriktiv. Würde dies nicht die Kreativität von Webdesignern und -entwicklern einschränken? &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Barrierefreiheit im Web muss die Kreativität von Webdesignern und -entwicklern nicht einschränken. Tatsächlich kann die Einbeziehung der Barrierefreiheit in den Design- und Entwicklungsprozess oft zu kreativeren und effektiveren Lösungen führen. Denn bei der Barrierefreiheit geht es nicht nur darum, einer Website ein paar Barrierefreiheitsmerkmale hinzuzufügen, sondern vielmehr darum, die Bedürfnisse aller Nutzer, einschließlich derer mit Behinderungen, zu berücksichtigen und Wege zu finden, die Website für alle nutzbar und angenehm zu machen.&lt;/p&gt;
&lt;p&gt;Bei der Gestaltung von Layout und Inhalt einer Website können Webdesigner und -entwickler beispielsweise berücksichtigen, wie die Website von Menschen mit Behinderungen genutzt wird, und nach kreativen Möglichkeiten suchen, um die Website zugänglich und nutzbar zu machen. Dazu kann die Verwendung innovativer Designtechniken gehören, wie z. B. Responsive Design, um die Website auf einer Vielzahl von Geräten zugänglich zu machen, oder die Einbeziehung von Multimedia-Elementen, wie z. B. Videos oder Audioaufnahmen, um den Inhalt für Nutzer mit Seh- oder Hörbehinderungen besser zugänglich zu machen.&lt;/p&gt;
&lt;p&gt;Außerdem können Webdesigner und -entwickler durch die Einbeziehung der Barrierefreiheit in den Entwurfs- und Entwicklungsprozess oft die allgemeine Benutzerfreundlichkeit der Website für alle Benutzer verbessern. Dies kann zu kreativeren und effektiveren Lösungen führen, die nicht nur barrierefrei, sondern auch ansprechend und angenehm für alle Nutzer sind.&lt;/p&gt;
&lt;p&gt;Insgesamt muss die Barrierefreiheit im Web die Kreativität von Webdesignern und -entwicklern nicht einschränken. Indem sie die Bedürfnisse aller Nutzer berücksichtigen und die Barrierefreiheit in den Design- und Entwicklungsprozess einbeziehen, können Webdesigner und -entwickler Websites erstellen, die nicht nur barrierefrei, sondern auch innovativ und effektiv sind.&lt;/p&gt;
&lt;h2 id=&quot;mythos-3-barrierefreiheit-ist-zu-schwierig-und-teuer&quot;&gt;Mythos #3: Barrierefreiheit ist zu schwierig und teuer&lt;/h2&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Dennoch gibt es so viele verschiedene Behinderungen und unterstützende Technologien zu berücksichtigen. Die Schulung von Mitarbeitern und die Integration der Barrierefreiheit in den gesamten Entwicklungsprozess ist einfach zu teuer. Was meinen Sie dazu? &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Es stimmt zwar, dass die Schulung der Mitarbeiter und die Einbeziehung der Barrierefreiheit in den Design- und Entwicklungsprozess einige Anfangsinvestitionen erfordern, aber die langfristigen Vorteile der Barrierefreiheit im Internet können die Kosten überwiegen. Für Unternehmen und Organisationen kann eine barrierefreie Website das potenzielle Publikum für die Website vergrößern, die Suchmaschinenoptimierung (SEO) der Website verbessern und zu einer höheren Kundenzufriedenheit und -treue führen. Dies kann zu erheblichen finanziellen Vorteilen führen, z. B. zu höheren Umsätzen oder Spenden, und dazu beitragen, die anfänglichen Kosten für die Umsetzung der Barrierefreiheit im Internet auszugleichen.&lt;/p&gt;
&lt;p&gt;Darüber hinaus stehen zahlreiche Ressourcen zur Verfügung, die Unternehmen und Organisationen bei der Umsetzung der Barrierefreiheit im Internet unterstützen, darunter Schulungsmaterial, Richtlinien und Standards sowie automatische Testwerkzeuge. Diese Ressourcen können dazu beitragen, den Prozess der Umsetzung der Barrierefreiheit im Internet effizienter und kostengünstiger zu gestalten.&lt;/p&gt;
&lt;p&gt;Insgesamt kann die Umsetzung der Barrierefreiheit im Internet zwar einige Anfangsinvestitionen erfordern, aber die langfristigen Vorteile einer barrierefreien Website können die Kosten aufwiegen. Durch die Berücksichtigung der Bedürfnisse aller Nutzer und die Einbeziehung der Barrierefreiheit in den Design- und Entwicklungsprozess können Unternehmen und Organisationen Websites erstellen, die von einer Vielzahl von Nutzern verwendet werden können und die erhebliche finanzielle Vorteile bieten.&lt;/p&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Wäre es nicht viel billiger, einfach ein Overlay für die Barrierefreiheit zu verwenden? &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Ein Accessibility-Overlay ist ein Tool, das einer bestehenden Website hinzugefügt werden kann, um sie für Nutzer mit Behinderungen besser zugänglich zu machen. Ein Accessibility-Overlay kann zwar einige Vorteile bieten, ist aber in der Regel nicht so effektiv und effizient wie die Einbeziehung der Barrierefreiheit in den Design- und Entwicklungsprozess von Anfang an.&lt;/p&gt;
&lt;p&gt;Ein großer Nachteil der Verwendung eines Overlays für die Barrierefreiheit besteht darin, dass es sich nur auf die Zugänglichkeit der Benutzeroberfläche (UI) der Website bezieht, nicht aber auf den zugrunde liegenden Inhalt oder die Struktur. Das bedeutet, dass die Benutzeroberfläche mit einem Overlay zwar zugänglicher sein kann, der Inhalt der Website für Benutzer mit Behinderungen aber immer noch schwer oder gar nicht zugänglich ist. Ein Overlay kann zum Beispiel Bilder mit alternativem Text versehen, aber wenn die Bilder nicht richtig beschriftet oder organisiert sind, können sie für Benutzer mit Sehbehinderungen immer noch schwer zu verstehen sein.&lt;/p&gt;
&lt;p&gt;Außerdem kann die Verwendung eines Overlays für die Barrierefreiheit weniger effizient und teurer sein als die Integration der Barrierefreiheit in den Design- und Entwicklungsprozess. Dies liegt daran, dass ein Overlay für die Barrierefreiheit erst nach der Entwicklung der Website hinzugefügt werden muss, was zusätzliche Zeit und Ressourcen erfordern kann. Im Gegensatz dazu kann die Einbeziehung der Barrierefreiheit in den Design- und Entwicklungsprozess von Anfang an effizienter und kostengünstiger sein, da die Barrierefreiheit in jeder Phase des Prozesses berücksichtigt werden muss.&lt;/p&gt;
&lt;p&gt;Insgesamt kann ein Overlay für Barrierefreiheit zwar einige Vorteile bieten, ist aber im Allgemeinen nicht so effektiv und effizient wie die Einbeziehung der Barrierefreiheit in den Design- und Entwicklungsprozess von Anfang an. Durch die Berücksichtigung der Bedürfnisse aller Benutzer und die Einbeziehung der Barrierefreiheit in den Design- und Entwicklungsprozess können Unternehmen und Organisationen Websites erstellen, die für alle Benutzer wirklich zugänglich sind.&lt;/p&gt;
&lt;h2 id=&quot;mythos-4-barrierefreie-websites-sind-hässlich&quot;&gt;Mythos #4: Barrierefreie Websites sind hässlich&lt;/h2&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Vielleicht haben Sie Recht und wir sollten von Anfang an auf Barrierefreiheit achten. Es ist einfach so schwer, barrierefreie Websites zu erstellen, die gut aussehen. Die meisten barrierefreien Websites sind hässlich und haben ein schlechtes visuelles Design. &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Es stimmt zwar, dass einige barrierefreie Websites nicht den gleichen visuellen Reiz haben wie andere Websites, aber das muss nicht der Fall sein. Barrierefreiheit und visuelle Gestaltung schließen sich nicht gegenseitig aus, und es ist möglich, Websites zu erstellen, die sowohl barrierefrei als auch ästhetisch ansprechend sind.&lt;/p&gt;
&lt;p&gt;Eine Möglichkeit, dies zu erreichen, ist die Einhaltung von Leitlinien und Standards für die Barrierefreiheit im Internet, wie z. B. die vom World Wide Web Consortium (W3C) entwickelten Web Content Accessibility Guidelines (WCAG). Diese Leitlinien enthalten spezifische Kriterien, die Websites erfüllen sollten, um als zugänglich zu gelten, lassen aber auch Flexibilität bei der Gestaltung und dem Layout der Website zu. Das bedeutet, dass Webdesigner und -entwickler ihre Kreativität und ihr Fachwissen einsetzen können, um optisch ansprechende Websites zu erstellen, die auch für Benutzer mit Behinderungen zugänglich sind.&lt;/p&gt;
&lt;p&gt;Wenn Webdesigner und -entwickler die Bedürfnisse aller Nutzer, einschließlich derer mit Behinderungen, berücksichtigen, können sie Websites erstellen, die nicht nur zugänglich und optisch ansprechend, sondern auch benutzerfreundlich und für eine Vielzahl von Nutzern ansprechend sind. Dies kann zu effektiveren und erfolgreicheren Websites führen, die von allen Nutzern geschätzt werden, unabhängig davon, ob sie eine Behinderung haben oder nicht.&lt;/p&gt;
&lt;p&gt;Auch wenn einige barrierefreie Websites nicht den gleichen visuellen Reiz haben wie andere Websites, ist es möglich, Websites zu erstellen, die sowohl barrierefrei als auch ästhetisch ansprechend sind. Indem sie die Richtlinien und Standards für Barrierefreiheit befolgen und die Bedürfnisse aller Nutzer berücksichtigen, können Webdesigner und -entwickler Websites erstellen, die zugänglich, optisch ansprechend und benutzerfreundlich sind.&lt;/p&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Was ist mit unterstrichenen Links? Das WCAG-Erfolgskriterium 1.4.1 zwingt Sie im Grunde dazu, Links zu unterstreichen, auch wenn dies die Ästhetik einer Website beeinträchtigt. &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Das Erfolgskriterium 1.4.1 der Web Content Accessibility Guidelines (WCAG) besagt, dass „Informationen und Beziehungen, die durch die Darstellung vermittelt werden, programmatisch ermittelt werden können oder als Text verfügbar sind“. Das bedeutet, dass alle Informationen oder Beziehungen, die durch die Präsentation einer Website visuell vermittelt werden, wie z. B. die Position eines Links, auch in Textform verfügbar sein sollten, damit sie von Nutzern mit Sehbehinderungen verstanden werden können, die die visuelle Präsentation der Website möglicherweise nicht sehen können.&lt;/p&gt;
&lt;p&gt;Im Falle von Links verlangt das WCAG-Erfolgskriterium 1.4.1 nicht unbedingt, dass Links unterstrichen werden, aber es verlangt, dass die Position des Links deutlich im Text angegeben wird. Dies kann auf verschiedene Weise erreicht werden, z. B. durch die Verwendung einer anderen Farbe für Links, durch die Verwendung eines eigenen Stils oder einer eigenen Schriftart für Links oder durch Unterstreichung von Links. Die spezifische Methode zur Angabe der Position eines Links bleibt dem Webdesigner oder Entwickler überlassen, solange sie die Anforderungen des WCAG-Erfolgskriteriums 1.4.1 erfüllt.&lt;/p&gt;
&lt;p&gt;Letztendlich besteht das Ziel des WCAG-Erfolgskriteriums 1.4.1 darin, sicherzustellen, dass die Informationen und Beziehungen, die durch die Präsentation einer Website vermittelt werden, in Textform vorliegen, so dass sie von Nutzern mit Sehbehinderungen verstanden werden können. Das Unterstreichen von Links ist zwar eine Möglichkeit, dieses Kriterium zu erfüllen, aber es gibt auch andere Optionen, die ein gutes visuelles Design bieten und gleichzeitig die Zugänglichkeit gewährleisten können.&lt;/p&gt;
&lt;p class=&quot;c-bold&quot;&gt; &lt;em&gt;Ich:&lt;/em&gt; Sie haben die Kriterien 1.3.1 und 1.4.1 verwechselt. Das Erfolgskriterium 1.4.1 besagt eigentlich, dass „Farbe nicht als einziges visuelles Mittel zur Übermittlung von Informationen, zur Angabe einer Aktion, zur Aufforderung einer Reaktion oder zur Unterscheidung eines visuellen Elements verwendet wird.“ &lt;/p&gt; 
&lt;p&gt;&lt;em&gt;ChatGPT:&lt;/em&gt; Ich entschuldige mich, wenn ich die WCAG-Erfolgskriterien verwechselt habe. Das Erfolgskriterium 1.4.1, das ich erwähnt habe, besagt in der Tat, dass „Farbe nicht als einziges visuelles Mittel zur Übermittlung von Informationen, zur Anzeige einer Aktion, zur Aufforderung einer Reaktion oder zur Unterscheidung eines visuellen Elements verwendet wird.“ Das bedeutet, dass Websites nicht ausschließlich Farbe verwenden sollten, um Informationen zu vermitteln oder eine Aktion anzuzeigen, da dies das Verständnis des Inhalts für Benutzer mit Sehbehinderungen erschweren oder unmöglich machen kann, die nicht sehen können…&lt;/p&gt;
&lt;hr/&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Am Ende brach ChatGPT plötzlich mitten im Satz ab und reagierte nicht mehr. Vielleicht habe ich die künstlichen Synapsen der KI
überhitzt, wer weiß.&lt;/p&gt;
&lt;p&gt;Insgesamt bin ich sehr beeindruckt von den detaillierten und meist korrekten Antworten von ChatGPT. Wenn man mit der KI spricht,
fühlt es sich tatsächlich so an, als würde man ein Gespräch mit einem Menschen führen. Es ist fast schon unheimlich.&lt;/p&gt;
&lt;p&gt;Natürlich ist die KI nicht perfekt. Nach einiger Zeit scheinen sich gewisse Formulierungen und Aussagen zu wiederholen. Als ich
eine konkrete Frage zum &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/use-of-color.html&quot;&gt;WCAG-Erfolgskriterium 1.4.1&lt;/a&gt; stellte,
antwortete ChatGPT mit fehlerhaften Informationen. Ich vermute, dass diese Fehler mit mehr Training weniger werden.&lt;/p&gt;
&lt;p&gt;Habt ihr schon selbst ein Gespräch mit ChatGPT geführt? Welche Erfahrungen habt ihr gemacht?&lt;/p&gt;</content:encoded><category>accessibility</category><category>AI</category><category>ChatGPT</category><category>design</category><category>disabilities</category><category>myths</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_robot_and_human.jpg" length="0" type="image/jpeg"/></item><item><title>3 Gründe, warum auch Web-Entwickler:innen von Barrierefreiheit profitieren</title><link>https://www.oidaisdes.org/de/blog/3-ways-web-devs-benefit-accessibility</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/3-ways-web-devs-benefit-accessibility</guid><description>Semantisches HTML ist leicht zu lesen, tastaturbedienbar und die perfekte Basis für CSS-Regeln.</description><pubDate>Sun, 27 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Web-Barrierefreiheit ist ein ethisches Gebot und wirtschaftlich sinnvoll. Ihr unterstützt die Inklusion von Menschen
mit Behinderung und erreicht damit potenziell mehr Kund:innen. Dennoch, als Web-Entwickler:in denkt ihr euch
vielleicht: &lt;span class=&quot;c-italic&quot;&gt;„Das ist super für meine Firma und die ganze Gesellschaft. Aber für mich heißt es noch
mehr Arbeit!“&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;Ich kann euch verstehen! Das Thema Barrierefreiheit kann am Anfang ganz schön überwältigen. Und ich gebe zu, manche
Sachen wie &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Live_Regions&quot;&gt;ARIA Live-Regionen&lt;/a&gt;
bereiten tatsächlich etwas mehr Arbeit. Doch ich verrate euch ein kleines Geheimnis: Barrierefreier Code wird euer
Leben als Web-Entwickler:in einfacher machen und euch langfristig viel Zeit sparen!&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-thisisengineering-web-dev-workplace.vJsnZYGD_SB7eQ.webp&quot; srcset=&quot;/_astro/pexels-thisisengineering-web-dev-workplace.vJsnZYGD_Z1SLAFx.webp 640w, /_astro/pexels-thisisengineering-web-dev-workplace.vJsnZYGD_Z25pu2w.webp 750w, /_astro/pexels-thisisengineering-web-dev-workplace.vJsnZYGD_ZYq0eN.webp 828w, /_astro/pexels-thisisengineering-web-dev-workplace.vJsnZYGD_Ziwn3d.webp 1080w, /_astro/pexels-thisisengineering-web-dev-workplace.vJsnZYGD_Z22Quta.webp 1280w, /_astro/pexels-thisisengineering-web-dev-workplace.vJsnZYGD_SB7eQ.webp 1600w&quot; alt=&quot;Eine Web-Entwicklerin sitzt am Arbeitsplatz mit drei Monitoren. Auf einem Bildschirm sind Code-Zeilen zu sehen.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © ThisIsEngineering / pexels.com&lt;/p&gt;
&lt;p&gt;Ihr glaubt mir nicht? Dann lest einfach die folgenden drei Gründe, warum mit Barrierefreiheit alles besser ist.&lt;/p&gt;
&lt;h2 id=&quot;1-semantisches-markup-ist-leicht-lesbar-und-wartbar&quot;&gt;1. Semantisches Markup ist leicht lesbar und wartbar&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.w3schools.com/html/html5_semantic_elements.asp&quot;&gt;Semantisches Markup&lt;/a&gt; vermittelt Informationen über die
Bedeutung von Elementen nicht nur an assistive Technologien. Es vermittelt diese Bedeutung auch den Entwickler:innen, die
den Code lesen, bearbeiten und umgestalten.&lt;/p&gt;
&lt;p&gt;Stellt euch vor, ihr seid neu im Team und wollt euch in die Code-Basis einlesen. Würdet ihr vor Freude Luftsprünge machen,
wenn ihr solchen Code vorfindet?&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;fixed-header&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;banner&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;header-logo&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;img&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Logo Example Page&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;navigation&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Main Navigation&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;list&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;listitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Home&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;listitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/about&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;About&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;main&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;heading&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-level&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Best Pizza in Town&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;heading&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-level&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Pizza Salami&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;pizza-salami&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;img&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Pizza with salami slices&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Some text&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;heading&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-level&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;2&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Pizza Capricciosa&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;pizza-capri&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;img&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Pizza with baked ham, mushroom and artichoke&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Some text&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Puh, das sind schon verdammt viele &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Tags! Irgendwie schwer zu verstehen. Tja, dann
würdet ihr euch über folgenden Code wohl mehr freuen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/header-logo.svg&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; alt&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Logo Example Page&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Main Navigation&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Home&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/about&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;About&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;header&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Best Pizza in Town&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h1&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Pizza Salami&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/pizza-salami.jpg&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; alt&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Pizza with salami slices&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Some text&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Pizza Capricciosa&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/pizza-capri.jpg&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; alt&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Pizza with baked ham, mushroom and artichoke&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Some text&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ah, das ist besser! Auf dieser Basis könnt ihr euch im Team sinnvoll über den HTML-Code austauschen. Notiz am Rande:
Beide Code-Beispiele bereiten den Inhalt barrierefrei für Screenreader-Nutzer:innen auf. Aber nur das zweite Beispiel
ist vorteilhaft für Entwickler:innen.&lt;/p&gt;
&lt;p&gt;Wenn ihr jetzt denkt: &lt;span class=&quot;c-italic&quot;&gt;„Boah, der übertreibt ja völlig mit dieser Spaghetti-Code-Hölle!“&lt;/span&gt;  Dann
kann ich nur antworten, dass ich Variationen davon schon auf unzähligen Websites gesehen habe. Einfach nur traurig.&lt;/p&gt;
&lt;h2 id=&quot;2-native-bedienelemente-sind-standardmäßig-tastaturbedienbar&quot;&gt;2. Native Bedienelemente sind standardmäßig tastaturbedienbar&lt;/h2&gt;
&lt;p&gt;HTML-Elemente wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;a&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;input type=“checkbox”&lt;/code&gt; 
oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;input type=“radio”&lt;/code&gt;  sind alle von Haus aus barrierefrei. Zum Beispiel können Nutzer:innen mit
der Tab-Taste von Schaltfläche zu Schaltfläche springen und diese mit der Enter- oder Leertaste aktivieren.&lt;/p&gt;
&lt;p&gt;Stellt euch vor, ihr wollt eine Schaltfläche mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Element implementieren – warum auch immer.
Damit dieses Monstrum mit der Tastatur bedienbar wird, müsstet ihr folgende Schritte unternehmen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;tabindex=“0”&lt;/code&gt;  setzen, um das Div in die Tab-Reihenfolge aufzunehmen.&lt;/li&gt;
&lt;li&gt;Einen gut sichtbaren Fokus-Indikator setzen, der vermittelt wann das Div den Fokus hat.&lt;/li&gt;
&lt;li&gt;Mit einem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;keydown&lt;/code&gt;  Event-Handler die Aktivierung des „Buttons“ mit Enter- und Leertaste ermöglichen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Folgende ist zu tun, wenn ihr stattdessen das native &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Element verwendet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nichts!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Buttons sind standardmäßig tastaturbedienbar und lösen automatisch das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;click&lt;/code&gt;  Event aus, wenn
die Enter- oder Leertaste gedrückt wird. Weiters könnt ihr das Styling sehr einfach mit CSS anpassen. Das trifft auch auf
die meisten Formularelemente zu. Lest dazu meinen &lt;a href=&quot;/de/blog/styling-accessible-web-forms/&quot;&gt;Artikel über Web-Formulare&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;3-zustandsbezogene-semantische-css-selektoren-sind-aussagekräftiger-und-robuster&quot;&gt;3. Zustandsbezogene, semantische CSS-Selektoren sind aussagekräftiger und robuster&lt;/h2&gt;
&lt;p&gt;Ihr könnt die semantischen Tag-Namen und &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA&quot;&gt;ARIA-Attribute&lt;/a&gt;
für aussagekräftige und leicht verständliche CSS-Selektoren nutzen. Zum
Beispiel: &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;header nav &amp;gt; ul { … }&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button[aria-expanded=“true”	] { … }&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;Indem die CSS-Regeln alleine auf HTML-Tags und -Attributen aufbauen, braucht ihr keine zusätzlichen CSS-Klassen, die
dynamisch mit JavaScript gesetzt werden. Stattdessen könnt ihr euch darauf konzentrieren, die Geschäftslogik alleine
im HTML-Code abzubilden (etwa indem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-expanded&lt;/code&gt;  auf „true“ oder „false“ gesetzt wird).&lt;/p&gt;
&lt;p&gt;Weitere Beispiele und eine ausführliche Auseinandersetzung mit dem Konzept bietet der
Artikel &lt;a href=&quot;https://benmyers.dev/blog/semantic-selectors/&quot;&gt;„Style with Stateful, Semantic Selectors“&lt;/a&gt; von Ben Myers.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3schools.com/html/html5_semantic_elements.asp&quot;&gt;Semantische HTML-Elemente (W3 Schools)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/Accessibility/HTML&quot;&gt;HTML: Eine gute Basis für Barrierefreiheit (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors&quot;&gt;CSS Attribut-Selektoren (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 16.12.2022 &lt;/h2&gt; 
&lt;p&gt;Abschnitt über zustandsbezogene, semantische CSS-Selektoren wurde überarbeitet.&lt;/p&gt;</content:encoded><category>accessibility</category><category>cleanCode</category><category>css</category><category>developers</category><category>html</category><category>keyboard</category><category>web</category><category>webdev</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_web_dev_workplace.jpg" length="0" type="image/jpeg"/></item><item><title>Gestalte barrierefreie Toggle-Buttons in React</title><link>https://www.oidaisdes.org/de/blog/accessible-toggle-button</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessible-toggle-button</guid><description>Die Kombination aus Button-Element und Switch-Rolle sorgt für eine gute Usability.</description><pubDate>Fri, 18 Nov 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ob Filter-Optionen, System-Einstellungen oder ein Dark-Mode-Schalter – wahrscheinlich seid ihr im Internet
schon mal auf einen Toggle-Button gestoßen. Diese erscheinen zunächst recht simpel: Sie erlauben den
Nutzer:innen zwischen zwei Zuständen zu wechseln, meistens „ein“ und „aus“.&lt;/p&gt;
&lt;p&gt;Leider gibt es kein natives HTML-Element für Toggle-Buttons. Aus diesem Grund geistern zahlreiche,
selbstgebaute Implementierungen im Internet herum. Einige davon, ihr ahnt es schon, völlig unzugängliche Ungetüme.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-gaby-tenda-dj-desk.clyO6qdc_15NsFy.webp&quot; srcset=&quot;/_astro/pexels-gaby-tenda-dj-desk.clyO6qdc_TC9U2.webp 640w, /_astro/pexels-gaby-tenda-dj-desk.clyO6qdc_Z2uGylT.webp 750w, /_astro/pexels-gaby-tenda-dj-desk.clyO6qdc_1vPR3C.webp 828w, /_astro/pexels-gaby-tenda-dj-desk.clyO6qdc_Z4fgAO.webp 1080w, /_astro/pexels-gaby-tenda-dj-desk.clyO6qdc_28KsKx.webp 1280w, /_astro/pexels-gaby-tenda-dj-desk.clyO6qdc_15NsFy.webp 1600w&quot; alt=&quot;Ein Mann steht hinter einem DJ Pult mit vielen Knöpfen und Drehschaltern.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Gaby Tenda / pexels.com&lt;/p&gt;
&lt;p&gt;Ich habe eine &lt;a href=&quot;https://alexlehner86.github.io/punk-api-beer-list/&quot;&gt;Demo-Applikation&lt;/a&gt; in React mit barrierefreien
Toggle-Buttons erstellt, die ich euch zeigen möchte. Ich bin mir nicht sicher, ob meine Lösung optimal ist. Daher würde
ich mich über euer Feedback freuen.&lt;/p&gt;
&lt;h2 id=&quot;demo-bier-liste-mit-toggle-buttons&quot;&gt;Demo: Bier-Liste mit Toggle-Buttons&lt;/h2&gt;
&lt;p&gt;Meine Demo zeigt eine Liste verschiedener Biere. Nutzer:innen können über Toggle-Buttons zwischen schwachen und starken
Bieren wechseln. Probiert es aus:&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/punk-api-beer-list/&quot; title=&quot;Demo-Seite Bier-Liste mit stark/schwach Toggle-Buttons&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Wenn ihr den Code betrachtet, werdet ihr eine Gruppe von Buttons vorfinden, denen ich
die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;switch&lt;/code&gt;  Rolle zugewiesen habe. Bevor wir uns auf die technischen Details stürzen,
möchte ich noch erklären, was ich mit dem Bedienelement erreichen möchte.&lt;/p&gt;
&lt;h2 id=&quot;ziele-und-anforderungen&quot;&gt;Ziele und Anforderungen&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Das Bedienelement soll seine Funktionalität klar vermitteln, sowohl visuell als auch für assistive
Technologien.&lt;/li&gt;
&lt;li&gt;Es soll seinen aktuellen Zustand vermitteln, sowohl visuell als auch für assistive Technologien.&lt;/li&gt;
&lt;li&gt;Nutzer:innen sollen das Bedienelement allein mit der Tastatur bedienen können.&lt;/li&gt;
&lt;li&gt;Nur eine Option („schwach“ oder „stark“) kann gleichzeitig aktiv sein. Wenn eine Option aktiviert wird,
wird die andere deaktiviert.&lt;/li&gt;
&lt;li&gt;Der Wechsel zwischen den beiden Optionen soll ein bewusster Akt der Nutzer:innen sein und nicht aus
Versehen passieren.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;semantische-auszeichnung-und-tastaturbedienung&quot;&gt;Semantische Auszeichnung und Tastaturbedienung&lt;/h2&gt;
&lt;p&gt;Man könnte auch Radio-Buttons verwenden und ihr Styling mit CSS anpassen. Ich habe mich bewusst dagegen
entschieden, weil diese bei Fokussierung automatisch aktiviert werden (was ich nicht will!) und zu den
Standard-Formularelementen zählen. Web-Formulare sollen aber keinen Kontext-Wechsel auslösen, solange
Nutzer:innen das Formular nicht bewusst abschicken.&lt;/p&gt;
&lt;p&gt;Also habe ich mich dafür entschieden, ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;button&lt;/code&gt;  Element für jede auswählbare
Option („schwach“ und „stark“) zu verwenden und ihnen die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;switch&lt;/code&gt;  Rolle zuzuweisen.
Die &lt;a href=&quot;https://www.w3.org/TR/wai-aria-1.2/#switch&quot;&gt;Spezifikation&lt;/a&gt; dieser Rolle lautet:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;A type of checkbox that represents on/off values, as opposed to checked/unchecked values.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Meine &lt;a href=&quot;https://github.com/alexlehner86/punk-api-beer-list/tree/main/src/components/TwoStateSwitch&quot;&gt;React-Komponente&lt;/a&gt;
beinhaltet einen Toggle-Button für jede Option. Auf diese Weisekann ich sie individuell beschriften und ihren Zustand
(ein oder aus) eindeutig vermitteln. Weiters gruppiere ich die beiden Buttons in einem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;section&lt;/code&gt; 
Element mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;group&lt;/code&gt;  Rolle. Seht euch meinen JSX-Code an:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;section&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;styles&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;container&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;group&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;switchLabel&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;switchLabel&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;styles&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;switchWrapper&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;switch&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            aria-checked&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;selectedState&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;stateValues&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            onClick&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;toggleSwitch&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;            {&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;stateLabels&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            role&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;switch&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            aria-checked&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;selectedState&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;stateValues&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            onClick&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;toggleSwitch&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;            {&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;stateLabels&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;section&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nutzer:innen können die Buttons mit der Tab-Taste fokussieren und sie mit der Enter- oder Leertaste ein- bzw. ausschalten.&lt;/p&gt;
&lt;h2 id=&quot;individuelles-styling-mit-css&quot;&gt;Individuelles Styling mit CSS&lt;/h2&gt;
&lt;p&gt;Das Styling der Toggle-Buttons sorgt für die visuelle Vermittlung ihrer Funktionalität und ihres aktuellen Zustands.
Wenn eine Option ausgewählt ist, invertiere ich ihre Farben und füge eine vertikale Linie mithilfe
des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::after&lt;/code&gt;  Pseudo-elements hinzu. Hier ein Auszug aus der SCSS-Datei meiner Komponente:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Invert background and text colors */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;aria-checked&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--light-black&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Add vertical line to highlight selected option */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;aria-checked&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:after&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    content&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    bottom&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.2em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    top&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.2em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;aria-checked&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:first-of-type:after&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.2em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border-right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.3em&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--primary-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;aria-checked&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:last-of-type:after&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.2em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border-left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.3em&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--primary-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;feedback&quot;&gt;Feedback&lt;/h2&gt;
&lt;p&gt;Das war’s. Mein Vorschlag für barrierefreie Toggle-Buttons. Was sagt ihr dazu? Genial oder einfach furchtbar?
Sagt mir eure Meinung auf Twitter, Mastodon oder GitHub!&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/switch_role&quot;&gt;ARIA: switch role (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/TR/wai-aria-1.2/#switch&quot;&gt;WAI-ARIA 1.2 (Spezifikation)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joshcollinsworth.com/blog/accessible-toggle-buttons&quot;&gt;Building Accessible Toggle Buttons (Alternative Implementierung von Josh Collinsworth)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>aria</category><category>button</category><category>css</category><category>html</category><category>keyboard</category><category>react</category><category>toggle</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_dj_desk.jpg" length="0" type="image/jpeg"/></item><item><title>Häufige Probleme mit ARIA und wie ihr diese vermeidet</title><link>https://www.oidaisdes.org/de/blog/common-aria-mistakes</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/common-aria-mistakes</guid><description>ARIA-Rollen und -Attribute können eine Website barrierefrei machen, wenn man weiß was man tut.</description><pubDate>Mon, 17 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Du willst also deine Website barrierefrei machen? Sehr gut! Und du hast bereits von
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA&quot;&gt;ARIA&lt;/a&gt; gehört,
also &lt;span lang=&quot;en&quot;&gt;Accessible Rich Internet Applications&lt;/span&gt;. Na, dann pflastern wir doch einfach alles
mit ARIA-Attributen zu und die Website ist barrierefrei, oder? Falsch!&lt;/p&gt;
&lt;p&gt;Wenn du nicht weißt, was du tust, wird deine Website am Ende weniger barrierefrei sein! Es gibt einen guten Grund,
warum die erste Regel von ARIA lautet: &lt;strong lang=&quot;en&quot;&gt;No ARIA is better than Bad ARIA!&lt;/strong&gt; Ihr solltet
grundsätzlich native HTML-Elemente und -Attribute mit der gewünschten Semantik und Funktionalität verwenden.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_1wXcuY.webp&quot; srcset=&quot;/_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_145ewT.webp 640w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_ZU0eR2.webp 750w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_1ChllD.webp 828w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_1NmJIP.webp 1080w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_Z1heA8U.webp 1280w, /_astro/pexels-ketut-subiyanto-confused-couple.BugMF6Zv_1wXcuY.webp 1600w&quot; alt=&quot;Eine Frau sitzt am Boden und balanciert einen Laptop auf ihren Knien. Sie blickt verdutzt zum Mann neben ihr.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1014&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Ketut Subiyanto / pexels.com&lt;/p&gt;
&lt;p&gt;Sehen wir uns gemeinsam an, welche Anwendungsfälle es für ARIA gibt und welche verbreiteten Fehler ihr vermeiden solltet.&lt;/p&gt;
&lt;h2 id=&quot;aria-wozu-ist-das-gut&quot;&gt;ARIA, wozu ist das gut?&lt;/h2&gt;
&lt;p&gt;ARIA besteht aus einer Reihe von &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles&quot;&gt;Rollen&lt;/a&gt; und
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes&quot;&gt;Attributen&lt;/a&gt;, die euch dabei helfen können,
Web-Inhalte barrierefrei für Menschen mit Beeinträchtigung aufzubereiten. Die aktuelle Version
&lt;a href=&quot;https://www.w3.org/TR/wai-aria-1.2/&quot;&gt;WAI-ARIA 1.2&lt;/a&gt; wurde im Dezember 2021 vom W3C veröffentlicht.&lt;/p&gt;
&lt;p&gt;Personen mit Beeinträchtigungen oder Behinderungen nutzen assistive Technologien, um mit Web-Inhalten zu interagieren.
Zum Beispiel surfen blinde Menschen mithilfe von Screenreadern im Internet. Personen mit motorischer Beeinträchtigung können
Spracheingabe-Software verwenden, um mit einer Website zu interagieren.&lt;/p&gt;
&lt;p&gt;Web-Entwickler:innen können ARIA-Rollen und -Attribute verwenden, um Nutzer:innen assistiver Technologien die Semantik
der Inhalte zu vermitteln. Ihr könnt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-expanded&lt;/code&gt;  auf ein Element setzen, um anzuzeigen, ob
der verknüpfte Bereich ein- oder ausgeklappt ist. Das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-selected&lt;/code&gt;  vermittelt, ob zum
Beispiel ein Tab aktuell ausgewählt ist oder nicht.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;button&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-expanded&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-controls&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;section1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;header1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        Personal Information&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;section1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;region&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-labelledby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;header1&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    &amp;lt;!-- Panel content that is shown/hidden via button --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Grundsätzlich solltet ihr ARIA nur für Custom Widgets wie etwa einen ausklappbaren Bereich verwenden. Seht euch den
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/&quot;&gt;ARIA Authoring Practices Guide&lt;/a&gt; an. Dieser beschreibt detailliert, wie ihr
semantische Informationen bei üblichen Design-Mustern und Widgets vermitteln solltet.&lt;/p&gt;
&lt;h2 id=&quot;häufige-fehler-bei-der-nutzung-von-aria&quot;&gt;Häufige Fehler bei der Nutzung von ARIA&lt;/h2&gt;
&lt;p&gt;Ich habe bereits hunderte Websites auf Barrierefreiheit überprüft. Dabei ist mir aufgefallen: Viele Web-Entwickler:innen
haben offensichtlich keine Ahnung was sie tun! Sie verstopfen das DOM mit ARIA-Rollen und -Attributen als ob es kein Morgen
gäbe. Ich zeige euch einige der häufigsten Fehler, auf die ich gestoßen bin.&lt;/p&gt;
&lt;h3 id=&quot;mit-aria-hiddentrue-ein-fokussierbares-element-verbergen&quot;&gt;Mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-hidden=“true”&lt;/code&gt;  ein fokussierbares Element verbergen&lt;/h3&gt;
&lt;p&gt;ARIA gibt euch die volle Kontrolle über den &lt;a href=&quot;https://web.dev/the-accessibility-tree/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;Accessibility Tree&lt;/span&gt;&lt;/a&gt;.
Dieser stellt eine angepasste Version des DOM für assistive Technologien dar. Das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-hidden&lt;/code&gt; 
ermöglicht euch, ein Element aus dem &lt;span lang=&quot;en&quot;&gt;Accessibility Tree&lt;/span&gt; zu entfernen und es somit vor
Screenreader-Nutzer:innen zu verbergen.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;https://www.stuff.com&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-hidden&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Interesting Stuff&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Problem dabei: Wenn ihr ein fokussierbares Element, wie etwa einen Link, aus dem &lt;span lang=&quot;en&quot;&gt;Accessibility Tree&lt;/span&gt;
entfernt, dann verbleibt das Element dennoch in der Tab-Reihenfolge. Wenn ein:e Screenreader-Nutzer:in mit der Tab-Taste
navigiert und damit den Link fokussiert, wird der Screenreader „leer“ oder etwas ähnliches vorlesen. Bitte tut ihnen das nicht an!&lt;/p&gt;
&lt;h3 id=&quot;ein-aria-label-definieren-das-nicht-dem-sichtbaren-label-entspricht&quot;&gt;Ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-label&lt;/code&gt;  definieren, das nicht dem sichtbaren Label entspricht&lt;/h3&gt;
&lt;p&gt;Stellt euch vor, ihr seid ein Uni-Student in Wien und wollt euch online für eine Vorlesung anmelden. Wegen eines
&lt;a href=&quot;https://de.wikipedia.org/wiki/Tremor&quot;&gt;Handtremors&lt;/a&gt; wollt ihr die Website mit eurer Spracheingabe-Software bedienen.
Ihr findet folgendes Web-Formular vor:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; action&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;form-field&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;firstname&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Vorname&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;First Name&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;firstname&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;firstname&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;form-field&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; for&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;lastname&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Nachname&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Last Name&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;lastname&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;lastname&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    &amp;lt;!-- Other fields --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um das Formular auszufüllen, wollt ihr das erste Eingabefeld mit der sichtbaren Beschriftung „Vorname“ auswählen. Also
sagt ihr den Sprachbefehl „Vorname klicken“, doch nichts passiert. Was ist hier los?&lt;/p&gt;
&lt;p&gt;Wie der Code oben zeigt, ist das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;label&lt;/code&gt;  Element programmatisch mit dem Eingabefeld über
das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;for&lt;/code&gt;  Attribut verknüpft. Allerdings überschreibt das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-label&lt;/code&gt;  Attribut
den programmatischen Namen des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;input&lt;/code&gt;  Elements mit &lt;span lang=&quot;de&quot;&gt;„First Name“&lt;/span&gt;. Das heißt,
der Name des Bedienelements enthält nicht die sichtbare Beschriftung.&lt;/p&gt;
&lt;p&gt;Das Formular ist somit für Nutzer:innen von Spracheingabe-Software schwer bedienbar und es liegt ein klarer
&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html&quot;&gt;WCAG-Verstoß&lt;/a&gt; vor. Übrigens: Es handelt sich um ein
echtes Beispiel eines Web-Formulars auf der Website einer großen Universität in Wien.&lt;/p&gt;
&lt;h3 id=&quot;das-aria-labelledby-attribut-verweist-auf-eine-id-die-nicht-existiert&quot;&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-labelledby&lt;/code&gt;  Attribut verweist auf eine ID, die nicht existiert&lt;/h3&gt;
&lt;p&gt;Mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-labelledby&lt;/code&gt;  Attribut könnt ihr ein HTML-Element programmatisch beschriften, indem ihr auf
ein anderes Element verweist. Der Wert sollte eine Liste von einer oder mehreren IDs sein, die auf das Element verweisen,
mit dem ihr das aktuelle Element beschriften möchtet. Ein Beispiel.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-labelledby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;sidenav-title&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;sidenav-title&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Related Content&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        &amp;lt;!-- List of links --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;nav&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Falls kein Element mit der ID „sidenav-title“ im DOM vorhanden wäre, würde das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;nav&lt;/code&gt;  Element keine
programmatische Beschriftung erhalten. Die Folge wäre eine suboptimale Erfahrung für Screenreader-Nutzer:innen. Deshalb
prüft bitte genau, ob das mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-labelledby&lt;/code&gt;  referenzierte Element tatsächlich vorhanden ist.&lt;/p&gt;
&lt;h3 id=&quot;navigations-menü-mit-rolemenubar-oder-rolemenu&quot;&gt;Navigations-Menü mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“menubar”&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“menu”&lt;/code&gt; &lt;/h3&gt;
&lt;p&gt;Viele Websites enthalten eine Seitennavigation, die wie eine Menüleiste mit ausklappbaren Untermenüs gestylt ist. Aufgrund
dieser visuellen Darstellung denken viele Web-Entwickler:innen, dass sie die folgenden semantischen Rollen setzen sollten:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menubar&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Home&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-haspopup&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-expanded&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;#&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;About&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menu&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; aria-label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;About&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;                &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/overview&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Overview&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;none&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;                &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; role&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;menuitem&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; href&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;/administration&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Administration&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;            &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;li&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;ul&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Allerdings wecken diese semantischen Rollen eine gewisse Erwartungshaltung bei den Nutzer:innen. Die
Rollen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;menubar&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;menu&lt;/code&gt;  sind für Menü-Widgets gedacht,
die den Nutzer:innen eine Liste an Aktionen anbieten und wie Menüs von Betriebssystemen bedienbar sind.
Das heißt: Sie sollten ein
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/patterns/menu/&quot;&gt;konkretes Set an Tastatur-Interaktionen implementieren&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wenn ihr zum Beispiel eine Seitennavigation mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;role=“menubar”&lt;/code&gt;  definiert, dann erwarten
Screenreader-Nutzer:innen, das Menü mit den Pfeiltasten bedienen zu können. Wenn das nicht funktioniert, dann sorgt
das für Verwirrung. Eine bessere Alternative ist die Anwendung des
&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/example-index/disclosure/disclosure-navigation.html&quot;&gt;&lt;span lang=&quot;en&quot;&gt;Disclosure Pattern&lt;/span&gt;&lt;/a&gt;
für die Seitennavigation.&lt;/p&gt;
&lt;h2 id=&quot;grundregeln-für-den-einsatz-von-aria&quot;&gt;Grundregeln für den Einsatz von ARIA&lt;/h2&gt;
&lt;p&gt;Wie wir gesehen haben, kann bei ARIA sehr viel schiefgehen. Diese Liste an Grundregeln wird euer Leben einfacher machen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Verwendet immer native HTML-Elemente, wenn möglich.&lt;/li&gt;
&lt;li&gt;Verändert nicht die Semantik von nativen Elementen, außer es ist wirklich notwendig.&lt;/li&gt;
&lt;li&gt;Setzt ARIA bei Custom Widgets ein und befolgt die Vorgaben im Authoring Practices Guide.&lt;/li&gt;
&lt;li&gt;Alle interaktiven ARIA-Bedienelemente müssen auch mit der Tastatur bedienbar sein.&lt;/li&gt;
&lt;li&gt;Testet euren Code mit assistiven Technologien wie Screenreadern und Spracheingabe-Software.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA&quot;&gt;ARIA (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/ARIA/apg/&quot;&gt;ARIA Authoring Practices Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/the-accessibility-tree/&quot;&gt;The Accessibility Tree&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>aria</category><category>html</category><category>mistakes</category><category>screenreader</category><category>voiceInput</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_confused_couple.jpg" length="0" type="image/jpeg"/></item><item><title>CSS-Tricks für bessere Sichtbarkeit im Forced Colors Modus</title><link>https://www.oidaisdes.org/de/blog/forced-colors-mode</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/forced-colors-mode</guid><description>Wie der Forced Colors Modus bei Websites funktioniert und wie ihr das Styling dafür optimiert.</description><pubDate>Tue, 27 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ein deutlicher Kontrast zwischen Text und Hintergrund hilft allen. Sowohl Menschen mit Sehschwäche als auch jenen,
die bei grellem Sonnenlicht auf ihr Display starren. Aus diesem Grund enthalten die
&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html&quot;&gt;WCAG&lt;/a&gt; diverse Mindest-Anforderungen für das
Kontrastverhältnis von Text bzw. UI-Komponenten zum Hintergrund.&lt;/p&gt;
&lt;p&gt;Für Menschen mit Sehbeeinträchtigung ist das aber nicht immer ausreichend. Sie brauchen spezifische Farbkombinationen
mit hohem Kontrast zur Verbesserung der Lesbarkeit. Assistive Technologien wie der
&lt;a href=&quot;https://assistivlabs.com/assistive-tech/display/high-contrast-mode&quot;&gt;High Contrast Mode&lt;/a&gt; in Windows überschreiben
aktiv die Farben einer Website, um Nutzer:innen mit Sehschwäche zu helfen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-steve-johnson-color-palette.Ch_oZIFL_1Vb6ee.webp&quot; srcset=&quot;/_astro/pexels-steve-johnson-color-palette.Ch_oZIFL_2oGe30.webp 640w, /_astro/pexels-steve-johnson-color-palette.Ch_oZIFL_12HXOW.webp 750w, /_astro/pexels-steve-johnson-color-palette.Ch_oZIFL_Kaspr.webp 828w, /_astro/pexels-steve-johnson-color-palette.Ch_oZIFL_Z2npGXf.webp 1080w, /_astro/pexels-steve-johnson-color-palette.Ch_oZIFL_1LqmDf.webp 1280w, /_astro/pexels-steve-johnson-color-palette.Ch_oZIFL_1Vb6ee.webp 1600w&quot; alt=&quot;Eine Mischung aus verschiedenen Farben auf einer Leinwand.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Steve Johnson / pexels.com&lt;/p&gt;
&lt;p&gt;Ich zeige euch wie der Forced Colors Modus bei Websites funktioniert und wie ihr eure Inhalte mit einfachen
CSS-Tricks optimieren könnt.&lt;/p&gt;
&lt;h2 id=&quot;wie-funktioniert-der-forced-colors-modus&quot;&gt;Wie funktioniert der Forced Colors Modus?&lt;/h2&gt;
&lt;p&gt;Der Forced Colors Modus ist ein allgemeiner Browser-Standard, der in
&lt;a href=&quot;https://www.w3.org/TR/css-color-adjust-1/#forced&quot;&gt;CSS Color Adjustment Module Level 1&lt;/a&gt; definiert wurde.
Betriebssysteme sollen vordefinierte Farb-Paletten anbieten und es Nutzer:innen ermöglichen, ihre eigenen
Farbkombinationen zu definieren.&lt;/p&gt;
&lt;p&gt;In der Spezifikation heißt es:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;When &lt;strong&gt;forced colors mode&lt;/strong&gt; is active (…), colors on the element are force-adjusted to the user’s preferred color palette.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das bedeutet, dass Farbwerte durch &lt;a href=&quot;https://www.w3.org/TR/css-color-4/#css-system-colors&quot;&gt;System-Farben&lt;/a&gt; ersetzt werden, welche
der definierten Farbpalette entsprechen. Zu den betroffen CSS-Eigenschaften zählen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;color&lt;/code&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;background-color&lt;/code&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;border-color&lt;/code&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;outline-color&lt;/code&gt; 
&lt;/li&gt;
&lt;li&gt;
&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;fill&lt;/code&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Andere Eigenschaften wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;box-shadow&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;text-shadow&lt;/code&gt;  werden
auf &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt;  gesetzt. Um euch ein Beispiel zu geben, so sieht mein Blog im Forced Colors Modus
mit dunkler Farbpalette aus:&lt;/p&gt;
&lt;img src=&quot;/_astro/oida-is-des-org-blog-high-contrast.ZXGCKf-4_Z21pn8O.webp&quot; srcset=&quot;/_astro/oida-is-des-org-blog-high-contrast.ZXGCKf-4_JgJpj.webp 640w, /_astro/oida-is-des-org-blog-high-contrast.ZXGCKf-4_Z1LhuaD.webp 750w, /_astro/oida-is-des-org-blog-high-contrast.ZXGCKf-4_15wQ7O.webp 828w, /_astro/oida-is-des-org-blog-high-contrast.ZXGCKf-4_Z21pn8O.webp 934w&quot; alt=&quot;Eine Unterseite von &apos;Oida, is des org&apos; mit aktivem Forced Colors Modus.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 934px) 934px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;934&quot; height=&quot;675&quot;&gt;
&lt;h2 id=&quot;wie-ihr-den-forced-colors-modus-testet&quot;&gt;Wie ihr den Forced Colors Modus testet&lt;/h2&gt;
&lt;p&gt;Mithilfe der
&lt;a href=&quot;https://developer.chrome.com/docs/devtools/rendering/emulate-css/#emulate-css-media-feature-forced-colors&quot;&gt;Entwicklertools in Chrome und Edge&lt;/a&gt;
könnt ihr den Forced Colors Modus emulieren und die Sichtbarkeit eurer Inhalte prüfen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Öffnet den Rendering-Tab.&lt;/li&gt;
&lt;li&gt;Unter “CSS-Medienfunktion forced-colors emulieren” wählt ihr “forced-colors: active” aus.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;die-medienfunktion-forced-colors&quot;&gt;Die Medienfunktion &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;forced-colors&lt;/code&gt; &lt;/h2&gt;
&lt;p&gt;Passt das Styling eurer Website explizit mit der Medienfunktion &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;forced-colors&lt;/code&gt;  an.
Zum Beispiel habe ich in meinem Blog ein SVG-Muster mithilfe der
Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;background-image&lt;/code&gt;  eingebunden:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;#___gatsby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-image&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;data:image/svg+xml...&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-attachment&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;fixed&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;cover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mit der Media-Query entferne ich das Hintergrundbild, wenn der Forced Colors Modus aktiv ist:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@media&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (forced-colors: active) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    #___gatsby&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        background-image&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Eine weitere nützliche CSS-Eigenschaft ist &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;forced-color-adjust&lt;/code&gt; . Diese ermöglicht euch,
einzelne Elemente vor dem Zugriff des Forced Colors Modus zu schützen und selbst das Styling zu optimieren.&lt;/p&gt;
&lt;h2 id=&quot;transparente-rahmen-und-umrisse&quot;&gt;Transparente Rahmen und Umrisse&lt;/h2&gt;
&lt;p&gt;Web-Layouts vermitteln die Grenze eines Elements häufig über eine andere &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;background-color&lt;/code&gt; 
oder mit einem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;box-shadow&lt;/code&gt; . Im Forced Colors Modus haben jedoch alle Elemente dieselbe
Hintergrundfarbe und alle Schatten werden entfernt. Die fehlende Begrenzung von Elementen kann für
Nutzer:innen verwirrend sein.&lt;/p&gt;
&lt;p&gt;Kein Grund zu verzweifeln! Es gibt eine geniale Lösung für das Problem: Definiert eine Rahmenlinie mit transparenter
Farbe. Bei aktivem Forced Colors Modus wird die Rahmenlinie sichtbar und vermittelt eindeutig die Grenze des Elements:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;section.info-card&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; transparent&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf dieselbe Weise könnt ihr für sichtbare Fokus-Indikatoren im Forced Colors Modus sorgen. Normalerweise setzen Browser
einen Umriss für fokussierte Links und Buttons. Es ist ok diesen mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;outline: none&lt;/code&gt;  zu
entfernen, wenn ihr den Fokus auf andere Weise (Hintergrundfarbe etc.) vermittelt. Da dieser Fokus-Indikator im Forced
Colors Modus verloren gehen würde, solltet ihr aber besser eine transparente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;outline&lt;/code&gt;  setzen.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;a:focus&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--primary&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--white&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* Provide visible focus indicator in forced colors mode */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; transparent&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Es gibt noch viele weitere CSS-Tricks, mit denen ihr verschiedene Probleme im Forced Colors Modus beheben könnt.
Bitte schaut euch das tolle Video &lt;a href=&quot;https://www.youtube.com/watch?v=vlx70ABSAP0&quot;&gt;„Practical Styling in Forced Colors Mode“&lt;/a&gt;
von Mike Herchel an.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@media/forced-colors&quot;&gt;forced-colors (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/forced-color-adjust&quot;&gt;forced-color-adjust (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.smashingmagazine.com/2022/03/windows-high-contrast-colors-mode-css-custom-properties/&quot;&gt;Windows High Contrast Mode, Forced Colors Mode And CSS Custom Properties&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>css</category><category>color</category><category>contrast</category><category>eyesight</category><category>visibility</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_color_palette.jpg" length="0" type="image/jpeg"/></item><item><title>CSS Cascade Layers in Angular verwenden</title><link>https://www.oidaisdes.org/de/blog/cascade-layers-in-angular</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/cascade-layers-in-angular</guid><description>Strukturiere deine Styles und vermeide lästige Konflikte aufgrund der Spezifität oder Reihenfolge der Deklaration.</description><pubDate>Mon, 05 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wer kennt das nicht: Ihr definiert eine neue CSS-Regel, kompiliert eure Web-Applikation und werft einen Blick auf
die Seite im Browser. Was? Warum wurde das Styling nicht angewandt?&lt;/p&gt;
&lt;p&gt;Sehr oft ist der Übeltäter eine andere CSS-Regel mit &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity&quot;&gt;höherer Spezifität&lt;/a&gt;.
Vielleicht hab ihr die Bibliothek eines Drittanbieters eingebunden, deren Styles in Konflikt mit euren stehen.&lt;/p&gt;
&lt;p&gt;Doch Rettung naht in Form eines neuen CSS-Features: &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;CSS Cascade Layer&lt;/code&gt; .
Diese ermöglichen uns die Aufteilung unserer Styles in streng getrennte Schichten, um Konflikte zu vermeiden.
Ich zeige euch, wie ihr das neue Feature in einer Angular-Applikation mit &lt;a href=&quot;https://sass-lang.com/&quot;&gt;SCSS&lt;/a&gt; anwenden könnt.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-dalila-dalprat-cake.Ca7jM4DH_1gbhYa.webp&quot; srcset=&quot;/_astro/pexels-dalila-dalprat-cake.Ca7jM4DH_ZTgBU7.webp 640w, /_astro/pexels-dalila-dalprat-cake.Ca7jM4DH_Z20UaSl.webp 750w, /_astro/pexels-dalila-dalprat-cake.Ca7jM4DH_2uANGF.webp 828w, /_astro/pexels-dalila-dalprat-cake.Ca7jM4DH_Z1iUOBg.webp 1080w, /_astro/pexels-dalila-dalprat-cake.Ca7jM4DH_ZOG1Al.webp 1280w, /_astro/pexels-dalila-dalprat-cake.Ca7jM4DH_1gbhYa.webp 1600w&quot; alt=&quot;Eine Torte mit mehreren erkennbaren Schichten.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Dalila Dalprat / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;was-sind-cascade-layer&quot;&gt;Was sind Cascade Layer?&lt;/h2&gt;
&lt;p&gt;CSS Cascade Layer geben Autoren mehr Kontrolle über die Kaskade in CSS. Also über die Art und Weise wie
Browser entscheiden, welche Styling-Regeln auf ein HTML-Element angewandt werden.&lt;/p&gt;
&lt;p&gt;Das neue Feature ist im CSS-Modul &lt;a href=&quot;https://drafts.csswg.org/css-cascade-5/#layering&quot;&gt;Cascading and Inheritance Level 5&lt;/a&gt;
definiert. Obwohl das Dokument erst den Entwurf-Status hat, werden Cascade Layer bereits
von &lt;a href=&quot;https://caniuse.com/css-cascade-layers&quot;&gt;allen modernen Browsern&lt;/a&gt; unterstützt. Das Dokument besagt:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;&lt;strong&gt;Cascade layers&lt;/strong&gt; provide a structured way to organize and balance concerns within a single origin. Rules within a single cascade layer cascade together, without interleaving with style rules outside the layer.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das heißt, wir können mehrere Layer definieren – beginnend bei Styles mit niedriger Priorität (z.B. Bibliotheken von
Drittanbietern) bis zu hochprioritären Styles von Komponenten. Konflikte zwischen einzelnen Schichten werden immer so
aufgelöst, dass die CSS-Regeln der Schicht mit höchster Priorität angewandt werden.&lt;/p&gt;
&lt;p&gt;Wenn wir uns die Schritte in der Kaskade ansehen, dann sehen wir dass die Zugehörigkeit zu einem gewissen Layer geprüft
wird bevor die Spezifität und Reihenfolge der Deklaration geprüft wird.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ursprung und Wichtigkeit (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;!important&lt;/code&gt; )&lt;/li&gt;
&lt;li&gt;Kontext&lt;/li&gt;
&lt;li&gt;CSS-Regeln im HTML-Element&lt;/li&gt;
&lt;li&gt;Layer&lt;/li&gt;
&lt;li&gt;Spezifität&lt;/li&gt;
&lt;li&gt;Reihenfolge der Deklaration&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Bitte schaut euch das Video &lt;a href=&quot;https://www.youtube.com/watch?v=zEPXyqj7pEA&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„The CSS Cascade, a deep dive“&lt;/span&gt;&lt;/a&gt;
von Bramus Van Damme an, um eine detaillierte Einführung in die CSS-Kaskade zu erhalten.&lt;/p&gt;
&lt;h2 id=&quot;die-layer-deklaration&quot;&gt;Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@layer&lt;/code&gt;  Deklaration&lt;/h2&gt;
&lt;p&gt;Grundsätzlich deklarieren wir einen neuen Layer inklusive zugehöriger CSS-Regeln mit
der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@layer&lt;/code&gt;  Deklaration:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; my-layer {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    // CSS rules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ihr könnt auch einen benannten Cascade Layer definieren, ohne diesem CSS-Regeln zuzuweisen. Auf diese Weise könnt ihr
die Hierarchie eurer Layer bestimmen. Als Best Practice wird empfohlen, zunächst die Hierarchie der Layer
mit &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;@layer&lt;/code&gt;  zu definieren und danach erst die konkreten CSS-Regeln den Layern hinzuzufügen:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; my-layer-1, my-layer-2;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; my-layer-1 {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    // CSS rules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; my-layer-2 {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    // CSS rules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alle Styles, die nicht innerhalb eines Layers deklariert wurden, werden automatisch als Teil eines anonymen Layers
erfasst. Dieser anonyme Layer hat eine höhere Priorität als die explizit definierten Layer. Das bedeutet, dass alle
CSS-Regeln, die außerhalb von Layern definiert wurden, Vorrang vor den Styles innerhalb von Layern haben.&lt;/p&gt;
&lt;p&gt;Ich gehe hier nicht auf alle Details der Cascade Layer ein. Bitte lest dazu den großartigen Artikel
&lt;a href=&quot;https://css-tricks.com/css-cascade-layers/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„A Complete Guide to CSS Cascade Layers“&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;demo-applikation-mit-angular-und-scss&quot;&gt;Demo-Applikation mit Angular und SCSS&lt;/h2&gt;
&lt;p&gt;Ich habe eine Applikation mit &lt;a href=&quot;https://angular.io/&quot;&gt;Angular 14&lt;/a&gt; und &lt;a href=&quot;https://leafletjs.com/&quot;&gt;Leaflet&lt;/a&gt; erstellt, welche
eine interaktive Karte anzeigt. Im Projekt verwende ich SCSS, da es tolle Features wie Placeholders und Mixins bietet.
Seht euch &lt;a href=&quot;https://github.com/alexlehner86/cascade-layers-angular-demo&quot;&gt;meinen Quellcode hier an&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mein Ziel ist einfach: Ich will sicherstellen, dass mein Styling für individuelle Komponenten immer angewandt wird.
Es sollte Vorrang vor meinem Styling-Reset sowie den CSS-Regeln von Drittanbieter-Bibliotheken haben. Zu diesem Zweck
habe ich mehrere Layer in der zentralen CSS-Datei &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;styles.scss&lt;/code&gt;  definiert:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@use&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; &amp;quot;sass:meta&amp;quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; reset, thirdparty, overrides;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; reset {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    @include&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; meta.load-css(&amp;quot;layers/reset/normalize&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; thirdparty {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    @include&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; meta.load-css(&amp;quot;node_modules/leaflet/dist/leaflet.css&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@layer&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; overrides {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    @include&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; meta.load-css(&amp;quot;layers/overrides/leaflet&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich verwende die SASS-Funktion &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;load-css&lt;/code&gt; , um das CSS aus anderen SCSS-Dateien zu laden und es
als Teil eines Cascade Layers zu definieren. Das Reset für User Agent Styles gebe ich in den Layer mit der niedrigsten
Priorität. Darauf folgt ein Layer für das Standard-Styling der Leaflet-Karte und ein Layer für das globale Überschreiben
von Styles.&lt;/p&gt;
&lt;p&gt;Ich definiere keinen Layer für die Styles von einzelnen Komponenten, welche in eigenen SCSS-Dateien deklariert werden.
Diese CSS-Regeln werden daher automatisch in einem anonymen Layer gesammelt und erhalten die höchste Priorität. Sehen
wir uns ein konkretes Beispiel an.&lt;/p&gt;
&lt;h2 id=&quot;styling-eines-karten-popups&quot;&gt;Styling eines Karten-Popups&lt;/h2&gt;
&lt;p&gt;In meiner Demo-App liste ich meine 5 Lieblingsplätze in Wien auf. Dieses werden auf einer interaktiven
Leaflet-Karte markiert. Beim Klick auf einen Marker öffnet sich ein Popup. Das
HTML-Template &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;fav-place-popup.component.html&lt;/code&gt;  des Popups sieht so aus:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;{{data.name}}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h2&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; *ngFor&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;let desc of data.description&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;{{desc}}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;fav-place-popup.component.scss&lt;/code&gt;  habe ich folgende Styles definiert:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    font-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.8rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    margin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5em&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Darüber hinaus definiert die Leaflet-Bibliothek folgendes Styling für Textabsätze innerhalb von Karten-Popups:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.leaflet-popup-content&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; p&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    margin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;18px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dank meiner etablierten Layer-Struktur muss ich keine Angst davor haben, dass Leaflets Styling
für &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.leaflet-popup-content p&lt;/code&gt;  mit meinen Komponenten-Styles für &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;p&lt;/code&gt; 
in Konflikt geraten könnten. Gleichzeitig sorgt Angulars &lt;a href=&quot;https://angular.io/guide/view-encapsulation&quot;&gt;View Encapsulation&lt;/a&gt;
dafür, dass meine Komponenten-Styles nicht auf alle Textabsätze in meiner Applikation angewandt werden. Genial!&lt;/p&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Ich liebe Cascade Layer! Sie sind ein mächtiges Werkzeug zur Ordnung von CSS-Styles und helfen, nervige Konflikte
aufgrund der Spezifität oder Reihenfolge der Deklaration zu vermeiden.&lt;/p&gt;
&lt;p&gt;Ein Problem konnte ich noch nicht lösen: Manche Angular-Bibliotheken (z.B. &lt;a href=&quot;https://material.angular.io/&quot;&gt;Angular Material&lt;/a&gt;)
fügen automatisch Styles im &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;head&lt;/code&gt;  Tag des HTML-Dokuments ein. Bisher habe ich leider keinen
Weg gefunden, um diese Styles innerhalb eines Layers meiner Wahl zu deklarieren. Ich hoffe, dass es in Zukunft eine
Lösung für dieses Problem geben wird.&lt;/p&gt;</content:encoded><category>angular</category><category>css</category><category>design</category><category>scss</category><category>specificity</category><category>structure</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_cake.jpg" length="0" type="image/jpeg"/></item><item><title>Warum du das native Dialog-Element nutzen solltest</title><link>https://www.oidaisdes.org/de/blog/native-dialog-element</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/native-dialog-element</guid><description>Das Dialog-Element ist einfach zu handhaben und barrierefrei, abgesehen von ein paar kleinen Problemen.</description><pubDate>Tue, 19 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wir sind alle mit Dialogboxen im Web vertraut. Von einfachen Aufforderungen, eine Aktion zu bestätigen, bis hin zu
Fenstern mit komplexen Inhalten — Dialoge sind ein integraler Bestandteil moderner Benutzeroberflächen im Web.&lt;/p&gt;
&lt;p&gt;Leider gab es lange Zeit kein natives Dialog-Element in HTML, weshalb zahlreiche
&lt;a href=&quot;https://accessuse.eu/en/modal-dialogs.html&quot;&gt;eigene Implementierungen mit schweren Barrierefreiheits-Problemen&lt;/a&gt;
entwickelt wurden. Das änderte sich mit der Einführung des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  Elements in
HTML 5.2 vor ein paar Jahren. Nachdem auch Safari endlich mit Version 15.4 das Element unterstützt, können nun
&lt;a href=&quot;https://caniuse.com/dialog&quot;&gt;alle modernen Browser&lt;/a&gt; damit umgehen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_Z1NUbqr.webp&quot; srcset=&quot;/_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_Z1FNTgA.webp 640w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_jlO9b.webp 750w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_1CSVna.webp 828w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_Z1Y8AMY.webp 1080w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_foBIH.webp 1280w, /_astro/pexels-miguel-a-padrinan-speech-bubbles.0fhF8W61_Z1NUbqr.webp 1600w&quot; alt=&quot;Zwei weiße Sprechblasen auf pinkem Hintergrund.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1064&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Miguel Á. Padriñán / pexels.com&lt;/p&gt;
&lt;p&gt;Ich zeige euch, wie einfach ihr einen barrierefreien Modal-Dialog mit dem nativen Element erstellen könnt. Bei gewissen
Browsern und Screenreadern gibt es noch kleinere Probleme, worauf ich am Ende des Artikels eingehen werde.&lt;/p&gt;
&lt;h2 id=&quot;was-macht-das-dialog-element&quot;&gt;Was macht das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  Element?&lt;/h2&gt;
&lt;p&gt;Das Dialog-Element erzeugt eine Popup-Box auf der Webseite, welche die Aufmerksamkeit der Nutzer:innen auf sich zieht.
Die &lt;a href=&quot;https://html.spec.whatwg.org/multipage/interactive-elements.html#the-dialog-element&quot;&gt;HTML-Spezifikation&lt;/a&gt; beschreibt
das Element so:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;The dialog element represents a part of an application that a user interacts with to perform a task, for example a dialog box, inspector, or window.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Ein typischer Anwendungsfall ist ein Modal-Dialog, der den Rest der Seite verdeckt und die Nutzer:innen zur Eingabe von
Daten auffordert. Ich habe eine &lt;a href=&quot;https://alexlehner86.github.io/fancy-css-playground/#/dialog&quot;&gt;Demo&lt;/a&gt; mit dem React-Framework
erstellt (&lt;a href=&quot;https://github.com/alexlehner86/fancy-css-playground/tree/main/src/pages/DialogElement&quot;&gt;Quellcode&lt;/a&gt;):&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/fancy-css-playground/#/dialog&quot; title=&quot;Demo Natives Dialog-Element&quot;&gt;&lt;/iframe&gt;
&lt;h2 id=&quot;aufbau-und-interaktion-mit-dem-dialog&quot;&gt;Aufbau und Interaktion mit dem Dialog&lt;/h2&gt;
&lt;p&gt;Der grundlegende &lt;a href=&quot;https://reactjs.org/docs/introducing-jsx.html&quot;&gt;JSX-Code&lt;/a&gt; meines Modal-Dialogs sieht so aus:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dialog&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    aria-labelledby&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;dialog-personal-info-heading&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    ref&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;formDialogRef&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    onClick&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;onFormDialogContainerClick&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;dialog-personal-info-heading&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        Personal Information&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;h3&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;form&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        method&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;dialog&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        onClick&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;stopPropagation&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        // form elements&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Standardmäßig rendert der Browser den Dialog erst dann, wenn ihr die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;open&lt;/code&gt;  setzt,
um den Dialog sichtbar zu machen. Empfohlen wird jedoch, die Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.show()&lt;/code&gt; 
oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.showModal()&lt;/code&gt;  zu verwenden, um den Dialog anzuzeigen.&lt;/p&gt;
&lt;p&gt;In meinem Fall will ich einen Modal-Dialog anzeigen, der den Rest der Seite verdeckt. In meiner funktionellen React-Komponente
erzeuge ich eine Referenz auf das HTML-Element mithilfe des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;useRef&lt;/code&gt;  Hooks und öffne den Dialog beim
Klick auf eine Schaltfläche:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; formDialogRef&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; useRef&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;HTMLDialogElement&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; onOpenFormDialogClick&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    formDialogRef&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;current&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;?.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;showModal&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Um den Dialog zu schließen, verwende ich die Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.close()&lt;/code&gt; . Wie meine Demo zeigt, kann auch
ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;form&amp;gt;&lt;/code&gt;  Element den Dialog mithilfe des Attributs &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;method=“dialog”&lt;/code&gt; 
schließen. Beim Abschicken des Formulars wird der Dialog geschlossen und für die Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;returnValue&lt;/code&gt; 
der Wert der Schaltfläche gesetzt, mit der das Formular abgeschickt wurde.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; method&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;dialog&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;styles&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;formField&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; htmlFor&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;favMovie&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Favorite movie:&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;favMovie&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;submit&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        value&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;DIALOG_CONFIRM_VALUE&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        Confirm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;button&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ihr könnt einen &lt;span lang=&quot;en&quot;&gt;Event Listener&lt;/span&gt; für das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;close&lt;/code&gt;  Ereignis des Dialogs
hinzufügen und somit eine Aktion abhängig vom &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;returnValue&lt;/code&gt;  ausführen.&lt;/p&gt;
&lt;h2 id=&quot;den-dialog-und-seinen-hintergrund-stylen&quot;&gt;Den Dialog und seinen Hintergrund stylen&lt;/h2&gt;
&lt;p&gt;Der Modal-Dialog wird standardmäßig zentriert und über dem restlichen Inhalt der Seite platziert. Browser wenden
jeweils ein eigenes Styling auf das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dialog&lt;/code&gt;  Element an, meist einen dicken schwarzen Rahmen.
Mit CSS könnt ihr das Aussehen des Dialogs individuell gestalten. Definiert zum Beispiel einen Schattenwurf und runde
Ecken:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dialog&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.125rem&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; var&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;--border-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border-radius&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4px&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    box-shadow&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;        0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 11px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 15px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; -7px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; #0003&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;        0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 24px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 38px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 3px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; #00000024&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;        0&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 9px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 46px&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 8px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; #0000001f&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    font-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    max-width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;min&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;18rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;90vw&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ein geniales Feature des nativen Dialogs ist das CSS Pseudo-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::backdrop&lt;/code&gt; . Damit könnt
ihr den Bereich hinter dem Modal-Dialog gestalten, etwa indem ihr die restliche Seite abdunkelt und verschwommen macht:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;dialog::backdrop&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;rgba&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;36&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;32&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.5&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    backdrop-filter&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;blur&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.25rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;tastatur--und-mausbedienung&quot;&gt;Tastatur- und Mausbedienung&lt;/h2&gt;
&lt;p&gt;Beim Öffnen des Modal-Dialogs setzt der Browser automatisch den Fokus auf das erste, interaktive Element im Dialog.
Diese Verhaltensweise ist für die meisten Anwendungsfälle passend, etwa bei meinem Formular-Dialog. In manchen
Fällen wäre es jedoch besser, wenn man den Fokus auf den gesamten Dialog oder ein Textelement am Anfang setzen könnte.
Mehr dazu im &lt;a href=&quot;https://github.com/whatwg/html/wiki/dialog--initial-focus,-a-proposal&quot;&gt;Vorschlag für initiale Fokus-Platzierung&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Solange der Modal-Dialog geöffnet ist, können Nutzer:innen mit dem restlichen Inhalt der Seite nicht interagieren. Das
bedeutet, dass Tastaturnutzer:innen den Dialog nicht mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;TAB&lt;/code&gt;  Taste verlassen können. Auch der
virtuelle Cursor des Screenreaders (Pfeiltasten oder Swiping) kann sich nur innerhalb des Dialogs bewegen.&lt;/p&gt;
&lt;p&gt;Der Modal-Dialog kann standardmäßig mit der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;ESC&lt;/code&gt;  Taste geschlossen werden. Nach dem Schließen wird
der Fokus automatisch zurück auf das Bedienelement gesetzt, mit dem der Dialog geöffnet wurde. Davon profitieren Tastatur-
und Screenreader-Nutzer:innen, die sofort an der Stelle weitermachen können, wo sie aufgehört hatten.&lt;/p&gt;
&lt;p&gt;Leider wird das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dialog&lt;/code&gt;  Element nicht automatisch geschlossen, wenn Nutzer:innen außerhalb des Dialogs
klicken. Um dieses Light-Dismiss-Verhalten zu implementieren, können wir die Koordinaten des Klicks mit dem gerenderten Rechteck
des Dialogs vergleichen (danke für die tolle Idee, &lt;a href=&quot;https://blog.logrocket.com/using-the-dialog-element/&quot;&gt;Amit Merchant&lt;/a&gt;):&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; isClickOutsideOfDialog&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;dialogEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; HTMLDialogElement&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MouseEvent&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; boolean&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; rect&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; dialogEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;getBoundingClientRect&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;clientY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; rect&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;top&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;            ||&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;clientY&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; rect&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;bottom&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;            ||&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;clientX&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; rect&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;left&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;            ||&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;clientX&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; rect&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; onFormDialogContainerClick&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;MouseEvent&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; formDialogEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; formDialogRef&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;current&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;formDialogEl&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        isClickOutsideOfDialog&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;formDialogEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    ){&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        formDialogEl&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;close&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;DIALOG_CANCEL_VALUE&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das funktioniert meistens sehr gut. Ein Problem habe ich bei meiner Demo festgestellt: Wenn Nutzer:innen die native
Auswahlliste öffnen, würde der Algorithmus dies als Klick außerhalb des Dialogs werten. Aus diesem Grund habe ich
einen &lt;span lang=&quot;en&quot;&gt;Click Event Listener&lt;/span&gt; für das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;form&lt;/code&gt;  Element registriert und nutze
die Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;.stopPropagation()&lt;/code&gt; .&lt;/p&gt;
&lt;h2 id=&quot;probleme-mit-der-barrierefreiheit-bei-manchen-screenreadern&quot;&gt;Probleme mit der Barrierefreiheit bei manchen Screenreadern&lt;/h2&gt;
&lt;p&gt;Das native &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dialog&lt;/code&gt;  Element funktioniert super mit den meisten Screenreadern und Browsern.
Leider gibt es noch ein paar kleine Probleme, wie die Barrierefreiheits-Tests meiner
&lt;a href=&quot;https://alexlehner86.github.io/fancy-css-playground/#/dialog&quot;&gt;Demo&lt;/a&gt; aufzeigen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows 10, Google Chrome 103.0.5060.114, NVDA 2022.1&lt;/strong&gt;: Wenn der Dialog geöffnet wird und Fokus erhält, liest der
Screenreader die Dialog-Rolle, die Überschrift (dank &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-labelledby&lt;/code&gt; ), den ersten Textabsatz und
die fokussierte Auswahlliste vor. Die Fokus-Reihenfolge und der virtuelle Cursor des Screenreaders wird auf die Inhalte
im Dialog beschränkt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows 10, Firefox 102.0.1, NVDA 2022.1&lt;/strong&gt;: Identisch zu Google Chrome, mit der Ausnahme dass die Schaltfläche, mit
welcher der Dialog geöffnet wurde, Teil der Fokus-Reihenfolge ist. Wahrscheinlich ein Firefox-Bug, der in Zukunft
behoben wird.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Samsung Galaxy S20, Android 12, Google Chrome 103.0.5060.71, TalkBack&lt;/strong&gt;: Der Screenreader liest nur die fokussierte
Auswahlliste vor. Der virtuelle Cursor (z.B. nach rechts wischen) wird auf die Inhalte im Dialog beschränkt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Samsung Galaxy S20, Android 12, Firefox 102.2.1, TalkBack&lt;/strong&gt;: Der Screenreader liest nur die fokussierte Auswahlliste
vor. Der virtuelle Cursor wird nicht auf die Inhalte im Dialog beschränkt. Das hat wahrscheinlich damit zu tun, dass
Firefox immer noch nicht die Eigenschaft &lt;a href=&quot;https://caniuse.com/mdn-api_element_ariamodal&quot;&gt;aria-modal&lt;/a&gt; unterstützt.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iPhone 8, iOS 15.5, Safari, VoiceOver&lt;/strong&gt;: Der Screenreader liest nur die fokussierte Auswahlliste vor. Der virtuelle
Cursor kann auf die Inhalte im Header gesetzt werden, jedoch nicht auf die Inhalte im Hauptinhaltsbereich, der direkt
unter dem Dialog liegt.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;  Element ist einfach zu handhaben und standardmäßig barrierefrei, abgesehen
von kleineren Problemen. Für manche Anwendungsfälle dürfte daher aktuell ein robuster, selbst gebauter Dialog wie
&lt;a href=&quot;https://github.com/KittyGiraudel/a11y-dialog&quot;&gt;a11y-dialog&lt;/a&gt; besser geeignet sind. Ich bin aber optimistisch was die
Zukunft des nativen Elements betrifft.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog&quot;&gt;The Dialog element (MDN)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/whatwg/html/wiki/dialog--initial-focus,-a-proposal&quot;&gt;Dialog initial focus, a proposal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nngroup.com/articles/modal-nonmodal-dialog/&quot;&gt;Modal &amp;amp; Nonmodal Dialogs: When (&amp;amp; When Not) to Use Them&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 07.03.2023 &lt;/h2&gt; 
&lt;p&gt;Die &lt;a href=&quot;https://github.com/whatwg/html/commit/a9f103c9f7bd09ef712990194638c75db1f50e3c&quot;&gt;HTML-Spezifikation hat eine wichtige Aktualisierung&lt;/a&gt;
hinsichtlich des initialen Fokus-Managements erhalten. Es wird möglich sein, dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;dialog&lt;/code&gt;  Element
selbst den Fokus zu geben, wenn es das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;autofocus&lt;/code&gt;  gesetzt hat.&lt;/p&gt;
&lt;p&gt;Sicher, es wird einige Zeit dauern, bis die Browser-Hersteller diese Änderungen umsetzen. Aber es gibt keinen Grund, noch länger
zu warten! Ich sehe es &lt;a href=&quot;https://www.scottohara.me/blog/2023/01/26/use-the-dialog-element.html&quot;&gt;wie Scott O’Hara&lt;/a&gt;: Es ist
an der Zeit, von benutzerdefinierten Dialogen wegzukommen und stattdessen das native Dialog-Element zu verwenden.&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 28.03.2026 &lt;/h2&gt; 
&lt;p&gt;Verwendet das neue &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;closedby&lt;/code&gt;  Attribut anstelle von JavaScript, um Light-Dismiss-Verhalten zu
implementieren. Das Feature sollte bis Ende des Jahres browserübergreifend unterstützt werden. Erfahrt mehr in meinem neuen
Artikel &lt;a href=&quot;/de/blog/dialog-closedby-attribute/&quot;&gt;„Dialoge mit dem closedby-Attribut aufwerten“&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>demo</category><category>dialog</category><category>html</category><category>keyboard</category><category>react</category><category>sreenreader</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_speech_bubbles.jpg" length="0" type="image/jpeg"/></item><item><title>Ein Bild sagt mehr als tausend Worte – außer du bist blind!</title><link>https://www.oidaisdes.org/de/blog/how-not-to-use-images</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/how-not-to-use-images</guid><description>Die Grundlagen für barrierefreie Bilder und welche häufigen Fehler ihr vermeiden solltet.</description><pubDate>Sun, 03 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Visuelle Inhalte sind großartig! Bilder vermitteln Emotionen, beflügeln unsere Fantasie und machen eine
Website ästhetisch ansprechend. Allerdings können viele Menschen Web-Inhalte nicht visuell wahrnehmen.
Blinde und sehbeeinträchtigte Nutzer:innen sind darauf angewiesen, dass Web-Entwickler:innen und
Content-Editor:innen einen Alternativtext bereitstellen.&lt;/p&gt;
&lt;p&gt;Leider gibt es immer noch sehr viele Websites mit Bildern, für die kein Alternativtext gesetzt ist oder deren
Alternativtext irreführend ist. Stellt euch vor, ihr besucht eine Website und statt Fotos und Grafiken seht ihr
nur leere Flächen und verschwommene Bilder. Nervig, oder?&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-aleksandar-pasaric-nothing-to-see.BeawTXrO_Z2rAzkq.webp&quot; srcset=&quot;/_astro/pexels-aleksandar-pasaric-nothing-to-see.BeawTXrO_2cWzNy.webp 640w, /_astro/pexels-aleksandar-pasaric-nothing-to-see.BeawTXrO_10h1a9.webp 750w, /_astro/pexels-aleksandar-pasaric-nothing-to-see.BeawTXrO_Z1Nqfso.webp 828w, /_astro/pexels-aleksandar-pasaric-nothing-to-see.BeawTXrO_Z1B2Dlz.webp 1080w, /_astro/pexels-aleksandar-pasaric-nothing-to-see.BeawTXrO_1I7jBt.webp 1280w, /_astro/pexels-aleksandar-pasaric-nothing-to-see.BeawTXrO_Z2rAzkq.webp 1600w&quot; alt=&quot;Ein dunkler Raum mit Neonlicht-Schrift an der Wand. Der Text lautet: &apos;Nichts zu sehen hier&apos;.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Aleksandar Pasaric / pexels.com&lt;/p&gt;
&lt;p&gt;In diesem Artikel werde ich einige Beispiele für schlechten Alternativtext teilen, auf die ich regelmäßig bei
Barrierefreiheits-Prüfungen stoße. Doch als erstes sehen wir uns die Grundlagen an.&lt;/p&gt;
&lt;h2 id=&quot;die-grundlagen-barrierefreier-bilder&quot;&gt;Die Grundlagen barrierefreier Bilder&lt;/h2&gt;
&lt;p&gt;Meistens verwenden wir das HTML-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;img&lt;/code&gt;  um Bilder auf einer Website anzuzeigen.
Mit dem Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;alt&lt;/code&gt;  können wir einen Alternativtext für das Bild definieren.
Die &lt;a href=&quot;https://html.spec.whatwg.org/#the-img-element&quot;&gt;HTML-Spezifikation&lt;/a&gt; beschreibt das Attribut so:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;alt — Replacement text for use when images are not available&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das bedeutet, dass der Alternativtext auf der Seite angezeigt wird, wenn das Bild z.B. wegen Netzwerkfehlern nicht
geladen werden kann. Natürlich ist der Text noch wichtiger für die Barrierefreiheit. Screenreader lesen den
Alternativtext ihren Nutzer:innen vor, so dass sie wissen, was auf dem Bild zu sehen ist.&lt;/p&gt;
&lt;p&gt;Es gibt noch andere Wege, um Bilder in einer Webseite einzubinden: Etwa mit dem HTML-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;svg&lt;/code&gt; 
oder den CSS-Pseudo-Elementen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:before&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:after&lt;/code&gt; . Um mehr über die
barrierefreie Aufbereitung dieser Elemente zu erfahren, folgt den Links im Abschnitt „Nützliche Links“ unten.&lt;/p&gt;
&lt;h2 id=&quot;den-passenden-alternativtext-formulieren&quot;&gt;Den passenden Alternativtext formulieren&lt;/h2&gt;
&lt;p&gt;Bei allen Bild-Elementen stellt sich dieselbe Frage: Welcher Alternativtext ist für das Bild angemessen? Das hängt
vom Typ des Bildes ab:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Informative Bilder&lt;/strong&gt;: Bilder, die relevante Informationen vermitteln. Die Textalternative sollte die Bedeutung bzw.
die relevanten Details des visuell wahrnehmbaren Inhalts vermitteln.
&lt;ul&gt;
&lt;li&gt;Es gibt &lt;a href=&quot;https://css-tricks.com/just-how-long-should-alt-text-be/&quot;&gt;verschiedene Meinungen&lt;/a&gt; darüber, ob der
Alternativtext aus einem kurzen, prägnanten Satz oder einer detaillierten Beschreibung in mehreren Sätzen bestehen soll.&lt;/li&gt;
&lt;li&gt;Bei komplexen Bildinhalten (z.B. Diagramme) sollte der Alternativtext kurz gehalten werden und auf eine lange
Beschreibung verweisen, die auf das Bild folgt.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dekorative Bilder&lt;/strong&gt;: Bilder, die dem Inhalt einer Seite keine relevanten Informationen hinzufügen. Dies ist etwa bei
Bildern der Fall, die eine Seite nur optisch attraktiver machen sollen. Oder wenn der Informationsgehalt eines Bildes
bereits durch nebenstehenden Text vermittelt wird. Diese Bilder solltet ihr vor assistiven Technologien verbergen,
z.B. indem ihr einen leeren Alternativtext setzt (&lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;alt=&amp;quot;&amp;quot;&lt;/code&gt; ).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Funktionale Bilder&lt;/strong&gt;: Bilder, die in Schaltflächen, Links und anderen interaktiven Elementen verwendet werden. In
diesem Fall sollte der Alternativtext den Zweck des interaktiven Elements vermitteln und nicht das Bild selbst beschreiben.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;meine-persönlichen-top-5-schlechter-alternativtexte&quot;&gt;Meine persönlichen Top 5 schlechter Alternativtexte&lt;/h2&gt;
&lt;p&gt;Bei Barrierefreiheits-Prüfungen von Websites stoße ich regelmäßig auf die immer gleichen Fehler. Hier ist meine
persönliche Liste an Beispielen für miserablen Alternativtext:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Titel in Dauerschleife&lt;/strong&gt;: Eine Artikelvorschau (z.B. im Nachrichten-Karussell) beinhaltet meistens ein
Vorschau-Bild, um den Artikel zu illustrieren. Sehr oft finde ich Alternativtext vor, der nicht den Inhalt des Bildes
beschreibt, sondern den Titel des Artikels wiederholt. Das ist völlig redundant und eine Zeitverschwendung für
Screenreader-Nutzer:innen. Bitte nehmt euch die Zeit, den tatsächlichen Inhalt des Bildes zu beschreiben!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hat der Fotograf ein Selfie gemacht?&lt;/strong&gt; Oft treffe ich auf Fotos, deren Alternativtext die Copyright-Information
beinhaltet. Hat die Fotografin ein Selfie gemacht und ist auf dem Foto zu sehen? Nein? Dann schmeiß den Namen aus dem
Alternativtext raus! Du kannst das Copyright in die sichtbare Bildbeschreibung geben.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Was tut das Ding?&lt;/strong&gt; Ein weiterer häufiger Fehler ist deskriptiver Alternativtext für funktionale Bilder. Stellt
euch eine Icon-Schaltfläche vor, die visuell als nach unten zeigender Pfeil dargestellt wird. Die Schaltfläche ermöglicht
das Herunterladen eines Dokuments, aber der Alternativtext lautet „Pfeil nach unten“. Nicht der beste Weg, um den
Zweck der Schaltfläche zu vermitteln.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ich bin gar nicht da&lt;/strong&gt;: Man nehme ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  Element und packe ein Bild darauf mithilfe der
CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;background-image&lt;/code&gt; . &lt;span lang=&quot;fr&quot;&gt;Et voilà!&lt;/span&gt; Ihr könnt das Bild sehen.
Aber es gibt keine Informationen für assistive Technologien. Screenreader-Nutzer:innen werden gar nicht bemerken, dass
ein Bild zu sehen ist. Oder noch schlimmer: Sie navigieren zu einem Bildlink oder einer Icon-Schaltfläche und erhalten
keine Info über deren Zweck. Danke für nichts!&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reine Faulheit&lt;/strong&gt;: Traurig, aber wahr. Ich treffe immer wieder auf &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;img&lt;/code&gt;  Tags, für die gar
kein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;alt&lt;/code&gt;  Attribut definiert ist. Es gibt einfach keine Beschreibung des Bildes. In diesem Fall
lesen Screenreader häufig den Dateinamen des Bildes vor. Nicht gerade hilfreich, wenn das Bild als „wdkmm12xpY5.png“
beschrieben wird.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Wenn ihr visuelle Inhalte in eine Webseite einbaut, dann stellt euch folgende Fragen: Welchen Zweck erfüllt das Bild?
Ist es rein dekorativ? Falls nicht, definiert einen sinnvollen Alternativtext, der das Bild beschreibt oder den Zweck
des Links oder der Schaltfläche vermittelt.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/tutorials/images/&quot;&gt;W3C Images Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/tutorials/images/decision-tree/&quot;&gt;An alt Decision Tree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/accessible-svgs/&quot;&gt;Accessible SVGs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://adrianroselli.com/2020/10/alternative-text-for-css-generated-content.html&quot;&gt;Alternative Text for CSS Generated Content&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>altText</category><category>html</category><category>images</category><category>mistakes</category><category>svg</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_eye_closeup.jpg" length="0" type="image/jpeg"/></item><item><title>Erstelle eine stylishe, barrierefreie Datei-Auswahl in 3 Schritten</title><link>https://www.oidaisdes.org/de/blog/accessible-file-input</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessible-file-input</guid><description>Lerne wie du das native HTML-Element zur Datei-Auswahl beliebig stylen kannst.</description><pubDate>Tue, 24 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Native HMTL-Elemente sind von Haus aus barrierefrei. Die meisten lassen sich auch beliebig mit CSS stylen – wie ich in
meinem &lt;a href=&quot;/de/blog/styling-accessible-web-forms/&quot;&gt;Artikel über Web-Formulare&lt;/a&gt; gezeigt habe. Das
Element zur Datei-Auswahl zählt leider nicht dazu.&lt;/p&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;input type=“file”&amp;gt;&lt;/code&gt;  Element wird vom Browser als Schaltfläche dargestellt, welche
den Datei-Auswahldialog des Betriebssystems öffnet. Diese Schaltfläche lässt sich gar nicht mit CSS stylen – weder die
Größe und Farbe noch die Schriftart. Aber, kein Grund zu verzweifeln! Ich zeige euch wie es geht.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-anete-lusina-pick-file.BQat4MZA_Z2kaLbb.webp&quot; srcset=&quot;/_astro/pexels-anete-lusina-pick-file.BQat4MZA_IM9Ih.webp 640w, /_astro/pexels-anete-lusina-pick-file.BQat4MZA_62pH7.webp 750w, /_astro/pexels-anete-lusina-pick-file.BQat4MZA_Z1Kvhgx.webp 828w, /_astro/pexels-anete-lusina-pick-file.BQat4MZA_15mxSp.webp 1080w, /_astro/pexels-anete-lusina-pick-file.BQat4MZA_ZGb2jl.webp 1280w, /_astro/pexels-anete-lusina-pick-file.BQat4MZA_Z2kaLbb.webp 1600w&quot; alt=&quot;Eine Person sucht in einer Aktentasche nach einem Dokument.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1068&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Anete Lusina / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;schritt-1-native-html-elemente-verwenden&quot;&gt;Schritt 1: Native HTML-Elemente verwenden&lt;/h2&gt;
&lt;p&gt;Wenn ich ein Web-Formular mit Datei-Auswahl baue, dann sollen alle Nutzer:innen Dateien auswählen und hochladen können.
Dazu zählen auch Menschen, die auf Screenreader oder die Tastaturbedienung angewiesen sind. Aus diesem Grund verwende
ich das native, barrierefreie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;input type=“file”&amp;gt;&lt;/code&gt;  Element. Ich habe eine Demo
mit dem React-Framework erstellt. So sieht mein &lt;a href=&quot;https://reactjs.org/docs/introducing-jsx.html&quot;&gt;JSX-Code&lt;/a&gt; aus:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;jsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; htmlFor&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;filepicker&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; className&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;styles&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;filePicker&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Upload PDF&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;input&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;filepicker&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;file&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        accept&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;.pdf&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        aria-describedby&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;selected-file&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        onChange&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; onFilePickerChange&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;label&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;selected-file&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;selectedFile&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ich verwende ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;label&lt;/code&gt;  Element, das die sichtbare Beschriftung meiner Datei-Auswahl
(“Upload PDF”) sowie das visuell verborgene &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;input&lt;/code&gt;  Element enthält. Auf diese Weise fungiert
das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;label&lt;/code&gt;  Element als sichtbare UI-Komponente, das sich beliebig stylen lässt (mehr dazu in
Schritt 2).&lt;/p&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;p&lt;/code&gt;  Element zeigt den Hinweis an, dass noch keine Datei ausgewählt wurde. Nach der Auswahl einer
Datei zeigt es den Dateinamen (siehe Schritt 3). Dank des Attributs &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-describedby&lt;/code&gt;  wird der
Text auch von Screenreadern vorgelesen, wenn die Nutzer:innen mit der Datei-Auswahl interagieren.&lt;/p&gt;
&lt;p&gt;Ich habe auch versucht, mithilfe von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;aria-hidden=“true”&lt;/code&gt;  den Absatz selbst vor assistiven
Technologien zu verbergen. Da dies bei bestimmten Browser- und Screenreader-Kombinationen zu Problemen führte, habe
ich das Attribut wieder entfernt. Jetzt hören Screenreader-Nutzer:innen den Hinweis möglicherweise zweimal. Das ist
immer noch besser, als ihn gar nicht zu hören.&lt;/p&gt;
&lt;h2 id=&quot;schritt-2-etwas-css-magie-anwenden&quot;&gt;Schritt 2: Etwas CSS-Magie anwenden&lt;/h2&gt;
&lt;p&gt;Als nächstes mache ich das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;input&lt;/code&gt;  Element mit CSS unsichtbar und positioniere es über
dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;label&lt;/code&gt;  Element. Das erlaubt mir, die sichtbare Beschriftung benutzerdefiniert zu gestalten:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.filePicker&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;rgb&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;49&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;92&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    font-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1rem&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    // ... more custom styling&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.filePicker&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; input&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    top&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;100%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    opacity&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Achtet bitte darauf, das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;input type=“file”&amp;gt;&lt;/code&gt;  Element nicht vor assistiven Technologien
zu verbergen. Die Nutzung von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;display: none&lt;/code&gt;  oder das Setzen einer Größe von null Pixel
würde dazu führen, dass Screenreader das Element nicht mehr auffinden können.&lt;/p&gt;
&lt;p&gt;Damit auch sehende Nutzer:innen ein visuelles Feedback erhalten, zeichne ich eine Outline für
das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;label&lt;/code&gt;  Element ein, wenn der Mauszeiger darüber bewegt wird oder wenn das darin
verschachtelte &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;input&lt;/code&gt;  Element fokussiert wird.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.filePicker:focus-within&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt; label&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.filePicker:hover&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; black&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline-offset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2px&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;schritt-3-eine-prise-javascript&quot;&gt;Schritt 3: Eine Prise JavaScript&lt;/h2&gt;
&lt;p&gt;Als letzten Schritt möchte ich den Dateinamen anzeigen, wenn Nutzer:innen eine Datei ausgewählt haben. Zu diesem Zweck
nutz ich das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;change&lt;/code&gt;  Event, das ausgelöst wird, wenn der Eingabewert verändert wird.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; FileUpload&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;FunctionComponent&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;selectedFile&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;setSelectedFile&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; useState&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;No file selected&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; onFilePickerChange&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;ChangeEvent&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;HTMLInputElement&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;&amp;gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; files&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Array&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; ??&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; []);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;            setSelectedFile&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;files&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;].&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        // Only the relevant sections of the JSX code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;file&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;            // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            onChange&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; onFilePickerChange&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; id&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;selected-file&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;selectedFile&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;p&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;        // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Natürlich könnt ihr das auch in reinem JavaScript umsetzen – oder irgendeinem Framework eurer Wahl. Ich liefere euch
nur ein Beispiel für eine Implementierung als React-Komponente. Seht euch den kompletten
&lt;a href=&quot;https://github.com/alexlehner86/fancy-css-playground/tree/main/src/pages/FileUpload&quot;&gt;Quellcode auf GitHub&lt;/a&gt; an.&lt;/p&gt;
&lt;h2 id=&quot;die-perfekte-datei-auswahl-oder&quot;&gt;Die perfekte Datei-Auswahl, oder?&lt;/h2&gt;
&lt;p&gt;Hier seht ihr meine gestylte Datei-Auswahl in Aktion. Probiert es aus! Zum Vergleich habe ich auch ein
unverändertes &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;input type=“file”&amp;gt;&lt;/code&gt;  Element eingebaut.&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/fancy-css-playground/#/fileupload&quot; title=&quot;Demo Gestylte Datei-Auswahl&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Ich bin mit dem Resultat an sich sehr glücklich. Allerdings geht es immer besser. Die Datei-Auswahl lässt sich super
mit der Tastatur bedienen. Auch Screenreader-Nutzer:innen können mit dem Element gut interagieren, wobei es in Kombination
mit gewissen Browsern und Plattformen kleinere Probleme gibt (&lt;a href=&quot;/blog/accessible-file-input/&quot;&gt;siehe englische Version des Artikels&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Vielleicht werden diese Probleme durch zukünftige Updates gelöst. Oder ich finde noch eine bessere Lösung.
Jedenfalls zeigt meine Demo, dass eine barrierefreie, gestylte Datei-Auswahl für Web-Formulare keine Hexerei ist.&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 26.03.2023 &lt;/h2&gt; 
&lt;p&gt;Ich habe mich geirrt: Es gibt tatsächlich eine Möglichkeit, das native &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;input type=“file”&amp;gt;&lt;/code&gt; 
HTML-Element anzupassen. Ihr könnt das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::file-selector-button&lt;/code&gt;  CSS-Pseudoelement verwenden, um die
gerenderte Schaltfläche zu gestalten. Leider könnt ihr den Text, der innerhalb der Schaltfläche gerendert wird, nicht ändern.
Hier findet ihr eine &lt;a href=&quot;https://css-tricks.com/almanac/selectors/f/file-selector-button/&quot;&gt;Demo mit weiteren Informationen&lt;/a&gt; dazu.&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 10.12.2023 &lt;/h2&gt; 
&lt;p&gt;Ich habe den HTML-Code in meinem Beispiel überarbeitet und die Screenreader-Tests mit den aktuellen Browserversionen erneut
durchgeführt.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>forms</category><category>html</category><category>input</category><category>javascript</category><category>screenreader</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_pick_file.jpg" length="0" type="image/jpeg"/></item><item><title>Wie du ein Gespür für digitale Barrierefreiheit entwickelst</title><link>https://www.oidaisdes.org/de/blog/develop-keen-sense-of-accessibility</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/develop-keen-sense-of-accessibility</guid><description>Sich Schritt für Schritt dem Thema annähern und offen für neue Perspektiven sein.</description><pubDate>Sun, 03 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span class=&quot;c-italic&quot;&gt;„Ich würde gerne einen Entwurf für eine Website betrachten können und sofort spüren: Das ist nicht
barrierefrei!“&lt;/span&gt;  – Diesen Wunsch äußerte ein Kollege vor ein paar Tagen. Er arbeitet bereits seit vielen
Jahren als Web-Entwickler, hat aber noch wenig Erfahrung mit digitaler Barrierefreiheit gesammelt.&lt;/p&gt;
&lt;p&gt;Seine Frage brachte mich zum Nachdenken: Was können Neulinge tun, um möglichst schnell ein gutes Gespür für das
Thema zu entwickeln?&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-eren-li-fingers-reading-braille.L9ubwvN6_Z1Bnpjg.webp&quot; srcset=&quot;/_astro/pexels-eren-li-fingers-reading-braille.L9ubwvN6_1lgeC6.webp 640w, /_astro/pexels-eren-li-fingers-reading-braille.L9ubwvN6_ZYsQQ5.webp 750w, /_astro/pexels-eren-li-fingers-reading-braille.L9ubwvN6_Z1ppmPp.webp 828w, /_astro/pexels-eren-li-fingers-reading-braille.L9ubwvN6_1inoXk.webp 1080w, /_astro/pexels-eren-li-fingers-reading-braille.L9ubwvN6_ogfKD.webp 1280w, /_astro/pexels-eren-li-fingers-reading-braille.L9ubwvN6_Z1Bnpjg.webp 1600w&quot; alt=&quot;Finger berühren die Seite eines Buches in Braille-Schrift.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;904&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Eren Li / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;responsives-design-wozu-soll-das-gut-sein&quot;&gt;Responsives Design? Wozu soll das gut sein?&lt;/h2&gt;
&lt;p&gt;Jüngere Kolleg:innen können sich das wohl schwer vorstellen: Es war nicht immer selbstverständlich, dass sich
Web-Inhalte fließend an verschiedene Bildschirmgrößen anpassen. Noch in den Nullerjahren war es üblich, Websites nur
für konkrete Bildschirmgrößen zu optimieren. Eine gute Zusammenfassung bietet der Artikel
&lt;a href=&quot;https://www.freecodecamp.org/news/a-brief-history-of-responsive-web-design/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„A Brief History of Responsive Web Design“&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Erst der Siegeszug des Smartphones brachte ein Umdenken. Nutzer:innen erwarten heute, dass Websites auf allen Geräten
gut aussehen und bedienbar sind. Responsives Design wird explizit als Anforderung für Web-Projekte definiert. UI/UX-Expert:innen
gestalten Entwürfe und Prototypen für verschiedene Bildschirmgrößen. Entwickler:innen testen implementierte Features ganz
selbstverständlich auf Desktop- und Mobilgeräten.&lt;/p&gt;
&lt;p&gt;Was hat das jetzt mit Barrierefreiheit zu tun? Für mich zeigt der Siegeszug von responsivem Design deutlich: Je mehr Menschen
Websites auf eine bestimmte Weise nutzen, desto stärker werden diese Bedürfnisse in der Web-Entwicklung berücksichtigt.&lt;/p&gt;
&lt;h2 id=&quot;barrierefreies-design-wozu-soll-das-gut-sein&quot;&gt;Barrierefreies Design? Wozu soll das gut sein?&lt;/h2&gt;
&lt;p&gt;Die Mehrheit der Web-Nutzer:innen greift zum Smartphone oder zur Maus, um im Internet zu surfen. Sie klicken auf eine
Schaltfläche und registrieren das visuelle Feedback der Seite. Sie sind nicht darauf angewiesen, dass
&lt;a href=&quot;https://www.youtube.com/watch?v=dEbl5jvLKGQ&quot;&gt;ein Screenreader den Web-Inhalt sinnvoll vorlesen kann&lt;/a&gt;
oder &lt;a href=&quot;https://www.youtube.com/watch?v=FvpUNiB-2T0&quot;&gt;interaktive Elemente mit der Tastatur erreichbar&lt;/a&gt; sind.&lt;/p&gt;
&lt;p&gt;Auch Web-Entwickler:innen sind im Grunde nur Nutzer:innen. Ihre alltäglichen Erfahrungen beeinflussen ihre Wahrnehmung,
was eine gute, bedienbare Website ausmacht. Ein Beispiel: Wer noch nie einen Screenreader genutzt hat, kann sich schwer
vorstellen, warum die &lt;a href=&quot;https://www.w3schools.com/html/html5_semantic_elements.asp&quot;&gt;semantische Auszeichnung von Web-Inhalten&lt;/a&gt;
so wichtig ist.&lt;/p&gt;
&lt;p&gt;Das bringt mich zur zentralen Frage zurück: Was können Neulinge tun, um möglichst schnell ein gutes Gespür für das Thema
zu entwickeln? Ganz einfach: &lt;strong&gt;Die Perspektive wechseln!&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;perspektive-von-menschen-mit-behinderung-einnehmen&quot;&gt;Perspektive von Menschen mit Behinderung einnehmen&lt;/h2&gt;
&lt;p&gt;Wenn ihr die Bedürfnisse von Menschen mit Behinderung verstehen wollt, dann fragt sie am besten selbst, wie sie
digitale Inhalte nutzen. Lasst euch von einer blinden oder seh­beeinträchtigten Person zeigen, wie sie mithilfe
eines Screenreaders online einkauft. Sprecht mit einer gehörlosen Person darüber, wie sie Nachrichten
mit Untertiteln oder in Gebärdensprache schaut.&lt;/p&gt;
&lt;p&gt;Falls ihr keine Menschen mit Behinderung kennt, könnt ihr z.B. in eurer Firma einen Workshop organisieren.
Hier kann etwa der &lt;a href=&quot;https://www.blindenverband.at/&quot;&gt;Blinden- und Sehbehindertenverband Österreich&lt;/a&gt; ein
Ansprechpartner sein. Manche Organisationen bieten auch konkrete Trainings an (Beispiel:
&lt;a href=&quot;https://www.myability.org/loesungen/disability-trainings/sensing-journey&quot;&gt;Sensing Journey von myAbility&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id=&quot;übung-macht-den-meister&quot;&gt;Übung macht den Meister&lt;/h2&gt;
&lt;p&gt;Als Web-Entwickler:in ist man laufend mit neuen Anforderungen konfrontiert, die aus der rasanten, technischen
Entwicklung resultieren. Deshalb haben wir das Prinzip &lt;span lang=&quot;en&quot;&gt;„Learning by Doing“&lt;/span&gt; verinnerlicht.
Diese Herangehensweise hilft uns auch beim Thema digitale Barrierefreiheit: Einfach mal machen!&lt;/p&gt;
&lt;p&gt;Ein guter Startpunkt sind aus meiner Sicht die
&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/quickref/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„Web Content Accessibility Guidelines“ (WCAG)&lt;/span&gt;&lt;/a&gt;, die für
den öffentlichen Bereich in allen EU-Mitgliedsstaaten bereits rechtlich vorgeschrieben sind. Die WCAG decken eine große
Bandbreite an Bedürfnissen verschiedener Nutzer:innengruppen ab. Sie bieten sehr ausführliche Online-Ressourcen, mit
konkreten Beispielen für barrierefreie Implementierungen sowie häufige Fehler.&lt;/p&gt;
&lt;p&gt;Mein Tipp: Die meisten Web-Inhalte können allein mit semantischem HTML und CSS barrierefrei aufbereitet werden.
Oft stoße ich auf Websites, die exzessiv &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/Accessibility/ARIA&quot;&gt;ARIA-Attribute&lt;/a&gt;
einsetzen und damit mehr Barrieren erzeugen als sie beseitigen. Sinnvoll ist der Einsatz von ARIA bei komplexen
UI-Komponenten, wie die &lt;a href=&quot;https://www.w3.org/TR/wai-aria-practices-1.1/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;WAI-ARIA Authoring Practices&lt;/span&gt;&lt;/a&gt;
veranschaulichen.&lt;/p&gt;
&lt;h2 id=&quot;lass-dir-zeit&quot;&gt;Lass dir Zeit&lt;/h2&gt;
&lt;p&gt;Das Thema digitale Barrierefreiheit ist komplex und vielschichtig. Das bedeutet für Neulinge eine steile Lernkurve und
viel Frustpotential. Ihr solltet euch Schritt für Schritt dem Thema annähern und offen für neue Perspektiven sein. Dann
entwickelt ihr das richtige Gespür mit der Zeit ganz von allein.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>design</category><category>disabilities</category><category>html</category><category>ux</category><category>wcag</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_fingers_braille.jpg" length="0" type="image/jpeg"/></item><item><title>Barrierefreie und interaktive Diagramme mit Angular und Highcharts</title><link>https://www.oidaisdes.org/de/blog/accessible-interactive-charts</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/accessible-interactive-charts</guid><description>Wie du Highcharts Event-Handling mit Angulars auf Komponenten basierter Architektur verbindest.</description><pubDate>Sun, 13 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Säulen- und Liniendiagramme müssen nicht langweilig und statisch sein. Moderne JavaScript-Bibliotheken
ermöglichen das Erstellen von animierten, interaktiven und barrierefreien Diagrammen.&lt;/p&gt;
&lt;p&gt;Ich bin ein großer Fan von &lt;a href=&quot;https://www.highcharts.com/&quot;&gt;Highcharts&lt;/a&gt;, einer JavaScript-Bibliothek für
SVG-basierte Diagramme. Es gibt mehrere Bibliotheken, welche Highcharts in die auf Komponenten basierte
Architektur von React und Angular integrieren. In meiner Demo-App zeige ich dir, wie du auch das Event-Handling
von Highcharts mit Angular-Komponenten verbinden kannst.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-lukas-charts-on-paper.BMu0f3mY_N3ntE.webp&quot; srcset=&quot;/_astro/pexels-lukas-charts-on-paper.BMu0f3mY_Z1zCHFe.webp 640w, /_astro/pexels-lukas-charts-on-paper.BMu0f3mY_18TTtM.webp 750w, /_astro/pexels-lukas-charts-on-paper.BMu0f3mY_ZO2Rzs.webp 828w, /_astro/pexels-lukas-charts-on-paper.BMu0f3mY_Z1sl5TB.webp 1080w, /_astro/pexels-lukas-charts-on-paper.BMu0f3mY_2qymeF.webp 1280w, /_astro/pexels-lukas-charts-on-paper.BMu0f3mY_N3ntE.webp 1600w&quot; alt=&quot;Ein Kugelschreiber zeigt auf ein Blatt Papier mit Säulen- und Liniendiagrammen.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1060&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Lukas / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;demo-app-auswahl-eines-tabs-wenn-eine-säule-im-diagramm-geklickt-wird&quot;&gt;Demo App: Auswahl eines Tabs, wenn eine Säule im Diagramm geklickt wird&lt;/h2&gt;
&lt;p&gt;Meine Demo-App basiert auf Angular 13, Highcharts und &lt;a href=&quot;https://www.npmjs.com/package/highcharts-angular&quot;&gt;highcharts-angular&lt;/a&gt;,
einer minimalen Bibliothek, die Highcharts für Angular kapselt. Ein Säulendiagramm zeigt die Nutzung primärer
Desktop-Screenreader. Mehrere Tabs bieten zusätzliche Informationen zu den Screenreadern. Wenn eine Säule im Diagramm
geklickt wird, wird das zugehörige Tab ausgewählt. Probiere es aus:&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/highcharts-event-mgmt-in-angular/&quot; title=&quot;Demo Page Highcharts/Angular Event Management&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Also, wie habe ich das geschafft?&lt;/p&gt;
&lt;h3 id=&quot;schritt-1-diagramm-optionen-definieren-und-das-diagramm-rendern&quot;&gt;Schritt 1: Diagramm-Optionen definieren und das Diagramm rendern&lt;/h3&gt;
&lt;p&gt;Die Highcharts-Bibliothek ist extrem praktisch. Du definierst einfach deine Diagramm-Optionen und Highcharts erledigt
den Rest. In meiner Demo-App habe ich ein Diagramm mit zwei Säulenreihen definiert:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; EXAMPLE_CHART&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Highcharts&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Options&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    series:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            data:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Jaws&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;53.7&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Nvda&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;30.7&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;VoiceOver&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;6.5&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ZoomTextFusion&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4.7&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Other&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;4.4&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            name:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;Worldwide&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            type:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;column&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            data:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Jaws&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;40.2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;                [&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Nvda&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;41.6&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            name:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;Europe&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            type:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;column&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    subtitle:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        text:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    title:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        text:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;Primary desktop/laptop screen reader (2021)&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    xAxis:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        categories:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Jaws&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Nvda&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;VoiceOver&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;ZoomTextFusion&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Other&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    yAxis:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        title:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;            text:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;Usage in percent&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dann stelle ich in der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;AppComponent&lt;/code&gt;  die Diagramm-Optionen und die Highcharts-Bibliothek bereit:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Highcharts&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;highcharts&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;@&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;Component&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    selector:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;app-root&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    templateUrl:&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; &amp;#39;./app.component.html&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    styleUrls:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;./app.component.scss&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; AppComponent&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; chartOptions&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; EXAMPLE_CHART&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; highchartsLib&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; Highcharts&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Als letztes übergebe ich im HTML-Template die Bibliothek und die Diagramm-Optionen an
die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;highcharts-chart&amp;gt;&lt;/code&gt;  Komponente:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;highcharts-chart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    [Highcharts]&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;highchartsLib&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    [options]&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;chartOptions&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    (chartInstance)&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;addCustomPropertiesToChart($event)&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;highcharts-chart&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;schritt-2-benutzerdefinierte-eigenschaften-der-diagramm-instanz-hinzufügen&quot;&gt;Schritt 2: Benutzerdefinierte Eigenschaften der Diagramm-Instanz hinzufügen&lt;/h3&gt;
&lt;p&gt;Die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;highcharts-chart&amp;gt;&lt;/code&gt;  Komponente stellt die
Ausgabe-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;chartInstance&lt;/code&gt;  bereit. Über diese erhalten wir die
Instanz des Diagramms, nachdem dieses erstellt wurde. Dieser Instanz fügen wir eine Funktion als
benutzerdefinierte Eigenschaft hinzu:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; addCustomPropertiesToChart&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;chartInstance&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Highcharts&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;Chart&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;): &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;chartInstance&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MyExampleChart&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;onSeriesPointClick&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;selectScreenreaderTab&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;Chart&lt;/code&gt;  Interface von Highcharts kennt keine Methode
namens &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;onSeriesPointClick&lt;/code&gt; . Deshalb definieren wir ein eigenes Interface,
welches diese benutzerdefinierte Eigenschaft hinzufügt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; interface&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MyExampleChart&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; extends&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; Highcharts&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt;Chart&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;    onSeriesPointClick&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nun bietet unsere Diagramm-Instanz eine Methode an, die direkt mit der Eltern-Komponente des Diagramms
verknüpft ist. Ein &lt;span lang=&quot;en&quot;&gt;Event Handler&lt;/span&gt; des Diagramms kann diese Methode aufrufen, um
zum Beispiel zu kommunizieren, dass ein konkreter Datenpunkt angeklickt worden ist.&lt;/p&gt;
&lt;h3 id=&quot;schritt-3-die-benutzerdefinierte-methode-in-einem-event-handler-aufrufen&quot;&gt;Schritt 3: Die benutzerdefinierte Methode in einem &lt;span lang=&quot;en&quot;&gt;Event Handler&lt;/span&gt; aufrufen&lt;/h3&gt;
&lt;p&gt;Mithilfe der Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;plotOptions&lt;/code&gt;  in den Diagramm-Optionen definieren wir
einen &lt;span lang=&quot;en&quot;&gt;Click Event Handler&lt;/span&gt; für
&lt;a href=&quot;https://api.highcharts.com/highcharts/plotOptions.series.point.events.click&quot;&gt;alle Datenpunkte&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;click: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; chart&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;series&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;chart&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; MyExampleChart&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    chart&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;onSeriesPointClick&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color:#C586C0&quot;&gt; as&lt;/span&gt;&lt;span style=&quot;color:#4EC9B0&quot;&gt; ScreenreaderName&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Der &lt;span lang=&quot;en&quot;&gt;Event Handler&lt;/span&gt; holt sich die Diagramm-Instanz, die unserem benutzerdefinierten
Interface &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;MyExampleChart&lt;/code&gt;  entspricht. Nun können wir die benutzerdefinierte
Methode &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;onSeriesPointClick&lt;/code&gt;  aufrufen und somit das zum Datenpunkt gehörige
Screenreader-Tab in der Applikation auswählen.&lt;/p&gt;
&lt;h3 id=&quot;schritt-4-mache-dein-diagramm-barrierefrei&quot;&gt;Schritt 4: Mache dein Diagramm barrierefrei&lt;/h3&gt;
&lt;p&gt;Highcharts bietet großartige Features für mehr Barrierefreiheit an. Du kannst etwa Farben als
&lt;a href=&quot;https://www.highcharts.com/docs/chart-design-and-style/pattern-fills&quot;&gt;Musterfüllungen&lt;/a&gt; definieren. Das hilft besonders
Menschen mit eingeschränktem Farbsehen. Diese profitieren davon, wenn durch Farbe vermittelte Informationen auch auf
andere visuelle Weise verfügbar sind.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;color: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    pattern: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        backgroundColor: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;#96dbe7&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        color: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;#080e38&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        height: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        path: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;M 0 0 L 10 10 M 9 - 1 L 11 1 M - 1 9 L 1 11&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;        width: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;},&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Mithilfe der Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;linkedDescription&lt;/code&gt;  kannst du das Diagramm mit einem
HTML-Element verknüpfen, das den Inhalt des Diagramms beschreibt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;accessibility: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    enabled: &lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    linkedDescription: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;#highcharts-description-1&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;},&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;fazit&quot;&gt;Fazit&lt;/h2&gt;
&lt;p&gt;Kombiniere Angular und Highcharts, um wunderschöne, barrierefreie Diagramme mit minimalem Aufwand zu gestalten.
Mithilfe von benutzerdefinierten Eigenschaften kannst du das &lt;span lang=&quot;en&quot;&gt;Event Handling&lt;/span&gt; von
Highcharts mit der auf Komponenten basierten Architektur von Angular verbinden, um noch interaktivere
Nutzer:innen-Erlebnisse zu erschaffen.&lt;/p&gt;
&lt;h2 id=&quot;ressourcen&quot;&gt;Ressourcen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://alexlehner86.github.io/highcharts-event-mgmt-in-angular/&quot;&gt;Die Live-Demo “Highcharts Event Management In Angular”&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/alexlehner86/highcharts-event-mgmt-in-angular&quot;&gt;Quellcode der Demo-App auf Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/highcharts&quot;&gt;Highcharts-Bibliothek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/highcharts-angular&quot;&gt;Highcharts-Angular-Bibliothek&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>angular</category><category>charts</category><category>demo</category><category>highcharts</category><category>javascript</category><category>typescript</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_charts_on_paper.jpg" length="0" type="image/jpeg"/></item><item><title>Barrierefreie Web-Formulare mit individuellem Design gestalten</title><link>https://www.oidaisdes.org/de/blog/styling-accessible-web-forms</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/styling-accessible-web-forms</guid><description>Style native Formularelemente mit CSS, um barrierefreie Web-Formulare mit konsistentem Look zu gestalten.</description><pubDate>Sat, 26 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;HTML ist von Haus aus barrierefrei. Zumindest wenn du native Elemente verwendest. Sehr oft implementieren
Entwickler:innen benutzerdefinierte UI-Komponenten für Formulare, um Design-Anforderungen zu erfüllen.
Dabei bleibt die Barrierefreiheit meist auf der Strecke.&lt;/p&gt;
&lt;p&gt;In diesem Artikel zeige ich dir, wie du native Formularelemente mit CSS individuell stylen kannst. Auf diese
Weise kannst du barrierefreie Web-Formulare mit einem konsistenten Look über alle Plattformen gestalten.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-steve-johnson-paint-brush.RNpWKU3z_ZSwFXj.webp&quot; srcset=&quot;/_astro/pexels-steve-johnson-paint-brush.RNpWKU3z_1QawjL.webp 640w, /_astro/pexels-steve-johnson-paint-brush.RNpWKU3z_Z2qKR0Y.webp 750w, /_astro/pexels-steve-johnson-paint-brush.RNpWKU3z_ZKbWxo.webp 828w, /_astro/pexels-steve-johnson-paint-brush.RNpWKU3z_RWi4t.webp 1080w, /_astro/pexels-steve-johnson-paint-brush.RNpWKU3z_2jhH1I.webp 1280w, /_astro/pexels-steve-johnson-paint-brush.RNpWKU3z_ZSwFXj.webp 1600w&quot; alt=&quot;Pinsel und Malspachtel auf einer bunt bemalten Leinwand.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Steve Johnson / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;wenn-design-anforderungen-die-barrierefreiheit-zerstören&quot;&gt;Wenn Design-Anforderungen die Barrierefreiheit zerstören&lt;/h2&gt;
&lt;p&gt;Native Formularelemente wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;input&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;select&lt;/code&gt;  sind
grundsätzlich barrierefrei. Sie erhalten den Fokus, wenn Nutzer:innen die Tab-Taste drücken. Sie ermöglichen
die Interaktion mit der Enter- oder Leertaste, z.B. um eine Checkbox anzuhaken. Und sie kommunizieren ihre
Rolle und ihren aktuellen Status an Screenreader.&lt;/p&gt;
&lt;p&gt;Klingt super! Wer würde jemals auf die verrückte Idee kommen, statt der nativen Formularelemente eigene
UI-Komponenten mit nicht-semantischem Spaghetti-Code zu implementieren? Wie wir leider alle wissen,
sind benutzerdefinierte Formularelemente weit verbreitet. Meistens sind sie nicht barrierefrei. Sehen wir
uns folgendes Beispiel für eine selbstgebaute Auswahlliste an:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;custom-select&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;select-trigger&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;PlayStation 5&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;arrow&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;custom-options&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;option selected&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;            PlayStation 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;option&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Nintendo Switch&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;option&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Xbox Series X&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;span&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dieser wilde Haufen von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;div&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;span&lt;/code&gt;  Tags ist an sich
nicht barrierefrei für Tastatur- und Screenreader-Nutzer:innen. Natürlich lässt sich das mit ARIA-Attributen
und &lt;span lang=&quot;en&quot;&gt;Keydown Event Listeners&lt;/span&gt; beheben. Doch vielen Entwickler:innen fehlt entweder dieses
Wissen oder es ist ihnen schlichtweg egal. Für sie zählt vor allem eines: Die Formularelemente entsprechend
der Design-Anforderungen der Kund:innen zu gestalten.&lt;/p&gt;
&lt;h2 id=&quot;warum-das-styling-von-nativen-elementen-herausfordernd-sein-kann&quot;&gt;Warum das Styling von nativen Elementen herausfordernd sein kann&lt;/h2&gt;
&lt;p&gt;Das Styling von Formularelementen mit CSS war in der Vergangenheit oft schwierig. Browser wenden jeweils ihr
eigenes Standard-Styling an. Formularelemente unterscheiden sich stark darin, wie einfach ihr Aussehen mit CSS
angepasst werden kann. Glücklicherweise werden immer mehr veraltete Browser ausgemustert (Stichwort: IE11),
weshalb man ohne Probleme auf neue Features moderner Browser zurückgreifen kann.&lt;/p&gt;
&lt;p&gt;Mozilla hat einen tollen Artikel über das
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/Forms/Styling_web_forms&quot;&gt;Styling von Web-Formularen&lt;/a&gt;
verfasst, den ihr unbedingt lesen solltet. Sie unterteilen native Formularelemente in drei Gruppen: „Die Guten“,
„Die Bösen“ und „Das Hässliche“. Ich stimme großteils mit dem Artikel überein, mit Ausnahme der Einschätzung,
dass Checkboxen und Radio-Buttons schwer zu stylen wären. Das war vielleicht in der Vergangenheit so, trifft
aber heute nicht mehr zu. Mit modernem CSS sind der Fantasie keine Grenzen gesetzt.&lt;/p&gt;
&lt;h2 id=&quot;styling-beispiel-1-radio-buttons&quot;&gt;Styling-Beispiel 1: Radio-Buttons&lt;/h2&gt;
&lt;p&gt;Um Radio-Buttons mit CSS umzugestalten, müsst ihr zuerst für die CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;appearance&lt;/code&gt; 
den Wert &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;none&lt;/code&gt;  setzen. Damit entfernt ihr das Standard-Styling des Browsers bzw.
Betriebssystems. Nun könnt ihr euch kreativ austoben und sogar Zustands-Änderungen animieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;radio&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;] {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    -webkit-appearance&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    appearance&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    box-sizing&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;border-box&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.4em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1.4em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.15rem&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; darkred&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border-radius&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;50%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;radio&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;::before&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;absolute&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    top&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;50%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    left&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;50%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    content&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    width&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.7em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    height&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.7em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border-radius&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;50%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;darkred&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* scale(0) hides the dot in unchecked state */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-50%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-50%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform-origin&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;center&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0.3s&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; ease-in&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color:#D4D4D4&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;radio&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:checked::before&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transform&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;translate&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-50%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;-50%&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;scale&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    transition&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt; 0.3s&lt;/span&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt; cubic-bezier&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.25&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.25&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.56&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In meinem Beispiel werden Radio-Buttons im nicht ausgewählten Zustand als dunkelroter Kreis dargestellt.
Mithilfe des Pseudo-Elements &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;::before&lt;/code&gt;  und der Pseudo-Klasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:checked&lt;/code&gt; 
wird ein dunkelroter Punkt angezeigt, wenn der Radio-Button ausgewählt wird. Probiere es selbst in meiner
&lt;a href=&quot;https://codepen.io/alexlehner86/pen/mdqGLxZ&quot;&gt;Demo auf CodePen&lt;/a&gt; aus.&lt;/p&gt;
&lt;h2 id=&quot;styling-beispiel-2-select&quot;&gt;Styling-Beispiel 2: Select&lt;/h2&gt;
&lt;p&gt;Das HTML-Element &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;select&lt;/code&gt;  zählt zur Kategorie „Das Hässliche“. Die
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/Forms/Advanced_form_styling#what_can_be_done_about_the_ugly_elements&quot;&gt;Formularelemente in dieser Gruppe&lt;/a&gt;
sind problematisch, da sie von Browsern auf sehr unterschiedliche Weise dargestellt werden. Du kannst
sie zu einem gewissen Grad gestalten, doch einzelne Bestandteile entziehen sich völlig dem Zugriff von CSS.&lt;/p&gt;
&lt;p&gt;Mit der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;appearance&lt;/code&gt;  kannst du das Standard-Styling des &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;select&lt;/code&gt; 
Elements grundsätzlich überschreiben. Das hat jedoch keine Auswirkungen auf die Optionen-Liste, die beim Klick auf das
Element eingeblendet wird. Das Styling des HTML-Elements &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;option&lt;/code&gt;  mit CSS ist stark eingeschränkt
und wird nur von wenigen Browsern unterstützt.&lt;/p&gt;
&lt;p&gt;Meiner Meinung nach sind die Styling-Möglichkeiten aber ausreichend, um grundlegende Design-Anforderungen (Farbe, Schriftart
etc.) zu erfüllen. In meiner &lt;a href=&quot;https://codepen.io/alexlehner86/pen/mdqGLxZ&quot;&gt;Demo auf CodePen&lt;/a&gt; habe ich folgendes Styling
angewandt:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;select&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    -webkit-appearance&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    appearance&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    box-sizing&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;border-box&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-color&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;white&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-image&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#DCDCAA&quot;&gt;        url&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;#39;/assets/custom_arrow_for_select.svg&amp;#39;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-position&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-repeat&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;no-repeat&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    background-size&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    border&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.25rem&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; darkred&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    padding&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;0.25em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;    /* Leave enough space for the arrow on the right */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    padding-right&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2em&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;natives-html-ist-immer-besser&quot;&gt;Natives HTML ist immer besser&lt;/h2&gt;
&lt;p&gt;Mit diesem Artikel wollte ich folgendes zeigen: Wenn du die Wahl zwischen nativem HTML und benutzerdefinierten
Formularelementen hast, dann entscheide dich für native HTML-Elemente. Sie sind von Haus aus barrierefrei und
können ausreichend mit CSS gestylt werden.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>design</category><category>forms</category><category>html</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_paint_brush.jpg" length="0" type="image/jpeg"/></item><item><title>Raus mit der Sprache! Bestimme wie Screenreader Text vorlesen sollen</title><link>https://www.oidaisdes.org/de/blog/spell-it-out-screen-reader</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/spell-it-out-screen-reader</guid><description>Verwende die CSS-Eigenschaft speak-as, um Screenreadern mitzuteilen, wie sie Zahlen und Abkürzungen lesen sollen.</description><pubDate>Sun, 13 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Zahlen, Abkürzungen und Gleichungen können für Screenreader-Nutzer:innen eine Herausforderung darstellen.
Mit der CSS-Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;speak-as&lt;/code&gt;  kannst du bestimmen, wie Text vorgelesen werden soll.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_1wVGnY.webp&quot; srcset=&quot;/_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_Z2p6vgj.webp 640w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_Z5JGJK.webp 750w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_Z5mTMC.webp 828w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_Z1jTfWC.webp 1080w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_ZgEpoJ.webp 1280w, /_astro/pexels-edmond-dantes-megaphone.DFdg2kJG_1wVGnY.webp 1600w&quot; alt=&quot;Eine Frau spricht in ein Megaphon.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Edmond Dantès / pexels.com*&lt;/p&gt;
&lt;h2 id=&quot;buchstabieren-oder-nicht-buchstabieren-das-ist-hier-die-frage&quot;&gt;Buchstabieren oder nicht buchstabieren, das ist hier die Frage&lt;/h2&gt;
&lt;p&gt;Vor einigen Tagen habe ich einen Kunden aus der Bankenbranche beraten. Sie möchten ihre Website für
Screenreader-Nutzer:innen optimieren. Eine Frage lautete: Wie können wir den Screenreader dazu bringen,
eine Zahl immer Ziffer für Ziffer vorzulesen? Zum Beispiel eine Kontonummer mit 12 oder mehr Stellen?&lt;/p&gt;
&lt;p&gt;In vielen Fällen sagen Screenreader statt der einzelnen Ziffern die ganze Zahl an. Beispielsweise wird 9100 als
„neuntausend einhundert“ anstelle von „neun eins null null“ vorgelesen. Ähnliche Probleme können bei Abkürzungen
oder Gleichungen auftreten. Es läuft alles auf die
&lt;a href=&quot;https://www.deque.com/blog/dont-screen-readers-read-whats-screen-part-1-punctuation-typographic-symbols/&quot;&gt;inhärente Heuristik des Screenreaders&lt;/a&gt;
hinaus. Diese bestimmt, wie gewisse Abfolgen von Buchstaben und Satzzeichen vorgelesen werden.&lt;/p&gt;
&lt;p&gt;Wäre es nicht großartig, wenn wir dem Screenreader einfach sagen könnten, wie er bestimmte Inhalte lesen soll?
Die Antwort lautet: Ja, das geht! Aber die Browserunterstützung ist leider schlecht.&lt;/p&gt;
&lt;h2 id=&quot;die-css-eigenschaft-speak-as&quot;&gt;Die CSS-Eigenschaft &lt;span lang=&quot;en&quot;&gt;speak-as&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;Das &lt;a href=&quot;https://www.w3.org/TR/css-speech-1/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;CSS Speech Module&lt;/span&gt;&lt;/a&gt; definiert die
Eigenschaft &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;speak-as&lt;/code&gt; . Sie bestimmt, auf welche Weise Text akustisch wiedergegeben wird,
basierend auf einer vordefinierten Liste von Möglichkeiten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong lang=&quot;en&quot;&gt;normal&lt;/strong&gt;: Verwendet die sprachabhängigen Ausspracheregeln des Browsers (Standard).&lt;/li&gt;
&lt;li&gt;&lt;strong lang=&quot;en&quot;&gt;spell-out&lt;/strong&gt;: Weist den Browser an, den Text zu buchstabieren (nützlich für Akronyme und Abkürzungen).&lt;/li&gt;
&lt;li&gt;&lt;strong lang=&quot;en&quot;&gt;digits&lt;/strong&gt;: Zahlen werden Ziffer für Ziffer vorgelesen. Zum Beispiel: 9100 als „neun eins null null“.&lt;/li&gt;
&lt;li&gt;&lt;strong lang=&quot;en&quot;&gt;literal-punctuation&lt;/strong&gt;: Satzzeichen (wie Semikolons, Klammern usw.) werden vorgelesen anstatt sie wie Pausen zu behandeln.&lt;/li&gt;
&lt;li&gt;&lt;strong lang=&quot;en&quot;&gt;no-punctuation&lt;/strong&gt;: Satzzeichen werden ignoriert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mithilfe dieser CSS-Eigenschaft könnten wir etwa eine Klasse für Kontonummern wie folgt definieren:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;.bank-account-number&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    speak-as&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;digits&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;browser--und-screenreader-unterstützung&quot;&gt;Browser- und Screenreader-Unterstützung&lt;/h2&gt;
&lt;p&gt;In der Theorie klingt das alles großartig. Leider funktioniert es mit den meisten Browsern und Screenreadern nicht. Ich habe
eine &lt;a href=&quot;https://codepen.io/alexlehner86/pen/OJOMmzm&quot;&gt;Demo auf CodePen&lt;/a&gt; zusammengestellt und die folgenden Szenarien getestet:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;NVDA 2021.3.1, Google Chrome 98.0.4758.82, Windows 10&lt;/li&gt;
&lt;li&gt;TalkBack, Firefox 97.1.0, Android 12&lt;/li&gt;
&lt;li&gt;VoiceOver, Safari 15, iOS 15.1&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Von den dreien leistet nur VoiceOver tolle Arbeit und liest den Inhalt gemäß dem Wert der &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;speak-as&lt;/code&gt; 
Eigenschaft vor. NVDA und TalkBack ignorieren es vollständig.&lt;/p&gt;
&lt;p&gt;In Anbetracht der Tatsache, dass das &lt;span lang=&quot;en&quot;&gt;CSS Speech Module&lt;/span&gt; vor über 10 Jahren geschrieben wurde,
bin ich von der aktuellen Situation sehr enttäuscht. Ich hoffe, dass in Zukunft weitere Browser und Screenreader
dieses Feature unterstützen werden!&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>screenreader</category><category>speech</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_megaphone.jpg" length="0" type="image/jpeg"/></item><item><title>3 unterschätzte HTML-Elemente, die einfach großartig sind</title><link>https://www.oidaisdes.org/de/blog/3-underrated-awesome-html-elements</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/3-underrated-awesome-html-elements</guid><description>Nutze die Elemente time, picture und dl für maschinenlesbare Daten, schnelleres Laden von Bildern und mehr Barrierefreiheit.</description><pubDate>Sat, 05 Feb 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wusstest du, dass es über 100 verschiedene HTML-Elemente gibt? Einige davon
wie &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;p&amp;gt;&lt;/code&gt;  oder &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 
sind uns allen geläufig. Doch viele Elemente fristen ein Nischendasein. Manche Web-Entwickler:innen
wissen nicht mal von ihrer Existenz.&lt;/p&gt;
&lt;p&gt;Aus diesem Grund möchte ich in diesem Artikel drei unterschätzte HTML-Elemente vor den Vorhang
holen: &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;time&amp;gt;&lt;/code&gt; , &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dl&amp;gt;&lt;/code&gt; .&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-olya-kobruseva-calendar.BYzGUoEm_Z1AJz6Q.webp&quot; srcset=&quot;/_astro/pexels-olya-kobruseva-calendar.BYzGUoEm_1bjtLN.webp 640w, /_astro/pexels-olya-kobruseva-calendar.BYzGUoEm_ZbUT5q.webp 750w, /_astro/pexels-olya-kobruseva-calendar.BYzGUoEm_Zby78i.webp 828w, /_astro/pexels-olya-kobruseva-calendar.BYzGUoEm_BABlt.webp 1080w, /_astro/pexels-olya-kobruseva-calendar.BYzGUoEm_ZCOyOJ.webp 1280w, /_astro/pexels-olya-kobruseva-calendar.BYzGUoEm_Z1AJz6Q.webp 1600w&quot; alt=&quot;Ein Tischkalender, der den Monat Jänner zeigt. Auf dem Kalender liegt eine Brille.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1068&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Olya Kobruseva / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;das-time-element-maschinenlesbare-datum--und-zeitangaben&quot;&gt;Das time-Element: Maschinenlesbare Datum- und Zeitangaben&lt;/h2&gt;
&lt;p&gt;Das &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Element/time&quot;&gt;HTML-Element&lt;/a&gt; &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;time&amp;gt;&lt;/code&gt; 
repräsentiert einen konkreten Zeitpunkt, Datum oder Zeitraum. Zusammen mit dem Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;datetime&lt;/code&gt; 
wird die Zeitangabe maschinenlesbar. Wozu das gut ist? Hier ein Beispiel:&lt;/p&gt;
&lt;iframe title=&quot;Code-Beispiel für die Verwendung des time-Elements&quot; src=&quot;https://codepen.io/alexlehner86/embed/GROjOjZ?default-tab=result&quot; loading=&quot;lazy&quot; allowtransparency=&quot;true&quot;&gt;&lt;p&gt;Öffne das Code-Beispiel &lt;a href=&quot;https://codepen.io/alexlehner86/pen/GROjOjZ&quot; lang=&quot;en&quot;&gt;
time element German&lt;/a&gt; von Alexander Lehner (&lt;a href=&quot;https://codepen.io/alexlehner86&quot;&gt;@alexlehner86&lt;/a&gt;)
auf &lt;a href=&quot;https://codepen.io&quot; lang=&quot;en&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;&lt;/iframe&gt;
&lt;p&gt;Das Beispiel enthält drei Termine, deren Datum jeweils im Stil eines Abreißkalenders dargestellt wird. Vielleicht
denkst du jetzt: Oida, das erklärt sich eh von selbst! Zusammen mit der Überschrift „Termine 2022“ ist doch klar,
welches Datum gemeint ist.&lt;/p&gt;
&lt;p&gt;Sehende werden wohl tatsächlich kein Problem mit dieser Darstellung des Datums haben. Anders die Situation für
blinde oder sehbeeinträchtigte Nutzer:innen. Wenn der Screenreader “mär vier” oder “jul acht” vorliest, wird
das verwirrend sein. Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;time&amp;gt;&lt;/code&gt;  Element sorgt hier für Klarheit.&lt;/p&gt;
&lt;p&gt;Leider unterstützen noch nicht alle gängigen Screenreader das Element.
&lt;a href=&quot;https://de.wikipedia.org/wiki/VoiceOver&quot;&gt;&lt;span lang=&quot;en&quot;&gt;VoiceOver&lt;/span&gt;&lt;/a&gt; liest das im &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;datetime&lt;/code&gt; 
Attribut definierte Datum korrekt vor (getestet mit einem iPhone 8, iOS 15, Safari). Mit den Screenreadern NVDA und TalkBack
funktioniert das leider derzeit nicht.&lt;/p&gt;
&lt;h2 id=&quot;das-picture-element-bilder-in-der-passenden-größe-laden&quot;&gt;Das picture-Element: Bilder in der passenden Größe laden&lt;/h2&gt;
&lt;p&gt;Das &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Element/picture&quot;&gt;HTML-Element&lt;/a&gt; &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;picture&amp;gt;&lt;/code&gt; 
ist ein Container, der zur Angabe mehrerer Quellen für ein Bild dient. Es muss ein &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;img&amp;gt;&lt;/code&gt; 
Element und kann mehrere &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;source&amp;gt;&lt;/code&gt;  Elemente enthalten. Damit kannst du das Bild für verschiedene
Bildschirmauflösungen und Browser optimieren. Schauen wir uns ein Beispiel an:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;picture&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; srcset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;cat_lg.avif&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;image/avif&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; media&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;(min-width: 60rem)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; srcset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;cat_md.avif&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;image/avif&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; srcset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;cat_lg.webp&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;image/webp&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; media&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;(min-width: 60rem)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; srcset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;cat_md.webp&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;image/webp&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; srcset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;cat_lg.jpg&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; media&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;(min-width: 60rem)&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;img&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;cat_md.jpg&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; alt&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;An adorable cat&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; loading&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;lazy&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt; decoding&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;async&amp;quot;&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;picture&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;type&lt;/code&gt;  erlaubt die Angabe des MIME-Typs der im Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;srcset&lt;/code&gt; 
angegebenen Ressource. Das erste &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;source&amp;gt;&lt;/code&gt;  Element im Beispiel oben verweist auf ein Bild im
neuen &lt;a href=&quot;https://de.wikipedia.org/wiki/AV1_Image_File_Format&quot;&gt;AVIF-Format&lt;/a&gt;. Wenn der Browser AVIF-Bilder wiedergeben kann,
wählt er diese Bilddatei. Andernfalls geht es weiter zum nächsten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;source&amp;gt;&lt;/code&gt;  Element.&lt;/p&gt;
&lt;p&gt;Auf diese Weise können moderne Browser, die das AVIF- oder &lt;a href=&quot;https://de.wikipedia.org/wiki/WebP&quot;&gt;WebP-Format&lt;/a&gt; unterstützen,
ein stark komprimiertes Bild in hoher Qualität laden. Ältere Browser können hingegen auf die JPG-Version des Bildes zurückgreifen.&lt;/p&gt;
&lt;p&gt;Das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;media&lt;/code&gt;  erlaubt die Angabe einer Media-Query, die der Browser auswertet. Im Beispiel sagen
wir dem Browser, das größere Bild zu verwenden, wenn die Bildschirmbreite mindestens 60 rem beträgt. Wenn eine Media-Query
nicht zutrifft, geht es ebenfalls weiter zum nächsten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;source&amp;gt;&lt;/code&gt;  Element.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-ihsan-adityawarman-sleeping-cat.FMWrRJKL_Z5SlGI.webp&quot; srcset=&quot;/_astro/pexels-ihsan-adityawarman-sleeping-cat.FMWrRJKL_1K1oh9.webp 640w, /_astro/pexels-ihsan-adityawarman-sleeping-cat.FMWrRJKL_ZGSWE4.webp 750w, /_astro/pexels-ihsan-adityawarman-sleeping-cat.FMWrRJKL_Z1f3Elr.webp 828w, /_astro/pexels-ihsan-adityawarman-sleeping-cat.FMWrRJKL_ZUcyqj.webp 1080w, /_astro/pexels-ihsan-adityawarman-sleeping-cat.FMWrRJKL_1fgekr.webp 1280w, /_astro/pexels-ihsan-adityawarman-sleeping-cat.FMWrRJKL_Z5SlGI.webp 1600w&quot; alt=&quot;Eine schlafende Katze mit schwarz-grauem Fell.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Ihsan Adityawarman / pexels.com&lt;/p&gt;
&lt;p&gt;Eine weitere Möglichkeit zur Bildoptimierung bietet das Attribut &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;srcset&lt;/code&gt; . Dieses kannst du auch
direkt mit dem &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;img&amp;gt;&lt;/code&gt;  Element verwenden, wie das süße Katzenfoto oben zeigt. Dessen
HTML-Code sieht ungefähr so aus:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;img&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    srcset&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;cat-480w.jpg 480w, cat-800w.jpg 800w&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    sizes&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;(max-width: 600px) 480px, 800px&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    src&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;cat-800w.jpg&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    alt&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;&amp;quot;Eine schlafende Katze mit schwarz-grauem Fell.&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;srcset&lt;/code&gt;  Attribut definiert eine Reihe von Bildern, aus denen der Browser wählen kann,
sowie die Größe der Bilder. Das &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;sizes&lt;/code&gt;  Attribut definiert eine Reihe von Bedingungen
(z.B. Bildschirmbreite) und gibt an, welche Bildgröße der Browser wählen sollte, wenn eine bestimmte Media-Query zutrifft.&lt;/p&gt;
&lt;p&gt;Wenn ihr noch tiefer in das Thema einsteigen wollt, kann ich folgende Artikel empfehlen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Learn/HTML/Multimedia_and_embedding/Responsive_images&quot;&gt;&lt;span lang=&quot;en&quot;&gt;Responsive Images (MDN Web Docs)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/learn/design/picture-element/&quot;&gt;&lt;span lang=&quot;en&quot;&gt;The picture element (web.dev)&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;schlüssel-wert-paare-mit-dl-dt-und-dd-auszeichnen&quot;&gt;Schlüssel-Wert-Paare mit dl, dt und dd auszeichnen&lt;/h2&gt;
&lt;p&gt;Listen zählen zu den grundlegenden Bausteinen in HTML. Jede:r Web-Entwickler:in kennt die
HTML-Elemente &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;  und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;ol&amp;gt;&lt;/code&gt;  für
&lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Element/ul&quot;&gt;ungeordnete&lt;/a&gt;
und &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Element/ol&quot;&gt;geordnete Listen&lt;/a&gt;.
Doch wenige sind mit ihrem nahen Verwandten &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dl&amp;gt;&lt;/code&gt;  vertraut.&lt;/p&gt;
&lt;p&gt;Diese sogenannte &lt;a href=&quot;https://developer.mozilla.org/de/docs/Web/HTML/Element/dl&quot;&gt;&lt;span lang=&quot;en&quot;&gt;Description List&lt;/span&gt;&lt;/a&gt;
umfasst eine Liste an Begriffen und Beschreibungen, die mit den HTML-Elementen &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dt&amp;gt;&lt;/code&gt; 
und &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;dd&amp;gt;&lt;/code&gt;  definiert werden. Üblicherweise wird es zur Anzeige eines Glossars oder von
Metadaten (also einer Liste von Schlüssel-Wert-Paaren) genutzt.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dl&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Kontoinhaber&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Martina Musterfrau&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Bankinstitut&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;Musterbank&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;IBAN&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dt&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;AT12 3456 7891 2345 6789&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dd&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color:#569CD6&quot;&gt;dl&lt;/span&gt;&lt;span style=&quot;color:#808080&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Was macht das Element in meinen Augen so großartig? Erraten! Es macht den Inhalt barrierefrei für Screenreader
zugänglich. Doch auch Web-Entwickler:innen profitieren davon. Stell dir das Beispiel oben als eine
Abfolge von &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;&amp;lt;div&amp;gt;&lt;/code&gt;  Elementen vor und überlege, in welchen Code du dich schneller
einlesen und zurechtfinden könntest. &lt;strong&gt;Semantisches HTML macht Code lesbarer!&lt;/strong&gt;&lt;/p&gt;</content:encoded><category>html</category><category>images</category><category>seo</category><category>time</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_calendar.jpg" length="0" type="image/jpeg"/></item><item><title>Licht aus! Wie blinde Menschen im Internet surfen</title><link>https://www.oidaisdes.org/de/blog/lights-off-how-blind-users-navigate</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/lights-off-how-blind-users-navigate</guid><description>Wie fühlt es sich an, blind zu sein? Färbe alles schwarz und erlebe das Web wie blinde Nutzer:innen.</description><pubDate>Sat, 29 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Wie fühlt es sich an, blind zu sein? Wie kann man auf einer Website navigieren und den Inhalt lesen?
Meine Demo-Seite „Komm auf die dunkle Seite“ ermöglicht es, alles schwarz zu färben und das Web wie
blinde Nutzer:innen zu erleben.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-victor-freitas-eye-closeup.BhU32UfC_1tDegJ.webp&quot; srcset=&quot;/_astro/pexels-victor-freitas-eye-closeup.BhU32UfC_18jEX7.webp 640w, /_astro/pexels-victor-freitas-eye-closeup.BhU32UfC_Z1Mt1PQ.webp 750w, /_astro/pexels-victor-freitas-eye-closeup.BhU32UfC_1fzJKh.webp 828w, /_astro/pexels-victor-freitas-eye-closeup.BhU32UfC_Z1mTWNq.webp 1080w, /_astro/pexels-victor-freitas-eye-closeup.BhU32UfC_ijbwB.webp 1280w, /_astro/pexels-victor-freitas-eye-closeup.BhU32UfC_1tDegJ.webp 1600w&quot; alt=&quot;Nahaufnahme eines menschlichen Auges.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Victor Freitas / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;22-milliarden-menschen-sind-sehbeeinträchtigt&quot;&gt;2,2 Milliarden Menschen sind sehbeeinträchtigt&lt;/h2&gt;
&lt;p&gt;Laut dem &lt;a href=&quot;https://www.who.int/publications/i/item/9789241516570&quot;&gt;&lt;span lang=&quot;en&quot;&gt;„World report on vision 2019“&lt;/span&gt;&lt;/a&gt;
sind weltweit etwa 2,2 Milliarden Menschen blind oder sehbeeinträchtigt. Viele von ihnen verwenden einen
Screenreader, um im Internet zu surfen.&lt;/p&gt;
&lt;p&gt;Sehenden Menschen fällt es oft schwer, wirklich zu verstehen, was das bedeutet: Kein visueller Input, sich
nur auf das auditive Feedback des Screenreaders verlassen müssen.&lt;/p&gt;
&lt;p&gt;Da ich ein neugieriger Mensch bin, habe ich eine Demo-Seite zusammengestellt, auf der du erleben kannst,
wie sich das Web für blinde Nutzer:innen anfühlt. Mein Ziel ist es, dass Menschen selbst nachvollziehen
können, wie wichtig barrierefreie Web-Inhalte für blinde Menschen sind.&lt;/p&gt;
&lt;h2 id=&quot;komm-auf-die-dunkle-seite&quot;&gt;Komm auf die dunkle Seite&lt;/h2&gt;
&lt;p&gt;Ich habe meine &lt;a href=&quot;https://alexlehner86.github.io/come-to-the-dark-side/home?lang=de&quot;&gt;Demo-Seite&lt;/a&gt; unten eingebunden.
Aktiviere einfach deinen Screenreader und färbe über den „Licht aus“-Schalter in der Kopfzeile alles schwarz.&lt;/p&gt;
&lt;iframe src=&quot;https://alexlehner86.github.io/come-to-the-dark-side/home?lang=de&quot; title=&quot;Demo: Komm auf die dunkle Seite&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Ich freue mich auf dein Feedback! Schreib mir einfach auf &lt;a href=&quot;https://tech.lgbt/@alex86&quot;&gt;Mastodon&lt;/a&gt;.&lt;/p&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 09.04.2022 &lt;/h2&gt; 
&lt;p&gt;Ich habe meine Demo-Seite nun zweisprachig gestaltet und die deutschsprachige Version hier im Artikel
eingebunden und verlinkt.&lt;/p&gt;</content:encoded><category>accessibility</category><category>blind</category><category>demo</category><category>screenreader</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_eye_closeup.jpg" length="0" type="image/jpeg"/></item><item><title>Gestalte deutlich sichtbaren Tastaturfokus mit :focus-visible</title><link>https://www.oidaisdes.org/de/blog/highly-visible-keyboard-focus</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/highly-visible-keyboard-focus</guid><description>Schickes Design oder Barrierefreiheit? Mit der CSS-Pseudoklasse :focus-visible könnt ihr sowohl Tastatur-User als auch eure Kunden zufriedenstellen.</description><pubDate>Sat, 22 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Schickes Design oder Barrierefreiheit? Mit der CSS-Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-visible&lt;/code&gt;  könnt
ihr sowohl Tastaturnutzer:innen unterstützen als auch ästhetisch anspruchsvolle Kund:innen zufriedenstellen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-cottonbro-keyboard.S0lQaG98_ZWJYFF.webp&quot; srcset=&quot;/_astro/pexels-cottonbro-keyboard.S0lQaG98_ZWudMY.webp 640w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_HnbJ1.webp 750w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_ZlgvEo.webp 828w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_Z27NIX3.webp 1080w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_5c0oj.webp 1280w, /_astro/pexels-cottonbro-keyboard.S0lQaG98_ZWJYFF.webp 1600w&quot; alt=&quot;Nahaufnahme von Händen einer Person, die auf einer Laptop-Tastatur schreibt.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1067&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © cottonbro / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;die-bedeutung-des-tastaturfokus&quot;&gt;Die Bedeutung des Tastaturfokus&lt;/h2&gt;
&lt;p&gt;Ein zentrales Merkmal von barrierefreien Websites ist die Möglichkeit, sie alleine mit der Tastatur zu bedienen.
Davon profitieren etwa Nutzer:innen mit motorischen Einschränkungen, die keine Maus verwenden können.
Damit sie sinnvoll durch den Inhalt navigieren können, muss das aktuell fokussierte Element einen deutlich erkennbaren,
&lt;a href=&quot;https://www.barrierefreies-webdesign.de/richtlinien/wcag-2.1/erfolgskriterien/fokus-sichtbar.html&quot;&gt;visuellen Fokus-Indikator&lt;/a&gt; erhalten.&lt;/p&gt;
&lt;p&gt;Browser definieren einen &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Techniques/general/G149&quot;&gt;Standard-Fokusrahmen&lt;/a&gt;, um die
Sichtbarkeit des Tastaturfokus zu gewährleisten. Das Aussehen des Fokus-Indikators kann mithilfe der
CSS-Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus&lt;/code&gt;  geändert werden. Zum Beispiel:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button:focus&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; purple&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;design-versus-barrierefreiheit&quot;&gt;Design versus Barrierefreiheit&lt;/h2&gt;
&lt;p&gt;Nun wird der Fokus-Indikator nicht nur bei der Navigation mit der Tastatur eingeblendet, sondern auch dann,
wenn Nutzer:innen ein fokussierbares Element mit der Maus anklicken oder am Handy mit dem Finger berühren.
Für manche Nutzer:innen ist diese visuelle Änderung unerwartet und irritierend. Ihnen ist nicht bewusst,
dass der Fokus-Indikator zur Barrierefreiheit beiträgt.&lt;/p&gt;
&lt;p&gt;Oft sind Web-Entwickler:innen daher mit Kund:innen oder Grafik-Designer:innen konfrontiert, welche die Entfernung
des Fokus-Indikators aus ästhetischen Gründen fordern. Zahlreiche Websites enthalten daher CSS-Regeln wie diese:&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button:focus&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bitte tut das nicht! Ihr würdet damit Nutzer:innen, die auf die Tastaturbedienung angewiesen sind, von der
Nutzung eurer Website ausschließen.&lt;/p&gt;
&lt;h2 id=&quot;die-lösung-heißt-focus-visible&quot;&gt;Die Lösung heißt :focus-visible&lt;/h2&gt;
&lt;p&gt;Es gibt eine Möglichkeit, Design und Barrierefreiheit zu versöhnen: Die Pseudoklasse &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-visible&lt;/code&gt; .
Die &lt;a href=&quot;https://www.w3.org/TR/selectors-4/#the-focus-visible-pseudo&quot;&gt;Spezifikation&lt;/a&gt; dazu lautet:&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;The :focus-visible pseudo-class applies while an element matches the :focus pseudo-class and
the user agent determines via heuristics that the focus should be made evident on the element.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Das bedeutet: Der Fokus-Indikator wird nur eingeblendet, wenn er gebraucht wird. Also wenn ein Element fokussiert
wird und der Browser den visuellen Indikator für notwendig erachtet (z.B. bei Navigation mit der Tastatur).&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Fokus-Indikator verbergen, wenn dieser nicht benötigt wird. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button:focus:not&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:focus-visible&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Fokus-Indikator bei Navigation mit Tastatur einblenden. */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button:focus-visible&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; purple&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Auf diese Weise könnt ihr das Fokus-Verhalten etwa für Schaltflächen und Links präzise steuern.
Manche Elemente wie Eingabefelder erhalten jedoch weiterhin bei einem Mausklick den Fokus-Indikator,
da das Anklicken die Eingabe per Tastatur aktiviert und somit eine Tastaturbedienung gegeben ist.
Mit meiner &lt;a href=&quot;https://alexlehner86.github.io/fancy-css-playground/#/a11yfeatures&quot;&gt;Demo&lt;/a&gt; könnt ihr selbst
das Verhalten testen.&lt;/p&gt;
&lt;h2 id=&quot;browser-unterstützung&quot;&gt;Browser-Unterstützung&lt;/h2&gt;
&lt;p&gt;Das Feature wird bereits von den &lt;a href=&quot;https://caniuse.com/css-focus-visible&quot;&gt;meisten modernen Browsern unterstützt&lt;/a&gt;.
Auch Safari unterstützt &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-visible&lt;/code&gt;  seit
der &lt;a href=&quot;https://developer.apple.com/documentation/safari-release-notes/safari-15_4-release-notes&quot;&gt;Version 15.4&lt;/a&gt;.
Wer auf Nummer sicher gehen will, kann einen regulären Fokus-Indikator definieren und diesen für Browser,
die &lt;code class=&quot;c-code&quot; lang=&quot;en&quot;&gt;:focus-visible&lt;/code&gt;  unterstützen, überschreiben.&lt;/p&gt;
&lt;pre class=&quot;astro-code slack-dark&quot; style=&quot;background-color:#222222;color:#E6E6E6;overflow-x:auto&quot; tabindex=&quot;0&quot; data-language=&quot;css&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Regulärer Fokus-Indikator für ältere Browser */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;button:focus&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;    outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; purple&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A9955&quot;&gt;/* Für Browser, die :focus-visible unterstützen */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C586C0&quot;&gt;@supports&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; (:focus-visible) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    button:focus:not&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;:focus-visible&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt;none&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D7BA7D&quot;&gt;    button:focus-visible&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#9CDCFE&quot;&gt;        outline&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#B5CEA8&quot;&gt;2px&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; solid&lt;/span&gt;&lt;span style=&quot;color:#CE9178&quot;&gt; purple&lt;/span&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E6E6E6&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://access4all.ch/blog/2012/07/sichtbarkeit-des-tastaturfokus-auf-webseiten/&quot;&gt;Sichtbarkeit des Tastaturfokus auf Websites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/focus-visible.html&quot;&gt;WCAG 2.1 Erfolgskriterium 2.4.7 Fokus sichtbar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance-minimum.html&quot;&gt;WCAG 2.2 Erfolgskriterium 2.4.11: Fokus-Darstellung (Minimum)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible&quot;&gt;MDN-Eintrag zu :focus-visible&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 class=&quot;post-update-title&quot;&gt; &lt;span aria-hidden=&quot;true&quot;&gt;&amp;raquo;&amp;nbsp;&lt;/span&gt;Update am 14.04.2022 &lt;/h2&gt; 
&lt;p&gt;Artikel wurde hinsichtlich Safari 15.4 aktualisiert.&lt;/p&gt;</content:encoded><category>accessibility</category><category>css</category><category>design</category><category>focusIndicator</category><category>keyboard</category><category>wcag</category><category>web</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_keyboard.jpg" length="0" type="image/jpeg"/></item><item><title>5 Tipps für den Einstieg in Barrierefreiheits-Prüfungen mit dem Screenreader</title><link>https://www.oidaisdes.org/de/blog/a11y-audits-screenreader</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/a11y-audits-screenreader</guid><description>Wie dir der Einstieg in die Prüfung mit Screenreadern gelingt und welche Tastaturbefehle und Gesten dir das Leben leichter machen.</description><pubDate>Sat, 15 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Aller Anfang ist schwer: Wie dir der Einstieg in die Prüfung mit Screenreadern gelingt
und welche Tastaturbefehle und Gesten dir das Leben leichter machen.&lt;/p&gt;
&lt;img src=&quot;/_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_2KOwy.webp&quot; srcset=&quot;/_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_2cBSYI.webp 640w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_Z2u04mc.webp 750w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_wFhz6.webp 828w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_1jOAML.webp 1080w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_2jFsiu.webp 1280w, /_astro/pexels-kampus-finger-tap-smartphone.B_6wqSgx_2KOwy.webp 1600w&quot; alt=&quot;Eine Frau berührt den Bildschirm eines Smartphones mit ihrem Zeigefinger.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;1068&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Kampus Production / pexels.com&lt;/p&gt;
&lt;h2 id=&quot;mein-erstes-mal&quot;&gt;Mein erstes Mal&lt;/h2&gt;
&lt;p&gt;Als ich vor drei Jahren das erste Mal einen Screenreader am Laptop aktivierte, wurde ich kurz panisch.
Eine roboterhafte Stimme begann in hohem Tempo auf mich einzureden. Intuitiv versuchte ich das Gehörte
mit dem, was ich am Bildschirm sah, abzugleichen – und scheiterte kläglich. Stress pur!&lt;/p&gt;
&lt;p&gt;Gerade für sehende Menschen kann die Nutzung eines Screenreaders zu Beginn verwirrend sein. Etwa für
Web-Entwickler:innen, die ein frisch implementiertes Feature auf Barrierefreiheit prüfen möchten.
Oder für Tester:innen, die eine Applikation aus der Perspekte von Blinden und stark Sehbeeinträchtigten
testen. Daher möchte ich ein paar Tipps teilen, wie der Einstieg leichter fallen kann.&lt;/p&gt;
&lt;img src=&quot;/_astro/iphone-voiceover-settings.5UW1NgW4_Z2wo1HG.webp&quot; srcset=&quot;/_astro/iphone-voiceover-settings.5UW1NgW4_Z2rCtdq.webp 640w, /_astro/iphone-voiceover-settings.5UW1NgW4_Z1GsGAN.webp 750w, /_astro/iphone-voiceover-settings.5UW1NgW4_17J7F1.webp 828w, /_astro/iphone-voiceover-settings.5UW1NgW4_ZSGDpN.webp 1080w, /_astro/iphone-voiceover-settings.5UW1NgW4_1SvSyK.webp 1280w, /_astro/iphone-voiceover-settings.5UW1NgW4_Z2wo1HG.webp 1600w&quot; alt=&quot;Einstellungs-Menü am iPhone für den Screenreader VoiceOver.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; style=&quot;--fit: cover; --pos: center;&quot; data-astro-image=&quot;constrained&quot; width=&quot;1600&quot; height=&quot;900&quot;&gt;
&lt;p class=&quot;copyright&quot;&gt;Foto: © Alexander Lehner&lt;/p&gt;
&lt;h2 id=&quot;tipps-für-den-einstieg&quot;&gt;Tipps für den Einstieg&lt;/h2&gt;
&lt;p&gt;Für Desktop-Geräte unter Windows kann ich den kostenfreien Screenreader &lt;a href=&quot;https://www.nvaccess.org/&quot;&gt;NVDA&lt;/a&gt; empfehlen.
Auf Apple-Geräten wie z.B. einem iPhone ist der Screenreader &lt;a href=&quot;https://de.wikipedia.org/wiki/VoiceOver&quot;&gt;VoiceOver&lt;/a&gt;
bereits vorinstalliert. Das Pendant auf Android-Geräten heißt &lt;a href=&quot;https://support.google.com/accessibility/android/answer/6283677?hl=de&quot;&gt;TalkBack&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Wo ist die Stopp-Taste?&lt;/strong&gt; Jeder Screenreader bietet eine Möglichkeit, das Vorlesen zu unterbrechen.
Zum Beispiel, bei VoiceOver einfach mit zwei Fingern auf eine beliebige Stelle am Bildschirm tippen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Nicht so schnell!&lt;/strong&gt; Geübte Screenreader-Nutzer:innen lassen sich Text in doppelter oder noch höherer
Geschwindigkeit vorlesen. Gerade zu Beginn solltet ihr das Sprechtempo drosseln und euren individuellen
Bedürfnissen anpassen. Bei NVDA kann man z.B. in den Optionen unter „Sprachausgabe“ die Geschwindigkeit
mit einem Schieberegler einstellen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Passende Stimme wählen&lt;/strong&gt;: Wählt in den Einstellungen des Screenreaders eine Stimme aus, die ihr als
möglichst angenehm empfindet. Meistens gibt es mehrere männliche und weibliche Stimmen zur Auswahl.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gesten und Tastaturbefehle&lt;/strong&gt;: Alle gängigen Screenreader bieten eine Vielzahl an Gesten und Tastaturbefehlen,
mit denen man konkrete Aktionen schneller ausführen kann. Wenn ihr etwa bei aktiviertem TalkBack mit drei Fingern
nach links oder rechts wischt, könnt ihr einen Navigationsmodus auswählen (z.B. Überschriften). Dann mit einem Finger
nach oben oder unten wischen, um zum vorherigen oder nächsten Element dieser Art zu springen. Damit kannst du u.a.
schnell überprüfen, ob Elemente semantisch korrekt implementiert wurden.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Zu Befehl!&lt;/strong&gt; Findet heraus, wie ihr den Screenreader am schnellsten ein- und ausschaltet. NVDA lässt sich
standardmäßig mit der Tastenkombination STRG + ALT + N starten und mit EINFG + Q ausschalten. Am iPhone müsst ihr
in den Einstellungen unter „Bedienungshilfen“ explizit VoiceOver als Kurzbefehl festlegen. Dann könnt ihr durch
dreifaches Drücken der Home-Taste den Screenreader ein- und ausschalten.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Am wichtigsten ist, dass du dir ausreichend Zeit lässt. Immer daran denken: Übung macht den Meister.&lt;/p&gt;
&lt;h2 id=&quot;nützliche-links&quot;&gt;Nützliche Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.nvaccess.org/files/nvda/documentation/userGuide.html&quot;&gt;NVDA User Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dequeuniversity.com/screenreaders/nvda-keyboard-shortcuts&quot;&gt;NVDA Tastaturbefehle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/de-at/guide/iphone/iph3e2e2281/ios&quot;&gt;VoiceOver-Gesten&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/accessibility/android/answer/6151827?hl=de&quot;&gt;TalkBack-Gesten&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>audit</category><category>NVDA</category><category>screenreader</category><category>TalkBack</category><category>VoiceOver</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_finger_tap_smartphone.jpg" length="0" type="image/jpeg"/></item><item><title>Erste Schritte zu mehr Barrierefreiheit</title><link>https://www.oidaisdes.org/de/blog/get-started-with-a11y</link><guid isPermaLink="true">https://www.oidaisdes.org/de/blog/get-started-with-a11y</guid><description>Erhöhe die Barrierefreiheit deiner Website oder App mit hohem Farbkontrast, semantischem Markup und Untertitel.</description><pubDate>Fri, 14 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ja ich weiß, das Thema Barrierefreiheit kann abschreckend wirken. Vor allem, wenn du den ersten Blick auf die Fülle
an &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/quickref/&quot;&gt;WCAG-Kriterien&lt;/a&gt; und verfügbaren Ressourcen wirfst.&lt;/p&gt;
&lt;p&gt;Mein Rat: Erstmal tief durchatmen! Wähle ein Thema, das dich interessiert (z. B. semantisches Markup), und verbessere
zumindest eine Sache auf deiner Website oder App. Barrierefreiheit ist kein „Alles-oder-Nichts“-Thema!
Jede einzelne Verbesserung zählt.&lt;/p&gt;
&lt;h2 id=&quot;wo-anfangen&quot;&gt;Wo anfangen?&lt;/h2&gt;
&lt;p&gt;Hier ist eine Liste an Verbesserungen, die du zuerst bei deiner Website oder App vornehmen kannst:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Überprüfe den Farbkontrast von Text, grafischen Elementen und UI-Komponenten.&lt;/strong&gt; Ein hoher Farbkontrast hilft vor allem älteren
Menschen, die &lt;a href=&quot;https://eldertech.org/color-in-designing-technology-for-seniors/&quot;&gt;Muster mit niedrigem Kontrast schlechter erkennen können&lt;/a&gt;.
Beachte folgende WCAG-Kriterien: &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html&quot;&gt;1.4.3 Kontrast (Minimum)&lt;/a&gt; und
&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/non-text-contrast.html&quot;&gt;1.4.11: Nicht-Text-Kontrast&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bediene deine Website nur mithilfe der Tastatur.&lt;/strong&gt; Kannst du über die Tab-Taste zu allen interaktiven Elementen navigieren?
Prüfe, ob die Elemente mit dem richtigen semantischen Markup (z. B. Schaltflächen- und Link-Tags) implementiert wurden.
Navigiere auf dem Smartphone mit dem Screenreader per Wischbewegung und prüfe, ob interaktive Elemente richtig erkannt und aktiviert
werden können. Beachte folgende WCAG-Kriterien: &lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/keyboard.html&quot;&gt;2.1.1: Tastatur&lt;/a&gt; and
&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/name-role-value.html&quot;&gt;4.1.2: Name, Rolle, Wert&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Haben deine Videos eine Untertitelspur?&lt;/strong&gt; Untertitel ermöglichen gehörlosen und schwerhörigen Personen das Ansehen
von Videos. Gleichzeitig profitieren alle, die sich in einer Situation befinden, in der sie den Ton nicht anhören können
(z. B. in einer überfüllten U-Bahn ohne Kopfhörer). Beachte folgende WCAG-Kriterien:
&lt;a href=&quot;https://www.w3.org/WAI/WCAG21/Understanding/captions-prerecorded.html&quot;&gt;1.2.2: Untertitel (aufgezeichnet)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>accessibility</category><category>captions</category><category>color</category><category>contrast</category><category>keyboard</category><category>video</category><category>wcag</category><enclosure url="https://www.oidaisdes.org/sharing/social_sharing_woman_in_wheelchair.jpg" length="0" type="image/jpeg"/></item></channel></rss>