flexible
媒体查询(PC + 移动自适应)
media queries :主要通过查询不同的宽度来执行不同的css代码,最终以达到界面的配置。核心语法:@media screen and(max-width:600px){/***/html{font-size:32px;}}
- media query 可以做到设备像素比的判断,方法简单,成本较低,特别是对于PC端和移动端维护同一套代码的时候;Bootstrap框架就是使用这种方式布局;
- 调整屏幕宽度的时候,不需要刷新页面即可响应;
- 图片便于修改,只需要修改CSS文件;
优点:
可同时去适配PC + 移动端缺点:
成本过高,less库需要写至少两套flex + rem
flexible.js较为成熟
搭配vscode,将其基础设置修改为80px
// 设计稿1920px * 1080// 1rem = 1920/24 = 80px(function flexible(window, document) {var docEl = document.documentElement;var dpr = window.devicePixelRatio || 1;// adjust body font sizefunction setBodyFontSize() {if (document.body) {document.body.style.fontSize = 12 * dpr + "px";} else {document.addEventListener("DOMContentLoaded", setBodyFontSize);}}setBodyFontSize();// set 1rem = viewWidth / 24function setRemUnit() {var rem = docEl.clientWidth / 24;docEl.style.fontSize = rem + "px";}setRemUnit();// reset rem unit on page resizewindow.addEventListener("resize", setRemUnit);window.addEventListener("pageshow", function(e) {if (e.persisted) {setRemUnit();}});// detect 0.5px supportsif (dpr >= 2) {var fakeBody = document.createElement("body");var testElement = document.createElement("div");testElement.style.border = ".5px solid transparent";fakeBody.appendChild(testElement);docEl.appendChild(fakeBody);if (testElement.offsetHeight === 1) {docEl.classList.add("hairlines");}docEl.removeChild(fakeBody);}})(window, document);
flexible升级版
使用
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"><script src="./node_modules/amfe-flexible/index.js"></script>
(function flexible (window, document) {var docEl = document.documentElementvar dpr = window.devicePixelRatio || 1 // 显示设备的物理像素分辨率与CSS像素分辨率// adjust body font sizefunction setBodyFontSize () {if (document.body) {document.body.style.fontSize = (12 * dpr) + 'px'}else {document.addEventListener('DOMContentLoaded', setBodyFontSize)}}setBodyFontSize();// set 1rem = viewWidth / 24function setRemUnit () {// 最小400px,最大2560pxlet width = docEl.clientWidthif (width/dpr <400) {width = 400 * dpr} else if (width/dpr > 2560) {width = 2560 * dpr}var rem = width / 24 // 1920下,1rem=80pxdocEl.style.fontSize = rem + 'px'}setRemUnit()// reset rem unit on page resizewindow.addEventListener('resize', setRemUnit)window.addEventListener('pageshow', function (e) {if (e.persisted) {setRemUnit()}})// detect 0.5px supportsif (dpr >= 2) {var fakeBody = document.createElement('body')var testElement = document.createElement('div')testElement.style.border = '.5px solid transparent'fakeBody.appendChild(testElement)docEl.appendChild(fakeBody)if (testElement.offsetHeight === 1) {docEl.classList.add('hairlines')}docEl.removeChild(fakeBody)}}(window, document))
监听窗口,设置比例,自动缩放(vw)
如果说我们要一个不需要JS和CSS耦合在一起的单位,那vw/vh就是一个不错的选择。
视口是什么? 浏览器内部的可视区域大小,即window.innerWidth/window.innerHeight大小,不包含任务栏标题栏以及底部工具栏的浏览器区域大小
vw:view width,指视口宽度的百分比,如:1vw = 视口宽度的1%
vh:view height,指视口高度的百分比,如:1vh = 视口高度的1%
vmin:vmin的值是当前vw和vh中较小的值
vmax:vmax的值是当前vw和vh中较大的值
clamp新属性
可参考文章: https://juejin.im/post/6892766734995226631
clamp(minimum, preferred, maximum);
img {width: clamp(15vw, 800%, 100%);}h1 {font-size: clamp(20px, 5vw, 35px);}p {font-size: clamp(10px, 4vw, 20px);}
