移动端适配方案

Flexible适配方案

最早的文章,是15年阿里手淘团队的移动端适配方案。

设计师常选择iPhone6作为基准设计尺寸,交付给前端的设计尺寸是按750px * 1334px为准(高度会随着内容多少而改变)。

前端开发人员通过一套适配规则自动适配到其他的尺寸。

先了解一些基本概念

视窗viewport

简单理解,viewport是严格等于浏览器的窗口,在桌面浏览器中,viewport就是浏览器窗口的宽度高度。

但是在移动端的viewport太窄,为了能更好的为css布局服务,所以提供了两个viewport:虚拟的viewportvisualviewport和布局的viewportlayoutviewport(了解这两种viewport概念的可以查看这里)

设备像素比(device pixel ratio)

设备像素比简称为dpr,其定义了物理像素和设备独立像素的对应关系。

设备像素比 = 物理像素 / 设备独立像素

在JavaScript中,可以通过`window.devicePixelRatio`获取到当前设备的dpr。而在CSS中,可以通过`-webkit-device-pixel-ratio`,`-webkit-min-device-pixel-ratio`和 `-webkit-max-device-pixel-ratio`进行媒体查询,对不同dpr的设备,做一些样式适配(这里只针对webkit内核的浏览器和webview)

在不同的屏幕上,CSS像素所呈现的物理尺寸是一致的,而不同的是CSS像素所对应的物理像素具数是不一致的。在普通屏幕下1个CSS像素对应1个物理像素,而在Retina屏幕下,1个CSS像素对应的却是4个物理像素。

所以在移动端除了布局的适配外,还需要考虑到图片的显示质量,这就是我们所说的2倍图或者3倍图

meta标签

viewport的meta标签,主要是用来告诉浏览器如何规范渲染web页面,在开发移动端页面,我们需要设置meta标签为:

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  

css单位rem

font size of the root element.  来自w3c规范

简单的理解,rem就是相对于根元素<html>的font-size来做计算。而我们的方案中使用rem单位,是能轻易的根据<html>的font-size计算出元素的盒模型大小。

实现方案

手淘团队根据以上的概念,出了一套针对移动端的适配方案`amfe-flexible`库。

使用方法

前提是需要设置页面的viewport

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

然后引入功能文件

# 阿里CDN引入
<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>

# 下载对应的文件,直接在页面中引入。

# 当然也可以 npm i -S amfe-flexible

需要注意的一点那就是:在Flexible中,只对iOS设备进行dpr的判断,对于Android系列,始终认为其dpr为1。

lexible实际上就是能过JS来动态改写meta标签,类似这样:

# 动态改写<meta>标签# 给<html>元素添加data-dpr属性,并且动态改写data-dpr的值# 给<html>元素添加font-size属性,并且动态改写font-size的值
  var metaEl = doc.createElement(‘meta‘);
  var scale = isRetina ? 0.5:1;metaEl.setAttribute(‘name‘, ‘viewport‘);
  metaEl.setAttribute(‘content‘, ‘initial-scale=‘ + scale + ‘, maximum-scale=‘ + scale + ‘, minimum-scale=‘ + scale + ‘, user-scalable=no‘);
  if (docEl.firstElementChild) {
     document.documentElement.firstElementChild.appendChild(metaEl);
  } else {
  var wrap = doc.createElement(‘div‘);
  wrap.appendChild(metaEl);
  documen.write(wrap.innerHTML);
}

  

接下来要做的事情就是`px`->`rem`

1.可以通过在编辑器中安装插件实现单位的换算

2.可以通过配置postCSS进行自动的单位转换,还按照正常的px进行布局,代码执行后会自动转成对应的rem数值。(具体的配置方法,需要看另外的关于postCSS的文章(待完善))

这套方案,在实际构建M站的过程中,我遇到的一个问题是,1px的border无法正常显示,目前网上没有一个很完美的解决方案,更多提到的是转为svg的方式实现。

不同的终端,我们面对的屏幕分辨率、DPR、1px、2x图等一系列的问题。那么这个布局方案也是针对性的解决这些问题,只不过解决这些问题不再是使用Hack手段来处理,而是直接使用原生的CSS技术来处理的。

vw是基于viewport视窗的长度单位。指的是浏览器可视化的区域,也就是window.innerWidth/window.innerHeight的大小。

1vw = window.innerWidth 的 1%

目前出视觉设计稿,我们都是使用750px宽度的,从上面的原理来看,那么100vw = 750px,即1vw = 7.5px。那么我们可以根据设计图上的px值直接转换成对应的vw值。

