不同手机按比例缩放
viewport方案
参考阿里的库,暂时没有仔细研究过
动态rem
写上meta:vp
标签
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
获取当前缩放比例并写入页面中(这里设计稿屏幕宽度为320px)
<script>
var width = document.documentElement.clientWidth
var scale = width / 320
var css = `
html{
font-size: ${scale * 320}px;
}
`
document.write(`<style>${css}</style>`)
</script>
将CSS中的单位都换成rem单位,缩放百分比按照设计稿和屏幕的比例,将现在CSS中的px单位除以320来获取比例,例如原来为128px
,用除以128/320
等于0.4
,就写成0.4rem
width: 0.4rem;
一个个手动替换十分耗时间,我们可以使用scss来做。google搜索关键字scss px to rem
优化字体大小
要将字体放大一定比例,上面的scale就需要缩小相同的比例。一放一缩
注意点
我们不能将字体设置的太小,chrome默认的最小字体为12,如果我们设置的小于12的话,浏览器会默认是12不会比你设置的小。
小结:
1.用meta:vp标签 禁止浏览器的980像素缩放。
2.设置html{font-size:设计稿宽度*缩放比例(就是页面宽度)/10 px}。
3.10 rem == 页面宽度。
4.所有单位都用rem == 所有长度都以页面宽度为基准。
5.页面可以兼容任何手机屏幕。
设备的1像素
现在设备的1像素不一定是CSS里面的1像素,比如retina屏在普通的1像素里又分了四份。
我们可以在mydevice网站 查看自己设备的CSS像素比CSS pixel-ratio
。
下面摘取阿里网站一篇博客的一些概念,移动端高清、多屏适配方案
一些概念
在进行具体的分析之前,首先得知道下面这些关键性基本概念(术语)。
物理像素(physical pixel)
一个物理像素是显示器(手机屏幕)上最小的物理显示单元,在操作系统的调度下,每一个设备像素都有自己的颜色值和亮度值。
设备独立像素(density-independent pixel)
设备独立像素(也叫密度无关像素),可以认为是计算机坐标系统中得一个点,这个点代表一个可以由程序使用的虚拟像素(比如: css像素),然后由相关系统转换为物理像素。
所以说,物理像素和设备独立像素之间存在着一定的
对应关系
,这就是接下来要说的设备像素比
。设备像素比(device pixel ratio )
设备像素比(简称dpr)定义了物理像素和设备独立像素的对应关系,它的值可以按如下的公式的得到:
设备像素比 = 物理像素 / 设备独立像素 // 在某一方向上,x方向或者y方向
在javascript中,可以通过
window.devicePixelRatio
获取到当前设备的dpr。在css中,可以通过
-webkit-device-pixel-ratio
,-webkit-min-device-pixel-ratio
和-webkit-max-device-pixel-ratio
进行媒体查询,对不同dpr的设备,做一些样式适配(这里只针对webkit内核的浏览器和webview)。
小结:
1.在普通屏幕
CSS 1px == 设备的1px
2.在Retina
CSS 1px == 设备的2px
需求要border-width == 设备的1px
设置border-width:0.5px == 设备的1px(兼容性有问题)
3.解决
页面整体缩放50%,<meta ...initial=0.5...> border-width: 1px == 设备的1px
副作用:所有div都变为原来的50%
所有长度都以rem为基准,让rem变为原来的2倍
<head>
<meta charset="UTF-8">
<script>
//整体缩放
var scale = 1 / window.devicePixelRatio
document.write(`
<meta name="viewport" content="user-scalable=no, initial-scale=${scale}, maximum-scale=${scale}, minimum-scale=${scale}">
`)
</script>
<title>Document</title>
<script>
var width = document.documentElement.clientWidth / window.devicePixelRatio
//缩放了多少再乘以多少,还原回去
var css = `
html{
font-size: ${width / 10 * window.devicePixelRatio}px;
}
`
document.write(`<style>${css}</style>`)
</script>
</head>
......
<style>
#section1 {
text-align: center;
border-bottom: 1px solid #ff0000;
}
</style>
代码思路:
1.获取设备的像素比
2.initial-scale = 1/像素比
3.让rem变为rem * 像素比
4.border-top:1px solid red
参考链接
网友评论