marctrix: Simple Slider

Hej alle,

mein simpler CSS-Slider ist über das WE weiter fortgeschritten:

Slider in Codepen

Ist noch nicht reif für Kritik. Ich weiß selber noch zu viel, was ich erst verbessern möchte, bevor ich Euch ranlasse ;-)

Was der Slider kann: Er läuft automatisch, man kann ihn anhalten. Das funktioniert sowohl mit Tastatur, als auch mit der Maus (checkbox-Hack - die Elemente kann jeder bedienen, sie sind auch sinnvoll beschriftet).

Der Slider wird außerdem angehalten, wenn man die Liste, die die Slides enthält mit der Maus überfährt (Quasi-Standard bei den meisten Slidern, die ich kenne) oder wenn man die Liste antabbt (fokussieren dank tabindes="0" möglich).

Das war es aber auch schon.

Annahmen

Ich gehe davon aus, dass es sich bei den Bildern um Schmuckgrafiken handelt und habe diese entsprechend über CSS eingefügt und nicht ins HTML integriert.

Bekannte To-Dos (Ergänzungen erwünscht!)

  • Aus den Buttons werde ich wohl wieder Links machen, denn sie sollen ja wohl "nur" auf eine andere Seite verweisen.
  • Die Animation "slide" verschiebt die einzelnen li um jeweils 100%, 200% usw (Änderung des Wertes für top). Die Animation hat anscheinend Vorrang für "händisch" gesetzte Werte, d. h. wenn die Animation läuft, bringt ein :checked ~ li { top: 0; } nicht das erste slide zurück.

Ich habe mir damit geholfen, dass ich die laufende Animation dadurch abbreche, dass ich den Namen einer nicht existierenden Animation angebe:

:checked ~ li {
    top: 0;
    animation-name: no-valid-animation;
}

Gesteuert wird das über eine Radio-Buttonleiste. Je nachdem welcher Radio-Button aktiv ist, wird der Wert für top auf unterschiedliche Werte gesetzt: (-100%, -200% usw, um das entsprechende slide anzuspringen).

Da eine nicht existierende Animation gewählt ist, läuft auch nichts mehr an. Das ist wohl auch der Wunsch eines nutzers, der ein bestimmtes Slide anspringt, um es in ruhe lesen zu können.

Der letzte Radio-Button dient dazu, die Animation wieder zu starten.

Gibt es eine elegantere Methode, als eine nicht vorhandene Animation aufzurufen?

  • Als (auskommentierte) Alternative habe ich einen "Pause"-Button eingebaut, der die Animation einfach anhält, wo sie gerade steht (z. B. um von ihr nciht vom Lesen abgelenkt zu werden - hier wären auch neue Darstellungsformen möglich, so könnte aus den einzelnen LIs ein Flex-Box-Grid werden, statt einer Animation. Mehr als das folgende CSS braucht es dafür nicht:
.slide { 
  display: flex; 
  flex-flow: row wrap; 
} 

.slide > * { 
  flex-basis: 20em; 
  flex-grow: 1; 
}

TO-DO

  • Die Buttons werden noch gestaltet.
  • RWD muss noch optimieret werden

Grenzen und Nachteile

  • Die Radio-Buttons zur Steuerung hätte ich gerne in einem Container, am liebsten alles als Liste, dann könnte die komplett übersprungen werden, von z. B. Screenreader-Nutzern. Dann funktioniert aber der check-Box-Hack nicht mehr, der voraussetzt, dass der Slider und die "Bedienelemente" in demselben Elternelement liegen.
  • Sollen mehr oder weniger Bilder angezeigt werden, muss das CSS angepasst werden. Zwar kann man mit CSS auch zählen, das würde hier aber zu sehr viel Code führen, weil 1 bis x Fälle abgefangen werden müssten. Vielleicht ist SASS hier die Rettung. Aber dann muss man zwar nciht mehr so viel schreiben, eine riesengroße CSS-Datei käme am Ende dennoch heraus, wenn man beispielsweise bis zu 100 Slides unterstützen wollte. Sonst kommt man um JS nciht mehr drum herum. Mehr als 10 Slides machen aber auch selten Sinn. Von daher kann man mit einer Begrenzung auf 10 wohl gut leben?!? Muss ich mir mal Gedanken drüber machen - input und feedback erwünscht!
  • Sollen Bilder getauscht werden, müssen die unter dem vorhandenen Namen gespeichert werden - neue Namen lassen sich nicht vergeben, ohne dass auch hier das CSS wieder angepasst werden müsste

Was weiter?

Die Idee eines reinen und simplen CSS-Sliders hat trotz der Nachteile ihren Charme. Er ist schnell und dank der Tatsache dass (bis auf den Checkbox-Hack) nur semantisch sinnvolle Elemente zum Einsatz kommen, ist er selbsterklärend, performant und zugänglich.

Wenn die nötige Logik (wie viele Slides sind vorhanden und welches CSS soll entsprechend übermittelt werden für Dauer der Animation und Anzahl der animierten Schritte (Slide 1 bis X)) kann dieser Slider IMHO auch produktiv genutzt werden z. B. in einer TYPO3-Extension oder in einem PHP-Skript usw

Gerade für das Wiki würde ich im Anschluss an die Ausarbeitung weiterer Slider-Details einen Artikel schreiben, der die Erstellung eines solchen Sliders Schritt für Schritt erklärt. Man kann daran mehrere Dinge prima erklären: geschicktes Selektieren (Checkbox-Hack und zählen von ELementen), Spezifität, Aspekte des RWD.

Insgesamt ist dieser Slider (wie jeder aufgrund der Tatsache, dass es eben ein Slider ist) ein relativ komplexes Konstrukt, aber ich denke, dieser eigent sich gerade aufgrund des Verzichts zusätzlicher Techniken gut dafür, die Schritte auseinanderzubröseln, um zu erklären, was ein Slider überhaupt tut und wie man so etwas prinzipiell umsetzen kann.

Weitere Varianten (aufregendere CSS-Effekte, scrollen in andere Richtungen, bouncing usw) nicht ausgeschlossen... ;-)

