移动端适配

本文详细介绍了rem单位、媒体查询以及less在响应式布局中的应用。通过媒体查询划分屏幕档位,设置不同档位下的html字体大小,结合rem单位实现元素的等比缩放。同时,利用less简化CSS代码,通过变量、嵌套和运算提高编写效率。此外,还探讨了flexible.js库如何动态调整rem,实现更为平滑的适配效果。两种解决方案各有特点,媒体查询+less适用于阶梯式变化,而flexible.js则提供连续变化的适配体验。


一、媒体查询

感受到屏幕的变化;可以根据屏幕不同的宽,从而获得不同的样式,然后实现不同的样式显示;

  • 1.CSS3 新语法,是一个查询屏幕的过程,通过查询当前屏幕尺寸属于哪个范围,从而有哪个范围的样式生效;
  • 2.感受屏幕变化,屏幕变化就是宽度的变化,通过预设置,当屏幕到了我已经预设置的变化的范围,就会把我提前设置 好的样式进行生效;

1.1 语法

CSS样式:

/*
mediatype 查询类型: 
----------------- 
all 所有设备 
print 用于打印机和打印预览 
screen 用于电脑屏幕,平板电脑,智能手机等。 
条件: 
---- 
and 并且 not 不满足 only 仅仅满足 
media feature 查询条件: 
---------------------- 
width,min-with,max-width */
@media mediatype and|not|only (media feature) { 
	CSS-Code; 
}

引用资源:(了解)

<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="mystylesheet.css">

举例:

适配需求:

档位1:w<320 px w <= 319 px;

档位2: w>=320px and w< 640px;

档位3: w>=640px

举例:

适配需求: 

档位1:w<320 px w <= 319 px; 

档位2: w>=320px and w< 640px; 

档位3: w>=640px

二、rem

2.1 原理:

  • rem是一个相对单位,类似于em,
  • 不同的是rem的基准是相对于html元素的字体大小,em是父元素字体大小。

2.2 作用:

  • 让一些不能等比自适应的元素,达到当设备尺寸发生改变的时候,等比例适配当前设备。

2.3 方案:

  • 使用媒体查询根据不同设备按比例设置html的字体大小,然后页面元素使用rem做尺寸单位,当html字体大 小变化元素尺寸也会发生变化,从而达到等比缩放的适配。

2.4 用法:

  • rem单位,可以控制整个页面所有元素有关PX类;(宽、高、padding、margin、top…)只要是你设置数值 的地方都可以实现控制;
  • root: 1rem代表HTML的font-size大小;

2.5 语法:

/* 1.根html 为 10px */ 
html { 
	font-size: 10px; 
}
 
/* 2.此时 div 的宽就是 150px */ 
div {
	width: 15rem; 
}

举例:举例展示缩放效果

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        /* rem语法 在哪里设置 设置什么 */
        /* rem是个单位  现在 1rem就是10px  */
        html {
            font-size: 10px;
        }
 
        div {
            width: 15rem;
            height: 15rem;
            background: #000;
        }
    </style>
</head>
 
<body>
    <div></div>
</body>
 
</html>

三、rem应用

rem布局的核心:rem+媒体查询;

媒体查询:把屏幕划分不同档位,等待变化;

  • 布局所有单位用rem,当 HTML字体大小发生改变,使用rem单位元素都会发生改变;
  • rem+媒体查询加在一起:划分屏幕,等待变化;变化谁?变化唯一控制 rem(HTML字体大小)
@media screen and (min-width: 320px) { 
	html { 
		font-size: 20px; 
	} 
}
@media screen and (min-width: 640px) { 
	html { 
		font-size: 40px; 
	} 
}
div { 
	width:1rem; 
	height:1rem; 
}

举例:实现不同尺寸,元素的缩放效果

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        @media screen and (min-width: 320px) {
            html {
                font-size: 20px;
            }
        }
 
        @media screen and (min-width: 640px) {
            html {
                font-size: 40px;
            }
        }
 
        div {
            width: 1rem;
            height: 1rem;
            background: #000;
        }
    </style>
