CSS
Børre Stenseth
Dynamikk > Flip >Bok

En enkel bokmal

Hva

I denne modulen skal vi se hvordan vi kan bruke flip-teknikken, beskrevet i Flip , og se hvordan vi kan nærme oss illusjonen av en bok.

Det vi skal lage ser slik ut:

booklet/booklet.html https://borres.hiof.no/wep/css/flip/book/booklet/booklet.html

Når en går litt i dybden på problemstillinger av denne typen så er det etn problemstilling som raskt melder seg: Hvor mye skal vi gjøre i CSS og hvor mye skal vi gjøre i Javascript ? Løsningen som er beskrevet nedenfor er antagelig mer JS-basert enn mange av tilsvarende prosjekter du kan finne på nettet. Som vi har sett i andre moduler i dette materialet er det nesten ingen grenser for hva vi kan få til av dynamikk i CSS. Jeg har valgt å bruke en del Javascript fordi det gir meg en bedre følelse av kontroll.

Plan

Vi definerer en "scene" der vi til enhver tid plasserer de aktive sidene og de neste sidene, dvs. de som ligger bak de aktive. page-elementene er i utganspunktet usynlige (display:none), og innholdet må flyttes til scenen for å bli synlig.

plan
Synlige sider

Koden som plasserer sidene på riktig plass blir slik:

_prepareBook()

Når vi første har gjort dette kan fokusere på det innholdet som er plassert i de fire feltene, de to aktive og de to som ligger bak.

CSS eller Javascript

Når vi skal flipp en side har vi mange valgmuligheter. Vi må hele tiden passe på at siden alltid under vendingen viser riktig front. Det vil si at innholdet må speiles når vi har rotert 90 grader. Dette lar seg løse med CSS (keyframe og animation), men jeg har valgt å bruke Javascript til å kontrollere hele "flippen".

Koden som gjør en vending er slik:

//------------------------------
// clicked on left active page
function flipForwards()
{        
    if( animating ||(curPageLeft==0))
        return;
    clearInterval(rotator);
    animating=true;
    activePageHolder=document.getElementById("activeLeft");
    rotator=setInterval("rotateRight()",stepTime);
    degrees=0;
    activePageHolder.setAttribute("style","z-index:500;");
}
function rotateRight()
{
    degrees=degrees+dStep;
    doTransform(activePageHolder,degrees,-50);
    if(degrees==90)
    {
        // flip it
        movePageTo(activePageHolder,curPageLeft-1);
        activePageHolder.querySelector(".content").classList.add("flipped");
    }
    if (degrees==180 || degrees>=360){
        clearInterval(rotator);
        animating=false;
        activePageHolder.querySelector(".content").classList.remove("flipped");
        activePageHolder.setAttribute("style","");
        prepareBook(curPageLeft-2);
    }
}

Funksjonen doTransform() er den som faktisk foretat et rotasjonssteg. Den er laget slik at den bruker style attributten til å overkjøre classe definisjonen mens flipp operasjonen foregår. Dette er en ganske hendig teknikk og fungerer fordi style har høyere prioritet enn class. Vi må bare huske på å fjerne slike midlertidige effekter. Funksjonen er slik:

//---------------------------------
// perform a rotation, will only affect style element
function doTransform(elt,rotY,transX){
    elt.style.transform="rotateY(" + rotY + "deg)       translateX(" + transX+"%)";
    elt.style.webkitTransform="rotateY(" + rotY + "deg) translateX(" + transX+"%)";
    elt.style.OTransform="rotateY(" + rotY + "deg)      translateX(" + transX+"%)";
    elt.style.MozTransform="rotateY(" + rotY + "deg)    translateX(" + transX+"%)";
}

All javascript koden er samlet slik:

_booklet.js

Stilsettet er slik:

_booklet.css

Forbedringer

Eksempelet har et stort forbedringspotensiale. Noen som kanskje kunne gjøres uten alt for mye arbeid:

  • Side angivelse. Vi burde kanskje sett på et sidenummer på sidene, f.eks opp i hjørnet.
  • Side indikator. Når vi blar i boka har vi ikke noe inntrykk av hvor langt vi har kommet og hvor mye som er "ulest". Vi kunne jo legge på noe slikt:
    -
    Vi kunne jo også gjøre den aktiv slik at vi kunne bla med den.
  • Side 0, den som ikke ser ut som en side, burde jo vært en bokhylle der vi kunne hente flere bøker, f.eks. ved et AJAX kall. Det vi da måtte få tak i ville jo egentlig bare være et HTML-segment med page-elementer.
  • Det er nok en god del å hente i å raffinere det som er av responsive design. Du kan jo teste demoen i utvikler modus i nettleseren, eller laste den opp i en eller annen mobil etter brett.
  • Det kan jo også være en interessant øvelse, og noen vil sikkert si forbedring, å overføre animasjonen til ren CSS.
Dynamikk > Flip >Bok