稀土掘金 稀土掘金

前端开发手机适配方案有哪几种?

一、问题:如何实现不同手机上的网页适配?

移动端适配是指同一个页面可以在不同的移动端设备上都有合理的布局。主流的实现方案有三种:

  1. @media响应式布局;
  2. rem适配
  3. vw,vh适配;

二、例子参考

例子1: rem适配

  1. 小米移 动端商城,很明显是采用了rem等比适配的方案。

​编辑

例子2: @media媒体监听

2.  不凡官网,采用了@media媒体监听实现适配。

例子3: rem和@media同时采用

  3.   王者荣耀,同时采用了媒体监听和rem等比适配。

例子4: vh/vm 等比显示

 4. b站。可以看出b站采用了vmin的单位,这个单位本质上还是vh/vw。

截屏2023-03-07 16.37.29.png

三、实现原理

3.1 实现原理

首先需要了解一个概念:viewport 视口( mdn)。如果要实现浏览器适配移动端,首先我们要统一标准视口。在html的head中添加以下代码:

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

3.2 第一种:rem实现原理

rem是一个倍数单位,它是基于html的font-size的倍数。只要我们在不同的设备上设置一个合适的初始值,当设备发生变化font-size就会自动等比适配大小,从而在不同的设备上表现统一。

比如说:移动端设计稿一般会以750px进行交付,而手机实际像素可能是375px。那么一般我们会以设备宽度的1/10作为初试html的font-size大小,当然这个值是动态的,在不同设备上得到的值不同。

比如有的设备宽度是375px,那么html初始font-size就是37.5px,如果设备宽度是300px,那么font-size就是30px。 因为内容都是rem基于font-size的倍数,所以不同宽度的设备上都是等比显示的。

注意:这个font-size基数到底是不是设备的1/10是没有统一论调的,你可以用1/n任意定义。关键是理解rem适配的原理是元素等比缩放

参照具体代码:

<!DOCTYPE html>
<!-- 0. 注意:font-size是动态设置,宽度为屏幕1/10 -->
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <!-- 1. 标准视口,禁止缩放,初始缩放为1 -->
  <meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>移动视口</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    .box{
       
      /* 4. 如果原稿宽度是750px,而且在750宽度的设备上开发。则375px应该还是375px。 
      基础font-size为75px,则这里换算成rem应该是5rem */
      /*
      想必你不一定能理解。试想如果在375宽度的设备上开发。这里的5rem是不是应该为37.5的5倍?
        37.5*5=187.5刚好为375的1/2呢?
      */
      width: 5rem;
      height: 5rem;
      background-color: green;
    }
​
  </style>
</head>
<body>
  <!-- 2. 假设一个750px宽度的设计稿,给了一个375px的元素块。 -->
  <!-- 我们的实现应该是一个盒子在不同宽度的设备上都应该表现一致(占比屏幕宽度的1/2)。
  因为屏幕宽度不一定,通过px显然无法实现,那么我们就需要使用rem来做等比缩放。 -->
  <!-- 一个简单的例子: -->
  <div class="box"></div>
  
  <script>
    // 3. 这里通过js监听屏幕尺寸 设置html的font-size
    function setView(){
      document.documentElement.style.fontSize = screen.width/10 + 'px';
    } 
    setView();
    // 这里是为什么?你自己想一想
    window.onresize = setView;
​
  </script>
</body>
</html>

至于px如何转换为rem,在vscode中可以搜索相关插件。

​编辑

3.3 第二种: 媒体监听

媒体监听通过@media实现。注意:媒体监听不是等比缩放!!!是同一块内容在不同设备上有合理的表现。

比如在PC端一行能同时展示4个元素块,而在移动端只能一行展示1个或者2个元素块(要不看不清)。

那么就可以通过监听媒体宽度,给元素设置不同的宽度,从而有合理的表现。

