css移动端适配最佳实践

简介: 移动端适配,在移动端里经常有遇到,在不同分辨率移动端设备精确还原UI设计稿,这是一个令人抓狂的问题,好在有flex,box布局解决了自适应很大一部分问题。

移动端适配,在移动端里经常有遇到,在不同分辨率移动端设备精确还原UI设计稿,这是一个令人抓狂的问题,好在有flexbox布局解决了自适应很大一部分问题。


在开始本文之前主要介绍几种笔者常用的适配方案


1、设置meta标签的initial-scale,mininum-scale,maxinum-scale缩放比

2、rem适配,利用根设置基础单位

3、vw+calc,结合rem适配


正文开始...


meta缩放比


(function () {
    let timer = null;
    function flexable() {
      const deviceWidth = window.screen.width;
      // 根据当前设计稿,如果是设计稿640,那么targetWidth就是320,设计稿实际1px,页面也是1px
      // 如果设计稿是750,那么targetWidth就是375
      const targetWidth = 320;
      const scale = deviceWidth / targetWidth;
      let meta = document.querySelector('meta[name="viewport"]');
      if (!meta) {
        const meta = document.createElement("meta");
        meta.setAttribute("name", "viewport");
        meta.setAttribute(
          "content",
          `width=device-width,initial-scale=${scale},minimum-scale=${scale},maximum-scale=${scale},user-scalable=no`
        );
        document.getElementsByTagName("head")[0].appendChild(meta);
      }
      if (meta) {
        meta.setAttribute(
          "content",
          `width=device-width,initial-scale=${scale},minimum-scale=${scale},maximum-scale=${scale},user-scalable=no`
        );
      }
    }
    window.addEventListener(
      "resize",
      () => {
        if (timer) {
          clearTimeout(timer);
        }
        timer = setTimeout(() => {
          flexable();
        }, 80);
      },
      false
    );
    flexable();
 })();

主要是设置根据window.screen.width与设计稿实际尺寸targetWidth计算出scale,将这个scale动态设置metacontent,width=device-width,initial-scale=scale,minimum-scale=scale,maximun-scale=scale


当我们动态设置meta后,我们不同分辨率下的字体大小就会动态的发生变化


640x960

edf9a300fb7c232789ab361ded2fa123.png

750x1334

85cc02ca0acb859757fa6470c59e9a67.png

注意targetWidth是你设计稿尺寸,如果是750的设计稿,那么就是375,在设计稿中量的是多少尺寸,就是多少固定尺寸


rem适配


因为默认浏览器字体的大小就是16px,所以我们在一些项目中会看到font-size:62.5%

62.5%到底怎么计算来的呢,如果我们根html设置font-size: 16px

1rem = 16px;


换算成百分比就是1/16就是6.25%,现在我们扩大10倍就是62.5%,所以1rem = 10px,也就1px=0.1rem


在我们根据UI设计稿实际尺寸中,如果量得尺寸是16px那么就是1.6rem,只需要在原单位基础上/10即可


注意我们meta标签上同样要默认设置<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<!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" />
    <title>rem</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      html {
        font-size: 62.5%;
      }
      .title {
        font-size: 2rem;
      }
      .box {
        max-width: 64rem;
        height: 10rem;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <div class="title">rem适配</div>
      <div class="box"></div>
    </div>
  </body>
</html>

79d6216cd59b5c222a0b0a04b769284b.jpg


这种方案在早期移动端rem适配用得比较多


vw适配


vw是视口单位,通常来讲会将可视区域分成100vw

0ef6e361379feb3fc3952a2db8ac04e9.png

在利用vwcalc来设置根htmlfont-size,然后用rem单位


然后我们看下代

* {
  padding: 0;
  margin: 0;
}
html {
  font-size: calc(100vw / 320 * 10);
}

100vw瓜分了320分辨率,然后我们需要扩大10倍

1rem = 10vw = 10px

所以当我们实际量得UI上20px时,我们直接计算得出2rem即可

 #app {
        position: relative;
      }
  .title {
    font-size: 2rem;
  }
  .box {
    max-width: 32rem;
    height: 10rem;
    background-color: red;
  }
  .content {
    font-size: 2rem;
    position: absolute;
    top: 0px;
    z-index: 1;
    background-color: rgb(255, 0, 0, 0.1);
  }
  .row-present .col {
    /* width: calc(100% / 3); */
    width: 20%;
    height: 100px;
    float: left;
    color: green;
    font-size: 20px;
  }
  :root {
    --background-color: #111;
  }
  .row-present .col:nth-of-type(2n + 1) {
    background-color: var(--background-color);
  }
  p.title {
    clear: both;
  }
  .row-vw .col {
    float: left;
    height: 100px;
    width: 20vw;
    color: green;
    font-size: 2rem;
  }
  .row-vw .col:nth-of-type(2n + 1) {
    background-color: var(--background-color);
  }

最后的结果就是下面


0ef6e361379feb3fc3952a2db8ac04e9.png