</head>
 
<body>
    <div></div>
</body>
 
</html>

rem布局核心总结:

  • 媒体查询:屏幕到达不同的范围下,HTML的font-size大小会有不同的取值;
  • 1rem 背后的代表的px值 = 当前档位 HTML 字体大小 所代表的大小
  • 那么使用rem单位的元素就会发生等比的变化;

四、实际应用

4.1 UI设计稿 :

尺寸不同,页面在不同的尺寸下要等比缩放

在这里插入图片描述
档位划分:min-width 最小界值;

约定:把UI各种设计稿,从小到大,当前我们档位划分开始点,起始点;


4.2 1rem背后代表的值 :

在这里,我们约定设置HTML的字体大小:按照每个档位的最小界值,都划分相同的份数,得到当前档位的 HTML的font-size大小;

// 我们此次定义的划分的份数 为 10 这个过程在计算 1个rem 在不同档位下是多大; 
@media screen and (min-width: 320px) { 
    html {
        font-size: 32px; 
    } 
}
@media screen and (min-width: 360px) { 
    html {
        font-size: 36px; 
    } 
}
@media screen and (min-width: 540px) { 
    html {
        font-size: 54px; 
    } 
}

4.3 具体如何做?

档位和根基设置按照约定设置好了;

UI给的图的已经拿到了,上面标注的是px单位;

目标:把px单位换算 成rem单位;

如何做:选择当前设计稿在档位下的rem背后代表的值进行计算;

  • 如果给你的540px宽度设计稿怎么换算rem,宽度=540px = 540/54 rem;

五、less应用

less : 让你写更少的代码,实现相同的效果;

less :是一门 CSS 扩展语言,它扩展了CSS的动态特性。 CSS 预处理言语。

常见的CSS预处理器:Sass、Less、Stylus 。

Less中文网址:http://lesscss.cn/

5.1 安装

vscode插件安装:

  • 搜索 Easy LESS
  • 安装完毕插件,重新加载下 vscode。
  • 测试:保存一下 .less 文件,会自动生成 .css 文件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.2 变量

变量是指没有固定的值,可以改变的。

我们CSS中的一些颜色和数值等经常使用,可以设置为变量;

语法:

//@变量名:; 
@bg:#333; 
.box_1 { 
	background-color: @bg; 
}
.box_2 { 
	background-color: @bg; 
}

命名规则:

  • 必须有@为前缀
  • 不能包含特殊字符~=+、不能以数字开头
  • 大小写敏感区分; .

5.3 嵌套

类似HTML一样写less结构;

语法:

/* css 写法 */ 
#header .logo { 
    width: 300px; 
}
/* less 写法 */ 
#header { 
    .logo { 
        width: 300px; 
    } 
}

交集|伪类|伪元素选择器,语法

/* css写法 */ 
a:hover{ 
    color:red; 
}
/* less写法 */ 
a{
    &:hover{ 
        color:red; 
    } 
}

5.4 运算

任何数字、颜色或者变量都可以参与运算。

Less提供了加(+)、减(-)、乘(*)、除(/)算术运算。

语法:

// 数字 
width: 200px - 50; 
// 颜色 
background-color: #666 - #222; 
// 注意:运算符中间左右有个空格隔开 1px * 5

单位选择:

  • 如果两个值之间只有一个值有单位,则运算结果就取该单位
  • 对于两个不同的单位的值之间的运算,运算结果的值取第一个值的单位

六、解决方案

6.1 方案1 :rem+媒体查询+less 方案

750px 操作过程:

第一步:

  • 原稿实现:先拿到设计稿:750px ; 页面上所有的元素,在750px设计稿上进行测量,代码实现;

第二步:

  • 准备各个档位下的rem :提前准备好各个档位下的HTML 的font-size大小;
    拿到当前尺寸的rem:因为我现在是750px的设计稿,所以可以得到750px这个尺寸属于的档位下的 HTML 的font-size大小,也就是750px设计稿下的1rem值。
    计算比例:把页面刚才所有的元素的PX值替换为 rem
    达到目标:那么,屏变化时,1rem(基础块)也会变化,自然就是等比缩放;

