移动端适配

目录

移动端的应用(主要包括三类):

移动端适配的原因

自适应:

响应式:

px、em、rem的理解

Viewport视口 

一、视口的划分:

layout viewport 布局视口

visual viewport 视觉视口

ideal viewport 理想视口

 二、视口大小的更改​​​​​​​

viewport属性各个参数:

移动端适配方法

一、rem(根倍率) + 动态的根标签的font-size

1、媒体查询设置动态的html标签属性

2、通过JS动态计算html标签中的font-size

3、已经开源的库可以使用

二、vw(视口宽度)---推荐

三、flex(弹性布局)


移动端的应用(主要包括三类):

原生App开发:  iOS、Android、RN、uniapp、Flutter等

原理:现在常用的前端框架是HTML、CSS、JS打包,在手机的浏览器中运行;原生app(RN)全是用JS编写,打包成为java或者OC语言,可以直接在手机中运行,不需要依赖浏览器

小程序开发:  微信小程序开发、uniapp等

web页面:  Vue开发、React开发、uniapp等

原理:就是上面提到的,移动端的Web页面,可以使用浏览器或者WebView浏览

这里借用一张React-Nactive图片解释:

通过这张图片,我们就可以显而易见的知道两者的区别:

        原生App直接与系统进行交互,与WebApp这种中间有浏览器或者WebView的显然要快,缺点也是显而易见的,拿我用过的RN为例,组件库中的组件相对来说比较少,变化和功能相对来说要少,再就是搭建环境和运行环境要比WebApp多,iOS和Android是两套代码,打包为的方式也不同.

移动端适配的原因

最主要的原因:屏幕大小

        这里我们可以看见各种手机型号,不同手机型号的屏幕也不经相同,如果使用固定的尺寸,那么不同的App在不同手机上肯定不适配.

       再加上现在平板、手表、曲面屏、折叠屏、车机显示屏、大的电视屏幕以及电脑屏幕,不同App想要做好用户体验以及开拓市场,那么App应用的适配性就至关重要.

自适应:

根据不同的设备屏幕大小来自动进行调整

响应式:

当屏幕的宽或者高进行改变时,会自动进行响应,并自动进行根据屏幕进行改变

比如:手机屏幕竖屏调整为横屏; 电脑窗口的宽或者高进行拉伸

px、em、rem的理解

简单的来讲:

  1. px(像素),屏幕的每一个小方块亮的不同颜色的灯组成了屏幕,每一个小方块,就是一个像素
  2. em(相对长度单位),电脑的手机当你不给font-size是也会出现字体大小,这个就是设置的默认字体大小,所有未经调整的浏览器都符合: 1em=16px。根据这个计算,就可以算出默认字体大小对应的em,那么不同屏幕的默认不同,就会进行自适应和响应式
  3. rem(根元素): root em就可以简单的理解为相对于root <html>元素的单位,

还有一些rpx、fpx等其实都是根据这些出发的,了解了这些再看就会简单

网址:px、em 和 rem 三者区别_cbkting的博客-CSDN博客_rem em px

Viewport视口 

一、视口的划分:

这里只针对移动端, pc端没有这种转换和划分

注意:<meta name="viewport" content="width=device-width, initial-scale=1.0">

实验前把这一行代码删除,该meta标签的作用是让当前viewport的宽度等于设备的宽度,同时不允许用户手动缩放。

layout viewport 布局视口

简述:相对于980px布局的这个视口(比如PC视口)

visual viewport 视觉视口

简述:原本的区域是980px X 1743px, 手机端(375px X 667px)如果按照这个显示,肯定只能显示一部分,按比例缩小之后的这个视口称之为"视觉视口"

ideal viewport 理想视口

默认情况下的layout viewport 布局视口不适合移动端开发, 需要进行转换,利用标签<mate>对布局视口, 设置成我们想要的移动端视口,就是理想视口

手机端的视口: 红色方块100px X 100px   手机视口:375 X 667

显然小方块不是整个视口的1/3左右,那么这100px肯定不是相对于这个视口的

那么这个100px是相对于layout viewport 布局视口

当我们从pc端视口---布局视口, 转换为手机视口---可见视口时, 原本980px缩小为375px, 100px也会按照这个比例等比缩小

PC端的视口: 小方块100px X 100px

 二、视口大小的更改

主要还是:<meta name="viewport" content="width=device-width, initial-scale=1.0">

content="width=device-width"   布局视口宽度 = 设备的宽度(手机宽度)

content="width=100px"    布局视口宽度  = 100px

如图所示:红色方块100px X 100px 占满整个视口

viewport属性各个参数:


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

  • width:viewport 的宽度,可以指定为一个像素值,如:600,或者为特殊的值,如:device-width (设备的宽度)。
  • height:viewport的高度。
  • initial-scale:初始缩放比例,即当浏览器第一次加载页面时的缩放比例。
  • maximum-scale:允许浏览者缩放到的最大比例,一般设为1.0。
  • minimum-scale:允许浏览者缩放到的最小比例,一般设为1.0。
  • user-scalable:浏览者是否可以手动缩放,yes或no。 

移动端适配方法

痛点:移动端适配原因

改变: 使用px是绝对的大小, 要使用相对的大小才能进行自适应与响应式

注意:百分比(%)设置不常用, 不同参照物的百分比很难统一

一、rem(根倍率) + 动态的根标签的font-size

rem(根倍率)相对于根标签<html>的倍率变化

那么 -->    375px是视口宽度,  font-size=20px  红色方快100px X 100px  1rem = 20px 

红色方块设置 5rem X 5rem

