PWA学习笔记(二)
设计与体验
APP Shell:
1、应用从显示内容上可粗略划分为内容部分和外壳部分,App Shell 就是外壳部分,即页面的基本结构
2、它不仅包括用户能看到的页面框架部分,还包括用户看不到的代码逻辑
3、页面能够展现所需的最小资源集合,即支持用户界面所需的最小的 HTML、CSS 和 JS 等静态资源集合
4、采用 App Shell 的站点,每个页面都会先加载 App Shell 的内容,
再由 App Shell 根据当前页面 URL 渲染对应的主体内容
正确地使用 APP Shell:
1、使用 Service Worker 预缓存 App Shell 的静态资源
2、用户访问 Web 站点时,通过 Service Worker 拦截请求
3、Service Worker 返回缓存中的 App Shell 给浏览器
4、App Shell 根据当前的 URL 再去请求对应的数据来渲染
骨架屏:
1、快速渲染的静态图片/样式/色块进行占位,让用户对后续会渲染的内容有一定的预期
2、从架构上来说分为前端渲染(CSR)和后端渲染(SSR)两种,骨架屏适用于前端渲染的页面
3、骨架屏的 HTML 和 CSS 内联,从而使骨架屏能更快地展示出来
4、外链样式文件会阻塞骨架屏渲染所需的样式和 HTML 的渲染,可以将外联样式的 rel 设置为 preload
<link rel="stylesheet" href="xxx.css">
<link rel="preload" href="xxx.css">
5、由于使用预加载来加载样式文件,所以我们无法保证浏览器会先应用样式再运行 JavaScript 渲染内容。
所以,在样式文件加载完成前,即使 JavaScript 已渲染好了内容,也先不要替换掉骨架屏,等待样式文件
加载完成后,再触发 JavaScript 进行挂载。如果样式文件在 JavaScript 文件之前加载,则 mount 函数
还没有声明,执行会出错,导致主体内容没有渲染到页面上,需增加标记告诉 JavaScript 样式是否加载完成
// src/main.js
const app = new Vue({
router,
components: { App },
template: '<App/>'
}) /**
* 挂载 Vue 渲染好的 HTML 元素到 #app 中,替换掉骨架屏
*/
window.mount = function () {
app.$mount('#app')
} // 如果样式文件已经加载完成了,直接挂载
if (window.STYLE_READY) {
window.mount()
} <!-- index.html -->
<link rel="preload" href="xxx.css" as="style" onload="this.onload=null;this.rel='stylesheet';window.STYLE_READY=1;window.mount&&window.mount();">
Data URL:
1、允许我们使用内联(inline-code)的方式在网页中包含数据,目的是将一些小的数据,
直接嵌入到网页中,从而不用再从外部文件载入
<!-- 传统引入图片方法 -->
<img src="data:images/image.png"/> <!-- Data URL 引入图片方法 -->
<img src="data:image/png;base64,iV......"/>
2、格式规范
data:[<mime type>][;charset=<charset>][;<encoding>],<encoded data> 1. data :协议名称; 2. [<mime type>] :可选项,数据类型(image/png、text/plain等) 3. [;charset=<charset>] :可选项,源文本的字符集编码方式 4. [;<encoding>] :数据编码方式(默认US-ASCII,BASE64两种) 5. ,<encoded data> :编码后的数据
部分 Data URL scheme 支持的类型
data:, 文本数据
data:text/plain, 文本数据
data:text/html, HTML代码
data:text/html;base64, base64编码的HTML代码
data:text/css, CSS代码
data:text/css;base64, base64编码的CSS代码
data:text/javascript, Javascript代码
data:text/javascript;base64, base64编码的Javascript代码
data:image/gif;base64, base64编码的gif图片数据
data:image/png;base64, base64编码的png图片数据
data:image/jpeg;base64, base64编码的jpeg图片数据
data:image/x-icon;base64, base64编码的icon图片数据
3、制作 base64 的 Data URL:
(1)使用二进制方式(rb)打开图片文件
(2)用 Python 的 base64 库来给比特流图片进行编码
# 引入 base64 库
import base64 with open("图片路径", 'rb') as f:
# 将比特流编码,类型仍是 bytes
base64_data = base64.b64encode(f.read())
# 解码比特流为字符串,以供使用
s = base64_data.decode()
data_url = 'data:image/jpeg;base64,' + s
4、适用场合:
(1)当访问外部资源很麻烦或受限时
(2)当图片是在服务器端用程序动态生成,每个访问用户显示的都不同时
(3)当图片的体积太小,占用一个HTTP会话不是很值得时
5、不适用场合:
(1)编码后可能会增加数据的体积
(2)Data URL形式的图片不会被浏览器缓存,这意味着每次访问这样页面时都被下载一次,但可优化
页面从加载到展现的大致顺序如下:
1、加载 HTML 文件
2、解析 DOM
3、并行加载 CSS/JS 资源
4、如果 head 中存在外链的样式,则阻塞渲染等待样式文件加载并解析完成
5、如果 head 中存在外链的 script,则阻塞渲染等待 script 文件加载并执行完成
像素:
1、图像中最小的单位,一个不可再分割的点,在计算机屏幕上一般指屏幕上的一个光点
2、设备像素对应屏幕上光点的数量
3、虚拟像素,也可以叫 CSS 像素(CSS Pixels)或逻辑像素,在 Android 开发中可以叫设备无关像素
注:在 iPhone X 上,设备像素是 1125x2436,而 CSS 像素是 375x812,则一个 CSS 像素对应长和宽各 3 个设备像素
比值 3 就是我们平时所说的设备像素比(Device Pixel Ratio),简称 DPR ,它并不是一个单位,而是一个比值
EM 和 REM:
1、EM 是相对单位,相对于元素自身的 font-size,它会从继承父元素的字体大小,若父元素没有设置字体大小,会一直找到根元素
2、REM = Root EM,顾名思义就是相对于根元素的 EM,是根据根元素来计算出CSS 像素点的大小,默认为 16px
3、EM 对于模块化的页面元素比较好,而方便是 REM 最大的好处(只需要知道 html 标签的字体大小即可)
vw、vh 和百分比:
1、vw:viewport width,视口宽度,1vw = 1% 视口宽度
2、vh:viewport height,视口高度,1vh = 1% 视口高度
3、百分比:根据父元素来决定,如父元素高 100px,则 50% == 50px
弹性框:
1、不是单位,而是一种布局方式,里面的元素可弹性伸缩、定义排版方向、指定 flex 元素的顺序
2、容器样式属性(display: flex 的元素):
(1)flex-direction:定义主轴方向,即子元素的排列方向,取值为
row、row-reverse、column 和 column-reverse,默认 row
(2)flex-wrap:默认情况下,弹性布局会将所有元素都压缩到一行,可以通过设置 flex-wrap 告诉
浏览器在适当时候换行取值为 nowrap、wrap、wrap-reverse
(3)flex-flow: 这个属性值是 flex-direction 和 flex-wrap 的简写
(4)justify-content: 定义子元素在主轴上对齐方式,
取值为 flex-start、flex-end、center、space-between 和 space-around
(5)align-items:定义子元素在垂直于主轴的交叉轴的排列方式,
取值为 flex-start、flex-end、center、baseline 和 stretch
(6)align-content:定义了子元素在多条轴线上的对齐方式,如果只使用了一条轴线,那该属性不起作用,
取值为flex-start、flex-end、center、space-between、space-around 和 stretch
PWA学习笔记(二)的更多相关文章
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
- Java IO学习笔记二
Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...
- 《SQL必知必会》学习笔记二)
<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...
- NumPy学习笔记 二
NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(二) indigo tools
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- iOS全局处理键盘事件
转自:http://www.cnblogs.com/xinus/archive/2013/01/22/ios-keybord-notification.html 注册监听键盘事件的通知 [[NSNot ...
- BZOJ1002 [FJOI2007]轮状病毒(最小生成树计数)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7125 Solved: 3878[Submit][Status][Discuss] Descripti ...
- POJ 2186 Popular cows(SCC 缩点)
Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10, ...
- 理解web服务器和数据库的负载均衡以及反向代理
这里的“负载均衡”是指在网站建设中应该考虑的“负载均衡”.假设我们要搭建一个网站:aaa.me,我们使用的web服务器每秒能处理100条请求,而aaa.me这个网站最火的时候也只是每秒99条请求,那么 ...
- Es6中箭头函数与普通函数的区别
Es6中箭头函数与普通函数的区别? 普通function的声明在变量提升中是最高的,箭头函数没有函数提升 箭头函数没有属于自己的this,arguments 箭头函数不能作为构造函数,不能被new,没 ...
- 深入探索Java设计模式(三)之装饰器模式
装饰器模式使你可以在运行时使用类似于对象组成的技术来装饰类.这在我们希望实例化具有新职责的对象而无需对基础类进行任何代码更改的情况下尤其有用.本文是在学习完优锐课JAVA架构VIP课程—[框架源码专题 ...
- textarea增加字数监听且高度自适应(兼容IE8)
1.封装方法: var textareaListener = { /*事件监听器兼容 * *attachEvent——兼容:IE7.IE8:不兼容firefox.chrome.IE9.IE10.IE1 ...
- Vue大纲
Vue框架 Vue ---- vue的基本使用 文本/事件/属性指令 补充: js面向对象 js函数 Vue ---- 表单指令 条件指令 循环指令 分隔符 过滤器 计算属性 监听属性 Vue --- ...
- uploadify没反应
由于业务问题,需要用到uploadify这个插件,结果官方的case怎么弄都没问题,弄到自己的页面上就有问题了. 后来发现,这个插件是要用到swf的,但是页面加载的过程中并没有加载swf文件,所以将问 ...
- 在 .NET Core 中使用 Diagnostics (Diagnostic Source) 记录跟踪信息
前言 最新一直在忙着项目上的事情,很久没有写博客了,在这里对关注我的粉丝们说声抱歉,后面我可能更多的分享我们在微服务落地的过程中的一些经验.那么今天给大家讲一下在 .NET Core 2 中引入的全新 ...