移动端适配常见方案

前端开发常用单位

像素

什么是像素(Pixel)?
  • 在前端开发中视口的水平方向和垂直方向是由很多小方格组成的,一个小方格就是一个像素。
  • 例如:div 尺寸是 100 x 100,那么水平方向就占用100个小方格,垂直方向就占用100个小方格。
像素特点
  • 不会随着视口大小的变化而变化, 像素是一个固定的单位(绝对单位)。

百分比

什么是百分比?
  • 百分比是前端开发中的一个动态单位, 永远都是以当前元素的父元素作为参考进行计算。
  • 例如:父元素宽高都是 200px,设置子元素宽高是 50%,那么子元素宽高就是 100px。
百分比特点
  1. 子元素宽度是参考父元素宽度计算的。
  2. 子元素高度是参考父元素高度计算的。
  3. 子元素 padding 无论是水平还是垂直方向都是参考父元素宽度计算的。
  4. 子元素 margin 无论是水平还是垂直方向都是参考父元素宽度计算的。
  5. 不能用百分比设置元素的 border。

结论:百分比是一个动态的单位,会随着父元素宽高的变化而变化(相对单位)。

em

什么是em?
  • em 是前端开发中的一个动态单位,是一个相对于元素字体大小的单位。
  • 例如:font-size: 12px; ,那么 1em 就等于 12px。
em特点
  1. 当前元素设置了字体大小, 那么就相对于当前元素的字体大小。
  2. 当前元素没有设置字体大小,那么就相当于第一个设置字体大小的祖先元素的字体大小。
  3. 如果当前元素和所有祖先元素都没有设置大小,那么就相当于浏览器默认的字体大小。

结论:em 是一个动态的单位,会随着参考元素字体大小的变化而变化(相对单位)。

rem

什么是 rem?
  • rem 就是 root em,和 em 是前端开发中的一个动态单位。
  • rem 和 em 的区别在于,rem是一个相对于根元素字体大小的单位。
  • 例如:根元素(html) font-size: 12px; ,那么 1em 就等于 12px。
rem 特点
  1. 除了根元素以外,其它祖先元素的字体大小不会影响 rem 尺寸。
  2. 如果根元素设置了字体大小,那么就相对于根元素的字体大小。
  3. 如果根元素没有设置字体大小,那么就相对于浏览器默认的字体大小。

结论:rem 是一个动态的单位,会随着根元素字体大小的变化而变化(相对单位)。

vw vh

什么是 vw(Viewport Width)和 vh(Viewport Height)?
  1. vw 和 vh 是前端开发中的一个动态单位,是一个相对于网页视口的单位。
  2. 系统会将视口的宽度和高度分为 100 份,1vw 就占用视口宽度的百分之一,1vh 就占用视口高度的百分之一。
  3. vw 和 vh 和百分比不同的是,百分比永远都是以父元素作为参考。
  4. vw 和 vh 永远都是以视口作为参考。

结论:vw/vh是一个动态的单位,会随着视口大小的变化而变化(相对单位)。

什么是vmin和vmax?
  1. vmin:vw 和 vh 中较小的那个。
  2. vmax:vw 和 vh 中较大的那个。
  3. 使用场景:保证移动开发中屏幕旋转之后尺寸不变。

视口

什么是视口?

  • 视口简单理解就是可视区域大小我们称之为视口。
  • 在PC端,视口大小就是浏览器窗口可视区域的大小。
  • 在移动端,视口大小并不等于窗口大小,移动端视口宽度被人为定义为了 980。

为什么是980而不是其他的值?

  • 因为过去网页的版心都是 980。
  • 乔老爷子为了能够让网页在移动端完美的展示,所以将 iOS 手机视口的大小定义为了 980。
  • 后来谷歌也觉得这是一个非常牛X的方案,所以 Android 手机的视口也定义为了 980。

移动端自动将视口宽度设置为980带来的问题

  • 虽然移动端自动将视口宽度设置为 980 之后让我们可以很完美的看到整个网页。
  • 但是由于移动端的物理尺寸(设备宽度)是远远小于视口宽度的。
  • 所以为了能够在较小的范围内看到视口中所有的内容,那么就必须将内容缩小。

