一、响应式布局
让 H5 页面适配不同设备
项目类型:
1. PC 端产品(一般用于大型项目,大型项目都是 PC 和移动端各一套产品)
一般不需要做响应式开发,都是固定宽高的布局(100%)还原设计稿
有时候全屏的项目,需要我们把最外层容器的宽度设置为百分百布局
2. 移动端产品(不需要 PC 访问处理)
webApp:把开发的 H5 页面放到手机端浏览器,微信、自己公司中APP运行“Hybrid 混合 APP 开发”
小程序:微信小程序
APP:IOS、Android、前端(pn、flutter、uni-app、ionic、phoneGap、cordova)
需要做响应式布局开发,但只需要适配移动端设备既可。
手机尺寸(宽:px)320、375、414
3. PC 端和移动端用同一套项目
需要响应式布局开发,这种产品一般都是简单的企业展示
如:Mobike
二、手机 APP 发展史
1. Native app
使用的技术栈
IOS :object - c / swift
Android :java - native
特点:
- 当时的技术与前端没关系,它们是直接运行在操作系统中。能够直接操作设备中的软件和硬件。而且性能很好,内容也都是 IOS 和 Android 开发出来的
- 不能跨平台,内容不能及时更新或者让用户及时的看到
2. webApp
使用的技术栈
H5页面:H5 + CSS3 + JavaScript
特点:
- H5 运行在手机的浏览器中,而不是操作系统中(操作手机软硬件功能需要浏览器的支持),而且性能不好
- 跨平台开发(手机端的浏览器一般都是 webkit 内核的)
- 强制自动更新的
3. Hybrid 混合 App 开发
使用的技术栈
把 webApp 嵌入到 Native App 的 webview 中
webview:嵌入 H5 页面
特点:
- 把操作软硬件和一些需要高体验或者支付分享等功能交给 Native App开发
- webview 就是不叫浏览器的浏览器,它也是基于 webkit 内核渲染页面的,前段开发者把网址给 APP 开发者,他们会把其嵌入到 webview 中。
4. H5 和 APP 的通信
- JSBridge
原理:向 webview 中注入所有需要 H5 后期调取 APP 的方法(类似于 window 的全局对象)
如:自拍照片:首先发送给 App , App 接收到请求会调取摄像头进行拍照,拍照后会把保存在相册中的图片地址给 H5 返回
- 伪协议传输:只用于 IOS 因为安卓是开源系统,不安全
- react / flutter / uni-app… 基于 js 编写功能后,最后生成 NativeApp的代码(前端最好也会 uni-app)
5. 响应式开发布局基础
- 拿到设计稿后(现在设计稿一般是 750px 的),我们设定一个初始的 rem 和 px 换算比例(一般设置为 1rem = 100px 为了方便后期换算)
- 测量出设计稿中元素的尺寸(ps 测出来的是 px 单位),在编写样式的时候全部转换为 rem 的单位(除以一百既可)100% 还原设计稿
- 编写一段 js ,获取当前设备的宽度,让其除以设计稿的宽度750,再乘以初始的换算比例100,计算出当前设备下,1rem 应该等于多少像素(只要改变 HTML 的 font-size 就可以);这样 HTML 字体大小一改,之前所有以 rem 为单位的元素都会跟着缩放……
px 就是像素,屏幕分辨率来决定的
DPI 适配:屏幕像素密度比
6. rem 响应式布局开发
现在真实项目中,主体响应式布局以 rem 为主,部分效果实现可基于 flex 来做,需要样式微调还是要基于 @media 来完成的…
我们把 HTML5 页面放到手机上预览,默认情况下,不管手机设备有多宽,HTML 都是按照980(或者1024)宽度渲染的。这样页面会整体缩小,内容也会缩小
解决:viewport 视口(layout viewport 布局视口),设定页面渲染中的一些规则,width = device-width:让当前页面渲染的宽度和设备宽度保持一致
width=device-width:让当前页面渲染的宽度和设备宽度保持一致
initial-scale=1.0:初始缩放比例1:1
maximum-scale=1.0:最大缩放比例1:1
minimum-scale=1.0:最小缩放比例1:1
user-scalable=no: 禁止用户手动缩放
// 为了防止前面的代码没写分号,所以函数前写分号
;(function (designWidth) {
function computeFont () {
// 获取视口的宽度
let winW = document.documentElement.clientWidth;
if (winW >= 750) {
// 如果视口的宽度超过 750 就把页面的 HTML 的 fontSize 设为 100px
return document.documentElement.style.fontSize = '100px';
}
document.documentElement.style.fontSize = winW / designWidth * 100 + 'px'
}
// 需要执行方法才会有作用
computeFont();
// resize 重新计算属性,视口大小发生变化时,重新计算
window.addEventListener('resize', computeFont)
// 屏幕朝向发生变化时,重新计算 HTML 的 fontSize
window.addEventListener('orientationchange',computeFont)
} (750));
7. 媒体查询
CSS中设定条件就是基于 @meida 完成的
媒体设备 all / print / screen…
媒体条件:否和某个条件写对应的样式
max-width
min-width
width
……
<style>
.person {
display: block;
margin: 0 auto;
width: 400px;
}
/* 如果当前页面宽度<=500 */
@media screen and (max-width: 500px) {
.person {
width: 200px;
}
}
</style>
二、CSS3 选择器、兼容情况
1、基本选择器
选择器 | IE |
---|---|
* [通配符选择器] | ok |
E [元素选择器] | ok |
#id [ID选择器] | ok |
.class [类选择器] | ok |
selector1,selectorN [群组选择器] | ok |
2、层次选择器
选择器 | IE |
---|---|
E F [后代选择器] | ok |
E>F [子选择器] | ok 7+ |
E+F [下一个弟弟] | ok 7+ |
E~F [所有的弟弟] | ok 7+ |
3、动态伪类选择器
选择器 | IE |
---|---|
E:link [链接伪类选择器,未访问] | ok |
E:visited [链接伪类选择器,已访问] | ok |
E:active [行为之元素激活] | ok 8+ |
E:hover [行为之鼠标停留] | ok |
E:focus [行为之获取焦点] | ok 8+ |
4、目标伪类选择器
选择器 | IE |
---|---|
E:target [目标伪类选择器] | ok 9+ |
5、UI元素状态伪类选择器
选择器 | IE |
---|---|
E:checked [选中状态] | ok 9+ |
E:enabled [启用状态] | ok 9+ |
E:disabled [不可用状态] | ok 9+ |
6、结构伪类选择器
选择器 | IE |
---|---|
E:first-child [第一个子元素] | ok 9+ |
E:last-child [最后一个子元素] | ok 9+ |
E F:nth-child(n) [E下的第n个子元素F] 注:n从1开始,可以是数字,也可以是even、odd,还可以是公式:2n/2n+1/n+5(从第五个开始)/-n+5(第一个到第五个)… | ok 9+ |
E F:nth-last-child(n) [选择倒数第n个] | ok 9+ |
E:root [E所在文档的根元素,HTML中根元素永远是HTML] | ok 9+ |
E:only-child [只有一个子元素] | ok 9+ |
E:empty [一个子元素都没有的] | ok 9+ |
7、否定伪类选择器
选择器 | IE |
---|---|
E:not(F) [匹配除了F外的E元素] | ok 9+ |
8、属性选择器
选择器 | IE |
---|---|
E[attr] [具有attr属性的元素] | ok 7+ |
E[attr=val] [attr属性等于val的元素] | ok 7+ |
E[attr|=val] [attr具有val或者以val-开始的元素] | ok 7+ |
E[attr~=val] [attr具有多个空格分开的值,其中有一个是val的元素] | ok 7+ |
E[attr*=val] [attr包含val的元素] | ok 7+ |
E[attr^=val] [attr以val开头的元素] | ok 7+ |
E[attr$=val] [attr以val结尾的元素] | ok 7+ |