Animationer och övergångar

By . Latest revision .

Vi har i tidigare kursmoment tittat på hur vi kan designa webbapplikationer så de ser ut som native appar. Vi ska i denna övning titta på hur vi med hjälp av animationer och övergångar även får känslan av att det är en native app.

Vi ska i följande övning få till samma känsla som nedan när vi går från en list-vy till en detalj-vy.

Vi ser att detalj-vyn kommer in från höger och försvinner ut till höger. Vi använder CSS3 för animationer och tittar på hur vi löser det i en liten app.

Exempelkoden finns i kursrepot example/animation.

#Grunden

Jag har gjort i ordning en liten applikation med två stycken vyer. En list vy och en detalj vy. Routern som används är den som skapades i övningen “En router i JavaScript”.

// list-component.js

export default class ListComponent extends HTMLElement {
    connectedCallback() {
        let link = document.createElement("a");

        link.textContent = "Se detaljer";

        link.addEventListener("click", (event) => {
            event.preventDefault();

            location.hash = "detail";
        });

        this.appendChild(link);
    }
}
// detail-component.js

export default class DetailComponent extends HTMLElement {
    connectedCallback() {
        let link = document.createElement("a");

        link.textContent = "Se lista";

        link.addEventListener("click", (event) => {
            event.preventDefault();

            location.hash = "";
        });

        this.appendChild(link);
    }
}
// router.js

export default class Router extends HTMLElement {
    constructor() {
        super();

        this.currentRoute = "";

        this.allRoutes = {
            "": {
                view: "<list-component></list-component>",
                name: "Lista",
            },
            "detail": {
                view: "<detail-component class='slide-in'></detail-component>",
                name: "Detalj",
            },
        };
    }

    get routes() {
        return this.allRoutes;
    }

    // connect component
    connectedCallback() {
        window.addEventListener('hashchange', () => {
            this.resolveRoute();
        });

        this.resolveRoute();
    }

    resolveRoute() {
        this.currentRoute = location.hash.replace("#", "");

        this.render();
    }

    render() {
        this.innerHTML = "<not-found></not-found>";

        if (this.routes[this.currentRoute]) {
            this.innerHTML = this.routes[this.currentRoute].view;
        }
    }
}

#CSS

Vi använder @keyframes för att göra animation av de olika vyerna. Vi använder transform: translateX() för att flytta vy och definierar två stycken @keyframes: moveFromRight och moveToRight.

@keyframes moveFromRight {
    from { transform: translateX(100%); }
}

@keyframes moveToRight {
    to { transform: translateX(100%); }
}

I moveFromRight flyttar vi den från 100% dvs. från höger om skärmen och i moveToRight flyttar vi den till precis höger om skärmen.

Vi definierar först klassen .slide-in som använder sig av moveFromRight på nedanstående sätt. Detalj-komponenten har alltid klassen .slide-in, vilket skarpsynta såg ovan i router.js-filen.

.slide-in {
    animation: moveFromRight 0.4s ease both;
}

Nu glider detalj-vyn in från höger när vi går från listan till detalj-vyn. För att få detalj-vyn att glida ut till höger när vi klickar på Lista-länken använder vi oss addEventListener och setTimeout innan vi ändrar location.hash.

// detail-component.js
export default class DetailComponent extends HTMLElement {
    connectedCallback() {
        let link = document.createElement("a");

        link.textContent = "Se lista";

        link.addEventListener("click", (event) => {
            event.preventDefault();

            this.classList.add("slide-out");

            setTimeout(() => {
                this.classList.remove("slide-out");

                location.hash = "";
            }, 250);
        });

        this.appendChild(link);
    }
}

Klassen .slide-out som använder sig av moveToRight keyframen.

.slide-out {
    animation: moveToRight 0.4s ease both;
}

För att se animeringen kan ni öppna upp example/animation med hjälp av er lokala webbserver.

#Avslutningsvis

Vi har i denna övning tittat på hur man med hjälp av animationer får känslan av att använda en mobil enhet och att det inte bara ser ut som en mobil enhet.

#Revision history

  • 2023-04-03: (B, efo) Uppdaterad inför webapp-v5.
  • 2018-03-02: (A, efo) Första utgåvan inför kursen webapp v3.

Document source.

Category: javascript.