6.2 方案2(推荐!!!) :rem+flexible.js+less

和上个方案实现原理一样,都是通过改变1rem(基础块)大小实现页面整体元素改变;

6.2.1 flexible.js 简介:

手机淘宝团队出的 简洁高效 移动端适配库;和flex布局没有任何关系

github地址:https://github.com/amfe/lib-flexible

不是通过设置CSS媒体查询设置font-size,通过 JS 设置font-size,效果是屏幕变化一点,就有一个rem重新计算;

6.2.2 1rem背后代表的值
  • 划分10份;
  • 设置在HTML标签上;
function setRem () { 
// docEl.clientWidth JS获取当前屏幕的宽度 
// 除以10,得到基础块 
    var rem = docEl.clientWidth / 10; 
    docEl.style.fontSize = rem + 'px' 
}
6.2.3 步骤!!!

假如设计稿430px

拿到UI设计稿,原稿实现;页面上所有的元素,在设计稿上进行测量,代码实现;(流式、flex)只要是UI给图上有标注,就是写出来;先全部实现出来,一会统一替换;

  • 在哪里写?less文件
  • 需要把生成的css文件进行引入index.html;
    设计稿宽度/10 :1rem=43px;

统一替换:100px=100/43rem;

6.2.4 举例

06.less

div {
    width: 100/43rem;
    height: 100/43rem;
    background: #000;
}

flexible.js

(function flexible(window, document) {
  var docEl = document.documentElement
  var dpr = window.devicePixelRatio || 1
 
  // adjust body font size
  function setBodyFontSize() {
    if (document.body) {
      document.body.style.fontSize = (12 * dpr) + 'px'
    } else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize)
    }
  }
  setBodyFontSize();
 
 
  // 750 100px 100rem / 75 
  // set 1rem = viewWidth / 10
  function setRemUnit() {
    var rem = docEl.clientWidth / 10
    docEl.style.fontSize = rem + 'px'
  }
 
  setRemUnit()
 
  // reset rem unit on page resize
  window.addEventListener('resize', setRemUnit)
  window.addEventListener('pageshow', function(e) {
    if (e.persisted) {
      setRemUnit()
    }
  })
 
  // detect 0.5px supports
  if (dpr >= 2) {
    var fakeBody = document.createElement('body')
    var testElement = document.createElement('div')
    testElement.style.border = '.5px solid transparent'
    fakeBody.appendChild(testElement)
    docEl.appendChild(fakeBody)
    if (testElement.offsetHeight === 1) {
      docEl.classList.add('hairlines')
    }
    docEl.removeChild(fakeBody)
  }
}(window, document))

demo.html

<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./flexible.js"></script>
    <link rel="stylesheet" href="./06.css">
</head>
 
<body>
    <div></div>
</body>
 
</html>

6.3 两种方案对比

相同:

  • 都是对font-size实现控制,1rem(基础块)变化,实现等比效果;

不同:

  • rem+媒体查询+less:通过设置不同的档位下,设置不同的1rem值;效果为阶梯式变化;
  • flexible.js+rem:通过js设置不同的1rem值,效果为连续变化;这个看起来更为连贯,适配任何屏幕。
