einsiedler: Icon Flyout / slidern ähnlich wie bei meiner Navigation

0 54

Icon Flyout / slidern ähnlich wie bei meiner Navigation

einsiedler
  • css
  • html
  • meinung
  1. 0
    Rolf B
    1. 0
      einsiedler
      1. 0
        Rolf B
        1. 1
          Gunnar Bittersmann
          • javascript
        2. 0
          einsiedler
          1. 1
            Rolf B
            1. 0
              einsiedler
              1. 1
                Rolf B
                1. 0
                  einsiedler
                  1. 0
                    Rolf B
                    1. 0
                      einsiedler
                      1. 0
                        Rolf B
              2. 1
                Gunnar Bittersmann
                • html
                1. 0
                  einsiedler
            2. 0
              einsiedler
              1. 0
                einsiedler
            3. 0
              einsiedler
              1. 0
                Rolf B
                1. 0
                  einsiedler
                  1. 0
                    Rolf B
                    1. 0
                      einsiedler
                      1. 0
                        Rolf B
                        1. 1
                          Gunnar Bittersmann
                          • javascript
                          1. 2
                            Rolf B
                            1. 1
                              Gunnar Bittersmann
                              1. 0
                                einsiedler
                                1. 0
                                  einsiedler
                                  1. 1
                                    Rolf B
                                    1. 0
                                      einsiedler
                                      1. 0
                                        Rolf B
                                      2. 1
                                        Rolf B
                                        1. 0
                                          einsiedler
                                          1. 0
                                            Rolf B
                                            1. 0
                                              Gunnar Bittersmann
                                              • css
                                              • javascript
                                              1. 1
                                                Rolf B
                                                1. 1
                                                  Gunnar Bittersmann
                                                  • html
                                                  • javascript
                                                  1. 0
                                                    einsiedler
                                                    1. 0
                                                      Gunnar Bittersmann
                                                      • javascript
                                                      1. 0
                                                        einsiedler
                                                        1. 1
                                                          Auge
                                                          • browser
                                                          • css
                                                          • editor
                                                          1. 0
                                                            Gunnar Bittersmann
                                                            1. 0
                                                              Auge
                                                              1. 0
                                                                JürgenB
                                                                1. 0
                                                                  Auge
                                                                  1. 0
                                                                    JürgenB
                                                          2. 0
                                                            einsiedler
                                                            1. 1
                                                              Auge
                                                              • css
                                                              • editor
                                                              1. 0

                                                                Lighting vs. Lightning

                                                                Der Martin
                                                                • rechtschreibung
                                          2. 0
                                            Nico R.
                                            1. 0
                                              Rolf B
                                            2. 0
                                              einsiedler
                                              1. 0
                                                Nico R.
      2. 1
        Rolf B

Hallo Leute,

webscreen

Mein Testentwurf gibt es hier: Misanthrop bei Bplaced

Ich möchte das SVG - Icon oben genauso animieren wie das Menü darunter.

ICON - Flyout

<div id="icon-nav-span" class="icon-span">
					<nav id="icon-nav" class="site-navigation" tabindex="-1">
						<!--  <button id="icon-toggle" aria-expanded="false" aria-controls="menu"></button> -->
						<span class="main-headline-span">
							<a class="sitelink-title-tagline" href="http://misanthrop.bplaced.net/test/open-public__july24/entwurf_14-04-25.html">						
								<h1>
									maxmustermann.eu
								</h1>
							</a>
						</span>
					</nav>
</div>

Nun habe ich da nun das Problem das sich die beiden !Menüs! einander ins Gehege kommen.

Navigation - Flyout

<div id="navi-span">
			<nav id="main-nav" class="site-navigation" tabindex="-1">
				<button id="toggle" aria-expanded="false" aria-controls="menu"></button>
				<ul>
					<li><a aria-current="page" class='menu nav-highlight' href='#'>Aktuelles</a></li>
					<li><a class='menu' href='#'>Arbeiten</a></li>
					<li><a class='menu' href='#'>CV</a></li>
					[ ... }
				</ul>
			</nav>
</div>
/* ++  HAUPTNAVIGATION / BUTTON  -- rechte Seite   ++ */

	[aria-expanded] {
		width:45px;
		height: 45px;
		background: transparent;
		color: transparent;
		border: none;
		background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath d='M1,2 h7 M1,5 h7 M1,8 h7' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
	}
	[aria-expanded="true"] {
		background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath d='M2,2 l6,6 M8,2 l-6,6' fill='none' stroke='%23c82f04' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
	}

	
	.site-navigation > ul {
		padding: 0.9rem;
	}
	
	.site-navigation li a {
		font-size: 1.55rem;
		font-style: bold;

	}
	
	#navi-span {
		width: 100%;
		display: flex;
		justify-content: flex-end;
		height: auto;
		
	}
	#main-nav {
		display: flex;
		justify-content: flex-end;
		flex-basis: auto;
		height: fit-content;
	}
	#main-nav > * {
		font-size: 1.55rem;
		font-style: bold;
	}
	
	button {
		border: none;
		margin: 0.7rem;
	}
	
	.site-navigation {
		overflow: hidden;		
	}
	.site-navigation > ul {
		margin-top: 1em;
		margin-left: 0.3em;
		padding: 0.4em 0.9em;
		border: dashed 5px red;		
	}
	#main-nav [aria-expanded]~ul {
        display: block !important;
        margin-right: -12.3em;
        transition: margin-right 0.85s;
		width: 12em;
		background: rgb(190,190,190,0.2);
	}
	#main-nav [aria-expanded="true"]~ul {
        margin-right: 0;
		background: orange;
		
    }

Wie also muss ich die [aria-expanded] -- background-images "individualisieren" das sie nur auf die jeweilige vorgegebene Funktion angewendet wird und nicht auch noch die andere?

Zudem komme ich da nicht mit den richtigen Kombinatoren klar die man hier wohl braucht.

Kann mir bitte jemand helfen.

Danke im Vorraus.