代码参考:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <!-- 1. 标准视口,禁止缩放,初始缩放为1 -->
  <meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1, user-scalable=no">
  <title>媒体监听适配</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    ul{
      list-style: none;
    }
    .header{
      width: 100%;
      height: 100px;
      background-color: pink;
    }
    .header .header-c{
      width: 1200px;
      height: 100px;
      background-color: green;
      margin: 0 auto;
    }
    .header .nav{
      /* width: xx */
      height: 100%;
    }
    .header .nav .nav-item{
      float: left;
      width: 100px;
      height: 100%;
      line-height: 100px;
      text-align: center;
      cursor: pointer;
    }
    /* 3. 针对适配的设备重新写一套样式 */
    @media screen and (max-width: 750px){
      .header{
        position: relative;
        height: 40px;
      }
      .header .header-c{
        width: 100%;
      }
      .header .nav{
        position: absolute;
        width: 100%;
        left: 0;
        top: 40px;
      }
      .header .nav .nav-item{
        float: none;
        width: 100%;
        height: 40px;
        background-color: pink;
        border-bottom: 1px solid gray;
        line-height: 40px;
      }
    }
  </style>
</head>
<body>
  <!-- 2. 要明确媒体监听实现的不是等比缩放!!!而是同一个内容在不同设备上都有合理的表现。 -->
  <!-- 比如一个导航 -->
  <div class="header">
    <div class="header-c">
      <ul class="nav">
        <li class="nav-item">首页</li>
        <li class="nav-item">分类</li>
        <li class="nav-item">发现</li>
        <li class="nav-item">我的</li>
      </ul>
    </div>
  </div>
</body>
</html>

3.4 第三种: vw/vh方案

vw 是相对单位,1vw 表示屏幕宽度的 1%。需要缩放的元素采用vw,不需要的采用px。 具体实现方法与rem类似,至于转换问题也可以参考rem的插件形式。 vmin的单位是选择较小的视窗,很明显b站采用vmin是希望在横屏和竖屏都有一个较合理的展示方式。

vw视窗宽度的 1%
vh视窗高度的 1%
vmin视窗较小尺寸的 1%
vmax视图大尺寸的 1%

截屏2023-03-07 16.47.21.png

四、各种方案对比

rem方案:

  • 原理不好理解^_^
  • 从px到rem的转换需要使用工具
  • 灵活可控,几乎完美复刻设计稿
  • 可能大量出现小数点,由于换算有些许误差(极小)
  • 适合具有完全移动端设计稿的项目

media媒体监听方案:

  • 没有学习成本
  • 如何适配需要重新定义,可能设计稿都不会体现
  • 复杂的组件很难有完美的呈现
  • 适合只有PC端设计稿,又需要兼容移动端的需求

vm/vh

  • 原理同rem,只不过rem基于html根font-size的倍数,vm/vh是基于窗口1%的宽度
  • 需要px转换rem的工具
  • 灵活可控,几乎完美复刻设计稿
  • 会出现大量小数,换算误差
  • 适合移动端开发

综合方案:

  • 可以同时使用media和rem或者vm/vh
  • 实现更大的自由度和更完美的呈现
  • 实现复杂,颗粒度不好把控

补充: 其实后来的微信小程序css单位rpx,换算方法为1px=2rpx,应该和rem的适配方案原理大致相同。

五、 附件

代码仓库:  gitee.com/bufanxy/lea…

声明:不凡君原创不易,转载请说明出处。

玻璃钢生产厂家芒市玻璃钢仿铜雕塑厂家安顺玻璃钢雕塑订做江苏主题商场美陈研发石家庄玻璃钢雕塑盘龙区玻璃钢雕塑怎么样宿州玻璃钢雕塑玻璃钢人像雕塑哪家价格便宜春季商场美陈戴蝴蝶结商场装饰美陈管理规定黄冈玻璃钢雕塑定制临沧市玻璃钢雕塑生产商杭州玻璃钢金属雕塑玻璃钢卡通雕塑怎么设计哈尔滨定做玻璃钢人物雕塑10米高玻璃钢雕塑多少钱无锡玻璃钢马雕塑设计玻璃钢海洋雕塑服务公司深圳开业商场美陈供货商滨州动物玻璃钢雕塑生产厂家鞍山商场美陈搭建浙江商场美陈制作公司平定玻璃钢雕塑厂家东莞玻璃钢外壳雕塑淮北玻璃钢雕塑销售衡水玻璃钢雕塑多少钱工业玻璃钢花盆厂家直销菏泽玻璃钢仿铜雕塑生产厂家达州商场美陈花器广州玻璃钢仙鹤雕塑平洲历史玻璃钢人物雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化