移动端适配 em和rem的区别

移动端分辨率

移动端设计时参考的分辨率一般为:320* 568, 375* 667, 414* 736

大神总结

em和rem的区别

  1. PX是像素单位,在同一个浏览器分辨率下一经设定就是固定的值。
  2. em和rem区别于PX 它们都是可扩展单位 区别在于对应参照物字体大小不同 解析成PX时的大小不一样。
  3. 当使用 rem 单位,他们转化为像素大小取决于页根元素(html)的字体大小, 根元素字体大小乘以 rem 值。
    
html{
font-size: 14px;
}
div{
  width:10rem;
}
// div的width解析后 width:140px;
  1. 当使用em单位时,像素值将是em值乘以当前元素的父级元素父级的字体大小, 父元素字体大小乘以 em 值。
    
这是em
html{ font-size: 14px; } .div1{ font-size: 16px; } .div2{ width: 10em; } // div2的width解析后 width:160px;

移动端适配方案之[postcss-px-to-viewport]

postcss-px-to-viewport,将px单位自动转换成viewport单位

npm install postcss-px-to-viewport --save-dev

引入vue项目,再postcss.config.js引入

module.exports = {
  plugins: {
    autoprefixer: {},
    'postcss-px-to-viewport': {
       viewportWidth: 750,   // 视窗的宽度,对应的是我们设计稿的宽度,一般是750
      viewportHeight: 1334, // 视窗的高度,根据750设备的宽度来指定,一般指定1334,也可以不配置
      unitPrecision: 3,     // 指定`px`转换为视窗单位值的小数位数
      viewportUnit: "vw",   //指定需要转换成的视窗单位,建议使用vw
      selectorBlackList: ['.ignore'],// 指定不转换为视窗单位的类,可以自定义,可以无限添加,建议定义一至两个通用的类名
      minPixelValue: 1,     // 小于或等于`1px`不转换为视窗单位,你也可以设置为你想要的值
      mediaQuery: false     // 允许在媒体查询中转换`px`
    }
  }
}

布局方法

  1. 选择一个分辨率作为参考, 其他分辨率参考该分辨率做适配
// 屏幕适配( window.screen.width / 移动端设计稿宽 * 100)也即是 (window.screen.width / 750 * 100)  ——*100 为了方便计算。即 font-size 值是手机 deviceWidth 与设计稿比值的 100 倍
document.getElementsByTagName('html')[0].style.fontSize = window.screen.width / 7.5 + 'px';
// 或者
// rem计算方式,适配rem.
(function(doc, win) {
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function() {
            var clientWidth = docEl.clientWidth;
            if(!clientWidth) return;
            docEl.style.fontSize = 100 * (clientWidth / 375) + 'px';
            doc.body.style.display = 'block';
        };

    if(!doc.addEventListener) return;
    win.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);
})(document, window);

  1. 通过CSS 的 @media 响应式 的根据不同的分辨率设置不同的样式
    注意:
    1.宽度需要使用百分比
    2.图片处理 给图片指定的最大宽度为百分比。如果图片大了,就同比缩小,如果图片小了,就原尺寸输出。
/** 指定iPad **/
@media only screen and (min-width: 768px) and (max-width: 1024px) {
  #head { … }
  #content { … }
  #footer { … }
}
/**指定 iPhone **/
@media only screen and (min-width: 320px) and (max-width: 767px) {
  #head { … }
  #content { … }
  #footer { … }
}
/** 最大宽度**/
@media screen and (max-width: 980px) {
  #head { … }
  #content { … }
  #footer { … }
}
  1. 通过自适应100%、box-flex、rem(相对于根目录的字体大小来设置)

meta 标签

meta 标签的 viewport 标记设置当前显示给用户内容的窗口拖动和缩放


常用的属性有

width 和height 分别指定视区的逻辑宽度和高度, width可以是像素或者device-width(当前屏幕宽度)
initial-scale 设置页面的初始缩放比例, 一般不缩放设置为1.0
user-scalable 用户是否可以缩放视区 yes/no

viewport 除此之外还有以下属性

device-dpi 设备默认的像素密度
high-dpi 高像素密度
medium-dpi 中等的像素密度
low-dpi 低像素密度

设置根目录字体大小