Ein Hinweis: Da in das Projekt viel Zeit fließen dürfte, würde ich es gerne auch noch auf meiner Homepage und/oder einer eigenen Projekt-Seite vorstellen, es wäre also nicht exklusiv für selfHTML. Ich weiß auch nicht, ob es überhaupt komplex genug ist, um urheberrechtlich geschützt werden zu können - ich würde es aber eh unter eine Lizenz wie MIT oder so stellen, dass es jeder verwenden darf, der möchte, so dass SELF-Exklusivität prinzipbedingt nicht gegeben wäre.

Ich habe auch erste Anfragen aus dem TYPO3-Umfeld, den nutzen zu dürfen für eine frei verfügbare Extension.

Ich hoffe, das ist ok für Euch.

Marc

  1. Servus!

    Hej alle,

    mein simpler CSS-Slider ist über das WE weiter fortgeschritten:

    Danke, (aber bei mir läuft die animation nicht :-( )

    Grenzen und Nachteile

    • Sollen mehr oder weniger Bilder angezeigt werden, muss das CSS angepasst werden. Zwar kann man mit CSS auch zählen, das würde hier aber zu sehr viel Code führen, weil 1 bis x Fälle abgefangen werden müssten. Vielleicht ist SASS hier die Rettung. Aber dann muss man zwar nciht mehr so viel schreiben, eine riesengroße CSS-Datei käme am Ende dennoch heraus, wenn man beispielsweise bis zu 100 Slides unterstützen wollte. Sonst kommt man um JS nciht mehr drum herum. Mehr als 10 Slides machen aber auch selten Sinn. Von daher kann man mit einer Begrenzung auf 10 wohl gut leben?!? Muss ich mir mal Gedanken drüber machen - input und feedback erwünscht!

    Ich würde sogar nur 1-9 vorschlagen und bei den 4 Seiten bleiben, damit das Beispiel überschaubar bleibt.

    • Sollen Bilder getauscht werden, müssen die unter dem vorhandenen Namen gespeichert werden - neue Namen lassen sich nicht vergeben, ohne dass auch hier das CSS wieder angepasst werden müsste

    Warum nicht doch als Inhalt ins HTML?

    
      <li id="meaningOf2ndChild">
        <a href="#">Link zwei</a>
        <button class="cta">weiter</button>
        <img ....>
      </li>
    

    Was weiter?

    Die Idee eines reinen und simplen CSS-Sliders hat trotz der Nachteile ihren Charme. Er ist schnell und dank der Tatsache dass (bis auf den Checkbox-Hack) nur semantisch sinnvolle Elemente zum Einsatz kommen, ist er selbsterklärend, performant und zugänglich.

    Grund genug für einen Artikel!

    Ein Hinweis: Da in das Projekt viel Zeit fließen dürfte, würde ich es gerne auch noch auf meiner Homepage und/oder einer eigenen Projekt-Seite vorstellen, es wäre also nicht exklusiv für selfHTML.

    Du hast die Autorenrechte und kannst hier einer Veröffentlichung unter CCN zustimmen, alles andere ist dein gutes Recht und geht uns nichts an!

    Vielen Dank für deine Bereitschaft!

    Herzliche Grüße

    Matthias Scharwies

    --
    Es gibt viel zu tun - packen wir's an: ToDo-Liste gewünschte Seiten
    1. Hej Matthias,

      mein simpler CSS-Slider ist über das WE weiter fortgeschritten:

      Danke, (aber bei mir läuft die animation nicht :-( )

      Hatte eben dran rumgefummelt.... ;-)

      Jetzt geht er wieder

      Ich würde sogar nur 1-9 vorschlagen und bei den 4 Seiten bleiben, damit das Beispiel überschaubar bleibt.

      Ich würde den sowieso auseinander Bröseln um einfach nachvollziehbare Schritte zu erhalten.

      Das ganze Ding auf einen Schlag ist IMHO noch zu umfangreich für eine Erklärung.

      • Sollen Bilder getauscht werden, müssen die unter dem vorhandenen Namen gespeichert werden - neue Namen lassen sich nicht vergeben, ohne dass auch hier das CSS wieder angepasst werden müsste

      Warum nicht doch als Inhalt ins HTML?

      
        <li id="meaningOf2ndChild">
          <a href="#">Link zwei</a>
          <button class="cta">weiter</button>
          <img ....>
        </li>
      

      Weil es meistens "nur" Schmuckgrafiken sind.

      Damit gehören sie eigentlich ins CSS.

      Da in das Projekt viel Zeit fließen dürfte, würde ich es gerne auch noch auf meiner Homepage und/oder einer eigenen Projekt-Seite vorstellen, es wäre also nicht exklusiv für selfHTML.

      Du hast die Autorenrechte und kannst hier einer Veröffentlichung unter CCN zustimmen, alles andere ist dein gutes Recht und geht uns nichts an!

      Vielen Dank für deine Bereitschaft!

      Sehr gerne! Sorry dass ich auf deine Mail noch nicht geantwortet hatte - ich musste erst mal mehr über den slider nachdenken.

      :-}

      Marc

    2. Hej Matthias,

      mein simpler CSS-Slider ist über das WE weiter fortgeschritten:

      Danke, (aber bei mir läuft die animation nicht :-( )

      Hinweis! derzeit gibt es Probleme im Safari (unter iOS und OS X - Cross-Browser-Tests habe ich bisher ohnehin kaum durchgeführt) - ich vermute im Moment ein Problem mit den vielen Kommentaren...

      Marc

  2. Hallo Marc

    Gibt es eine elegantere Methode, als eine nicht vorhandene Animation aufzurufen?

    Du könntest mehrere Animationen unter verschiedenen Namen definieren und den einzelnen Bildern zuweisen.

    Mit besten Grüssen
    Richard

    1. Hej Richard,

      Gibt es eine elegantere Methode, als eine nicht vorhandene Animation aufzurufen?

      Du könntest mehrere Animationen unter verschiedenen Namen definieren und den einzelnen Bildern zuweisen.

      Ja, das habe ich auch gedacht, aber dann muss ich x Fälle abarbeiten. Ich versuche eigentlich den Slider in die andere Richtung weiter zu entwickeln: Dass es mehr und mehr egal ist, wie viele Bilder angezeigt werden sollen und das CSS möglichst klein zu halten.

      Trotzdem danke für Deinen Vorschlag!

      Marc

      1. Hallo Marc

        Ja, das habe ich auch gedacht, aber dann muss ich x Fälle abarbeiten.

        Es genügt eine Animation für alle Bilder. Das ist nicht komplizierter als deine Lösung jetzt.

        Ich versuche eigentlich den Slider in die andere Richtung weiter zu entwickeln: Dass es mehr und mehr egal ist, wie viele Bilder angezeigt werden sollen und das CSS möglichst klein zu halten.

        Meine Überlegung war, von Bild zu Bild zu animieren, das käme deiner Absicht entgegen.

        Mit den besten Grüssen
        Richard

        1. Hej Richard,

          Ja, das habe ich auch gedacht, aber dann muss ich x Fälle abarbeiten.

          Es genügt eine Animation für alle Bilder. Das ist nicht komplizierter als deine Lösung jetzt.

          Hmm - irgendwie habe ich ein Brett vor dem Kopf. Ich habe derzeit zwei Animationen. Eine echte und eine Dummy - die gar nicht angelegt ist.

          Meinst du, ich sollte da etwas drin hinterlegen? Um Beispielsweise die einzelnen Slides nicht einfach anzuzeigen, sondern den Wechsel dahin zu animieren? - Das wäre natürlich eine Überlegung wert.

          Dennoch müsste ich dann für jedes Wert wieder die Werte für die Verschiebung angeben - was bei Änderungen der Größen pflegeaufwändig und fehleranfällig ist - es sei denn, man verwendet SASS o.ä.

          Ich versuche eigentlich den Slider in die andere Richtung weiter zu entwickeln: Dass es mehr und mehr egal ist, wie viele Bilder angezeigt werden sollen und das CSS möglichst klein zu halten.

          Meine Überlegung war, von Bild zu Bild zu animieren, das käme deiner Absicht entgegen.

          Wie?

          Irgendwie kann ich dir trotz 3 Tassen Kaffee nicht ganz folgen heute morgen :-}

          Marc

          1. Hallo Marc

            Meinst du, ich sollte da etwas drin hinterlegen? Um Beispielsweise die einzelnen Slides nicht einfach anzuzeigen, sondern den Wechsel dahin zu animieren? - Das wäre natürlich eine Überlegung wert.

            Ja, das meinte ich, aber es könnte aufwändiger sein, als ich zunächst dachte. Es ist einfach unsauber, auf eine nicht existierende Animation zu zugreifen.

            Meine Überlegung war, von Bild zu Bild zu animieren, das käme deiner Absicht entgegen. Wie?

            Ich dachte da an die Möglichkeit, am Ende der Animation ein Ereignis auszulösen, was wohl aber nicht möglich ist. Auf JavaScript zu verzichten schränkt doch sehr ein. So wäre es einfacher gewesen, mit einer variablen Anzahl von Bildern zu arbeiten.

            Mit besten Grüssen
            Richard