利用vw+rem实现移动web适配布局
基本概念
1、单位
Px(CSS pixels)
- 像素 (px) 是一种绝对单位(absolute units), 因为无论其他相关的设置怎么变化,像素指定的值是不会变化的
- 其实是相对于某个设备而言的,不同设备指定的值大小还是有区别的
em
- 1em与当前元素的字体大小相同(更具体地说,一个大写字母M的宽度)。CSS样式被应用之前,浏览器给网页设置的默认基础字体大小是16像素,这意味着对一个元素来说1em的计算值默认为16像素。但是要小心—em单位是会继承父元素的字体大小,所以如果在父元素上设置了不同的字体大小,em的像素值就会变得复杂。现在不要过于担心这个问题,我们将在后面的文章和模块中更详细地介绍继承和字体大小设置。em是Web开发中最常用的相对单位。
ex, ch
- 分别是小写x的高度和数字0的宽度。这些并不像em那样被普遍使用或很好地被支持。
rem
- REM(root em)和em以同样的方式工作,但它总是等于默认基础字体大小的尺寸;继承的字体大小将不起作用,所以这听起来像一个比em更好的选择,虽然在旧版本的IE上不被支持 查看关于跨浏览器支持 Debugging CSS.)
vw,vh
- 分别是视口宽度的1/100和视口高度的1/100,其次,它不像rem那样被广泛支持。 还有vmin,vmax...
百分比
rem 和 vw 兼容对比
rem
vw
2、关于window.devicePixelRatio
- 此属性返回当前显示设备的物理像素分辨率与CSS像素分辨率的比值。该值也可以被解释为像素大小的比例:即一个CSS像素的大小相对于一个物理像素的大小的比值。
那么什么是设备的物理像素?
物理像素(physical pixel):设备能控制显示的最小单位。设备独立像素(DIP,device-independent pixel,density-independent pixel):独立于设备的用于逻辑上衡量像素的单位
对于前端来说,可以理解成在设备上能设置的最小值。如在dpr = 1 最小值1px; dpr = 2 最小值为0.5px
PPI(pixel per inch)
- 每英寸有多少个像素点(设备像素点),PPI越高,画质越好。
公式
// w: 横向pixel
// h: 纵向pixel
// inch: 屏幕尺寸
PPI = Math.sqrt(w * w + h * h) / inch
console.log(Math.ceil(Math.sqrt(1920 * 1920 + 1080 * 1080) / 5.5))
// 然而我并不明白怎么要这样算 不是应该是 w * h / inch ?????
具备足够高像素密度而使得人体肉眼无法分辨其中单独像素点的液晶屏
3、移动适配注意的点
屏幕尺寸不一样的适配问题
- 这个可以借助vw完美解决
图片模糊问题
- 图片用三倍图 可以保证清晰,推荐用两倍图+webp格式 开发和显示效果折中的结果
1px 显示问题
- 方法很多
api不支持的兼容问题
- vw不支持的兼容
高清显示
- 是否影响渲染性能??待考证
- 缩放是否可以是网页更高清?
- 第三方组件库兼容问题
- 富文本显示问题
- 前端代码迁移单位不一致问题
适配方案
1、经典的flexble.js方案
存在问题
- 1、iframe 问题
- 2、富文本问题
// vue指令
// 1. 先获取dpr 2获取每个文档对象的字体大小 乘以dpr
Vue.directive('richtext', (el, binding) => {
Vue.nextTick(() => {
let dpr = document.querySelector('html').getAttribute('data-dpr')
let f = (dom) => {
let fontPx = dom.style && dom.style.fontSize
if (fontPx) {
fontPx = fontPx.substr(0, fontPx.length - 2) * parseInt(dpr)
dom.style.fontSize = fontPx + 'px'
}
if (dom.childNodes.length > 0) {
for (let i = 0; i < dom.childNodes.length; i++) {
f(dom.childNodes[i])
}
}
}
f(el)
})
})
// 使用方法
.richtext(v-html="content" v-richtext='')
3、高清方案存在的误区
dpr越高越清晰 是源自设备本身和缩放关系不大或者说当dpr为1时清晰度已经足够了,不需要再通过缩放来是网页显示更清晰(实践总结,未找到资料支持)
4、兼容问题
https://juejin.im/post/5b9cb9d26fb9a05d1b2e44a3
2、vw方案
3、rem + vw (推荐方案)
设置html根font-size的值
// 设计稿 750 * 1334
html {
height: 100%;
font-size: 50px; // 向下兼容 不止vw时候 写死font-size
font-size: 13.33333333vw; // 7.5rem === 100vw
margin: 0 auto;
}
@media (min-width: 560px) { // pc兼容
html,body {
font-size: 54px;
max-width: 540px;
}
}
@media (max-width: 1024px) { // ipad兼容:ipad最大1024px
html,body {
max-width: 1024px;
}
}
1px显示问题 物理像素 dpr>=2 取2倍
.border-bottom {
position: relative;
&::after {
content: '';
position: absolute;
z-index: 1;
pointer-events: none;
background-color: red;
height: 1px;
left: 0;
right: 0;
bottom: 0;
@media only screen and (min-resolution: 2dppx) { // 非标准的
-webkit-transform: scaleY(0.5);
-webkit-transform-origin: 50% 0%;
}
}
}
// only操作符仅在媒体查询匹配成功的情况下被用于应用一个样式,这对于防止让选中的样式在老式浏览器中被应用到
// -webkit-device-pixel-ratio 是一个非标准的布尔类型CSS媒体类型,是标准
// resolution 媒体类型的一个替代方案.
单位要怎么写
方法一:postcss-px2rem(vue-cli3)
这里不推荐 因为px2rem: 写px时需要加上 /*no*/ 感觉比较麻烦
const px2rem = require('postcss-px2rem')
const postcssPx2rem = new px2rem({
remUnit: 50 // 基准大小
})
css: {
loaderOptions: {
postcss: {
plugins: [postcssPx2rem]
},
}
},
方法二:目前方案是直接写 7.5rem=100vw 设计稿除以100即可
方法三:px2rem的编辑器插件如vscode的cssrem
除不尽的问题 (calc)
涉及到兼容问题
总结 vw + rem的好处
- 实现简单
- 不依赖插件及第三方库
- 几行css代码 就可以实现
- 开发方便
- 100vw === 设计稿 / 100 rem 方便换算
- 不影响px使用,完美兼容第三方组件库
- 不存在富文本和iframe等兼容问题
利用vw+rem实现移动web适配布局的更多相关文章
- rem - 移动前端自适应适配布局解决方案和比较(转载)
原文链接:http://caibaojian.com/mobile-responsive-example.html 互联网上的自适应方案到底有几种呢?就我个人实践所知,有这么几种方案:· 固定一个某些 ...
- 移动web开发之rem适配布局
移动web开发之rem适配布局 方案: 页面布局文字能否随着屏幕大小变化而变化 流式布局和flex布局主要针对于宽度布局,那高度如何布局? 怎样让屏幕发生变化的时候元素高度和宽度等比例缩放? 1. r ...
- PostCSS的插件 -- 关于vue rem适配布局方案
PostCSS的插件 作用:用于自动将像素单元生成rem单位 记以下三种 postcss-plugin-px2rem postcss-pxtorem postcss-px2rem 任选一种,最近大家推 ...
- 移动web适配利器-rem
移动web适配利器-rem 前言 提到rem,大家首先会想到的是em,px,pt这类的词语,大多数人眼中这些单位是用于设置字体的大小的,没错这的确是用来设置字体大小的,但是对于rem来说它可以用来做移 ...
- 移动端布局方案—vw+rem
前言 首先你要知道 vw 和 rem 是什么?怎么使用? ①:简单来说 vw 是视口单位,相当于把视口等分成了100,1vw = 1; ②:rem是相对单位,设置根元素 html 的 font-siz ...
- 逐帧动画抖动、适配布局、SVG Sprites
笔者所在的前端团队主要从事移动端的H5页面开发,而团队使用的适配方案是: viewport units + rem.具体可以参见凹凸实验室的文章 – 利用视口单位实现适配布局 . 笔者目前(2017. ...
- rem是如何实现自适应布局的?
http://caibaojian.com/web-app-rem.html 使用rem 然后根据媒体查询实现自适应.跟使用JS来自适应适配也是同个道理,不过是js更精确一点.使用媒体查询: html ...
- rem 是如何实现自适应布局的
摘要:rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个px字号,则可以来算出元素的宽高.本文讲的是如何使用rem实现自适应.· rem这是个低调的css单位,近一 ...
- rem是如何实现自适应布局的
原文链接:http://caibaojian.com/web-app-rem.html 摘要:rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个px字号,则可以来算 ...
随机推荐
- linux内核分析 第七周 Linux内核如何装载和启动一个可执行程序
一.编译链接的过程和ELF可执行文件格式 vi hello.c gcc -E -o hello.cpp hello.c -m32 //预处理.c文件,预处理包括把include的文件包含进来以及宏替换 ...
- 单点登录(五)-----遇到问题-----cas server 源码部署tomcat运行报错BeanCreationException:Error creating bean with name 's
我们在上一篇文章已经解决了把下载好的cas server源码部署到tomcat缺少子项目编辑文件或者jar包导致找不到class报错的问题 单点登录(四)-----遇到问题-----cas serve ...
- POI操作word和html相互转化
下面是里两个类:第一个类是html转为word,第二个是word转html(最下面附上jar包下载链接) package com.wz.poi.wordHtml; /** * 2018/4/24 * ...
- 解题:POI 2012 Well
题面 比较明显地能看出二分来,但是检查函数很难写.对于二分出的一个$mid$,我们要让它满足在$m$次操作内令序列中存在一个为零的位置,同时使得任意相邻的两项之差不超过$mid$ 第二项的检查比较好做 ...
- 【bzoj2795】【Poi2012】A Horrible Poem
题解: 询问区间的整循环节 设区间长度为$n$ 如果有循环节长为$x$和$y$,那由斐蜀定理得$gcd(x,y)$也一定为一个循环节: 假设最小的循环节长为$mn$,那么对于任何循环节长$x$,一定$ ...
- go语言操作mongodb
Install the MongoDB Go Driver The MongoDB Go Driver is made up of several packages. If you are just ...
- JAVA 加密算法初探DES&AES
开发项目中需要将重要数据缓存在本地以便在离线是读取,如果不对数据进行处理,很容易造成损失.所以,我们一般对此类数据进行加密处理.这里,主要介绍两种简单的加密算法:DES&AES. 先简单介绍一 ...
- O(1)时间复杂度求栈中最小元素
import java.util.Stack; /** * 功能:O(1)时间复杂度求栈中最小元素 * 思路:空间换取时间,使用两个栈,stack1栈存储数据,stack2栈存储最小值: * stac ...
- mac、linux 查看端口占用程序
lsof -i:80 列出占用 80 端口的程序 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 672 ruby 42u IPv4 ...
- POJ - 2976 Dropping tests && 0/1 分数规划
POJ - 2976 Dropping tests 你有 \(n\) 次考试成绩, 定义考试平均成绩为 \[\frac{\sum_{i = 1}^{n} a_{i}}{\sum_{i = 1}^{n} ...