Der einsiedelnde

  1. Hallo einsiedler,

    Mein Testentwurf gibt es hier: Misanthrop bei Bplaced

    Allerdings ohne den Jump-Out Esel. Deswegen bin ich nicht sicher, ob Du damit das zeigst, was Du zeigen möchtest.

    Darüber hinaus hat das Beispiel JavaScript-Fehler und -Unnötigkeiten.

    • stylesheet.textContent = cssRules - cssRules ist undefiniert
    • Warum willst Du überhaupt on-the-fly Styles erzeugen, was spricht gegen eine .css Datei die Du vom Server holst?
    • menu.style.display = isExpanded ... - menu ist undefiniert. Das sieht nach einem Relikt aus, denn im Stylesheet sieht man, dass Du das mittlerweile mit reinem CSS machst, so wie es sich auch gehört.
    • den DOMContentLoaded-Handler kannst Du Dir sparen, wenn Du dem Script-Element das defer-Attribut gibst. defer-Scripte werden unmittelbar vor Auslösen des DOMContentLoaded Events ausgeführt.
    <script defer>
       // JS, das erst läuft, wenn das DOM fertig erstellt ist.
    </script>
    

    Zu deinem eigentlichen Problem: Ich denke mir, die Funktion flyoutExtension sollte einen Parameter bekommen: toggleID. Den verwendest Du in der Funktion zur Identifikation des Toggles.

    function flyoutExtension(toggleID) {
       const toggle = document.querySelector("#" + toggleID);
       ...Rest unverändert, bis auf die beiden isExpanded-Zeilen, die können weg
    }
    
    flyoutExtension("menu-toggle");
    flyoutExtension("titel-toggle");
    

    Dein aktuelles id="toggle" Element habe ich in menu-toggle umgetauft, und den Esel von icon-toggle in titel-toggle. Kannst Du machen oder lassen.

    Sodann musst Du Dir den CSS genau anschauen und Eigenschaft für Eigenschaft überlegen: Was ist für beide Flyouts gemeinsam gültig, und was ist spezifisch für eins von den beiden. Wie man etwas auf nur eins der beiden Flyouts begrenzt, weißt Du eigentlich schon, du machst es bereits: #main-nav [aria-expanded]~ul gilt nur für' Menü. Der Selektor #icon-nav [aria-expanded]~span würde nur für die Titelanimation gelten; allerdings ist da auch falsches HTML drin. Ein span darf nur phrasing-content (Text und seine Auszeichnungen) enthalten, ein h1 ist aber eine Stufe höher: flow-content. Das span muss ein div sein. Ich würde aber behaupten: schmeiß das span ganz weg und mach das a in das h1 statt andersrum, der Selektor ändert sich dann natürlich in #icon-nav [aria-expanded]~h1

    Die Farbe Orange würde ich der main-nav Liste übrigens immer geben, nicht nur im expanded=true Zustand. Ich finde, es sieht besser aus, wenn sie beim Einfahren orange bleibt.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Witzbold. Ja eben, das ist eben der Part der mir kopfzerbrechen bereitet.

      Um mal kurz anzudeuten was ich bereits versucht habe:

      Zunächst hatte ich mir überlegt mit details / summary zu arbeiten, denn ein "eigentliches" Menü ist es ja nun nicht wirklich.

      <div class="icon-span">
      					<details id="icon-nav">
      						<summary>
      							<a class="sitelink-title-tagline" href="http://meinewebsite.eu/arbeitsseite_14-04-25.html">
      							
                                   <h1>
      									maxmustermann.eu
      							</h1>
                                   </a>
      						</summary>
      					</details>
      </div>
      

      Nun habe ich summary den SVG-Icon zugeteilt. background-image: url("...der link zum SVG...")

      .icon-span {
      		display: flex;
      		flex-direction: row;
      		justify-content: flex-end;
      		width: 26rem;
      }
      

      .icon-span wird eine horizontale flexbox... zwei Boxen NEBENEINANDER

      (eine für a , eine für das h1)

      Und nun fängt das Dilemma an und zwar NUR beim besch..ten FIREFOX Hoffentlich fällt dieser SCH....ss Browser bald unter 0% der Anwender

      Der Firefox besteht darauf das summary UNTER details angezeigt wird, bei ALLEN NORMALEN Browsern wird das a & h1 NEBENEINANDER angezeigt.

      Genervt ging ich dazu über details / summary wieder zu entfernen und änderte es mit einem Button und dem aria=expanded Zeugs.

      Da das Hauptmenü schon fertig war funktionierte anschliessend GAR NICHTS mehr, weder das Hauptmenü noch der Esel-Run

      DESHALB die Frage in meinem Post: Bei beiden wird dieses aria-expanded Gedöns NICHT angewendet, kommen sich also ins Gehege.

      WIE NUN kann man nun mit meinen tausenden Attributen mein [aria-expanded] INDIVIDUALISIEREN sodas es nur speziell für seine Funktion "läuft"

      Ich habe meiner Meinung nach ALLE Komninationen mit diesen Kombinatoren ausgetestet und NICHTS funktioniert. Da meine frage: WARUM das?

      Ich möchte DAS gerne von einem von euch zeigen lassen.

      Darum bitte ich.

      MFG der einsiedelnde

      1. Hallo einsiedler,

        Ich möchte DAS gerne von einem von euch zeigen lassen. Darum bitte ich.

        Okay. Soll ich dafür die Seite mit dem Esel rekonstruieren oder stellst Du sie auf bplaced bereit? Weil - dort fehlt der h1 Teil ja.

        Und inwieweit sind die genannten JavaScript-Fehler relevant? cssRules fehlt und menu eben auch. Ich kann das erstmal ignorieren.

        By the way: ich habe das widerlichste zu tun, was es geben kann: die eigenen Worte runterschlucken. Script defer klappt nur für externe Scripte.

        Aber wenn man bereit ist, im strict mode zu arbeiten, geht script type="module" - dann es es ein ECMA-Script Modul und die werden immer deferred ausgeführt.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. @@Rolf B

          By the way: ich habe das widerlichste zu tun, was es geben kann: die eigenen Worte runterschlucken. Script defer klappt nur für externe Scripte.

          Aber wenn man bereit ist, im strict mode zu arbeiten, geht script type="module" - dann es es ein ECMA-Script Modul und die werden immer deferred ausgeführt.

          Es geht auch ohne das Eine oder das Andere. Einfach die gute alte Regel: script am Ende des body.

          Jolan tru

          --
          Wenn der Faschismus wiederkehrt, wird er nicht sagen „Hallo, ich bin der Faschismus.“ Er wird sagen: „Ich suche in diesem Deutschen Bundestag keine anderen Mehrheiten als die in der demokratischen Mitte. Wenn es heute eine solche Mehrheit gegeben hat, bedauere ich das.“ (Friedrich Merz)
        2. Okay, ja sorry...

          Habe soweit alles notdürftig editiert... so dass es weitergehen kann...

          Der Link..., derselbe vom ersten thread (bei misanthrop.bplaced.net).

          Wie Du Dir denken kannst habe ich eure Anleitung zum Navigation/Flyout-Menü

          https://wiki.selfhtml.org/wiki/Navigation/Flyout-Menü verwendet.

          Jetzt habe ich nur den Inhalt von den cssRules und add('menu') entfernt. Eventuell ist dies mir später doch noch nützlich im Falle wenn java-script aus ist.

          Jetzt habe ich exakter alles aus dem Bereich `` entfernt. :o)

          und es sollten nun keine script-Fehler mehr auftauchen.

          Wenn Du Dir nun das CSS / HTML anschaust, hast Du da den Eindruck das alles nun strukturierter ist. Auf jeden fall nicht mehr über-ZIG Ecken rum und dannoch im 90grad Winkel wie ich es zuanfang hatte. Diesen Entwurf habe ich nun entgültig Ab-Akta gelegt, da stieg wirklich keiner mehr durch. Hoffentlich ist dieser Entwurf nun klarer.

          Gut..

          1. Hallo einsiedler,

            grins, ich bin jetzt von dem alten Kram ausgegangen. Mal gucken, wie sich das auf die neue Version portiert.

            Das Tab-Problem habe ich jetzt mit visilibility:hidden gelöst und einer Klasse, die den Flyout-Inhalt so lange sichtbar hält, bis die Transition beendet ist.

            Du hast ein Überschriften-Problem. "calendar" ist h2, aber der Link nach maxmustermann.eu soll die h1 sein? Glaube ich nicht. Die h1 gibt an, worum es auf der Seite geht. Ich denke deshalb, dass calendar in h1 sein muss und der Link zu maxmustermann.eu ist überhaupt keine Überschrift, sondern einfach nur ein Link. Den Du natürlich stylen kannst, bis er schimmerlig wird.

            Den Esel habe ich jetzt so ins HTML gesetzt:

            	<header id="sitemast">
            		<div id="header-global" class="header-box">
            			<h2 class="page-title-tagline">calendar</h2>
            			<nav id="icon-nav" class="flyout-box" tabindex="-1">
            				<button aria-controls="icon-link"></button>
            				<a id="icon-link" class="flyout-content" href="...">						
            					maxmustermann.eu
            				</a>
            			</nav>
            		</div>
            		<nav aria-label="page" id="skiplinks">...</nav>
            	</header>
            

            und das Menü sieht so aus:

            	<div id="navi-span">
            			<nav id="main-nav" class="flyout-box" tabindex="-1">
            				<button aria-expanded="false" aria-controls="menu"></button>
            				<ul id="menu" class="flyout-content">
            					...
            				</ul>
            			</nav>
            		</div>
            

            Anmerkungen:

            • den tabindex -1 auf dem main-nav hast Du gemacht, weil die Skiplinks dahin verweisen, okay, ABER ich würde die Skiplinks auf den Button zeigen lassen. Denn sonst muss man erstmal mit Tab zum Button springen, bevor man das Menü öffnen kann.
            • die Existenzberechtigung von navi-span würde ich bestreiten wollen, aber das wird eine längere Operation. Ich verstehe, warum Du das Ding benutzt. In Sinne von "Sorry für das lange Markup, ich hatte keine Zeit für ein kürzeres" lasse ich das so.

            Die Klassen flyout-box und flyout-content bilden zusammen mit dem Button (dem man noch die Klasse flyout-toggle geben kann wenn das Flyout weitere Buttons bekommt) das Flyout-Widget. Die Grundstruktur ist

            <div class="flyout-box">
               <button></button>
               <div class="flyout-content">
               </div>
            </div>
            

            Statt der divs sind beliebige passende Elemente möglich.

            Das Widget steuert sich mit

            	.flyout-box {
            		display: flex;
            		justify-content: end;
            		overflow: hidden;
            	}
            	.flyout-box > button[aria-expanded] {
            		width:45px;
            		height: 45px;
            		background: transparent;
            		color: transparent;
            		border: none;
            		margin: 0.7rem;
            	}
            	.flyout-box > .flyout-content {
            		display: block !important;
            		width: var(--flyout-width);
            		margin-right: calc(-0.3em - var(--flyout-width));
            		transition: margin-right 0.85s;
            		visibility: hidden;
            	}
            
            	.flyout-box [aria-expanded="true"] ~ .flyout-content {
            		margin-right: 0;
            	}
            	.flyout-box button.content-visible ~ .flyout-content {
            		visibility: visible;
            	}
            

            wobei das Styling des Buttons eigentlich nicht ins Widget gehlört, sondern spezifisch für den Einsatz des Widgets ist. Das custom property --flyout-width muss man in dem Element setzen, das die flyout-box Klasse hat, um festzulegen, wie breit der Inhalt sein soll. Sowas kann man sicherlich geschickter lösen, vielleicht auch automatischer, aber dazu hatte ich jetzt keinen Nerv.

            Für den Esel gibt's dann noch

            	#icon-nav {
            		--flyout-width: 10em;
            		justify-self: end;
            		display: flex;
            		align-items: center;
            	}
            	#icon-nav button[aria-expanded] {
            		background: center no-repeat url('***/esel.svg');		  
            	}
            

            und für die Navigationslinks dies:

            	#main-nav {
            		--flyout-width: 10em;
            		flex-basis: auto;
            		height: fit-content;
            		font-size: 1.55rem;
            		font-weight: bold;
            	}
            	#main-nav > ul {
            		margin-top: 1em;
            		margin-left: 0.3em;
            		padding: 0.4em 0.9em;
            		border: dashed 5px red;		
            		background: rgb(190,190,190,0.2);
            	}
            	#main-nav > button[aria-expanded=true] ~ ul {
            		background: orange;		
            	}
            

            font-style muss font-weight sein. Mit font-style setzt du Kursiv und so.

            font-size und -weight auf >* und li a kann weg, das erbt sich einfach aus #main-nav.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hallo Rolf,

              grins, ich bin jetzt von dem alten Kram ausgegangen. Mal gucken, wie sich das auf die neue Version portiert.

              Neee... von DEM bin ich inzwischen weit weg und hab aufgehört daran weiterzubasteln.

              Bringt NIX, ich steig da sowiso nicht mehr durch.

              So habe ich von vorn angefangen und darauf geachtet das es NICHT wieder so "verschachtelt" wird.

              Nun ja, Seitenspezifische Überschrift (h2) daneben der website Name (als Icon und im flyout als Link), nächste Zeile: Inhaltsübersicht daneben das Hauptmenü... sooo toll ist es nun auch nicht... eher langweilig alles ...

              Du hast ein Überschriften-Problem. "calendar" ist h2, aber der Link nach maxmustermann.eu soll die h1 sein? Glaube ich nicht. Die h1 gibt an, worum es auf der Seite geht.

              Im Grunde hast du ja Recht. Der Unterseitenspezifische Name ist "calendar", wie andere zum Beispiel: Galerie oder Vita... u.s.w.

              Den website Namen wollte ich als Icon darstellen, der beim "ausfahren" nochmal den websitetitel wiedergibt.

              Jetzt zum NEUEN:

              Bis jetzt habe ich nur den Esel-Icon bearbeitet aber kannst Du mir sagen warum der NICHT angezeigt wird?

              Sehr seltsam!

              Die Hauptnavigation ist noch die alte.

              der einsiedelnde

              1. Hallo einsiedler,

                Der Esel erscheint nicht, weil Du einen meinen persönlichen Lieblingsfehler gemacht hast: Die Eigenschaft background-image vs background.

                Falsch:

                background-image: center no-repeat url(...);
                

                Richtig:

                background-image: url(...);
                background-position: center;
                background-repeat: no-repeat
                

                oder

                background: center no-repeat url(...);
                

                Der Esel fliegt noch nicht; ich denke, soweit warst Du noch nicht mit meinem vorigen Beitrag. Dort stehen Hinweise dazu.

                Jetzt noch zu ein paar anderen Dingen.

                • Viele deiner Elemente haben eine id und eine class. Die Formatierung machst Du mit einem bunten Strauß an Eigenschaften, die teils bei der ID und teils bei der class stehen. Das ist unübersichtlich und verwirrend.

                  • Wenn die Eigenschaft nur für genau dieses eine Element wichtig ist, setze sie bei der ID

                  • Wenn es mehrere Elemente mit der gleichen Klasse gibt und die Eigenschaft für alle Elemente dieser Klasse gelten soll, setze sie für die Klasse.

                  • Wenn eine Eigenschaft für alle Elemente einer Klasse gelten soll, die Kindelement eines bestimmten Elements sind, gib dem Elternelement eine ID und selektiere nach dem Schema #parent-id .elem-class. Geschicktes Selektieren im CSS ist nicht ganz einfach und eine einmal gefundene Lösung muss nicht dauerhaft richtig sein.

                  • Wenn eine Klasse für nur ein Element verwendet wird, überlege genau, warum, es diese Klasse überhaupt gibt. Gründe für Einmalklassen:

                    • Sie werden mit JavaScript gesetzt oder entfernt
                    • Du möchtest eine wiederverwendbare Komponente bauen (oder verwendest eine)
                  • Bei jeder Änderung überlege genau, ob die Verteilung auf ID und Klasse weiterhin gerechtfertigt ist.

                  • Ich weiß natürlich nicht, wie deine Planung ist und ob die Klassen, die derzeit nur einmal verwendet werden, künftig öfter vorkommen.

                • Das nav id="main-nav" Element braucht noch ein display: flex, damit Button und ul nebeneinander sind.

                • Die #global-navigations müssen kein Grid sein. Ich würde das so machen:

                  • #global-navigations bekommt position:relative und padding: 0.45em; (das horizontale Padding ist relativ egal)
                  • Das details-Element (pagecontent-titelbox) bekommt width:25em und margin: 0 auto, damit ist es zentriert. Alternativ zu width:25em ginge auch width:fit-content und etwas Padding im Summary.
                  • Das main-nav Element bekommt position:absolute, top:0 und right:0.5em. Weg mit grid-column, justify-self, flex-basis und height.
                  • Wenn Du möchtest, dass der Button in der global-navigations Box drin bleibt, mach ihn entweder kleiner oder verringere seinen margin. Derzeit hat er 0.7em. Tu das nicht blindlings für alle Buttons, sondern nur für #main-nav button.

                Rolf

                --
                sumpsi - posui - obstruxi
                1. Ja gut. Das Icon ist nun sichtbar.

                  Die Überschrift ("calandar") ist nun eine h1.

                  Habe nun:

                  .flyout-box {
                  		display: flex;
                  		justify-content: end;
                  		overflow: hidden;
                  	}
                  	.flyout-box > button[aria-expanded] {
                  		width: 113px;
                  		height: 160px;
                  		background: transparent;
                  		color: transparent;
                  		border: none;
                  		margin: 0.7rem;
                  	}
                  	.flyout-box > .flyout-content {
                  		display: block !important;
                  		width: var(--flyout-width);
                  		margin-right: calc(-0.3em - var(--flyout-width));
                  		transition: margin-right 0.85s;
                  		visibility: hidden;
                  	}
                  
                  	.flyout-box [aria-expanded="true"] ~ .flyout-content {
                  		margin-right: 0;
                  	}
                  	.flyout-box button.content-visible ~ .flyout-content {
                  		visibility: visible;
                  	}
                  

                  Für den icon eingefügt aber es tut sich noch NICHTS!

                  Woran liegt es?

                  Deine weiteren Anmerkungen zum Beispiel bezüglich der : Elemente etc. gehe ich heute Abend in Ruhe durch.

                  Erstmal möchte ich die Animationen fertig haben.

                  Was mich jetzt aber noch stört ist die Höhe von ul bei der Hauptnavigation.

                  Ich glaube man sieht es auch schon.

                  Die Höhe von ul bestimmt irgendwie #main-nav.

                  Toll wäre es jetzt wenn also das ul anfangs so hoch wie der Hamburger-Button, wenn das Menü sich öffnet passt sich die Höhe an den Content vom ul an.

                  Ist das machbar?

                  Denn so sieht es irgendwie nicht aus.

                  T.

                  1. Hallo einsiedler,

                    Was mich jetzt aber noch stört ist die Höhe von ul bei der Hauptnavigation.

                    Mich hat das auch gestört. Deshalb hatte ich Dir aufgeschrieben, wie man die global-navigation ändern könnte.

                    Du hattest vorher einen position:relative Container um die main-nav. Die main-nav war position:absolute. Das ist sie jetzt nicht mehr, und damit bestimmt sie die Höhe der global-navigation.

                    Deswegen kam mein Vorschlag zum Umbau der global-navigation. Der adressiert das alles.

                    Rolf

                    --
                    sumpsi - posui - obstruxi
                    1. Ja gut, werde ich mir morgen anschauen, für heute bin ich fertig, zig Sstunden am PC wegen der website.

                      Trotzdem aber kann ich immer noch nicht das Icon anklicken, da passiert nichts. Warum ist das so? Alles habe ich so eingesetzt wie in Deinem Beispiel. Es funktioniert einfach nicht.

                      Achso: --flyout-width: 10em; habe ich im CSS oben in die ROOT-Liste gesetzt.

                      @charset "UTF-8";

                      :root { --flyout-width: 10em; }

                      Ach und:

                      [aria-expanded] {
                      		width:45px;
                      		height: 45px;
                      		background: transparent;
                      		color: transparent;
                      		border: none;
                      		background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath d='M1,2 h7 M1,5 h7 M1,8 h7' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
                      	}
                      	[aria-expanded="true"] {
                      		background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath d='M2,2 l6,6 M8,2 l-6,6' fill='none' stroke='%23c82f04' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
                      	}
                      

                      für den Navigationsbotton muss ja auch drin bleiben, im CSS.

                      Grüße...

                      1. Hallo einsiedler,

                        Alles habe ich so eingesetzt wie in Deinem Beispiel. Es funktioniert einfach nicht.

                        Weil die Ratschläge nur halb umgesetzt hast.

                        (1) Ich habe Dir am 01.05.2025 um 18:12 beschrieben, wie Du das Flyout-Widget flexibel auf zwei Widgets anwendest. Das hast Du nicht getan, du wendest es unflexibel nur auf das main-nav Menü an.

                        (2) Du hast das <script> ans Ende verschoben, wie Gunnar vorschlug. Prima. Aber dann kann die Klammer mit DOMContentLoaded weg. Das stört zwar nicht, es ist aber überflüssig.

                        Entweder: Script im Head:

                        <script>
                        document.addEventListener("DOMContentLoaded", function() {
                           // DOM-spezifische Initialisierung
                        });
                        </script>
                        

                        Oder: Script am Ende vom Body:

                        <script>
                           // DOM-spezifische Initialisierung
                        </script>
                        

                        Es gibt hierbei einen kleinen Unterschied: Die Funktion des DOMContentLoaded Handlers kapselt die Variablen und Funktionen ein, die Du verwendest. Ohne die Eventhandler-Funktion sind diese Variablen und Funktionen global sichtbar. Das kann man durch eine IIFE (immediately invoked function expression, siehe Wiki ) wieder einkapseln - sofern nötig. Sofern nicht nötig, kannst Du Dir das auch sparen.

                        <script>
                        (function() {
                           // DOM-spezifische Initialisierung
                        })();
                        </script>
                        

                        Rolf

                        --
                        sumpsi - posui - obstruxi
              2. @@einsiedler

                Nun ja, Seitenspezifische Überschrift (h2)

                Falsch. Die seitenspezifische Überschrift sollte <h1> sein. (Singular; es sollte nur ein h1-Element pro Seite geben.)

                Du darfst keine Überschrift-Ebenen überspringen, das heißt: bei 1 anfangen. Die nächste Ebene (Kapitelüberschriften) wäre dann <h2>, keinesfalls <h3>.

                Jolan tru

                --
                Wenn der Faschismus wiederkehrt, wird er nicht sagen „Hallo, ich bin der Faschismus.“ Er wird sagen: „Ich suche in diesem Deutschen Bundestag keine anderen Mehrheiten als die in der demokratischen Mitte. Wenn es heute eine solche Mehrheit gegeben hat, bedauere ich das.“ (Friedrich Merz)
                1. Ist korregiert. "calendar" ist nun eine H1.

            2. Ich habe nun alles genauso eingesetzt, trotzdem funktioniert es noch nicht.

              Das grid für die global-navogations habe ich extra noch nicht entfernt weil ich die Funktionen erstmal ans laufen bringen wollte.

              Es scheint so als wenn die flex-boxen zwar da sind, wo sie hingehören (wenn man sie in den DevTools aktiviert) sind aber nicht sichtbar.

              Der Hamburger Button wird weder angezeigt, noch funktioniert das slidern, vom Icon oder dem Hauptmenü.

              Was ist da jetzt noch falsch?

              Ver-dorri-noch-eins...

              der einsiedelnde

              1. Anmerkung 01:38

                Habe gemerkt, das wenn man das visibility: hidden; entfernt zumindest der Text sichtbar wird.

                Gut: visibility: hidden; darf also NUR ( bei #main-nav > ul ) eingesetzt werden wenn aria-expanded: false ist.

                Wie ich es verstanden habe wird das visibility: hidden; wegen der TAB-Funktion eingesetzt ansonsten wird der ul-Inhalt mitgetabbt wenn er seitlich unsichtbar ist.

                Der Hamburger Button ist aber immer noch nicht sichtbar...

                • seufZ *
            3. Anmerkungen:

              den tabindex -1 auf dem main-nav hast Du gemacht, weil die Skiplinks dahin verweisen, okay, ABER ich würde die Skiplinks auf den Button zeigen lassen. Denn sonst muss man erstmal mit Tab zum Button springen, bevor man das Menü öffnen kann.

              Bedeutet also das der Button eine ID benötigt?

              die Existenzberechtigung von navi-span würde ich bestreiten wollen, aber das wird eine längere Operation. Ich verstehe, warum Du das Ding benutzt. In Sinne von "Sorry für das lange Markup, ich hatte keine Zeit für ein kürzeres" lasse ich das so.

              Siehst ja nun was passiert wenn navi-span nicht da ist! Ganz toll.

              Ich habe nun alles genau so eingesetzt wie beschrieben, dennoch funktioniert GAR NICHTS. Ich kann gar nichts anklicken? Stimmt mit dem JS etwas nicht?

              Was ist nun noch falsch?

              1. Hallo einsiedler,

                Bedeutet also das der Button eine ID benötigt?

                Damit man ihn per Skip-Link anspringen kann, ja.

                würde ich bestreiten wollen, aber das wird eine längere Operation. Siehst ja nun was passiert wenn navi-span nicht da ist! Ganz toll.

                Jo. Operation gelungen, Patient tot. Sorry. Ich kann auch nur dann über's Wasser laufen, wenn ich weiß, wo die Steine liegen. Diesmal fehlte einer.

                Ich habe nun alles genau so eingesetzt wie beschrieben

                Dann war die Beschreibung vielleicht zu konfus. Wie gesagt: ich bin auch nur ein Mensch.

                Stimmt mit dem JS etwas nicht?

                Ja. Öffne die Entwicklerwerkzeuge und schau in die Konsole. Hinweis: class="flyout-toggle"id="flyout-toggle".

                Der CSS-Selektor muss zum verwendeten Attribut passen. Schau Dir den Unterschied zwischen ID-Selektor und Klassenselektor an.

                Rolf

                --
                sumpsi - posui - obstruxi
                1. Bedeutet also das der Button eine ID benötigt?

                  Damit man ihn per Skip-Link anspringen kann, ja.

                  GUT. Danke.

                  Der Esel-Icon wird nun sanft geslidet. Nun habe ich noch folgende Zeile hinzugefügt:

                  .flyout-box [aria-expanded="false"] ~ .flyout-content {
                  		visibility: hidden;
                  }
                  

                  Was jetzt speziell NUR für die TAB-Funktion wichtig ist, das dieser Inhalt eben nicht "mitgetabbt" wird wenn er unsichtbar ist.

                  Finde ich ein wenig blöd wenn das icon zu ihrer Urposition zurückslidert das der Inhalt sofort "weg" ist. Wenn es eine bessere Möglichkeit "gäbe" wäre ich froh, ansonsten gewöhne ich mich daran.

                  Das PROBLEM bleibt jetzt nur: Das HAUPTMENÜ

                  Dieser slidet nun NICHT aus. Woran liegt es.

                  Kann es sein das die ID "toggle" nur EINMAL verwendet werden darf?

                  Und genau das funktioniert bisher nur für den Icon.

                  Wären eventuell zwei UNTERSCHIEDLICHE ID`s angebracht.

                  Meinetwegen: Icon-toggle und Menue-toggle oder so?

                  Was mache ich aber nun beim js?

                  document.addEventListener('DOMContentLoaded', function () {
                  
                  		flyoutExtension();
                  	
                  function flyoutExtension () {
                  	const menu = document.querySelector('nav ul');
                  	menu.insertAdjacentHTML('beforebegin', ``);
                  	menu.classList.add('menu');
                  
                  	const toggle = document.querySelector('#icon-toggle');
                  	toggle.addEventListener('click', function() {
                  		const currentState = toggle.getAttribute('aria-expanded');
                  		const newState = currentState === 'true' ? 'false' : 'true';
                  		toggle.setAttribute('aria-expanded', newState);
                  		const isExpanded = toggle.getAttribute('aria-expanded') === 'true';
                          menu.style.display = isExpanded ? 'block' : 'none';
                  	});
                  
                  const toggle = document.querySelector('#menue-toggle');
                  	toggle.addEventListener('click', function() {
                  		const currentState = toggle.getAttribute('aria-expanded');
                  		const newState = currentState === 'true' ? 'false' : 'true';
                  		toggle.setAttribute('aria-expanded', newState);
                  		const isExpanded = toggle.getAttribute('aria-expanded') === 'true';
                          menu.style.display = isExpanded ? 'block' : 'none';
                  	});
                  	
                  }
                   const cssRules = ``;
                  
                  	const stylesheet = document.createElement('style');
                  	stylesheet.textContent = cssRules;
                  	document.querySelector('html > head').appendChild(stylesheet);		
                  
                  });
                  

                  Nehme stark an das das falsch ist. oder doch nicht?

                  liegt es am JS?

                  Mit der Bitte um Hilfe.

                  der einsiedelnde

                  1. Hallo einsiedler,

                    dass Du für beide Slide-Elemente eigene IDs brauchst und die Funktion, die das steuert, einmal je Slider aufrufen musst, hab ich - glaube ich - schon ganz am Anfang dieses Threads geschrieben.

                    Da habe ich dargestellt, dass es einen gemeinsamen Kern gibt, der mit Klassen gesteuert werden sollte, und ein paar spezifische Dinge, die über die ID zugewiesen werden müssen. Ich glaube, da hast Du mich einen Witzbold genannt…

                    Rolf

                    --
                    sumpsi - posui - obstruxi
                    1. Hallo Rolf,

                      document.addEventListener('DOMContentLoaded', function () {
                      
                      flyoutExtension("menu-toggle");
                      	
                      function flyoutExtension () {
                      
                      	const toggle = document.querySelector('#menu-toggle');
                      	toggle.addEventListener('click', function() {
                      		const currentState = toggle.getAttribute('aria-expanded');
                      		const newState = currentState === 'true' ? 'false' : 'true';
                      		toggle.setAttribute('aria-expanded', newState);
                      		const isExpanded = toggle.getAttribute('aria-expanded') === 'true';
                              menu.style.display = isExpanded ? 'block' : 'none';
                      	});
                      	
                      }
                      
                      flyoutExtension("titel-toggle");
                      
                      function flyoutExtension () {
                      
                      	const toggle = document.querySelector('#titel-toggle');
                      	toggle.addEventListener('click', function() {
                      		const currentState = toggle.getAttribute('aria-expanded');
                      		const newState = currentState === 'true' ? 'false' : 'true';
                      		toggle.setAttribute('aria-expanded', newState);
                      		const isExpanded = toggle.getAttribute('aria-expanded') === 'true';
                              menu.style.display = isExpanded ? 'block' : 'none';
                      	});
                      	
                      }			
                      });
                      

                      also ist, was das JS betrifft richtig?

                      Oder kann man das zusammenfassen, das ist eine Teilfrage.

                      Bitte nicht so "abstrakt" alles. Ich bin nicht so rutiniert wie ihr es seid.

                      der einsiedelnde

                      1. Hallo einsiedler,

                        Bitte nicht so "abstrakt" alles. Ich bin nicht so rutiniert wie ihr es seid.

                        Was in JavaScript eine Funktion mit Parametern ist, das ist Dir bisher nicht klar?

                        Die Funktion flyoutExtension kann es unter diesem Namen nur einmal geben. Wenn Du sie zweimal reinschreibst, gibt's einen Fehler im JavaScript. Aber einmal reicht auch, wenn Du ihr die ID als Parameter mitgibst.

                        flyoutExtension('menu-toggle');
                        flyoutExtension('titel-toggle');
                        
                        function flyoutExtension (toggleId) {
                        
                        	const toggle = document.querySelector('#' + toggleId);
                        
                        	toggle.addEventListener('click', function() {
                        		const currentState = toggle.getAttribute('aria-expanded');
                        		const newState = currentState === 'true' ? 'false' : 'true';
                        		toggle.setAttribute('aria-expanded', newState);
                        		const isExpanded = toggle.getAttribute('aria-expanded') === 'true';
                                menu.style.display = isExpanded ? 'block' : 'none';
                        	});
                        }			
                        

                        Die Funktion wird zweimal aufgerufen. Beim ersten Mal enthält toggleId den Wert 'menu-toggle', beim zweiten Mal den Wert 'titel-toggle'. Da die Struktur des flyout-Widgets in beiden Fällen gleich ist, kann man es auch mit gleichartigem Code steuern. Der Unterschied ist nur die ID, über die man einsteigt.

                        Die lokale const toggle Variable wird bei beiden Aufrufen verwendet, aber das macht nichts. Zwei Aufrufe, zwei verschiedene Aufrufkontexte, das hält JavaScript auseinander. Beide Toggles bekommen ihren click-Handler und der bearbeitet dann das Toggle, für das er registriert wurde

                        Rolf

                        --
                        sumpsi - posui - obstruxi
                        1. @@Rolf B

                          Da gibt’s noch einiges Verbesserungspotential:

                          	const toggle = document.querySelector('#' + toggleId);
                          

                          Besser

                          	const toggle = document.querySelector(`#${toggleId}`);
                          

                          Aber wohl noch besser:

                          	const toggle = document.getElementById(toggleId);
                          

                          	toggle.addEventListener('click', function() {
                          

                          Ich würde sowas als Pfeilfunktion schreiben. Muss man aber nicht.


                          		const currentState = toggle.getAttribute('aria-expanded');
                          		const newState = currentState === 'true' ? 'false' : 'true';
                          		toggle.setAttribute('aria-expanded', newState);
                          		const isExpanded = toggle.getAttribute('aria-expanded') === 'true';
                          

                          Den aktuellen Ausgangszustand hast du bereits mit currentState abgefragt. Du kennst also den Folgezustand. Die erneute Abfrage des aktuellen Zustands macht keinen Sinn.

                          Sorge also dafür, dass du isExpanded gleich bei der ersten Abfrage von toggle.getAttribute('aria-expanded') setzt und verwende das auch schon bei toggle.setAttribute().


                          		menu.style.display = isExpanded ? 'block' : 'none';
                          

                          Hier besser das hidden-Attribut verwenden. Das macht den Code besser lesbar, außerdem ist die Änderung im DOM im Inspektor im Entwicklertool sichtbar.

                          		menu.hidden = !isExpanded;
                          

                          Jolan tru

                          --
                          Wenn der Faschismus wiederkehrt, wird er nicht sagen „Hallo, ich bin der Faschismus.“ Er wird sagen: „Ich suche in diesem Deutschen Bundestag keine anderen Mehrheiten als die in der demokratischen Mitte. Wenn es heute eine solche Mehrheit gegeben hat, bedauere ich das.“ (Friedrich Merz)
                          1. Hallo Gunnar,

                            für unseren Einsiedler ist vor allem eins wichtig: dass er es nachher selbst versteht.

                            Rolf

                            --
                            sumpsi - posui - obstruxi
                            1. @@Rolf B

                              für unseren Einsiedler ist vor allem eins wichtig: dass er es nachher selbst versteht.

                              Eben deshalb hab ich’s ja verständlicher gemacht:

                              • getElementById(toggleId) ist verständlicher als querySelector('#' + toggleId).
                              • Einmal den aktuellen Zustand abzufragen ist verständlicher als dies zweimal zu tun.
                              • menu.hidden ist verständlicher als menu.style.display.

                              Wobei zu letzterem noch zu sagen wäre, dass man evtl. noch

                              [hidden] { display: none !important }
                              

                              ins Stylesheet schreiben muss. Wobei man nicht lange drüber nachdenken muss. Einfach machen. Schaden tut’s nicht. Eine Erklärung gibt’s auch dazu.

                              Jolan tru

                              --
                              Wenn der Faschismus wiederkehrt, wird er nicht sagen „Hallo, ich bin der Faschismus.“ Er wird sagen: „Ich suche in diesem Deutschen Bundestag keine anderen Mehrheiten als die in der demokratischen Mitte. Wenn es heute eine solche Mehrheit gegeben hat, bedauere ich das.“ (Friedrich Merz)
                              1. Huuuuuahhhhh...

                                jetzt hat das erste mal etwas geklappt...

                                Aber gut...

                                document.addEventListener('DOMContentLoaded', function () {
                                
                                flyoutExtension('menu-toggle');
                                flyoutExtension('titel-toggle');
                                	
                                function flyoutExtension (toggleId) {
                                
                                	const toggle = document.getElementById(toggleId);
                                	toggle.addEventListener('click', function() {
                                		const currentState = toggle.getAttribute('aria-expanded');
                                		const newState = currentState === 'true' ? 'false' : 'true';
                                		toggle.setAttribute('aria-expanded', newState);
                                		const isExpanded = toggle.getAttribute('aria-expanded') === 'true';
                                        menu.hidden = !isExpanded;
                                	});	
                                }
                                });
                                

                                Dann wohl so...

                                und im CSS noch [hidden] { display: none !important }

                                Würde DAS nun folgendes überflüssig machen?

                                .flyout-box [aria-expanded="false"] ~ .flyout-content {
                                		visibility: hidden;
                                }
                                

                                Denn was mich momentan ein wenig nervt ist, wenn das Menü zurückslidert, war durch diese CSS Zeile der .flyout-content sofort unsichtbar.

                                der einsiedelnde

                                1. und im CSS noch [hidden] { display: none !important }

                                  Würde DAS nun folgendes überflüssig machen?

                                  .flyout-box [aria-expanded="false"] ~ .flyout-content {
                                  		visibility: hidden;
                                  }
                                  

                                  Denn was mich momentan ein wenig nervt ist, wenn das Menü zurückslidert, war durch diese CSS Zeile der .flyout-content sofort unsichtbar.

                                  Wie gesagt, dient diese CSS-Zeile eben NUR dazu, das beim TABBEN der .flyout-content NICHT mitgetabbt wird.

                                  Beim schließen des Menüs aber wird .flyout-content sofort unsichtbar.

                                  @Rolf

                                  In folgender CSS-Zeile soll die Klasse .content-visible Wozu dienen?

                                  .flyout-box button.content-visible ~ .flyout-content {
                                  		visibility: visible;
                                  }
                                  

                                  Was hattest Du damit vor? Hilft dies bei meinem Problem wenn im JS diese Klasse gesetzt wird? Und wenn ja, wie?

                                  der einsiedelnde

                                  1. Hallo einsiedler,

                                    Wie gesagt, dient diese CSS-Zeile eben NUR dazu, das beim TABBEN der .flyout-content NICHT mitgetabbt wird. Beim schließen des Menüs aber wird .flyout-content sofort unsichtbar.

                                    In folgender CSS-Zeile soll die Klasse .content-visible Wozu dienen?

                                    Genau aus dem Grund, dass das Menü beim Schließen sofort unsichtbar wird, und dadurch das Fly-In nicht so schön aussieht, hatte ich diese Klasse eingebaut. Aber ich habe Dir die zugehörige JavaScript-Änderung nicht verraten. Sorry.

                                    In meiner Script-Version setze ich beim Klich auf den Button die content-visible Klasse. Die zwingt das Menü in die Sichtbarkeit, auch wenn aria-expanded schon auf false steht. In meinem Script ist ein Eventhandler auf transitionend. Der wird ausgelöst, wenn das fly-in beendet ist, und entfernt content-visible dann, damit das Tab-Verbot wieder greift.

                                    Hilft dies bei meinem Problem wenn im JS diese Klasse gesetzt wird?

                                    Durch die Klasse fährt das Menü im sichtbaren Zustand ein.

                                    Du hast noch ein anderes Problem, das Gunnar und ich übersehen haben: die „Variable“ menu. Die deklarierst Du nicht und die initialisierst Du nicht, aber der Herrgott Browser nähret sie doch. Das ist nämlich die ID des Flyout-Menüs, und aus uralten Kompatibilitätsgründen ist jedes Element unter seiner ID im Window-Objekt zu finden. In menu steht immer der flyout-content der global-navigation. D.h. hier hast Du eine vergessene Überschneidung von Esel und Menü, und die hast Du versucht, mit display: block !important; für die Flyout-Box zu bekämpfen. Woraufhin das hidden-Attribut sind traurig in die Ecke verzieht, weil sich keiner mehr dafür interessiert.

                                    Das menu fasst Du auch nur deshalb an, weil Gunnar Dir das "hidden" eingeredet hat. Das beißt sich jetzt aber mit der visibility-Steuerung im CSS. Aber weil ich jetzt arbeiten muss, kann ich nicht daran weitermachen.

                                    Rolf

                                    --
                                    sumpsi - posui - obstruxi
                                    1. Genau aus dem Grund, dass das Menü beim Schließen sofort unsichtbar wird, und dadurch das Fly-In nicht so schön aussieht, hatte ich diese Klasse eingebaut. Aber ich habe Dir die zugehörige JavaScript-Änderung nicht verraten. Sorry.

                                      In meiner Script-Version setze ich beim Klich auf den Button die content-visible Klasse. Die zwingt das Menü in die Sichtbarkeit, auch wenn aria-expanded schon auf false steht. In meinem Script ist ein Eventhandler auf transitionend. Der wird ausgelöst, wenn das fly-in beendet ist, und entfernt content-visible dann, damit das Tab-Verbot wieder greift.

                                      Bitte nicht wieder so kryptisch, im Ansatz verstehe ich es. Komme mir so vor als wenn ich mein Orakel befrage. ; O ))

                                      Verrätst Du mir das script? BITTE!

                                      Und WAS hat es sich nun mit der ID "menue" auf sich" und ist involviert.

                                      der einsiedelnde

                                      1. Hallo einsiedler,

                                        ich bin jetzt bei der Arbeit - ich schreib's heute abend auf.

                                        Rolf

                                        --
                                        sumpsi - posui - obstruxi
                                      2. Hallo einsiedler,

                                        oookay. Ich musste jetzt erstmal die CSS-Visibility-Steuerung mit der hidden-Visibibility Steuerung konsolidieren. Und dann musste ich rausfinden, warum die Toggle-Buttons sich nicht ordentlich ausrichten ließen. Das lag an deinem margin-left für das main-Menü.

                                        Als Script würde ich Dir dies empfehlen:

                                        
                                        document.addEventListener('DOMContentLoaded', function () {
                                        
                                        flyoutExtension('menu-toggle');
                                        flyoutExtension('titel-toggle');
                                        	
                                        function flyoutExtension (toggleId) {
                                        
                                        	const toggle = document.getElementById(toggleId);
                                        	// aria-controls Attribut verwenden, um den Flyout-Inhalt zu finden
                                        	// Vorsicht: aria-controls darf grundsätzlich mehrere IDs enthalten, aber NICHT für das flyout-Widget.
                                        	const menu = document.getElementById(toggle.getAttribute("aria-controls"));
                                        
                                        	toggle.addEventListener('click', function() {
                                        		// Neuen expanded-Zustand aus altem Zustand herleiten. Kann ein bool sein.
                                        		const newExpanded = toggle.getAttribute('aria-expanded') !== 'true';
                                        
                                        		// Da das Verstecken erst im transitionend Event erfolgt, kann hier stumpf hidden auf false gesetzt werden
                                        		menu.hidden = false;
                                        
                                        		// Wichtig: aria-expanded erst in der nächsten Layout-Runde setzen, sonst funktioniert die Animation
                                        		// beim Einblenden nicht
                                        		requestAnimationFrame(function() {
                                        			toggle.setAttribute('aria-expanded', newExpanded);
                                        		});
                                        	});	
                                        
                                            menu.addEventListener("transitionend", function(endEvent) {
                                        		// Nach Transitionsende den hidden-Zustand an den expanded-Zustand anpassen
                                        		menu.hidden = toggle.getAttribute('aria-expanded') !== 'true';
                                            });
                                        
                                        	// Korrekte Anfangswerte sicherstellen
                                        	toggle.setAttribute("aria-expanded", false);
                                        	menu.hidden = true;
                                        }
                                        });
                                        

                                        Der transitionend Eventhandler verzögert das Verstecken des Flyout-Inhalts, bis die Animation zu Ende ist, und setzt den hidden-Zustand dann gemäß des aria-expanded-Zustand des Toggles. Das Gefummel mit requestAnimationFrame ist nötig, um das Setzen von aria-expanded (was per CSS die Transition auslöst) zu verzögern. Verzichtet man darauf, erfolgt bei mir keine Transition mehr; das Menü ist dann sofort sichtbar. Um das vom Toggle kontrollierte Flyout-Element zu finden, verwende ich das aria-controls Attribut. Sehr praktisch 😉.

                                        Im CSS sieht das CSS für das Flyout-Widget so aus:

                                        	
                                        	.flyout-box {
                                        		display: flex;
                                        		gap: var(--flyout-gap);
                                        		justify-content: end;
                                        		overflow: hidden;
                                        	}
                                        	.flyout-box > .flyout-toggle[aria-expanded] {
                                        		background: transparent;
                                        		color: transparent;
                                        		border: none;
                                        		margin: 0.7rem;
                                        	}
                                        	.flyout-box > .flyout-content {
                                        		width: var(--flyout-width);
                                        		margin-right: calc(0em - var(--flyout-gap, 0em) - var(--flyout-width));
                                        		transition: margin-right 0.85s;
                                        	}
                                        	
                                        	.flyout-box [aria-expanded="true"] ~ .flyout-content {
                                        		margin-right: 0;
                                        	}
                                        
                                        	[hidden] { display: none !important; }
                                        

                                        Mehr braucht's erstmal nicht. Die Sichtbarkeitssteuerung erfolgt nach Gunnars Vorschlag über das hidden-Attribut. Aber: Die zu verwendenden Maße müssen vorgegeben werden, dafür habe ich jetzt zwei custom-properties: --flyout-width für die Breite des Flyout-Inhalts und --flyout-gap, um optional einen Abstand zwischen Toggle und Inhalt zu setzen. Den muss das Flyout berücksichtigen.

                                        Der Esel hat dann dieses CSS. --flyout-gap verwendet er nicht. FALLS du noch Abstand zwischen Esel und Link erzeugen willst, füge --flyout-gap analog zur main-nav hinzu. SETZE KEINE MARGINS für den Flyout-Inhalt. Ob man den Button hier als .flyout-toggle oder als button anspricht, ist relativ egal, aber man sollte es einheitlich tun. Die Farb- und Randeinstellungen für den Button sind 'raus, das macht schon das Flyout-CSS.

                                        	#icon-nav {
                                        		--flyout-width: 10em;
                                        		grid-column: 2 / 3;
                                        		justify-self: end;
                                        		display: flex;
                                        		align-items: center;
                                        	}
                                        	#icon-nav .flyout-toggle {
                                        		width: 5em;
                                        		height: 7.5em;
                                        	}
                                        	#icon-nav .flyout-toggle[aria-expanded] {
                                        		background-image: url(http://misanthrop.bplaced.net/test/open-public__july24/images/svg/esel-icon.png);
                                        		background-position: center;
                                        		background-repeat: no-repeat;		  
                                        	}
                                        	#icon-link {
                                        		font-size: 1.95rem;
                                        		padding: 0.4em 0.5em;
                                        	}
                                        

                                        Schließlich die main-Navigation:

                                        Der Hintergrund kann immer orange sein. Und der Abstand zwischen Button und Menü erfolgt über --flyout-gap, diese Variable wird vom CSS für das Flyout-Widget verwendet, um per gap-Eigenschaft einen Abstand zu erzeugen.

                                        	#main-nav {
                                        		--flyout-width: 10em;
                                        		--flyout-gap: 0.5em;
                                        		font-size: 1.55rem;
                                        		font-weight: bold;
                                        	}
                                        
                                        	#main-nav .flyout-toggle {
                                        		width: 45px;
                                        		height: 45px;
                                        		background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath d='M1,2 h7 M1,5 h7 M1,8 h7' fill='none' stroke='black' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
                                        	}
                                        	#main-nav [aria-expanded="true"] {
                                        		background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 9 9'%3E%3Cpath d='M2,2 l6,6 M8,2 l-6,6' fill='none' stroke='%23c82f04' stroke-width='2' stroke-linecap='round'/%3E%3C/svg%3E");
                                        	}
                                        	
                                        	#navi-span {
                                        		grid-column: 2 / 3;
                                        		display: flex;
                                        		justify-content: end;
                                        		width: 100%;
                                        		position: absolute;
                                        	}
                                        	
                                        	#main-nav > ul {
                                        		margin-top: 0.6em;
                                        		padding: 0.35em 0.55em;
                                        		border: dashed 5px red;		
                                        		background: orange;
                                        	}
                                        

                                        Ich hoffe, damit passt es dann.

                                        Rolf

                                        --
                                        sumpsi - posui - obstruxi
                                        1. Hallo Rolf,

                                          Funktioniert SUPER, vielen Dank.

                                          Nunja zumindest was den Opera One(Version: 118.0.5461.60)

                                          Microsoft Edge Version 136.0.3240.64

                                          und den Chrome Version 136.0.7103.93

                                          betrifft, da ist alles tippitoppi.

                                          NUR der besch***ene Firefix 138.0.1 (64-bit)

                                          tanz aus der Reihe und macht eine Ausnahme, bei dem fährt das Menü NICHT ein, also slidert nicht ein, sondern ist sofort sichbar, wie Du es beschrieben hattest. Aber es slidert komischerweise beim schliessen zurück.

                                          Eine Idee??

                                          Auch @Gunnar?

                                          ABER eine Sache ist erfreulicherweise nun mitbehoben. Und zwar das mit der leidigen Höhe, denn bei der Ausgangsposition bei aria-expandet=false nimmt .main-nav nun die Höhe des Buttons ein, wenn das Menü nun ausgefahren ist, dann entsprechend die Höhe der Menge was in der ul ist.

                                          der einsiedelnde.

                                          1. Hallo einsiedler,

                                            Firefox hatte ich nicht getestet - ich habe das Problem da auch. Aber nicht immer; es ist intermittierend. Auch Chrome haut zweitweilig das Flyout sofort 'raus, ohne es zu animieren.

                                            Das ist offenbar eine Frage des Timings. Je nachdem, was auf dem Computer los ist, überlagern sich hidden=false und Flyout zeitlich. Wenn der Flyout beginnt, bevor hidden verarbeitet ist, geht's schief. Dann denkt er, er müsse eine Breitenänderung von 0 animieren, und tut nichts. DANACH greift die hidden-Änderung.

                                            Um das zu analysieren, habe ich die Verzögerung des Flyout mal konfigurierbar gemacht. STOP. Nicht übernehmen!

                                            let waitFrames = 3;
                                            requestAnimationFrame(setExpanded);
                                            function setExpanded() {
                                            	waitFrames--;
                                            	if (waitFrames > 0)
                                            		requestAnimationFrame(setExpanded);
                                            	else
                                            		toggle.setAttribute('aria-expanded', newExpanded);
                                            }
                                            

                                            Ab waitFrames=3 ist es halbwegs zuverlässig. Aber auch dann nicht immer. Und das ist Sch...eußlich. Auf höhere Werte hatte ich keine Lust, bei 60 Hz Bildrate bedeutet waitFrames=4 schon 66 ms Verzögerung. KANN man mit leben, aber muss man?

                                            Das Problem ist der Umstand, dass das hidden-Attribut ein display:none beinhaltet und das Element damit dem Layout entzieht. Weshalb ich es in meinem ursprünglichen Plan auch nicht drin hatte.

                                            @Gunnar Bittersmann: hidden ist deine Idee, welche Vorschläge hast Du für die Lösung des Timings? Schaffe ich hier üble Workarounds für ein eigentlich ganz anders gelagertes Problem?

                                            Einstweilen hätte ich die Idee, das JS so zu lassen wie es ist - ohne diese waitFrames - und dafür das Verhalten von hidden zu ändern.

                                            Aus dem CSS

                                            [hidden] {
                                               display: none !important;
                                            }
                                            

                                            habe ich dies gemacht:

                                            .flyout-content[hidden] {
                                               display: block;
                                               visibility: hidden;
                                            }
                                            

                                            Ein eventuelles display:none vom Browser wird damit aufgehoben. Nachteilig ist, dass diese display-Klausel andere display-Modi kaputtmacht (flex, grid, inline, etc) und damit im Allgemeinen so nicht verwendbar ist. Aber das implizite display:none des Browsers muss aufgehoben werden, sonst funktioniert es nicht. Merkwürdig eigentlich, dass es ohne !important klappt, aber da ein !important im Browser-Stylesheet ein !important im Autorenstylesheet ohnehin schlägt (habe ich im Selfwiki so von MDN abgeschrieben), kann man eh nur hoffen, dass der Browser kein !important setzt.

                                            Durch visibility:hidden wird mein ursprüngliches Konzept reaktiviert: Der Flyout-Inhalt nimmt am Layout teil, wird aber nicht angezeigt. Dadurch weiß der Browser jederzeit, wie breit dieser Inhalt ist, und kommt nicht auf die Idee, je nach Timing die Animation eines nullbreites Dings wegoptimieren zu können.

                                            Mir scheint, dass das hidden-Attribut die Wurzel des Timing-Übels ist und man zur ursprünglichen Steuerung zurück sollte. Aber wie gesagt: das könnte alles Workaround sein und ich hätte gerne Gunnars Meinung gehört. Mein Teststand ist hier.

                                            Rolf

                                            --
                                            sumpsi - posui - obstruxi
                                            1. @@Rolf B

                                              @Gunnar Bittersmann: hidden ist deine Idee

                                              Hm, ich brachte hidden ins Spiel als Ersatz für das direkte Rumhantieren mit style.display = "none" – ohne letzteres erstmal zu hinterfragen. Das soll jetzt nachgeholt werden.

                                              welche Vorschläge hast Du für die Lösung des Timings? Schaffe ich hier üble Workarounds für ein eigentlich ganz anders gelagertes Problem?

                                              Scheint mir so, ja. Warum etwas verstecken, was sich sowieso schon außerhalb des Viewports befindet?

                                              Abhängig vom Zustand des Steuerbuttons bekommen Esel und Menü translate: var(--panel-width) 0 verpasst (wobei die 0 für die y-Richtung auch weggelassen werden kann). Und translate lässt sich wunderbar animieren – und das auch performant.

                                              Im Gegensatz zu margin-right – das zu animieren ist falsch (s.a. dieses Posting).

                                              Wenn das Reinschieben nicht vom Viewportrand erfolgen soll, ist da noch ein overflow: hidden fällig, aber das bekommt man hin, ☞ guckst du.

                                              Note: Das einzige, was JavaScript tut, ist den Zustand des jeweiligen Buttons zu ändern.

                                              Jolan tru

                                              --
                                              Wenn der Faschismus wiederkehrt, wird er nicht sagen „Hallo, ich bin der Faschismus.“ Er wird sagen: „Ich suche in diesem Deutschen Bundestag keine anderen Mehrheiten als die in der demokratischen Mitte. Wenn es heute eine solche Mehrheit gegeben hat, bedauere ich das.“ (Friedrich Merz)
                                              1. Hallo Gunnar,

                                                Warum etwas verstecken, was sich sowieso schon außerhalb des Viewports befindet?

                                                Damit es bedienbar ist und man nicht in eingeklabbte Menüs hineintappt?

                                                Eine CSS-Eigenschaft, die die Sichtbarkeit unverändert lässt und nur das antabben verhindert gibt's meines Wissens nicht. Daher visibility:hidden.

                                                Im Gegensatz zu margin-right – das zu animieren ist falsch

                                                Na toll, irgendwann merke ich mir das auch mal 😉

                                                Aber das transitionend-Event braucht man schon noch, denn die Visibility darf erst auf hidden gesetzt werden, wenn der Transform durch ist. Man könnte natürlich auch mal schauen, ob man das mit @keyframe-Animation eleganter hinbekommt. Wenn sich das jetzt noch geschickt mit einem Popover kombifizieren ließe… Hm. Hmmmmmm. Nachher. Nach Feierabend. Und vermutlich mal wieder nicht browserübergreifend brauchbar 😢

                                                Rolf

                                                --
                                                sumpsi - posui - obstruxi
                                                1. @@Rolf B

                                                  Warum etwas verstecken, was sich sowieso schon außerhalb des Viewports befindet?

                                                  Damit es bedienbar ist und man nicht in eingeklabbte Menüs hineintappt?

                                                  🤦‍♂️

                                                  Eine CSS-Eigenschaft, die die Sichtbarkeit unverändert lässt und nur das antabben verhindert gibt's meines Wissens nicht. Daher visibility:hidden.

                                                  Es gibt aber eine HTMLElement-Eigenschaft, die die Sichtbarkeit unverändert lässt und nur das Antabben verhindert: inert.

                                                  Ich hab das mal in den Codepen eingebaut.

                                                  Aber das transitionend-Event braucht man schon noch, denn die Visibility darf erst auf hidden gesetzt werden, wenn der Transform durch ist.

                                                  Das ist damit obsolet.


                                                  let isExpanded = this.getAttribute('aria-expanded') == 'true';
                                                  isExpanded = !isExpanded;
                                                  

                                                  habe ich bewusst so geschrieben. So wird ersichtlich, dass isExpanded erst den aktuellen Zustand widerspiegelt, der dann geändert wird.

                                                  Schriebe man hingegen

                                                  const isExpanded = this.getAttribute('aria-expanded') != 'true';
                                                  

                                                  würde das zu einem großen „Hä??“ führen. Das ließe sich vielleicht verkleinern, indem man die Variable willBeExpanded benennt, aber besser verständlich ist wohl die Variante mit der expliziten Negierung von isExpanded.

                                                  Jolan tru

                                                  --
                                                  Wenn der Faschismus wiederkehrt, wird er nicht sagen „Hallo, ich bin der Faschismus.“ Er wird sagen: „Ich suche in diesem Deutschen Bundestag keine anderen Mehrheiten als die in der demokratischen Mitte. Wenn es heute eine solche Mehrheit gegeben hat, bedauere ich das.“ (Friedrich Merz)
                                                  1. Vielen Dank Gunnar.

                                                    Sollte es wirklich so einfach sein?

                                                    Denn ich befürchte ja, das durch das ganze JS welches im Hintergrund von codepen abläuft, es deswegen so rund läuft. Denn was mich stutzig macht ist, das man direkt den botton anspricht:

                                                    for (button of document.querySelectorAll('.slide-in button')) {
                                                    	button.addEventListener(
                                                    		'click',
                                                    		function () {}
                                                    	
                                                    
                                                    [ ... ]
                                                    

                                                    Werde es jedenfalls mal in mein SETTING einsetzen, es jedenfalls versuchen.

                                                    @Rolf B Dürfte das so gelingen? Wie weit bist Du mit deiner Arbeitsversion? Ist das Beispiel verlinkt auf Deiner website der letzte korrekte Stand?

                                                    Zurück zu Gunnars Version:

                                                    Was mich auch noch beschäftigt ist: Das, wenn das jeweilige Menü OFFEN ist. ob dann diese Menüpunkte (inerhalb der ul) MITGETABBT werden. Das sollte so sein, aber ich befürchte durch die KLASSE inert="" wird ALLGEMEIN alle Unterpunkte innerhalb von der ul ignoriert. Ist das so?

                                                    @Gunnar Bittersmann @Rolf B

                                                    Könnt ihr bitte meine Anfrage diesbezüglich noch vervollständigen?

                                                    der einsiedelnde

                                                    1. @@einsiedler

                                                      Denn was mich stutzig macht ist, das man direkt den botton anspricht:

                                                      Du kannst das natürlich auch mit event delegation machen.


                                                      Was mich auch noch beschäftigt ist: Das, wenn das jeweilige Menü OFFEN ist. ob dann diese Menüpunkte (inerhalb der ul) MITGETABBT werden. Das sollte so sein, aber ich befürchte durch die KLASSE inert="" wird ALLGEMEIN alle Unterpunkte innerhalb von der ul ignoriert. Ist das so?

                                                      Nein, wegen this.nextElementSibling.inert = !isExpanded;. Bei geöffneten Menü ist inert auf false gesetzt.

                                                      🖖 Live long and prosper

                                                      --
                                                      “In my home, the America I love, the America I've written about, that has been a beacon of hope and liberty for 250 years, is currently in the hands of a corrupt, incompetent and treasonous administration. Tonight, we ask all who believe in democracy and the best of our American spirit, to rise with us, raise your voices against authoritarianism, and let freedom reign.”
                                                      — Bruce Springsteen, Manchester 2025-05-14
                                                      1. Benötige eure Unterstützung:

                                                        Ich habe nun alles genauso "eingesetzt" : Mein aktueller Entwurf beim freehoster bplaced

                                                        Aber irgendwie scheint etwas nicht zu stimmen, denn wenn ich:

                                                        .slide-in {
                                                        	--panel-width: 10em;
                                                        	height: 3em;
                                                        	display: flex;
                                                        	align-items: start;
                                                        	margin-inline: auto 0;
                                                        	width: fit-content;
                                                        	transition: translate 0.3s;
                                                        	
                                                        	&:has(button:not([aria-expanded="true"])) {
                                                        				translate: var(--panel-width);
                                                        	}
                                                        	
                                                        	ul {
                                                        		z-index: 1;
                                                        		background: white;
                                                        		outline: thin solid silver;
                                                        		width: var(--panel-width);
                                                        		list-style: none;
                                                        		margin: 0;
                                                        		line-height: 1.1;
                                                        	}
                                                        	
                                                        	li {
                                                        		padding-block: 0.2em;
                                                        	}
                                                        	
                                                        	a {
                                                        		color: currentColor;
                                                        		text-decoration: none;
                                                        	}
                                                        }
                                                        

                                                        genauso einsetze, scheint etwas mit den { } nicht zu stimmen. Denn wenn ich hinter dem { von .slide-in { tippe dann wird nicht das } ganz am Ende rot sondern ganz woanders. Also da scheint etwas nicht zu stimmen.

                                                        Das ist genau DAS was ich meinte mit, das bei CODEPEN dieses CSS zwar funzt, nicht aber wenn man es "ubertrgägt / übersetzt".

                                                        Also wie geht es nun richtig?

                                                        Morgen kümmere ich mich um die kleineren Devices und dem Fall falls scripte unterbunden werden.

                                                        Ich habe vor mit <noscript> </noscript> im head auf eine CSS zu verwiesen für diesen Fall.

                                                        div id="global-navigations" ist ein GRID das ich dort zweizeilig mache ( Grid ROWs ) , in der ersten Zeile das Menü in der zweiten Zeile darunter die Inhaltübersicht.

                                                        So soll es angezeigt werden wenn javascript aus ist.

                                                        Gute n8 der einsiedelnde

                                                        1. Hallo

                                                          Ich habe nun alles genauso "eingesetzt"… Aber irgendwie scheint etwas nicht zu stimmen, denn wenn ich:

                                                          .slide-in {
                                                          	--panel-width: 10em;
                                                          	height: 3em;
                                                          	display: flex;
                                                          	align-items: start;
                                                          	margin-inline: auto 0;
                                                          	width: fit-content;
                                                          	transition: translate 0.3s;
                                                          	
                                                          	&:has(button:not([aria-expanded="true"])) {
                                                          				translate: var(--panel-width);
                                                          	}
                                                          	
                                                          	ul {
                                                          		z-index: 1;
                                                          		background: white;
                                                          		outline: thin solid silver;
                                                          		width: var(--panel-width);
                                                          		list-style: none;
                                                          		margin: 0;
                                                          		line-height: 1.1;
                                                          	}
                                                          	
                                                          	li {
                                                          		padding-block: 0.2em;
                                                          	}
                                                          	
                                                          	a {
                                                          		color: currentColor;
                                                          		text-decoration: none;
                                                          	}
                                                          }
                                                          

                                                          genauso einsetze, scheint etwas mit den { } nicht zu stimmen. Denn wenn ich hinter dem { von .slide-in { tippe dann wird nicht das } ganz am Ende rot sondern ganz woanders. Also da scheint etwas nicht zu stimmen.

                                                          Das ist genau DAS was ich meinte mit, das bei CODEPEN dieses CSS zwar funzt, nicht aber wenn man es "ubertrgägt / übersetzt".

                                                          Gehe bitte davon aus, dass, wenn es im Codepen funktioniert, es auch in einem einigermaßen aktuellen Browser funktioniert. Eventuell, und meiner Meinung nach mit aller Wahrscheinlichkeit, wird es aber mit den Highlightning-Regeln deines Editors oder deiner IDE nicht korrekt angezeigt.

                                                          Das beeinträchtigt aber nicht die Funktionalität im Browser. Dort muss und wird es funktioneren (den Test mit einem nicht veralteten Browser vorausgesetzt).

                                                          Tschö, Auge

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

                                                            Eventuell, und meiner Meinung nach mit aller Wahrscheinlichkeit, wird es aber mit den Highlightning-Regeln deines Editors oder deiner IDE nicht korrekt angezeigt.

                                                            Ja, der Editor/die IDE ist wohl so alt, dass er/sie mit CSS-Nesting nicht umgehen kann. Da hilft updaten oder ignorieren.

                                                            Das beeinträchtigt aber nicht die Funktionalität im Browser. Dort muss und wird es funktioneren (den Test mit einem nicht veralteten Browser vorausgesetzt).

                                                            Es müsste schon ein sehr veralteter Browser sein, in dem Nesting nicht funktioniert. Grün, soweit das Auge reicht.

                                                            🖖 Live long and prosper

                                                            --
                                                            “In my home, the America I love, the America I've written about, that has been a beacon of hope and liberty for 250 years, is currently in the hands of a corrupt, incompetent and treasonous administration. Tonight, we ask all who believe in democracy and the best of our American spirit, to rise with us, raise your voices against authoritarianism, and let freedom reign.”
                                                            — Bruce Springsteen, Manchester 2025-05-14
                                                            1. Hallo

                                                              Das beeinträchtigt aber nicht die Funktionalität im Browser. Dort muss und wird es funktioneren (den Test mit einem nicht veralteten Browser vorausgesetzt).

                                                              Es müsste schon ein sehr veralteter Browser sein, in dem Nesting nicht funktioniert. Grün, soweit das Auge reicht.

                                                              Danke, dass du auf den Can-I-Use-Eintrag verweist. Ich hatte, wo ich es benutzte, bisher immer noch überall das Ampersand & vor den verschachtelten Selektoren notiert, weil die Chromium-Browser anfangs ja nicht ohne diese Einleitung auskamen.

                                                              Seit Ende 2023 ist das offensichtlich Geschichte … und ich bekomme es erst jetzt mit.

                                                              Tschö, Auge

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

                                                                Danke, dass du auf den Can-I-Use-Eintrag verweist. Ich hatte, wo ich es benutzte, bisher immer noch überall das Ampersand & vor den verschachtelten Selektoren notiert, weil die Chromium-Browser anfangs ja nicht ohne diese Einleitung auskamen.

                                                                Seit Ende 2023 ist das offensichtlich Geschichte … und ich bekomme es erst jetzt mit.

                                                                nur zur Info und weil ich da gerade drüber gestolpert bin: der Polyfill für die Anchor-Positionierung benötigt das Ampersand & vor den verschachtelten Selektoren immer noch.

                                                                Gruß
                                                                Jürgen

                                                                1. Hallo

                                                                  Danke, dass du auf den Can-I-Use-Eintrag verweist. Ich hatte, wo ich es benutzte, bisher immer noch überall das Ampersand & vor den verschachtelten Selektoren notiert, weil die Chromium-Browser anfangs ja nicht ohne diese Einleitung auskamen.

                                                                  Seit Ende 2023 ist das offensichtlich Geschichte … und ich bekomme es erst jetzt mit.

                                                                  nur zur Info und weil ich da gerade drüber gestolpert bin: der Polyfill für die Anchor-Positionierung benötigt das Ampersand & vor den verschachtelten Selektoren immer noch.

                                                                  Nur zur Klarstellung, dass Ampersand zu notieren macht nix kaputt, sondern nur etwas zusätzliche Schreibarbeit.

                                                                  Um welches Polyfill handelt es sich denn?

                                                                  Tschö, Auge

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

                                                                    Nur zur Klarstellung, dass Ampersand zu notieren macht nix kaputt, sondern nur etwas zusätzliche Schreibarbeit.

                                                                    ja, aber ich habe recht lange gesucht, bis ich gefunden habe warum mein kleiner Test funktioniert, aber das „Große“ nicht.

                                                                    Um welches Polyfill handelt es sich denn?

                                                                    um diesen Polyfill für anchor: https://github.com/oddbird/css-anchor-positioning?tab=readme-ov-file

                                                                    Gruß
                                                                    Jürgen

                                                          2. Na, dann taugt der Notepad++ nicht viel...

                                                            O.K., ich ignoriere einfach die fehlerhafte Darstellung vom Notepad und gehe davon aus das es funzt. Tut es ja letztlich auch.

                                                            @all

                                                            Was mich jetzt stört ist die "einheitlche" Breite die durch das

                                                            --panel-width: 18em;
                                                            
                                                            

                                                            vorgegeben wird.

                                                            webscreen

                                                            Ich mein der website Link hinter dem icon brauch mehr width als der Inhalt vom Hautpmenü (sein width).

                                                            WIE kann man das nun erreichen?

                                                            Habt ihr ideen?

                                                            der einsiedelnde

                                                            1. Hallo

                                                              Na, dann taugt der Notepad++ nicht viel...

                                                              O.K., ich ignoriere einfach die fehlerhafte Darstellung vom Notepad und gehe davon aus das es funzt.

                                                              Ja, der hat einige Probleme beim Highlightning von CSS[1]. Man kann zwar über die Einstellungen an den Highlightning-Regeln jeder einzelnen Sprache drehen, aber darin muss man sich erst einmal einarbeiten (wollen).

                                                              Was auf die Schnelle geht, ist das hinzufügen von Schlüsselwörtern für Identifier (Eigenschaften), Pseudoklassen oder -elemente. Notepad++ kennt zum Beispiel nicht das Pseudoelement ::backdrop. Wenn man es notiert, wird es im Defaultstil als „unknown pseudoclass“ rot hinterlegt statt, wie die anderen, bekannten Pseudoelemente, in orangener Schrift angezeigt zu werden.

                                                              Also auf in die Einstellungen! Dann „Stile konfigurieren“ => „Sprache: CSS“, in der Liste „Stilbeschreibungen“ den Eintrag „Pseudoelement“ aussuchen und als benutzerdefiniertes Schlüsselwort „backdrop“ hinzufügen. Dann speichern und schwupps wird „backdrop“ wie die bereits bekannten Pseudoelemente formatiert.

                                                              Es lassen sich auch Regelwerke für weitere Sprachen importieren. Es gibt für weitere Sprachen gar ein eigenes Repository.

                                                              Da geht also einiges. Nur das Nesting von CSS-Selektoren geht nicht. Es gibt schon einen Bug-Report dafür. Soweit ich das verstehe, ist das Notepad++-Team dabei von der Umsetzung in der Bibliothek Lexilla, die für das Highlightning aller Sprachen verwendet wird, abhängig.

                                                              Tut es ja letztlich auch.

                                                              Um mal eine Fußballmetapher zu bringen: „Die Wahrheit liegt auf dem Platz.“

                                                              Tschö, Auge

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

                                                              1. Vermutlich auch bei anderen Sprachen. ↩︎

                                                              1. Hi,

                                                                Ja, der hat einige Probleme beim Highlightning von CSS.

                                                                aufgepasst: Syntax-Highlighting hat nichts mit Gewittern und Blitzen zu tun!

                                                                Einen schönen Tag noch
                                                                 Martin

                                                                --
                                                                Manchmal kann man gar nicht so viel fühlen, wie man denkt.
                                                                Und manchmal fühlt man so viel, dass man gar nicht denken kann.
                                          2. Hallo Einsiedler,

                                            gibt es ein Online-Beispiel, wo man sich den aktuellen Stand ansehen kann? Auch um Rolfs Ausführungen besser zu verstehen.

                                            Schöne Grüße

                                            Nico

                                            1. Hallo Nico,

                                              Einsiedlers Version ist im ersten Posting verlinkt, meine Variante in meinem letzten Beitrag von heute 09:39 Uhr

                                              Rolf

                                              --
                                              sumpsi - posui - obstruxi
                                            2. Ja klar: Testseite beim freehoster bplaced

                                              Gruß der einsiedelnde

                                              1. Danke dir :-)

                                                Leider fehlt mir gerade die Zeit, mich näher damit zu befassen. Aber wenns soweit ist und ich etwas Wertvolles beizutragen habe (was ich nicht glaube), meld ich mich nochmal.

                                                Schöne Grüße Nico

      2. Hallo einsiedler,

        ich schaue mir das jetzt schon eine Weile an und habe auch die Styles, die für die generische Flyout-Box relevant sind und die Styles, die für die konkreten Instanzen dieser Box gebraucht werden, separiert. Das war ein ganz schönes Durcheinander. Den Esel als 97K SVG solltest Du übrigens besser als passend großes PNG ausliefern und ihm mehr Kontrast geben, der ist ein Beispiel für ein SVG, an dem der Browser sich müde rendert.

        Aber jetzt habe ich ein blödes Problem identifiziert, die die Bedienbarkeit erschwert: Die versteckten Items sind zwar unsichtbar, aber man kann sie weiterhin per Tab erreichen. Würdest Du den Flyout-Inhalt einfach verstecken (hidden oder display.none), dann wäre das kein Thema. Aber durch die Animation kann man den Flyout-Inhalt nicht einfach verstecken, denn er muss ja da bleiben, bis die Animation endet.

        Ich sehe jetzt zwei Optionen, beide brauchen JavaScript.
        (a) auf das transitionend Event registrieren und bei Erreichen des Endes den Content auf hidden setzen. Das muss natürlich entfernt werden, sobald das Flyout wieder geöffnet wird.
        (b) im click-Handler des Buttons alle anklickbaren Elemente mit tabindex -1 versehen.

        Beides ist kompliziert und lästig, das Problem entsteht halt nur wegen der Flyout-Animation. Bevor ich einfach mache...

        Ich habe ein bisschen recherchiert, 2017 wurde mal andiskutiert, ob man den tabindex nicht per CSS verändern können sollte - das artete dann in Umordnung der Tab-Reihenfolge aus und irgendwann scheint es versandet. @Gunnar Bittersmann, gibt's da tatsächlich keine CSS Eigenschaft, um ein Element gegen antabben zu schützen? user-select oder pointer-events ist es ja nicht. Hier steht zwar etwas über directional focus navigation und das scheint das Ergebnis der genannten Diskussion zu sein. Implementiert ist es bisher wohl nirgends und MDN weiß auch noch nichts dazu. Zum Thema bedienbares animiertes Dropdown- (oder Flyout-)Menü habe ich nicht viel gefunden, und das, was ich fand, befasste sich mit den Folgen der Animation und nicht mit der Tab-Order. Ob Pickering dazu was brauchbares hat, weiß ich nicht. Möglicherweise steht in Menus was, aber als er mit "Was ist ein Menü und was nicht" anfing und immer weiter darin rumbohrte, habe ich ihm den Vogel gezeigt und bin gegangen. Das muss doch ein gelöstes Standardproblem sein.

        Rolf

        --
        sumpsi - posui - obstruxi