响应式技术笔记
media query
@media screen and (max-width: 375px)
按照断点设置不同的 css
CSS Grid
1 | display: grid |
候选技术
flex
container
1 | display: flex; |
items
1 | flex: flex-grow flex-shrink flex-basis; |
目前最好用的移动 layout 技术
rem
根据 root 的 font-size 设置后续尺寸。网页上 root 就是 html,也就是根据 html 的 font-size 决定尺寸单位。
做法:
- JS 动态获取 root 元素的宽度
documentElement | body的clientHeight - 根据获取的宽度设置一个合理的
rem值 - 使用 scss 之类技术为后续其他元素的
px单位转为rem单位
Flexible
基本概念
视窗 viewport
- PC 端就是浏览器窗口
- 移动端为了 CSS 布局提供两个 viewport
- visual viewport 虚拟
- layout viewport 布局
物理像素 physical pixel
物理像素又被称为设备像素,他是显示设备中一个最微小的物理部件。
设备独立像素 density-independent pixel
与密度无关,计算机坐标系统的一个点,可以有程序使用的虚拟像素
CSS 像素
抽象单位,用于浏览器上,精确度量 web 页面的内容,DIPs(与上一个有关)
屏幕密度
设备表面像素数量 PPI
设备像素比 device pixel ratio
dpr 物理像素和 DIPs 之间对应关系 dpr = pp / dip
JS: window.devicePixelRatio
CSS:
1 | device-pixel-ratio |
meta 标签
告诉浏览器渲染 web 页面
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
rem
Font size of the root element
前端实现方案
使用库 lib-flexible
1 | <meta name="flexible" content="initial-dpr=2" /> |
执行这个 JS 后,会在<html>元素上增加一个data-dpr属性,以及一个font-size样式。JS 会根据不同的设备添加不同的data-dpr值,比如说2或者3,同时会给html加上对应的font-size的值,比如说75px。
页面其他元素可以通过rem单位设置。
flexible 实质
- JS 动态改写 meta 标签
- 给
html元素添加data-dpr属性并动态改写值 - 给
html元素添加font-size属性并动态改写值
具体案例
为兼容
vw``vh,规定1rem = 10a1a = 页面的 1/100用工具转换 px 到 rem:
- SCSS
1
2
3
4
5
6
7
8
9@function px2em($px, $base-font-size: 16px) {
@if (unitless($px)) {
@warn "Assuming #{$px} to be in pixels, attempting to convert it into pixels for you";
@return px2em($px + 0px); // That may fail.
} @else if (unit($px) == em) {
@return $px;
}
@return ($px / $base-font-size) * 1em;
}- 其他工具包括 PostCSS 之类
字号不使用 rem
不希望文本变小,而希望看到更多文本
更适应字体点阵尺寸
效果
HTML
1
2
3
4
5
6
7
8
9
10
11div {
width: 1rem;
height: 0.4rem;
font-size: 12px;
}
[data-dpr="2"] div {
font-size: 24px;
}
[data-dpr="3"] div {
font-size: 36px;
}Scss
1
2
3
4
5
6
7
8
9@mixin font-dpr($font-size) {
font-size: $font-size;
[data-dpr="2"] & {
font-size: $font-size * 2;
}
[data-dpr="3"] & {
font-size: $font-size * 3;
}
}使用 scss 的 mixin
@include font-dpr(16px)
vw/vh
各种概念
- offsetHeight/offsetWidth = content + padding + border
- clientHeight/clientWidth = content + padding - scroll(if)
- scrollHeight/scrollWidth = content + padding - scroll(if) + ::before/after(if) 【包括不在可视区域内】
- window.innerHeight = window viewport including scrollbar
- document.documentElement.clientWidth/Height = window.innerWidth/Height - scroll
- window.outerHeight = innerHeight + UI
- screen.width/height 屏幕尺寸
- vw | vh | vin | vmax
- 宽度 750px,
1vw = 750/100 = 7.5px - 使用场景
- 容器适配
- 文本适配
- 大于
1px的边框、圆角、阴影 padding margin
技术点
- 使用
vw来实现页面的适配,并且通过 PostCSS 的插件 postcss-px-to-viewport 把px转换成vw。 - 为了更好的实现长宽比,特别是针对于
img、vedio和iframe元素,通过 PostCSS 插件 postcss-aspect-ratio-mini来实现,在实际使用中,只需要把对应的宽和高写进去即可 - 为了解决
1px的问题,使用 PostCSS 插件 postcss-write-svg ,自动生成border-image或者background-image的图片
降级处理
使用 CSS Houdini 或者 CSS Polyfill 处理。
Viewport 不足之处
- margin 使用 px:转换成 padding 或者 border-box 或者 calc()
- px -> vw 的偏差