<think> 首先,用户的问题是:“我想了解移动端适配的原理 请问移动端适配的原理”。系统指令要求我使用中文回答,结构清晰,逐步解决问题,并保证回答真实可靠。 我需要参考提供的引用内容。这些引用是关于移动端适配原理的: - [^1] 讨论了移动端适配的原因和一些概念。 - [^2] 解释了rem布局原理,涉及rem单位基于html的font-size。 - [^3] 强调适配的目的是让设计稿在不同设备上表现一致。 - [^4] 提到物理像素、逻辑像素,以及网易和淘宝的方案。 - [^5] 讨论了使用media query或data-dpr来处理字号大小。 用户的问题焦点是“移动端适配的原理”,所以我需要整理这些原理的核心点。 关键原理点: 1. **适配的必要性**:不同设备有不同屏幕尺寸、分辨率和像素密度(DPI),需要确保网页在各种设备上显示一致。 2. **viewport设置**:在HTML的meta标签中设置viewport来控制页面的缩放和尺寸,如:`<meta name="viewport" content="width=device-width, initial-scale=1.0">`。这使得页面宽度等于设备宽度。 3. **单位系统**:使用相对单位来实现适配- **rem单位**:rem基于根元素(html)的font-size。开发者设置html的font-size为设备宽度的某个比例,然后所有尺寸用rem表示。这样当设备宽度变化时,元素尺寸自动缩放。 - 例如,设计稿宽度750px,设置html font-size为750/10 = 75px(假设10rem为设计稿宽度)。那么一个100px宽的元素在CSS中写为100/75 ≈ 1.333rem。 - **vw/vh单位**:视口宽度/高度单位。1vw = 1%视口宽度。可以直接使用vw来定义尺寸,避免依赖rem。 4. **像素密度处理**:物理像素和逻辑像素(CSS像素)的区别。高DPI设备有更多物理像素,但CSS像素基于逻辑像素。有时需要处理不同DPI,如使用data-dpr属性来调整文本大小。 5. **常见方案**: - **网易方案**:基于rem,动态计算html的font-size。 - **淘宝方案(Flexible)**:类似,但更完整,处理了高清屏和dpr。 6. **实现方式**: - 使用JavaScript在页面加载时动态设置html的font-size,基于设备宽度。 - 或者使用CSS媒体查询(media queries)来根据不同宽度设置样式。 回答结构应该清晰: 1. **介绍适配的必要性**:解释为什么需要移动端适配。 2. **核心原理**:详细说明viewport、相对单位(尤其是rem)、和动态计算。 3. **常见实现方案**:简述网易和淘宝的方法。 4. **总结原理**:强调基于相对单位和动态计算。 系统指令还要求生成相关问题,所以我需要在回答末尾添加相关问题。 此外,回答中引用的段落末尾自然地添加引用标识,如[^1]、[^2]等。所以我需要正确引用这些来源。 最后,系统指令要求使用$...$和$$...$$格式处理数学表达式,但这里可能没有复杂的数学,主要是单位解释。 现在,构建回答: - 开头:重申问题,说明适配原理。 - 主体:分步骤解释原理。 - 结尾:总结,并添加相关问题。 生成相关问题: 1. rem单位和em单位有什么区别? 2. 如何实现动态rem适配? 3. 移动端适配中如何处理高清屏(Retina屏幕)? 4. viewport设置的具体作用是什么? 确保回答真实可靠:基于提供的引用内容。 </think> ### 移动端适配的原理 移动端适配的核心原理是确保网页在不同设备(如手机、平板)上具有一致的视觉表现和用户体验。由于不同设备的屏幕尺寸、分辨率和像素密度(DPI)差异巨大,适配的目标是将设计稿(通常是固定宽度,如750px)灵活地映射到各种屏幕上。这主要通过相对单位、动态计算和视口控制实现。下面我将逐步解释关键原理,以确保回答清晰可靠。 #### 1. **适配的必要性:设备多样性与像素密度** - 不同设备(如iPhone 12与Android手机)的物理像素(硬件像素点)和逻辑像素(CSS像素)不一致。例如,一个750px的设计稿在高DPI设备(如Retina屏幕)上可能被渲染为更多物理像素,导致元素过小或过大。 - **物理像素与逻辑像素**:物理像素是设备的实际像素点,逻辑像素是CSS使用的像素单位。高DPI设备(dpr > 1)会将一个逻辑像素映射到多个物理像素上。适配的目的是让设计稿在任何设备上都保持比例一致[^3][^4]。 - 适配确保文本、图像和布局都能自适应缩放,避免出现滚动或溢出问题。 #### 2. **核心原理:相对单位与动态计算** 移动端适配的核心是使用相对单位而非固定单位(如px),并通过动态计算实现缩放。主要方法包括: - **viewport设置**:在HTML的`<head>`中添加meta标签控制视口: ```html <meta name="viewport" content="width=device-width, initial-scale=1.0"> ``` - `width=device-width`:强制页面宽度等于设备逻辑宽度(如iPhone的逻辑宽度为375px)。 - `initial-scale=1.0`:禁止用户缩放,确保初始缩放比例为1:1。这解决了设备宽度不一致的问题[^4][^3]。 - **rem单位布局原理**: - rem(root em)基于根元素(html)的font-size。所有尺寸(如width、height)使用rem单位,这样当html的font-size变化时,元素尺寸自动缩放。 - **动态计算font-size**:通过JavaScript在页面加载时设置html的font-size为设备宽度的比例。例如: - 设计稿宽度750px,设置html font-size = 设备宽度 / (750 / 基准值)。基准值常设为10(便于计算)。 - 公式:$$ \text{html font-size} = \frac{\text{deviceWidth}}{\text{设计稿宽度} \times \text{基准值比例}} \times \text{基准值} $$ - 假设设备宽度375px(标准iPhone),设计稿750px,设定1rem = 100px(基准值),则html font-size = 375 / 7.5 = 50px。元素在设计稿中100px宽时,CSS写为$1rem$(因为100px / 100 = 1rem)。在375px设备上,实际渲染为50px * 1rem = 50px,保持比例一致[^2][^4]。 - 示例:设计稿元素高度100px,在750px设备下,1rem = 750/10 = 75px,元素高度为$100 / 75 \approx 1.333rem$。在375px设备下,1rem = 375/10 = 37.5px,元素高度为$1.333 \times 37.5 \approx 50px$,比例不变[^2]。 - **vw/vh单位**:视口宽高单位(1vw = 1%视口宽度),可直接用于CSS。例如,设计稿元素100px宽,视口宽度750px时,元素设为$100 / 750 \times 100vw \approx 13.333vw$。这避免了JavaScript动态计算,但兼容性略差于rem[^2]。 #### 3. **处理像素密度和文本大小** - 高DPI设备(dpr > 1)需要额外处理文本和图像清晰度: - **data-dpr属性**:如淘宝方案,在html标签添加data-dpr属性(如`<html data-dpr="2">`),然后通过CSS媒体查询调整文本大小: ```css .text { font-size: 12px; } [data-dpr="2"] .text { font-size: 24px; } /* dpr=2时放大文本 */ ``` 这确保文本在高清屏上不模糊[^5]。 - **图像适配**:使用SVG图标或`srcset`属性为不同dpr提供多倍图,优化显示效果。 #### 4. **常见实现方案** - **网易方案**:基于rem,通过JavaScript计算html font-size。计算公式:$$ \text{font-size} = \frac{\text{deviceWidth}}{7.5} $$(适合750px设计稿)。优点是简单高效[^4]。 - **淘宝方案(Flexible)**:结合rem和viewport缩放,动态设置dpr和font-size。处理高DPI更全面,适合复杂场景。例如,设置viewport的scale=1/dpr,避免缩放失真[^4][^5]。 - **媒体查询(Media Queries)**:CSS方案,根据不同屏幕宽度设置font-size。例如: ```css @media (min-width: 375px) { html { font-size: 37.5px; } } /* iPhone适配 */ ``` 但不如JavaScript灵活,适合简单页面[^5]。 #### 总结 移动端适配的原理本质是通过相对单位(rem/vw)和动态计算(JavaScript或CSS),将设计稿的固定尺寸映射到不同设备逻辑宽度上,同时处理像素密度以实现一致性。viewport控制基础缩放,rem/vw实现弹性布局,data-dpr优化高清显示。这是一种成本低、效果好的方案,确保用户体验统一[^1][^3][^4]。 相关问题: 1. rem单位和em单位在移动端适配中有什么区别? 2. 如何用JavaScript实现动态rem适配? 3. 移动端适配中如何处理Retina屏幕的高清显示问题? 4. viewport的initial-scale属性具体如何影响页面缩放?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值