24
05

jQuery - Flash of Unstyled Content

jQuery - Flash of Unstyled Content

Seit Ewig­kei­ten mal wie­der ein win­zi­ges Tuto­rial von mir zur Lösung eines durch­aus ner­vi­gen klei­nen Pro­blems. Nutzt man jQuery im gro­ßen Stil mit dyna­misch gela­de­nen Inhal­ten und auf­wen­di­ge­rem CSS, kann es zum Effekt kom­men, den man Flash of unstyled Con­tent nennt. Der Brow­ser lädt Inhalte, die noch nicht voll­stän­dig mit Sti­len und Klas­sen ver­se­hen sind und zeigt somit Inhalte in fal­scher Form an. Mein Archiv war hier ein Mus­ter­bei­spiel, wel­ches mitt­ler­weile aber aus­ge­bes­sert ist. Zuge­ge­ben nur ein Schön­heits­feh­ler aber einer, der sich ganz ein­fach behe­ben lässt.

Ich bin nicht der Erste, der die­ses Pro­blem ver­sucht zu lösen. Wer danach googled wird viele Lösun­gen fin­den. Auch ich habe nur eine Lösung zu mei­ner gemacht. Zwei Vor­rau­sett­zun­gen sind zu erfül­len. Zum einen möchte ich so wenig zusätz­li­chen Quell­code und zum ande­ren solle es eine pure Javaskript-Lösung sein, die Nut­zer mit deak­ti­vier­tem Javaskript igno­riert. Im schlimms­ten Fall ver­steckt man mit CSS Ele­mente, die nur ange­zeigt wer­den, wenn Javaskript aktiv ist. Die­sen Fall möchte man ver­mei­den.

Grund­sätz­lich lau­fen alle Lösun­gen nach dem glei­chen Prin­zip. Beim Laden der Seite wer­den unge­stylte Ele­mente ver­steckt und nach dem jQuery sei­nen Zau­ber hat wir­ken las­sen, zeigt man diese Ele­mente wie­der an. jQuery selbst bie­tet dafür nicht grund­los eine document.ready-Funktion, die prak­tisch dafür geschaf­fen ist. Wir brau­chen 2 Zei­len jQuery und 1 Zeile CSS.

Die Javaskript-Frage kop­peln wir an die CSS-Regel, die somit nur greift, wenn Javaskript aktiv ist. Dafür schlägt learnin­gJQuery das HTML-Tag vor. Also ver­passt man die­sem Tag ein­fach eine neue CSS-Klasse/ID:

    $('html').addClass('js');

basiert dar­auf CSS, um das gewünschte Ele­ment zu ver­ste­cken

    .js #zuVersteckendesElement {display: none;}

und ent­fernt die .js-Klasse vom HTML-Tag, wenn das Doku­ment fer­tig gela­den ist:

    $(document).ready(function(){
        $('html').removeClass('js');
    });

Was hier pas­siert ist schnell und ein­fach beschrie­ben:

  1. Doku­ment beginnt zu laden
  2. .js-Klasse wird HTML-Tag zuge­wie­sen
  3. CSS-Klasse greift somit und ver­steckt das gerade gela­dene Ele­ment
  4. Doku­ment ist fer­tig gela­den und struk­tu­riert
  5. .js-Klasse wird ent­fernt
  6. Ele­ment erscheint auf der Seite

Das ist mal wirk­lich ein­fach. Kleine Pro­bleme kann es geben, wenn man ver­schie­dene jQuery-Module mit der Lösung kom­bi­niert, was mir im Archiv pas­siert ist. Hier habe ich etwas rum­ge­dok­tort, wie die CSS-Regel aus­se­hen muss, damit das Ele­ment ver­steckt, das jQuery-Tabs aber nicht beein­flusst wer­den. Abge­se­hen davon, eine sehr ele­gante Lösung.

Kommentar schreiben
safari bug

Vorschau:

HTML ist in Kommentaren zugelassen. Erlaubt sind die HTML-Tags:
<a href>, <i>, <p>, <strong>, <em>, <ul>, <ol>, <li>, <blockquote>.
Alle themenfremden oder persönlichkeistverletzenden Beiträge werden gelöscht, also immer schön sachlich argumentieren.

schrieb: