移动端适配详解 , 给你解决适配烦恼

news2025/7/12 11:38:44

试想一下,如果我们只能开发web端,那么移动端的网友由谁来做!那也太悲惨了

所以,这里说的就是如何开发页面到移动端,适配各个手机型号,让页面在手机上跑起来~ 

目录

理解些许概念

1. 开发的种类

2. 两个模糊的概念

3. 认识视口

布局视口 : 

视觉视口 : 

理想视口 : 

适配方案一:百分比设置 (不推荐)

适配方案二:rem + 动态html的font-size

问题一的解决方式:

1 - 媒体查询

2 - JS动态计算

3 - 使用lib-flexible库

问题二的解决方式: 

1 - 手动计算 :

2 - 使用scss的函数或者less的混入来计算

        less文件设置

3 - 使用postcss-pxtorem插件 

        01. 安装

        02. 在postcss.config.js中配置

        03. 这样在页面上我们还是直接写px即可,打包后后自动更改的 

4 - 使用VSCode插件 : px to rem 插件

        01. 下载

        02. 配置

        03. 使用

适配方案三:vw 

1 - 手动计算 :

2 - 使用scss的函数或者less的混入来计算

3 - 使用postcss-px-to-viewport插件

01. 下载

02. 在postcss.config.js中配置

03. 这样在页面上我们还是直接写px即可,打包后后自动更改的 

4 - 使用VSCode插件 : px to rem 插件

适配方案四:flex的弹性布局


理解些许概念

1. 开发的种类

移动端开发目前主要包括三类

  • 原生App开发 ( iOS Android RN uniapp Flutter 等 ) 
  • 小程序开发 ( 原生小程序 uniapp Taro 等 ) 
  • web页面 ( 移动端的web页面 ,可以使用浏览器或者webview浏览,可以内嵌进小程序、app )

2. 两个模糊的概念

自适应 : 根据不同的设备屏幕大小来自动调整尺寸、大小

响应式 : 会随着屏幕的实时变动而自动调整,是一种自适应 

3. 认识视口

概念 : 

  • 在浏览器中,可以看到的区域就是视口
  • fixed就是相对于视口来进行定位的
  • 在pc端的页面中,我们不需要对视口进行区分,因为布局视口和视觉视口是同一个

但是在移动端,不太一样,布局的视口和可见的视口是不太一样的,有三种情况

布局视口 : 

相对于980ox布局的这个视口,默认是980px

视觉视口 : 

默认情况下,按照980px来显示的内容,右侧就会有一大部分区域无法展示,所以手机端浏览器会默认对页面进行缩放用来显示到用户的可见区域

显示在可见区域的这个视口,就是视觉视口

 

理想视口 : 

 当布局视口 === 视觉视口的时候,就称之为理想视口

 那么怎么让他们俩相等呢,视觉视口不能更改(手机频幕怎么改~),但是布局视口可更改:

<!-- 
    这里设置的width就是布局视口的宽度 默认是980px。width=980px
    我们一般会改成device-width,让布局视口等于设备宽度
-->
<meta name="viewport" content="width=device-width">

 完美的配置,个人认为

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

适配方案有以下四种:

适配方案一:百分比设置 (不推荐)

  • 因为不同属性的百分比值,相对的可能是不同参照物,所以百分比往往很难统一
  • 在移动端适配中使用时很少的

适配方案二:rem + 动态html的font-size

rem的单位是相对于html元素的font-size来设置的,如果我们需要在不同的屏幕下有不同的尺寸,可以动态的修改html的font-size的值

这样就变成了我们要思考这两个问题

  • 问题一 : 针对不同的屏幕,设置html不同的font-size
  • 问题二 : 讲原来要设置的尺寸,转化成rem单位

问题一的解决方式:

1 - 媒体查询

通过媒体查询来设置不同尺寸范围内的屏幕html的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, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  <title>Document</title>
  <style>
    /* 利用css的层叠特性 */
    @media screen and (min-width: 320px) {
      html {
        font-size: 16px;
      }
    }
    @media screen and (min-width: 375px) {
      html {
        font-size: 18px;
      }
    }
    @media screen and (min-width: 414px) {
      html {
        font-size: 20px;
      }
    }
    @media screen and (min-width: 480px) {
      html {
        font-size: 22px;
      }
    }
    .box {
      width: 5rem;
      height: 5rem;
      background-color: skyblue;
    }
  </style>
</head>

<body>
  <div class="box"></div>
</body>

</html>

2 - JS动态计算

1. 根据html的宽度计算出font-size的大小,并设置到html上

2. 监听页面宽度的实时变化,重新设置font-size到html上

