Jedan od detalja koji je jako bitan kod mobilnih aplikacija je brzina ili barem dojam brzine. Brzina se može postići tehničkim poboljšanjima u samom kodu koristeći npr. Lazy Loading, ali opet ostaje onaj dio na koji kao developer ne mogu direktno utjecati, a to je brzina kojom će mi server poslati podatke koje trebam prikazati na ekranu mobilnog uređaja.
A skeleton screen is essentially a blank version of a page into which information is gradually loaded. – Mobile Design Details: Avoid The Spinner
Dok se podaci učitavaju korisnik je prisiljen čekati a ja kao developer trebam odlučiti kako pristupiti tom čekanju na način da korisniku zadržim pažnju, da mu dam do znanja da se u pozadini ipak nešto događa.
Tri su glavna pristupa:
– prikazati prazan ekran
– prikazati loader animaciju
– prikazati skeleton screen

Izrada Skeleton Screena
Definiram varijablu popisKorisnika koja će sadržavati popis korisnika koji dohvatim s API-ja https://jsonplaceholder.typicode.com/users, ali dok podaci ne stignu koristiti ću varijablu privremeniPopisKorisnika koja je zapravo niz (array) od šest stavki.
setTimeout će mi simulirati zastoj na mreži i podatke ću u ovom slučaju čekati tri sekunde za vrijeme kojih će biti prikazan skeleton screen.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import { Component } from '@angular/core'; import { NavController } from 'ionic-angular'; @Component({ selector: 'page-home', templateUrl: 'home.html' }) export class HomePage { popisKorisnika: any; privremeniPopisKorisnika: Array<any> = new Array(6); constructor(public navCtrl: NavController) {} ionViewDidLoad() { setTimeout(() => { fetch('https://jsonplaceholder.typicode.com/users') .then(response => response.json()) .then(data => { //console.log(data); this.popisKorisnika = data; }); }, 3000); } } |
Izgled ekrana sastoji se od najobičnijeg popisa korisnika i funkcionalnosti iza koje stoji *ngIf.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<ion-header> <ion-navbar> <ion-title> Ionic3 - Skeleton Screen </ion-title> </ion-navbar> </ion-header> <ion-content padding> <ion-list *ngIf='popisKorisnika'> <ion-item *ngFor='let korisnik of popisKorisnika'> <h2>{{korisnik.name}}</h2> <h3>E-mail: {{korisnik.email}}</h3> <p>Tvrtka: {{korisnik.company.name}}</p> </ion-item> </ion-list> <ion-list *ngIf='!popisKorisnika'> <ion-item *ngFor='let privremeno of privremeniPopisKorisnika' class='privremeniPodatak'> <h2></h2> <h3></h3> <p></p> </ion-item> </ion-list> </ion-content> |
I za kraj tu je malo CSS-a.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
page-home { .privremeniPodatak { @keyframes animatedBar{ 0%{ background-position: -406px 0; } 100%{ background-position: 0 0; } } h2, h3, p { background-color: lightgrey; opacity: 0.5; height: 1em; margin-top: 10px; position: relative; background: linear-gradient(to right, #dddddd , #EEEEEE); animation: animatedBar 700ms linear infinite; &:after { position: absolute; display: block; content: ''; right: 0; bottom: 0; top: 0; background-color: white; } } h2:after { width: 65%; } h3:after { width: 60%; } p:after { width: 40%; } } } |
Na kraju to izgleda ovako:
Zaključak
Skeleton screen je odličan način za stvaranje dojma brzine. U kombinaciji s ostalim tehničkim poboljšanjima performansi mobilne aplikacije može napraviti čuda, a sve u svrhu boljeg korisničkog iskustva.
Struktura aplikacije prema package.json
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
{ "name": "Ionic3SkeletonScreen", "version": "0.0.1", "author": "Tomislav Stanković", "homepage": "https://www.tomislavstankovic.com/", "private": true, "scripts": { "start": "ionic-app-scripts serve", "clean": "ionic-app-scripts clean", "build": "ionic-app-scripts build", "lint": "ionic-app-scripts lint" }, "dependencies": { "@angular/animations": "5.2.11", "@angular/common": "5.2.11", "@angular/compiler": "5.2.11", "@angular/compiler-cli": "5.2.11", "@angular/core": "5.2.11", "@angular/forms": "5.2.11", "@angular/http": "5.2.11", "@angular/platform-browser": "5.2.11", "@angular/platform-browser-dynamic": "5.2.11", "@ionic-native/core": "~4.10.0", "@ionic-native/splash-screen": "~4.10.0", "@ionic-native/status-bar": "~4.10.0", "@ionic/storage": "2.1.3", "ionic-angular": "3.9.2", "ionicons": "3.0.0", "rxjs": "5.5.11", "sw-toolbox": "3.6.0", "zone.js": "0.8.26" }, "devDependencies": { "@ionic/app-scripts": "3.1.11", "typescript": "~2.6.2" }, "description": "Ionic 3 - Skeleton Screen" } |








