Web前端中移动端适配方案

使用rem单位或者VW/VH进行移动端适配

px单位名称为像素,相对长度单位,像素(px)是相对于显示器屏幕分辨率而言  (最终解析单位)

em单位名称为相对长度单位。相对于当前对象内文本的字体尺寸   (相对于父元素的font-size大小的单位,那如果你要设置一个元素的宽度,高度,那么就得去看他父级的大小,如果父级也是em单位,你又得去找他的父级,得一层层计算,才能得到准确的像素值,因此在实际开发中,常用rem来替代此方案

pt单位名称为点(Point),绝对长度单位一般老版本的table使用长度大小单位但是现在基本上没有使用

(换算:浏览器的默认字体高度16px,1em=16px,12px相当于9pt长度

html{font-size:10px}

因此常常通过使用设置font-size为10px来确定根元素大小,1rem = 10px的大小

% 相对于父元素的大小设定的比率

 

rem    rem相对的是HTML根元素,px是相对固定单位,字号大小直接被定死,所以用户无法根据自己设置的浏览器字号而缩放,em和rem虽然都是相对单位,但em是相对于它的父元素的font-size,页面层级越深,em的换算就越复杂,而rem是直接相对于根元素,这就避开了很多层级关系。移动端新型浏览器对rem的兼容很好,可以放心使用。

 

一般而言,UI给的设计稿往往都是iphone6的稿子(750*1334),因为iphone6为两倍屏,所以设计稿转为rem需要在px单位下÷2÷10得到rem单位的值。之后在CSS中添加媒体查询设置每个屏幕大小的值,页面即可根据设置的font-size值适配。

 举个例子:


html{font-size:10px} /*也有的写作62.5%,即是默认大小16px的0.625倍-10px*/
 
@media only screen and (max-height: 700px) and (min-height:645px) and (max-width: 400px) and (min-width: 360px) {html {font-size: 9.3px} }
@media only screen and (max-height: 645px) and (min-height:601px) and (max-width: 400px) and (min-width: 360px) {html {font-size: 8.7px} }
@media only screen and (max-height: 600px) and (min-height:560px) and (max-width: 400px) and (min-width: 360px) {html {font-size: 8px} }
@media only screen and (max-height: 560px) and (min-height:531px) and (max-width: 400px) and (min-width: 360px) {html {font-size: 7.6px} }
@media only screen and (max-height: 530px) and (min-height:500px) and (max-width: 400px) and (min-width: 360px) {html {font-size: 7px} }

但是此处会有两个坑,基于维护代码的鲁棒性来说必须说说:

1、关于rem的资料来说,基本都默认浏览器字号为16px,然后直接定义font-size:62.5%,但是rem为css3的属性,大概13、14年才得到完全支持,有些浏览器的早期版本和国内浏览器的默认字号并不是16px,那么百分之62.5的换算就会出现偏差。

2、chrome强制字体最小值为12px。低于12px的按照12px处理,那么1rem = 10px也会出现一定程度的偏差。

解决方案:将1rem = 10px换成1rem = 100px;或者不要再PC端项目使用rem;

之后使用符合标准的换算过的媒体查询即可

@media screen and (min-width:360px) and (max-width:374px) and (orientation:portrait) {
    html { font-size: 703%; }
}
@media screen and (min-width:375px) and (max-width:383px) and (orientation:portrait) {
    html { font-size: 732.4%; }
}
@media screen and (min-width:384px) and (max-width:399px) and (orientation:portrait) {
    html { font-size: 750%; }
}
@media screen and (min-width:400px) and (max-width:413px) and (orientation:portrait) {
    html { font-size: 781.25%; }
}
@media screen and (min-width:414px) and (max-width:431px) and (orientation:portrait){
    html { font-size: 808.6%; }
}
@media screen and (min-width:432px) and (max-width:479px) and (orientation:portrait){
    html { font-size: 843.75%; }
}

更成熟的工业级方案?

上述方案已可以很好的解决适配中的坑,但是业界早已对此为题作出了各种非常优秀的解决方案,大名鼎鼎的淘宝Flexible即是一个工业级的解决方案。

https://github.com/amfe/lib-flexible

引入文件,直接引用阿里的CDN文件(或下载到本地引入)


<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script>

设定: 页面不要设定 。Flexible会自动设定每个屏幕宽度的根font-size、动态viewport、针对Retina屏做的dpr。

换算: 假设拿到的设计稿为标准UI设计稿iphone6的大小,750*1334,Flexible会把设计稿分为10份,可以理解为页面width=10rem,即1rem=75px,所以根font-size(基准值)=75px。 

换算过于麻烦?px2rem/cssrem插件来了 

 

cssrem插件

cssrem是一款vscode自带的插件,如果你也用VScode,可以使用此插件

1.vscode安装插件
2.配置

参数配置文件:VSCode -> 文件 -> 设置 -> 搜索cssrem

cssrem.rootFontSize root font-size (unit: px), default: 16
cssrem.fixedDigits px转rem小数点最大长度,默认:6。
cssrem.autoRemovePrefixZero 自动移除0开头的前缀,默认:true

3.书写的时候就会有提示 ,可以直接转换rem

 

px2rem插件

1、安装

npm install px2rem-loader lib-flexible –save

2、在项目入口文件main.js中引入lib-flexible

import ‘lib-flexible/flexible.js’

3、在build下的 utils.js中,generateLoaders 方法。(基于vue-cli2.x)

const px2remLoader = {
  loader: 'px2rem-loader',
  options: {
    remUnit: 75 // 设计图的1/10
  }
}
function generateLoaders (loader, loaderOptions, anotherLoader) {
  const loaders = options.usePostCSS ? [cssLoader, postcssLoader,px2remLoader] : [cssLoader,px2remLoader]

  if (loader) {
    loaders.push({
      loader: loader + '-loader',
      options: Object.assign({}, loaderOptions, {
        sourceMap: options.sourceMap
      })
    })
  }
  if (!!anotherLoader) loaders.push(anotherLoader)

  // Extract CSS when that option is specified
  // (which is the case during production build)
  if (options.extract) {
    return ExtractTextPlugin.extract({
      use: loaders,
      fallback: 'vue-style-loader'
    })
  } else {
    return ['vue-style-loader'].concat(loaders)
  }
} 

至此,移动端适配性能较高且适配性较好。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值