摘要:二基于上面的測(cè)試,實(shí)現(xiàn)頁(yè)面加載動(dòng)畫(huà)理想的方式是什么先定好目標(biāo)盡快讓用戶(hù)看到變化,不要讓用戶(hù)以為頁(yè)面已經(jīng)不響應(yīng),再逐步加載內(nèi)容。頁(yè)面上方加載動(dòng)畫(huà)的定義和頁(yè)面元素,提供異步加載頁(yè)面元素和文件的。
在手機(jī)上打開(kāi)頁(yè)面時(shí),經(jīng)常會(huì)因?yàn)榫W(wǎng)絡(luò)不好導(dǎo)致需要較長(zhǎng)的加載時(shí)間,如果這段時(shí)間內(nèi)只是顯示一個(gè)“白板”,用戶(hù)體驗(yàn)非常不好。通常的解決方案就是完整打開(kāi)頁(yè)面前給用戶(hù)展示一個(gè)加載動(dòng)畫(huà),讓用戶(hù)能夠看到頁(yè)面還活著呢。本以為是個(gè)很簡(jiǎn)單的活,真做起來(lái)才發(fā)現(xiàn)【有不少學(xué)問(wèn)】!
一、首先要搞清楚的問(wèn)題是,為什么加載過(guò)程中會(huì)出現(xiàn)”白板“,下面用Chrome開(kāi)發(fā)者工具的Timeline分析面板做了幾個(gè)實(shí)驗(yàn)。1、不加載資源文件
順序:加載、解析、渲染、繪制
2、加載CSS
加載外部的CSS文件會(huì)阻止渲染,不論link的標(biāo)簽放在什么位置上。
順序:加載、解析、加載(阻塞了渲染)、渲染、繪制
3、加載JS
a、在body前加載外部的JS文件會(huì)阻止渲染
順序:加載、解析、渲染(?)、加載(阻塞)、解析(JS執(zhí)行完多了個(gè)解析)、渲染、繪制
b、在body后加載外部的JS文件不會(huì)阻止渲染
順序:加載、解析、渲染、繪制、加載、解析、渲染、繪制
4、在
加載CSS中斷了頁(yè)面的渲染和繪制
5、在
加載CSS沒(méi)有中斷。我理解這是因?yàn)镴S是單線(xiàn)程的,放在timeout里創(chuàng)建的link去排隊(duì),瀏覽器就先不管它了。
先定好目標(biāo):盡快讓用戶(hù)看到變化,不要讓用戶(hù)以為頁(yè)面已經(jīng)不響應(yīng),再逐步加載內(nèi)容。
最快的方式就是做一個(gè)空的頁(yè)面,不加載任何外部資源(包括:CSS和JS)。頁(yè)面上方加載動(dòng)畫(huà)的CSS定義和頁(yè)面元素,提供異步加載頁(yè)面元素、CSS和JS文件的JS。通過(guò)JS加載各類(lèi)資源成功后關(guān)閉動(dòng)畫(huà)效果,清除不必要的內(nèi)容。
這樣就來(lái)個(gè)新問(wèn)題,如何實(shí)現(xiàn)動(dòng)態(tài)加載問(wèn)題?
外部文件的動(dòng)態(tài)加載問(wèn)題很多文章都深入分析過(guò)了,簡(jiǎn)單說(shuō),就是用異步加載,但是要考慮到各個(gè)JS文件的依賴(lài)關(guān)系問(wèn)題。綜合比較了一下,決定requirejs實(shí)現(xiàn)動(dòng)態(tài)加載。因?yàn)樽罱恢庇胊ngular,所以下面的代碼是require.js+angular。
HTML
loading
loader.js
因?yàn)閍ngular不是AMD,所以用shim引用成angular全局變量
require.config({ paths: { "angular": "/static/js/angular.min", }, shim: { "angular": { exports: "angular" }, }, deps: ["/test/loading/app.js?_=10"] });
app.js
如果真的要?jiǎng)討B(tài)添加樣式,建議先獲得數(shù)據(jù),把數(shù)據(jù)展現(xiàn)出來(lái),在加載樣式,這樣就能讓用戶(hù)今早看到變化。
define(["angular"], function(angular) { "use strict"; angular.module("app", []).controller("ctrl", ["$scope", "$timeout", function($scope, $timeout) { $scope.data = []; // 模擬長(zhǎng)時(shí)間獲得數(shù)據(jù) $timeout(function() { for (var i = 0; i < 100; i++) { $scope.data.push("data:" + i); } // 模擬長(zhǎng)時(shí)間獲得樣式 $timeout(function() { var link, head; link = document.createElement("link"); link.href = "/test/loading/app.css?_=" + (new Date()).getTime(); link.rel = "stylesheet"; link.onload = function() { var eleLoading, eleStyle; eleLoading = document.querySelector(".loading"); eleLoading.parentNode.removeChild(eleLoading); eleStyle = document.querySelector("#loadingStyle"); eleStyle.parentNode.removeChild(eleStyle); }; head = document.querySelector("head"); head.appendChild(link); }, 2000); }, 2000); }]); });
app.css
#content{color:red;}三、還可以做什么?
可以考慮頁(yè)面的布局也動(dòng)態(tài)加載,這樣用戶(hù)可以先看見(jiàn)頁(yè)面的框架,然后再獲取數(shù)據(jù)填到框架中。但是還沒(méi)有想到成熟的解決方案。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/78644.html
摘要:二基于上面的測(cè)試,實(shí)現(xiàn)頁(yè)面加載動(dòng)畫(huà)理想的方式是什么先定好目標(biāo)盡快讓用戶(hù)看到變化,不要讓用戶(hù)以為頁(yè)面已經(jīng)不響應(yīng),再逐步加載內(nèi)容。頁(yè)面上方加載動(dòng)畫(huà)的定義和頁(yè)面元素,提供異步加載頁(yè)面元素和文件的。 在手機(jī)上打開(kāi)頁(yè)面時(shí),經(jīng)常會(huì)因?yàn)榫W(wǎng)絡(luò)不好導(dǎo)致需要較長(zhǎng)的加載時(shí)間,如果這段時(shí)間內(nèi)只是顯示一個(gè)白板,用戶(hù)體驗(yàn)非常不好。通常的解決方案就是完整打開(kāi)頁(yè)面前給用戶(hù)展示一個(gè)加載動(dòng)畫(huà),讓用戶(hù)能夠看到頁(yè)面還活著呢。...
摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線(xiàn)程,定時(shí)器任務(wù)線(xiàn)程,文件系統(tǒng)處理線(xiàn)程等等。線(xiàn)程核心是引擎。主線(xiàn)程和工作線(xiàn)程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)...
摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線(xiàn)程,定時(shí)器任務(wù)線(xiàn)程,文件系統(tǒng)處理線(xiàn)程等等。線(xiàn)程核心是引擎。主線(xiàn)程和工作線(xiàn)程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)...
摘要:因?yàn)楫惒降年P(guān)系中的回調(diào)函數(shù)并非立即執(zhí)行,而是需要加入等待隊(duì)列中。通知繪制位圖到屏幕上而就只需要繪制圖層了,所以硬件加速的性能無(wú)疑更好。 寫(xiě)在前面 說(shuō)到web的高性能動(dòng)畫(huà),這部分內(nèi)容其實(shí)已經(jīng)是老生常談的了,不過(guò)其中還是有不少比較新的而且非常實(shí)用的內(nèi)容可以和大家分享一下。讀完這篇文章后相信大家都會(huì)對(duì)動(dòng)畫(huà)渲染的機(jī)制以及制作60fps動(dòng)畫(huà)的關(guān)鍵要素有足夠的理解,以后遇上了動(dòng)畫(huà)相關(guān)的問(wèn)題也可以很...
摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線(xiàn)程,定時(shí)器任務(wù)線(xiàn)程,文件系統(tǒng)處理線(xiàn)程等等。線(xiàn)程核心是引擎。主線(xiàn)程和工作線(xiàn)程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問(wèn)題的一些問(wèn)題并結(jié)合個(gè)...
閱讀 2346·2021-11-24 10:27
閱讀 3588·2019-08-30 15:55
閱讀 3350·2019-08-30 15:53
閱讀 2351·2019-08-29 17:27
閱讀 1442·2019-08-26 13:47
閱讀 3556·2019-08-26 10:28
閱讀 921·2019-08-23 15:59
閱讀 2861·2019-08-23 15:19