总结


  • 可以动态设置metainitial-scale的缩放比,主要是根据screen.width设备宽度与目标设计稿targetWidth形成像素比scale,假设设计稿是750的,那么我们的targetWidth就是375,设计稿量的尺寸就是10px,网页上所写的元素也是10px,因为scale=1,随着不同分辨率scale的值也会发生变化
  • rem适配,浏览器默认font-size:16px,当我们根font-size:62.5%时,我们利用rem单位设置元素单位,1rem=10px,所以当设计稿750像素时,量尺寸20px,那么你实际单位换成rem时,就是2rem,原有尺寸缩小10倍即可,这种方案会有一定误差,但也基本满足移动端自适应
  • vw+calc+rem方案,同样是设置根html的单位,主要是font-size: calc(100vw / targetWidth * 10),我们把vw视口单位,如果你的设计稿是640,100vw就是targetWidth=320像素,如果你的设计稿是750,那么targetWidth=3751rem = 10vw = 10px,所以当你750的设计稿20像素时,那么在实际网页的单位只需要缩小10倍即可,也就是2rem,这种方式精确度高,简单,基本不需要第三方什么适配js
  • 本文code example[1]
相关文章
|
24天前
|
编解码 前端开发 UED
探讨了CSS媒体查询在移动端开发中的应用,介绍了媒体查询的基本概念、常见条件及其在响应式布局、导航菜单、图片优化和字体调整等方面的具体应用
本文深入探讨了CSS媒体查询在移动端开发中的应用,介绍了媒体查询的基本概念、常见条件及其在响应式布局、导航菜单、图片优化和字体调整等方面的具体应用。通过实际案例分析和注意事项的讨论,旨在帮助开发者更好地理解和运用媒体查询,提升移动端用户体验。
40 4
|
1月前
|
JSON 移动开发 数据格式
html5+css3+js移动端带歌词音乐播放器代码
音乐播放器特效是一款html5+css3+js制作的手机移动端音乐播放器代码,带歌词显示。包括支持单曲循环,歌词显示,歌曲搜索,音量控制,列表循环等功能。利用json获取音乐歌单和歌词,基于html5 audio属性手机音乐播放器代码。
110 6
移动端的打开方式,打开F12之后,就可以看到手机样式设计,移动端的初始化使用normalize.css代码库录到,box-sizing: border-box; 定宽度为多少就是多少,代码库,移动端
移动端的打开方式,打开F12之后,就可以看到手机样式设计,移动端的初始化使用normalize.css代码库录到,box-sizing: border-box; 定宽度为多少就是多少,代码库,移动端
|
4月前
|
前端开发 UED
触屏新体验:CSS动画让移动端底部导航活起来!
触屏新体验:CSS动画让移动端底部导航活起来!
|
4月前
|
前端开发 JavaScript
vite中css最佳实践:使用postcss完善项目中的css配置
【8月更文挑战第3天】使用postcss完善项目中的css配置
1058 1
|
6月前
|
缓存 前端开发 JavaScript
从HTML、CSS以及其他方面介绍一些移动端网页性能优化的策略
【6月更文挑战第14天】本文探讨了移动端网页性能优化的重要性,并提出了HTML、CSS及其他方面的优化策略。HTML方面,建议精简结构、使用语义化标签、异步加载脚本和压缩文件。CSS优化包括简化样式、利用CSS3动画、媒体查询及压缩文件。其他策略涉及图片和字体优化、缓存利用、压缩传输数据、减少HTTP请求及监听网络状态。通过这些方法,可提升网页性能,改善用户体验。
75 1
|
5月前
|
前端开发 JavaScript
css相对单位 rem 和 em 的最佳实践
css相对单位 rem 和 em 的最佳实践
40 0
|
6月前
|
移动开发 JavaScript 前端开发
rem的适配方案,css文件和js文件的引入方式,特色小边框的制作,DS-Digital.ttf数字展示屏的使用方法:,自适应图片 background-size,jQuery爆bug,a和盒子居中,
rem的适配方案,css文件和js文件的引入方式,特色小边框的制作,DS-Digital.ttf数字展示屏的使用方法:,自适应图片 background-size,jQuery爆bug,a和盒子居中,
|
7月前
|
前端开发 JavaScript UED
【专栏:HTML与CSS移动端开发篇】移动端触摸事件与手势识别
【4月更文挑战第30天】本文探讨了移动端触摸事件和手势识别在网页开发中的重要性。介绍了基础触摸事件如`touchstart`, `touchmove`, `touchend`, `touchcancel`及相关属性。文章列举了处理触摸事件的方法,包括单点触摸、多点触摸、滑动、长按、捏合缩放、旋转检测和事件代理。建议使用第三方库如Hammer.js简化手势处理,并分享了最佳实践,如避免意外触摸、提供视觉反馈、考虑性能和跨设备测试。理解并有效利用这些技术能提升用户交互体验。
256 7
|
7月前
|
缓存 前端开发 JavaScript
【专栏:HTML与CSS移动端开发篇】移动端网页性能优化策略
【4月更文挑战第30天】本文探讨了移动端网页性能优化的重要性,并提出了优化策略。HTML方面,建议精简结构、使用语义化标签、异步加载脚本和压缩文件;CSS优化包括精简样式、使用CSS3动画、媒体查询和压缩文件。其他策略涉及图片和字体压缩、缓存利用、数据压缩、减少HTTP请求及根据网络状态调整加载。综合运用这些策略能提升网页性能和用户体验。
103 6
下一篇
DataWorks