Beispiel:HTML-custom-3.html

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

<!doctype html> <html> <head> <meta charset="utf-8"> <title>toggle-switch</title> <style>body:has(#halloween-style:state(checked)) {

 background: black;

color: white;

h1,h2,h3 { color: orange; border-bottom: medium solid; width: max-content; } img { opacity: 1; } }

body {

	max-width: 40em;

margin: 0 auto; position: relative; }

label { position:absolute; top: 1em; right: 1em; } img.pumpkin { width: 200px; float:right; margin-left:1em; max-width: 100%; opacity: 0; }


</style> </head>

<body>

custom elements

<label for="halloween-style" id="toggle-label">Halloween Style einschalten <toggle-switch id="halloween-style"></toggle-switch> </label>

Halloween

<img class="pumpkin" src="https://upload.wikimedia.org/wikipedia/commons/a/a2/Jack-o%27-Lantern_2003-10-31.jpg" alt="Jack o Lantern">Halloween (Aussprache: /hæləˈwiːn, hæloʊ̯ˈiːn/, von englisch All Hallows’ Eve, der Abend vor Allerheiligen) benennt die Volksbräuche am Abend und in der Nacht vor dem Hochfest Allerheiligen, vom 31. Oktober auf den 1. November. Dieses Brauchtum war ursprünglich vor allem im seinerzeit katholisch geprägten Irland verbreitet.

Seit den 1990er Jahren verbreiten sich Halloween-Bräuche in US-amerikanischer Ausprägung auch in Deutschland und seinen Nachbarländern.


<script> 'use strict'; class ToggleSwitch extends HTMLElement {

   static observedAttributes = [ 'checked' ];
   
   static css =
       `:host {
           --padding: 3cqw;
           display: block;            
           width: 7.5em;
           container-type: inline-size;
           cursor: pointer;
       }
       div {
           box-sizing: border-box;
           transition: all 0.5s ease-in-out;         
       }
       .track {
           user-select: none;
           aspect-ratio: 2 / 1;
           border: thin solid currentColor;
           background-color: steelBlue;
           border-radius: 20cqw;
           padding: var(--padding) calc(2*var(--padding));
       }
       .thumb {
           width: calc(50cqw - 2*var(--padding));
           aspect-ratio: 1 / 1;
           background-color: transparent;

border: 5cqw solid orange;

           border-radius: 50%;
       }
       :host(:state(checked)) .frame {
           background-color: lightblue;
       }
       :host(:state(checked)) .thumb {
           background-color: orange;
           transform: translateX(100%);
       }`;
   
   static html =
`
`;
   #internals;
   
   constructor() {
       super();
       this.attachShadow({mode: "open"});
       this.#internals = this.attachInternals();
       this.#render();
       
       this.setAttribute('role', 'switch'); // Set ARIA role to 'switch'
       this.setAttribute('tabindex', '0'); // Make element focusable
   }

// Shadow-DOM des Toggle-Switch aufbauen und Eventhandling vorbereiten

   #render() {
       this.shadowRoot.innerHTML = 
       `<style>${ToggleSwitch.css.trim()}</style>
       ${ToggleSwitch.html}`;
       
       this.addEventListener('click', () => {
           this.#changeToggle();
       });
       this.addEventListener('keydown', (event) => {
           if (event.key === ' ' || event.key === 'Enter') {
               event.preventDefault(); // Prevent scrolling when space is pressed
               this.#changeToggle();
           }
       });
   }

// Darauf reagieren, ob das checked-Attribut geändert wurde

   attributeChangedCallback(name, oldValue, newValue) {
       console.log("attr <%s> <%s> <%s>", name, oldValue, newValue);
       if (name == "checked" && oldValue != newValue) {
           this.#fixChecked();
       }
   }

// Getter für checked-Eigenschaft

   get checked() {

// checked-Eigenschaft reflektiert Existenz des checked-Attributs

       return this.hasAttribute('checked');
   }

// Setter für checked-Eigenschaft

   set checked(check) {

// Eigenschaftsänderung in Attribut widerspiegeln

       this.toggleAttribute('checked', check);

// Übrige Eigenschaften anpassen

       this.#fixChecked();
   }

// Änderungen am checked-Zustand in State und Aria-Zustand übertragen

   #fixChecked() {
       const check = this.checked;
       if (check) {
           this.#internals.states.add('checked');
       }
       else {
           this.#internals.states.delete('checked');
       }
       this.#internals.ariaChecked = check ? "true" : "false";
       this.setAttribute('aria-checked', check);
   }
   // Useraktionen, die den checked-Zustand umschalten, landen hier

// change-Event nur werfen, wenn der User den Zustand geändert hat!

   #changeToggle() {
       this.checked = !this.checked;
       this.dispatchEvent(
           new Event("change", { bubbles: true, cancelable: true})
       );
   }

}

// Custom-Element bei HTML anmelden - fertig. customElements.define('toggle-switch', ToggleSwitch); </script>

</body> </html>