<!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, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  <title>Document</title>
  <style>
    .box {
      width: 5rem;
      height: 5rem;
      background-color: skyblue;
    }
  </style>
</head>

<body>
  <div class="box"></div>

  <script>
    // 拿到html元素
    const htmlDom = document.documentElement
    // 改变的函数
    function serRemFontSize() {
      // 拿到屏幕的宽度
      const htmlWidth = htmlDom.clientWidth
      // 计算fontsize的大小  
      const htmlFontSize = htmlWidth / 10
      // fontsize赋值到html上
      htmlDom.style.fontSize = htmlFontSize + 'px'
      console.log(htmlWidth);
    }
    // 第一次进来时主动调用一下
    serRemFontSize()
    // 实时监听屏幕尺寸改变的函数
    window.addEventListener('resize', serRemFontSize)
    // 监听页面跳转(前进或者后退),重新设置一下
    window.addEventListener('pageshow',function(e){
      if (e.persisted) {
        serRemFontSize()
      }
    })
  </script>
</body>

</html>

3 - 使用lib-flexible库

做的事情时一样的,直接引用即可 lib-flexible

一、
// 先安装
npm i -S amfe-flexible

// 在页面处引用
<script src="./node_modules/amfe-flexible/index.js"></script>


二、找到index.js 文件,打开复制代码下来也可

问题二的解决方式: 

加入设计图是375的,页面上一个元素的宽是100px,那么我们得转换成rem

1 - 手动计算 :

用计算器算。100px / html的font-size  =  100 / 37.5 = 2.66667 

width = 2.66667 rem

2 - 使用scss的函数或者less的混入来计算

        less文件设置

@textColor:#12345678;

.poToRem(@px){
  // 375 -> 37.5   根据设计稿来的  设计稿375px  那就 / 37.5
  result:1rem * (@px / 37.5)
}


// 使用less
.box{
  // 利用混入来设定
  width: .poToRem(100)[result];
  height: .poToRem(100)[result];
}

p{
  font-size: .poToRem(16)[result];
}

3 - 使用postcss-pxtorem插件 

webpack的这个工具,在打包时会自动换算,可以看看我的这个文章webpack 插件

        01. 安装

npm install postcss-pxtorem --save-dev

        02. 在postcss.config.js中配置

module.exports = {
  plugins: [
    require('postcss-preset-env'),
    // 使用这个插件
    require('postcss-pxtorem')({
      rootValue: 37.5, // 设计稿宽度的1/10
      propList: ['*'], // 需要做转化处理的属性,如`hight`、`width`、`margin`等,`*`表示全部
      exclude: /node_modules/i // 忽略的文件
    })
  ]
};

        03. 这样在页面上我们还是直接写px即可,打包后后自动更改的 

4 - 使用VSCode插件 : px to rem 插件

        01. 下载

        02. 配置

点击齿轮⚙️ ,选择扩展设置

        03. 使用

适配方案三:vw 

相对于屏幕视口大小,屏幕宽 = 100vw

<!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, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
  <title>Document</title>
  <style>
    /* 
      375 =>  1vw = 3.75px
    */
    .box {
      /* 100px 转换单位 */
      /* 100 / 3.75 = 26.667vw */
      width: 26.667vw;
      height: 26.667vw;
      background-color: skyblue;
    }
  </style>
</head>

<body>
  <div class="box"></div>

  </script>
</body>

</html>

注意 : vw 永远相对于视口大小,如果视口很大,那么页面的元素也会很大,没办法设置最大最小值

rem可以,rem可以通过媒体查询,设定最大宽度的font-size 

使用vw 就没有rem的问题一了  只有问题二!!!

1 - 手动计算 :

同上rem计算~

2 - 使用scss的函数或者less的混入来计算

同上rem计算~

3 - 使用postcss-px-to-viewport插件

01. 下载

npm install postcss-px-to-viewport -D

02. 在postcss.config.js中配置

module.exports = {
  plugins: [
    require('postcss-preset-env'),
    // 使用这个插件
    require('postcss-px-to-viewport')({
      unitToConvert: 'px', // 需要转换的单位,默认为"px"
      viewportWidth: 375, // 视窗的宽度,对应pc设计稿的宽度,一般是750
      // viewportHeight: 1080,// 视窗的高度,对应的是我们设计稿的高度
      unitPrecision: 5, // 单位转换后保留的精度
      propList: [
        // 能转化为vw的属性列表, * 代表所有
        '*'
      ],
      viewportUnit: 'vw', // 希望使用的视口单位
      fontViewportUnit: 'vw', // 字体使用的视口单位
      selectorBlackList: ['#abc','ignore','tabbar','tabbar-item'], // 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。cretae
      minPixelValue: 1, // 设置最小的转换数值,如果为1的话,只有大于1的值会被转换 小于或等于'1px'不转换为视窗单位
      mediaQuery: false, // 媒体查询里的单位是否需要转换单位
      replace: true, // 是否直接更换属性值,而不添加备用属性
      exclude: /(\/|\\)(node_modules)(\/|\\)/ // 忽略某些文件夹下的文件或特定文件,例如 'node_modules' 下的文件  exclude:[/DetailBottomBar/,/TabbarItem/]   //包含DetailBottomBar的文件不需要转化

      // landscape: true, // 是否添加根据landscapeWidth 生成的媒体查询条件
      // landscapeUnit: 'rem', // 横屏时使用的单位
      // landscapeWidth: 5120 // 横屏时使用的视窗宽度(横屏的尺寸为938px)

      /**
       * @keyframes 和 media 查询里的px默认时不转化的,设置mediaQuery : true  则媒体查询里的也会转换px
       * @keyframes 可以暂时手动填写vw单位的转化结果
       */
    })
  ]
};

03. 这样在页面上我们还是直接写px即可,打包后后自动更改的 

4 - 使用VSCode插件 : px to rem 插件

移动端适配主要是以上两种方法,第一种的百分比的用的比较少


适配方案四:flex的弹性布局

我想,大家都懂吧!嗯,肯定懂


 补充 :以下是一些概念,很抽象,虽然不懂也能开发,但是面试可能会考哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/405147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3新特性——Composition API详解

文章目录一、 Vue3快速入门1. Vue3 带来了什么2. Vue3工程的创建2.1 使用vue-cli创建2.2 使用vite创建2.2.1 是什么2.2.2 vite的优势2.2.3 使用步骤3. vue3项目结构的分析3.1 vue-cli 项目结构4. vue3中的开发者工具4.1 在线安装4.2 离线安装二、常用Composition API1. setup2.…

Vue3获取DOM、操作组件

文章目录&#x1f31f; 写在前面&#x1f31f; Vue2 ref 的使用&#x1f31f; Vue3获取DOM&#x1f31f; Vue3操作组件&#x1f31f; 写在最后&#x1f31f; 写在前面 专栏介绍&#xff1a; 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章&#xff0c;应粉丝要求开始更新 Vue…

若依框架前端Vue项目分析实战

说明 前面讲解了vue2的单点知识&#xff0c;下面用若依提供的vue项目&#xff0c;实战分析一下&#xff0c;拿到一个vue项目&#xff0c;如何进行分析并进行二次开发。 一、public/index.html与main.js和App.vue三者的关系 vue项目是单界面应用&#xff0c;所有的界面将在pu…

VSCode 入门操作大全 + 实用插件推荐【零基础专属详细教程】

&#x1f4c0; 前言&#xff1a; &#x1f3ab; 选择一个好的开发工具很重要&#xff0c;很多刚学编程的小伙伴在 webstorm 和 vscode 上很难抉择&#xff0c;我个人更喜欢使用 vscode&#xff0c;因为其有着简洁的操作风格和丰富的人性化的各种功能&#xff0c;这篇文章带给大…

2022年前端Vue常见面试题大全(三万长文)持续更新...

目录 1.Vue和React有什么不同&#xff1f;使用场景分别是什么&#xff1f; 2.axios是什么&#xff1f;怎么使用它&#xff0c;怎么解决跨域&#xff1f; 3.说说Vue&#xff0c;React&#xff0c;angularjs&#xff0c;jquery的区别 4.什么阶段&#xff08;生命周期&#xff…

2022最新版40个前端练手项目【附视频+源码】

不管学习哪门语言都希望能做出实际的东西来&#xff0c;这个实际的东西当然就是项目啦&#xff0c; 不用多 说&#xff0c;大家都知道学编程语言一定要做项目才行。 本次给到大家的是40个前端实战练手项目(附源码和视频讲解)&#xff0c;希望对大家有一定的帮助&#xff0c;激…

企微获取用户敏感数据

1、企微配置可信域名 2、企微获取成员userID 3、企微获取用户敏感数据 文章目录一、简介1、企微数据安全更新2、身份验证方式2.1 网页授权登录(企微内部)2.2 扫描授权登录(浏览器)二、企微应用配置1、企微配置可信域名2、企微授权登录3、企微可信IP三、网页授权登录方式(企微)1…

Vue2 大型项目升级 Vue3 详细经验总结

前言 前段时间&#xff0c;公司准备在现有的 Vue2 项目中做一个聊天系统&#xff0c;但考虑开发聊天系统的周期并不短&#xff0c;客户又急需。于是准备对接腾讯的 IM 组件&#xff0c;来实现。 不知道的这里贴个官网&#xff1a; IM TUIKit 官方文档 对于 TUIKit&#xff0…

【axios】axios的基本使用

axios是一个专注于网络请求的库。 不同于jquery&#xff0c;功能复杂&#xff0c;既可以操作dom&#xff0c;又可以做动画&#xff0c;还可以发ajax请求。axios是一个专注于网络请求的库。 一、基本使用 1.导入库文件 在js中导入axios的库文件后&#xff0c;会直接在全局挂载…

[vue 进阶] 关于dicts字典的用法

最近在学习若依系统的框架&#xff0c;其中发现一个很奇怪的事情&#xff0c;网上查询很多地方&#xff0c;也是一知半解。 网上搜索的结果如下&#xff0c;大家可以先看看&#xff1a; [vue 进阶] 关于dicts字典的用法_小钿钿不忘初心_的博客-CSDN博客前言在使用若依框架开发…

CSS3如何调整背景图片大小

系列文章目录 CSS3实现半透明边框&#xff08;1&#xff09; CSS3实现多重边框&#xff08;2&#xff09; CSS3如何改变背景图片大小系列文章目录一、background-size语法格式二、参数详解1.length2.percentage3.cover4.contain总结在CSS3中&#xff0c;如果想要调整背景图片的…

适合普通大学生的前端开发学习路线

大家好&#xff0c;我是帅地。 假如你没有明确的目标&#xff0c;或许可以按照我说的学习路线来学习一波&#xff0c;我写的每一份学习路线&#xff0c;不会很全面&#xff0c;因为我认为&#xff0c;东西列的太多&#xff0c;反而不利于新手的学习&#xff0c;所以我列举的&a…

Vue中的路由

目录 目录 一&#xff0c;路由理解 二&#xff0c;基本配置 第一步: 在main.js文件中引入并使用插件 第二步: 在src文件夹下创建一个router文件夹然后在文件夹下创建index.js ​编辑 第三步: 回到main.js中引入创建的 router 并在vue实例对象中使用 三&#xff0c;路由的…

vue使用富文本编辑器vue-quill-editor

问题描述&#xff1a; 我们在开发过程中经常会遇到使用富文本编辑器进行操作&#xff0c;当前插件市场上关于富文本的编辑器挺多的&#xff0c;我们就不一一个介绍了&#xff0c;现在我们主要讲解一些vue-quill-editor富文本编辑器的使用操作和注意事项。 效果图 具体操作使用…

是什么让学习 Web 开发在未来几年变得有价值?

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f30a; 本文首发…

React中ref的使用方法和使用场景(详解)

摘要 不管在Vue中还是React&#xff0c;如果我们想使用一个元素的DOM&#xff0c;不需要通过JS中操纵DOM的方法&#xff0c;它们提供了一个专属的API就是ref。 而Vue中的ref可能比较简单&#xff0c;这一篇主要讲一下如何在React中使用ref&#xff0c;以及使用ref的场景。 1…

如何创建vue3项目

目录 如何创建vue3项目 1、用vue cli创建 2、使用vite直接创建 3、使用vue3官方推荐创建方式 如何创建vue3项目 创建vue3我们常用的有三种方式&#xff1a; 1、用vue cli创建 1.使用vue cli环境前提条件&#xff1a; node -vv16.13.0 npm -v8.1.0 vue -Vvue/cli 4.5.15 …

微信小程序中使用vant组件库(超详细)

目录前言Vant Weapp的安装与使用1、安装 node.js2、通过 npm 安装3、修改 app.json4、修改 project.config.json5、构建 npm 包6、使用组件全局引入和局部引入全局引入局部引入Toast 组件的使用官方文档 API 详解Props 参数Events 事件Slot 插槽外部样式类前言 Vant是一个轻量…

vue中this.$router.push()路由传值和获取的两种常见方法

今天接到了比较大的需求&#xff0c;由于这个公司的接口调用方法和上一段实习那家公司的写法很不一样&#xff0c;我花了很多时间在摸索&#xff0c;“踏出第一步总是最困难的”&#xff0c;果然没错&#xff0c;第一个很费劲&#xff0c;但完成之后有了思路&#xff0c;下面的…

登录功能的实现(包括前后端)

目录:&#x1f349;&#x1f349;&#x1f349;UPDATE:✨✨✨前言✨✨✨概述✨✨✨技术栈✨✨✨效果图✨✨✨代码✨✨✨github链接&#x1f349;&#x1f349;&#x1f349;UPDATE: 突然发现喜提榜一&#xff0c;蟹蟹读者老爷们的支持(づ&#xffe3; 3&#xffe3;)づ 润色了…