现在的视口宽度为 414px  现在的红色方块 5rem X 5rem 只需要设置 font-size=28px

红色方块实际:140px X 140px

动态根标签:当视口变化时, 我们只需要改变<html>中的font-size大小就可以适配

1、媒体查询设置动态的html标签属性

这里的媒体查询动态是一个区间: min-width: 375px 至 min-width: 414px都是font-size: 20px;

所以rem的与font-size一样, 是根据视口的大小达到范围后进行变化, 而不是实时变化

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  <title>viewport</title>
</head>
<body>
  <div class="box"></div>
</body>

  <style>
    @media screen and (min-width: 320px) {
      html {
        font-size: 12px;
      }
    }
    @media screen and (min-width: 375px) {
      html {
        font-size: 20px;
      }
    }
    @media screen and (min-width: 414px) {
      html {
        font-size: 28px;
      }
    }
    @media screen and (min-width: 480px) {
      html {
        font-size: 30px;
      }
    }
    @media screen and (min-width: 960px) {
      html {
        font-size: 60px;
      }
    }
    body {
      margin: 0;
      padding: 0;
    }
    .box {
      width: 5rem;
      height: 5rem;
      background-color: red;
    }
  </style>
</html>

2、通过JS动态计算<html>中的font-size

原理: 就是实时监听视口的宽度,拿到这个宽度,然后根据这个宽度就可以设置实时的html标签的font-size的值

虽然font-size可以实时变化了,但是rem的值计算却很麻烦

方法一: 引入scss或者less预编辑器, 用到的是可以使用函数

这里就使用函数相当于转换器, 输入的是px的大小,转换为rem

方法二: webpack插件(postcss-pxtorem)可以在打包的时候,把你的px换算为rem(原理同上)

方法三:VScode插件(px to rem & rpx & vw), 输入px值然后按照规定的快捷键

注意: 需要改根组件font-size的倍率: 37.49(原理同上)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  <title>viewport</title>
</head>
<body>
  <div class="box"></div>
</body>

  <script>
    // 声明常量: 所有的HTML元素赋给htmlEl
    const htmlEl = document.documentElement
    // 声明常量: htmlEl元素的内部宽度
    //clientWidth属性表示元素的内部宽度,以像素计。该属性包括内边距,但不包括垂直滚动条(如果有)、边框和外边距。
    // const htmlWidth = htmlEl.clientWidth
    function setResize(){
      const htmlWidth = htmlEl.clientWidth
      const htmlFontSize = htmlWidth / 10
      htmlEl.style.fontSize = htmlFontSize + 'px'
    }

    // 解决第一次调用的问题:第一次是默认的16px
    setResize()

    // 给window添加一个事件监听---两个参数(监听参数的变化, 变化之后执行的函数)
    window.addEventListener('resize', setResize())
  </script>

  <style lang="scss" scoped>
    pxToRem(@px) {
      result: 1rem * (@px / 37.49);
    }
    body {
      margin: 0;
      padding: 0;
    }
    .box {
      width: pxToRem(100)[result];
      height: pxToRem(100)[result];
      background-color: red;
    }
  </style>
</html>

3、已经开源的库可以使用

lib-flexble

  1. npm install lib-flexible --save
  2. 在main.js中引入import 'lib-flexble'
px2rem-loader
  1. npm install px2rem-loader --save-dev
  2. 在根目录的vue.config.js文件中进行配置
module.exports = {
  chainWebpack: config => {
    config.module
      .rule('css')
        .test(/\.css$/)
        .oneOf('vue')
        .resourceQuery(/\?vue/)
        .use('px2rem')
          .loader('px2rem-loader')
          .options({
            remUnit: 75
          })
  }
}

二、vw(视口宽度)---推荐

假设375px的这个设备为我们的设计时的标准设备

100vw = 375px     1vw = 3.75px

红色方块是 100px = 100/3.75 vw = 26.6vw

当变换成为iPone XR 为414px

100vw = 414px    1vw =  4.14px

26.6vw = 26.6 X 4.14 px = 110.1px

这样红色方块在视口中自动按照比例变大

那么我们在设计的时候,把大小全部使用vw,就可以实现适配

接上面的: 上面用的是函数来查取动态的视口宽度viewport width

vw就是视口宽度  100vw就是设备的视口宽度

那么设置如下:

<body>
  <div class="box"></div>
</body>
  <style>
    /* html {
      font-size: 10vw;
    } */
    body {
      margin: 0;
      padding: 0;
    }
    /* 这里的rem = 10vw 2.6667rem = 26.667vw*/
    .box {
      width: 26.667vw;
      height: 26.667vw;
      background-color: red;
    }
  </style>

三、flex(弹性布局)

display: flex弹性布局

flex(设置在子元素上) 作用:可以让元素自动占用容器的可用空间,等比划分

flex-grow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大

flex-shrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小

flex-basis属性定义了在分配多余空间之前,项目占据的主轴空间(main size)

flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto

通过上面的的方法我们已经可以实现这个页面的不同设备上的适配

痛点:电脑上是宽长高短, 手机上是宽短高长, 这也就决定了两者除了适配之外, 在布局上为了用户更加方便, 也必须适配

比如: 在电脑上面如果左侧有一个选项列表, 在移动端就要设计为抽屉

经典的圣杯布局: PC端的中间部分可能可以很大,但是在手机上中间部分就要小一点

这里用到最多的就是自适应 flex:1

痛点: 如果可以无限的放大或者缩小, 太大还好,当太小时,  有的文字或者一些表单看不见或者按不到,

解决办法: 要么就禁止缩放, 要么就设置一个最小的font-size的值/视口