如何保证在移动端不自动缩放网页的尺寸?

	<!-- 通过meta设置视口大小 -->
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
	<!--
		width=device-width   设置视口宽度等于设备的宽度
		initial-scale=1.0   初始缩放比例, 1不缩放
		maximum-scale:  允许用户缩放到的最大比例
		minimum-scale:  允许用户缩放到的最小比例
		user-scalable:  用户是否可以手动缩放
	-->

移动端常用适配方案

界面自动跳转

function isPc() {
    let userAgentInfo = navigator.userAgent;
    if(/iphone/i.test(userAgentInfo)){
        return false;
    }else if(/android/i.test(userAgentInfo)){
        return false;
    }
    return true;
}
if(!isPc()){
    location.href = "http://m.jd.com";
}

通过媒体查询 + rem

由于移动端也有很多的屏幕尺寸,所以也需要进行适配
例如:

  • iPhone3/4/5: 320px
  • iPhone678: 375px
  • iPhoneX/plus: 414px
    当下在企业开发中设计师提供给我们的移动端设计图片是 750 * xxx 的或者 1125 * xxx 的。
    所以我们需要对设计师提供的图片进行等比缩放,这样才能 1:1 还原设计图片。

如何等比缩放?

  1. 将设计图片等分为指定份数,求出每一份的大小。
  2. 例如: 750 设计图片分为 7.5 份,那么每一份的大小就是 100px。
  3. 将目标屏幕也等分为指定份数,求出每一份的大小。
  4. 例如:375 屏幕也分为 7.5 份,那么每一份的大小就是 50px。
  5. 用原始元素尺寸 / 原始图片每一份大小 * 目标屏幕每一份大小 = 等比缩放后的尺寸。
  6. 例如:设计图片上有一个150 * 150的图片,我想等比缩放显示到375屏幕上。
  7. 那么:150 / 100 * 50 = 1.5 * 50 = 75px。

如何在前端开发中应用这个计算公式?

  1. 目标屏幕每一份的大小就是 html 的 font-size: 50px。
  2. 使用时只需要用 “原始元素尺寸 / 原始图片每一份大小 rem” 即可。
  3. 150 / 100 = 1.5 / 1.5rem
  4. 1rem = 50px / 1.5rem === 1.5 * 50 = 75px

移动端常用适配方案

<!--可以让部分国产浏览器默认采用高速模式渲染页面-->
<meta name="renderer" content="webkit">
<!--为了让 IE 浏览器运行最新的渲染模式下-->
<meta http-equiv="X-UA-Compatible" content="IE=edge">

<script>
    let scale = 1.0 / window.devicePixelRatio;
    let text = `<meta name="viewport" content="width=device-width, initial-scale=${scale}, maximum-scale=${scale}, minimum-scale=${scale}, user-scalable=no">`;
    document.write(text);
    document.documentElement.style.fontSize = window.innerWidth / 7.5 + "px";
</script>
  1. 初始化 HTML 中的代码
  2. 利用 rem + 视口释放的方式来适配移动端
  3. 注意点:如果在 HTML 文件中用到了字符串模板,字符串模板中用到了变量,那么 html-plugin 是无法处理的,所以会报错。
  4. 如果想解决这个问题,那么我们需要再借助一个 loader,html-loader。
  5. 借助 postcss-pxtorem 实现自动将 px 转换成 rem。
  6. 借助 webpack 实现 CSS3/ES678 语法的兼容。
  7. 借助 fastclick 解决移动端 100~300ms 的点击事件延迟问题。
  8. 初始化默认的全局样式。

注意点:在移动端开发中,一般情况下我们不需要让字体大小随着屏幕尺寸的变化而变化。由于我们是通过视口缩放来适配移动端的,所以我们不能直接设置字体大小,否则字体大小就会随着屏幕尺寸的变化而变化。

// vue.config.js
module.exports = {
  configureWebpack: {
    module: {
      rules: [
        {
          test: /\.(html)$/,
          exclude: /node_modules/,
          use: {
            loader: 'html-loader',
            options: {
              minimize: true
            }
          }
        }
      ]
    }
  }
}
// postcss.config.js
module.exports = {
  plugins: {
    autoprefixer: {},
    'postcss-pxtorem': {
      rootValue: 100, // 根元素字体大小
      propList: ['*']
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值