这里当然我们也去可以手动去转化单位,但是我们可以在项目的配置项中添加`postCSS`相关的配置,可以为我们自动去转化。我们也只需要按照设计稿给的px去进行布局即可。

下面介绍在`grunt`上配置`postCSS`

安装postCSS插件

# grunt
npm install grunt-postcss --save-dev

#webpack
npm install postcss-loader --save-dev

 

grunt中配置

在`gruntfile.js`中配置,通过`grunt.loadNpmTasks()`函数加载`grunt-postcss`插件

module.exports = function(grunt) {
    grunt.initConfig({
        postcss:{
            options:{
                //  配置postCSS所需插件
                processors:[
                    //  这是postCSS插件
                    //  自动添加前缀
                    require(‘autoprefixer‘),
                    //  适配方案
                    require(‘postcss-px-to-viewport‘)({
                      viewportWidth: 750,
                        viewportHeight: 1670,
                        unitPrecision: 5,
                        viewportUnit: ‘vw‘,
                        selectorBlackList: [],
                        minPixelValue: 1,
                        mediaQuery: false
                    })
                ]
            },
            dist:{
                //  设置CSS的源文件和postCSS编译后的CSS文件
                src: ‘src/style.css‘,   //  源文件
                dest: ‘dest/style.css‘  //  输出文件
            }
        }
    });
    grunt.loadNpmTasks(‘grunt-postcss‘);
}

  

webpack中配置

配置webpack.config.js(即你的基本公用配置中)

module: {
  loaders: [
    {
      test: /\.css$/,
      // 如果使用了 ExtractTextPlugin
      loader: ExtractTextPlugin.extract(‘style‘, ‘css!postcss‘)
      // 否则
      // loader: "style-loader!css-loader!postcss-loader"
    }
  ]
},
//  当然,你也可以在根目录下设置.postcssrc.js中添加对postCSS的配置,会自动识别。
postcss: function () {
    return [ // 里面是我们要用的插件
    //  自动添加前缀
    require(‘autoprefixer‘),
    //  适配方案
    require(‘postcss-px-to-viewport‘)({
        viewportWidth: 750,
        viewportHeight: 1670,
        unitPrecision: 5,
        viewportUnit: ‘vw‘,
        selectorBlackList: [],
        minPixelValue: 1,
        mediaQuery: false
    })
    ];
}

  

注意的是,配置postCSS插件的时候,需要提前安装依赖。点击这里。看看postCSS的强大之处吧。

针对第二套适配方案,`vw`已经广泛被移动端浏览器良好的支持了。所以几乎是没有什么问题.

现有项目中的适配方案

现有的项目采用的适配方案,其实和第一种的原理是一样的。

//  动态计算px的大小,比如设计稿的尺寸宽是750px
(function(dew){
    var winW = document.documentElement.clientWidth;
    var ratio = winW/desW;
    document.documentElement.style.fontSize = ratio * 100 + ‘px‘;
})(750);
//在css中对根字体大小进行设置:

// html,body{
//     font-size:100px;
// }
// 这样我们在对UI给的尺寸直接除以100,就是对应的rem单位了。

  

当然,px和rem之间的转换,可以通过编辑器自己的插件,也可以去配置postCSS去自动转换。

总结

PostCSS是一种工具,一款已成长为像Sass和LESS一样主流的处理器,这一切都归功于它的强大、速度和易用性。

将 PostCSS 视为后处理器,或者将其视作是预处理器的相反处理,都是一种误导;PostCSS 有能力应对各种不同的使用场景,既可以处理已经被预处理器编译过的代码,也可以处理纯粹的 CSS 代码;它可以在开发者的开发工作流中处理更多的任务

postCSS其实算不上什么适配方案,1和3两套方案的本质是一样的。至于第2种适配方案,本质就是把我们经常用的rem变成了vw视窗单位。

对于postCSS,这个东西带给了我很多新的关于web自动化流程的设计感想。他可以实现很多我们针对CSS方面兼容性的处理。事实上页面的布局总是令人蛋疼的。但技术是不断革新的,我们可以随着保持对新技术的关注,尝试这些新特性运用到实际项目中,只有这样,我们解决问题的方案才会越来越完善。

原文地址:https://www.cnblogs.com/yangsg/p/10197212.html

时间: 2024-10-13 02:46:24

移动端适配方案的相关文章

rem移动端适配方案