设置根目录字体大小为当前屏幕宽度的1/3倍, 可根据需求自定义
这有一个好处就是, 可以固定所有标签的width或者height等数量属性为固定的多少像素(PX), 浏览器会根据屏幕宽度按1/3的比例动态改变, 类似于使用百分比布局(width:100%),但是个人认为使用px为单位更方便布局

    document.getElementsByTagName("html")[0].style.fontSize = document.documentElement.clientWidth/3 + "px";
    

此外移动端布局还涉及到

  • AndroidIOS的兼容性问题(背景图片定位,浏览器兼容)
  • 移动端UI框架(jquery weui)
  • 布局(flex,div)
// 标签浏览器兼容代码
@charset "utf-8";
body, button, input, select, textarea {
    font: 12px/1.125 Arial, Helvetica, sans-serif
}

blockquote, body, button, dd, dl, dt, fieldset, form, h1, h2, h3, h4, h5, h6, hr, input, legend, li, ol, p, pre, td, textarea, th, ul {
    margin: 0;
    padding: 0
}

table {
    border-collapse: collapse;
    border-spacing: 0
}

li {
    list-style: none
}

fieldset, img {
    border: 0
}

q:after, q:before {
    content: ''
}

input, textarea {
    outline-style: none
}

input[type=text], input[type=password], textarea {
    outline-style: none;
    -webkit-appearance: none
}

textarea {
    resize: none
}

address, caption, cite, code, dfn, em, i, th, var {
    font-style: normal;
    font-weight: 400
}

legend {
    color: #000
}

abbr, acronym {
    border: 0;
    font-variant: normal
}

a, u {
    text-decoration: none
}

a:hover {
    text-decoration: underline
}

以下参考大神的做法,动态修改body 的font-size

开发原则:文字流式,控件弹性,图片等比缩放。

设计稿竖直放时的横向分辨率为640px,为了计算方便,取一个100px的font-size为参照,那么body元素的宽度就可以设置为width: 6.4rem,于是html的font-size=deviceWidth / 6.4。这个deviceWidth就是viewport设置中的那个deviceWidth。
这个deviceWidth通过document.documentElement.clientWidth就能取到了,所以当页面的dom ready后,做的第一件事情就是:

document.documentElement.style.fontSize = document.documentElement.clientWidth / 6.4 + 'px';

这个6.4怎么来的,当然是根据设计稿的横向分辨率/100得来的。
如果设计稿基于iphone6,横向分辨率为750,body的width为750 / 100 = 7.5rem
如果设计稿基于iphone4/5,横向分辨率为640,body的width为640 / 100 = 6.4rem
当deviceWidth大于640时,则物理分辨率大于1280(这就看设备的devicePixelRatio这个值了),应该去访问pc网站了。

var deviceWidth = document.documentElement.clientWidth;
if(deviceWidth > 640) deviceWidth = 640;
document.documentElement.style.fontSize = deviceWidth / 6.4 + 'px';

//使用了less和sass这样的css处理器
//定义一个变量和一个mixin@baseFontSize: 75;//基于视觉稿横屏尺寸/100得出的基准font-size
.px2rem(@name, @px){
    @{name}: @px / @baseFontSize * 1rem;
}
//使用示例:
.container {
    .px2rem(height, 240);
}
//less翻译结果:
.container {
    height: 3.2rem;
}
如何与设计协作

第一步,视觉设计阶段,设计师按宽度750px(iphone 6)做设计稿,除图片外所有设计元素用矢量路径来做。设计定稿后在750px的设计稿上做标注,输出标注图。同时等比放大1.5倍生成宽度1125px的设计稿,在1125px的稿子里切图。

第二步,输出两个交付物给开发工程师:一个是程序用到的@3x切图资源,另一个是宽度750px的设计标注图。

第三步,开发工程师拿到750px标注图和@3x切图资源,完成iPhone 6(375pt)的界面开发。此阶段不能用固定宽度的方式开发界面,得用自动布局(auto layout),方便后续适配到其它尺寸。

第四步,适配调试阶段,基于iPhone 6的界面效果,分别向上向下调试iPhone 6 plus(414pt)和iPhone 5S及以下(320pt)的界面效果。由此完成大中小三屏适配。

第一篇,记录自己踩过的坑!

页面规范

你可能感兴趣的:(移动端适配 em和rem的区别)