Kategorien
Code

Loading Indicator á la Youtube mit CSS

Loading-Balken
Der Plan

Nachdem ich eine vernüftige Ladeanimation gesucht habe, und bei allem immer irgendwie jQuery dranhängen musste, hab ich beschlossen, das ganze mal in lean zu lösen. Probleme dabei gibt es eigentlich nur im Bereich des Animationsstarts durch JS, dazu habe ich bei CSS-Tricks den passenden Tipp gefunden.

HTML:

<div class="loading-bar"></div>

CSS:

    .loading-bar {
        display: none;
        opacity: 0;
        position: absolute;

        top: 0;
        width: 100%;
        max-width: 100%;
        margin: 0;
        padding: 0;

        background: red;
        height: 0;
        animation-name: expand-width, fade;
        animation-duration: 1s, 4s;
        animation-delay: 0s, 1s;

        animation-iteration-count: 1;
    }

    .loading-bar.visible {
        display: block;
        opacity: 1;
        height: 2px;
    }

    @keyframes fade {
        from {
            height: 2px;
            opacity: 1;
        }
        to {
            height: 0;
            opacity: 0;
        }
    }

    @keyframes expand-width {
        from {
            width: 0;
        }
        to {
            width: 100%;
        }
    }

    @keyframes glow {
        from {
            box-shadow: 0 0 5px red,
            0 0 10px red,
            0 0 10px rgba(255, 165, 0, 1),
            0 0 20px rgb(255, 244, 0);
        }
        to {
            box-shadow: none;
        }

    }

    .loading-bar.visible:before {
        box-shadow: none;

        position: absolute;
        right: 0;
        content: "";
        display: block;
        height: 2px;
        width: 8px;
        animation-name: glow;
        animation-duration: 5s;
        animation-iteration-count: 1;
    }

 

Javascript:

    var links = document.querySelectorAll( 'a' ),
            linkslen = links.length;

    for ( var link = 0; link < linkslen; link++ ) {

        links[link].addEventListener( 'click', function ( e ) {
            var lb = document.querySelectorAll( '.loading-bar' )[0];
            lb.classList.remove( 'visible' );
            //noinspection SillyAssignmentJS
            // triggers reflow for animation restart
            lb.offsetHeight = lb.offsetHeight;
            lb.classList.add( 'visible' );
        }, false )
    }

Edit am 29.12.: Ich habe den Code mal ein bisschen lesbarer und einfacher gemacht. Dazu habe ich das innere DIV entfernt, dass CSS zusammengeführt und das JS ein bisschen lesbarer gemacht. Mein Partial aus meinem Hugo-Projekt habe ich mal als Gist online gestellt. Sichergestellt sein sollte, dass das Partial so eingefügt wird, dass .loading-bar direktes Kind-Element von BODY ist. Ansonsten müssen ggf. die Styles angepasst werden.

Kategorien
Webentwicklung

Listen mit eigenen Aufzählungszeichen (ohne Bilder, mit Unicode!)

Wenn man mal in die Verlegenheit kommen sollte, eine Liste mit eigenen Aufzählungszeichen machen zu müssen, wie zum Beipiel in “Auflistung von Vorteilen”, der kann das mit der Content-Eigenschaft gut machen. Allerdings sind die Dinger dann meist inline, so dass Zeilenumbrüche unter dem Listen-Symbol weitergehen, und eher fies zu positionieren.

Mit einem kleinen Trick geht’s aber auch einfacher:

// LESS code

  ul {
    margin: 0;
    padding: 0;
    li {
      list-style-type: none;
      display: table-row;
      &:before {
        content:'\002B'; // "+"
        font-size: 20px;
        line-height: 1.5;
        display: table-cell;
        padding-right: 5px; // Achtung: Margins und Borders greifen hier nicht mehr.
      }
    }
  }

Links

  1. CSS Value Converter
Kategorien
Webentwicklung

CSS-Content-Eigenschaften

Man lernt ja nie aus: “open-quote” und “close-quote” sind valide Werte für die CSS-Eigenschaft “content” und zeigen an dieser Stelle dann typografisch korrekte Anführungszeichen. Wunderbare Eigenschaft zum Stylen von quotes und blockquotes, finde ich.

CSS content • Inhalte mit CSS generieren

Kategorien
Linklove

Ressourcensammlung KW34/2014

picjumbo.com_austriaroad2

Statische Websitegeneratoren (z.B. für Design-Prototypen)

Automatisierung, Testing, Prozesssteuerung

Andere Links

Kategorien
Webentwicklung

display: table-row – Nicht alles was glänzt ist Gold!

Neulich schrieb ich ja schon über den sehr interessanten Styling-Ansatz von Google Chrome in Verbindung mit display: table-row. Das entdeckte ich im Zuge des Produktkonfigurator-Projekts. Nun hat es sich ergeben, dass ich im Zuge einer Optimierung eines Webshops für einen Kunden umsetzen sollte, dass alle Footer-Widgets (genauer: 4 Listen mit Navigationspunkten, aufgeteilt auf 4 Spalten) als jeweils eine Box mit gleicher Höhe wie die anderen 3 dargestellt werden sollte.

Das ganze soll natürlich möglichst dynamisch sein, damit unterschiedliche Schriftrenderings auf unterschiedlichen OS- und Browserkombinationen problemlos läuft. Vorgabe des Kunden: Alte Browser (IE<10) dürfen schlechter aussehen, aktueller Firefox ist die Referenz. (‘Und alle so yeah!‘).

Vorher schon habe ich im Zuge der Kästenanpassung für die Breitenoptimierung der Kästen auf box-sizing: border-box; umgestellt, so dass ich außer den Margins hier eigentlich keine größeren Probleme erwartete: Einfach die Kästenelemente auf Tabellen-Zellen-Style umstellen, fertig – wenn eine Zelle höher wird, werden die anderen automatisch auch höher. Jung und naiv.

Nach einer Experimentierphase mit zwei Wrap-Elementen, die display: table und display: table-row stand fest: Es gibt keine Möglichkeit bei display: table und Co., das Spacing der “Tabellenzellen” zu beeinflussen, so dass eine breiter Kasten statt 4 angezeigt wurde. Margins: Ein Ding der Unmöglichkeit. Und weiter mit Wrappern innerhalb der Kästen um das alte Design wieder herzustellen fand ich nicht zielführend.

Ich hatte dann doch kurz überlegt, ob ich nicht das Javacript von OXID anschauen und wieder aktivieren sollte, welches eine Equalheight-Funktion hat, die aber scheinbar mit border-box nicht klarkommt. Da der Kunde (für einen Webshop) sehr progressiv auf Browserebene arbeitet, hab ich dann überlegt, welche Möglichkeiten CSS only dann noch in Frage kommen, ohne am DOM viel zu verändern und dachte mal kurz an das Flexbox-Modul. Und hey: Es funktioniert ab IE10 und in allen modernen Browsern.

Dazu kam folgende Anforderung, die die Entscheidung leichter machte: der letzte Kasten, der bisher nur eine Zeile enthielt wurde mit mehr Inhalt (dynamisch) gefüllt, war nun aber 1 Zeile länger als die anderen Kästen.

Wrapper um die Kästen mit display:flex-box und die Kästen auf flex:1 gesetzt, fasst in allen aktuellen Browsern. IE 8 und 9 kennen Flexbox nicht und machen einen Fallback auf die bereits vorhandene float-Lösung (wodurch der 4. Kasten geringfügig größer ist als die anderen).