一. rem vs em 单位 定义 特点 rem font size of the root element 以根元素字体大小为基准 em font size of the element 以父元素字体大小为基准 二.js计算 为了避免造成因为动态设置<html>元素的font-size而造成页面抖动,一般这部分代码我们放在header底部去加载,并内联到html文档里面. <script> const oHtml = document.getElementsByTagName(

移动端适配方案研究

初次接触移动端的时候,以为终于可以不用像pc那样考虑令人头疼的ie浏览器兼容问题,有强大的css3的帮助,可以随心所欲..可是后来才发现原来移动端各种层次不齐的终端更会让人抓耳挠腮,同样的页面在不同的手机上显示的完全不一样的效果,于是抛开功能,页面适配性也成了一个大的课题. 说到移动端,下面这一行代码大家一定不陌生: <meta name="viewport" content="width=device-width, initial-scale=1, maximum-s

h5移动端适配方案

flex布局 flex布局,不使用rem,直接使用px. <!DOCTYPE html> <html> <head> <title></title> <style> /*利用flex属性,可以实现块级元素1:1:1*/ /*简单的就能使里面的内容居中(尤其是垂直居中,好用到爆)*/ .box{ display: flex;width: 50px;height: 30px; /*默认 row*/ flex-direction:colum

html移动端适配方案rem

为了做到一次开发的网页能够在不同尺寸的移动端设备上适配,我们需要使设计稿上标注的固定尺寸在不同设备上按照设备大小的比例显示不同的尺寸. 比如设计稿是按照 IPhone6 的 750px 像素设计的,设计稿上的头部导航条的高度是75px. 那么在 IPhone6 的手机上导航条显示的高度就是75px,在640px像素的手机上显示的高度就应该是(640/750) * 75 = 64px,以此类推,在不同像素手机上元素的大小就是(实际设备大小/设计稿大小)*设计稿上该元素的大小. 而在实际开发中,我们

08-移动端开发教程-移动端适配方案

由于移动端的特殊性,屏幕的尺寸碎片化严重,要想很好的适配不同的尺寸的设备,需要我们前端开发相比PC端要做一些基层的适配方案. 1. 常见的适配方案 百分比+固定高度布局方案 固定屏幕为理想视口宽度 少许的媒体查询设置字体 水平百分比布局 水平方向部分也可以使用弹性布局 Rem解决方案 Rem的大小取值:根据页面的dpr动态改变 Rem的取值: 1rem = 100px 或者 1rem = 1/10 * 理想视口的宽度 chrome浏览器字体小于12px(会被重置为12px) 固定设计稿的宽度开发

移动端适配方案-rem(基础篇)

常见移动web适配方案一般有3种方法,如下图: ①:定高,宽度百分比(百分比适配简单,一般用来做一些适配性不高的页面,比如只有一些文字和图片等简单的屏幕适配) ②:flex (更多的用于复杂页面的布局.具体参照阮一峰大神写的-Flex 布局教程:语法篇和实例篇 http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool   (语法篇) http://www.ruanyifeng.com/blog/2015

手淘H5移动端适配方案flexible源码分析

移动端适配一直是一个值得探讨的问题,在业余时间我找了一些页面,查看了一些厂商对于移动端H5页面的适配方案,看到了几个典型的例子,今天就来记录一下我看到的第一个典型的例子,也是我们公司目前普通H5项目正在使用的适配方案. 这个适配方案是lib-flexible,在看这个源码的同时,我想先来回顾一下几个概念: 1.  viewport 在移动设备上,viewport是设备屏幕用来显示我们网页的那一块区域,或者说是浏览器(或者Hybird App内的webview)用来展示我们网页的那部分区域,vie

(html+css)_移动端适配方案一(流式布局)

一.前言 二.主要内容 1.移动端面对的问题:因为手机屏幕和尺寸不一样,当我们用不同手机设备浏览的时候为了提高用户体验必须要做移动端适配 2.解决方案一: 流式布局 + viewport视口进行设置 流式布局:就是百分比布局,非固定像素,内容向两侧填充,理解成流动的布局,称为流式布局*/ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <

还在用rem做移动端适配?最新移动端适配方案vw,vh了解一下!

vw,vh都是相对于屏幕视口的单位. vw:相对于视口的宽度.视口被均分为100单位的vw: vh:相对于视口的高度.视口被均分为100单位的vh: vmax:相对于视口的宽度或高度中较大的那个.其中最大的那个被均分为100单位的vmax: vmin:相对于视口的宽度或高度中较小的那个.其中最小的那个被均分为100单位的vmin: 解释完相关观念,下面就来说说具体的适配方案: 一般UI给的设计稿都是采用750X1334的,因此可以使用sass来编写一个函数: 1 $containerWidth: