移动端WEB开发流式布局
1. 视口(屏幕区域)
定义:浏览器显示页面内容的屏幕区域,可分为布局视口、视觉视口和理想视口
-
布局视口(layout viewport):解决早期PC端在手机显示的问题,分辨率980px,需要手动缩放页面
-
视觉视口 (visual viewport):用户正在看到的网站的区域
-
理想视口(ideal viewport):自适应,网站在移动端最理想的浏览和阅读宽度设定,即布局视口的宽度与理想视口的宽度一致,需要手动添加meta视口标签通知浏览器操作
1.1 meta视口标签
content属性:
属性 | 解释说明 | 标准值 |
---|---|---|
width | 设置viewport宽度,特设定device-width特殊属性值(自适应理想视口) | device-width |
initial-scale | 初始缩放比,大于0的数字 | 都为1.0 |
maximum-scale | 最大缩放比,大于0的数字 | 都为1.0 |
minimum-scale | 最小缩放比,大于0的数字 | 都为1.0 |
user-scalable | 用户是否可以缩放,yes/1或no/0 | no(0) |
1.2 标准viewport设置
-
视口宽度和设备保持一致
-
视口默认缩放比例1.0
-
不允许用户自行缩放
-
最大允许的缩放比例1.0
-
最小允许的缩放比例1.0
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0,minimum-scale=1.0, use-scalable=0">
2. 二倍图
2.1 物理像素比
-
物理像素/分辨率(pixel):物理真实存在的屏幕显示的最小颗粒,出厂商设定好,比如苹果6/7/8是750*1334。
-
物理像素比(设备像素比dpr):1px能显示的物理像素点个数;
同一方向上的物理像素/CSS像素(缩放比为1.0时)PC端页面1px=1物理像素,但移动端不同:width=375px的盒子在ipone8占满750px宽度,其开发尺寸1px=物理像素点2个
-
视网膜屏幕(Retina):一种显示技术,将更多的物理像素点压缩到一块屏幕里,从而达到更高的分辨率,增强细腻程度和显示效果
因为视网膜屏幕将原来的1个像素点增大x倍,原图在手机放大会导致模糊,则需要原图像素增加x倍,但大小不变,则在手机上显示时,就可以正常显示。
2.2 x倍图
先放大x倍,再缩放到原来的一半,即开发尺寸不变,分辨率增加,就相当于视网膜屏幕(手机尺寸不变,分辨率增加),显示效果不变
例如一张50×50的图片和一张100×100的图片(两张图要清晰图相同哈),将100×100的图片的长宽都设置为50px,这样的两张图,后者更清晰
3. 移动端技术解决方案
-
移动端浏览器
-
基本以webkit内核为主,只需考虑webkit兼容性问题,浏览器私有前缀只需要考虑添加webkit
-
放心使用H5标签和CSS3样式
-
-
CSS初始化(normalize.css):保护有价值的默认值、修复浏览器bug、模块化、有详细文档可查阅,https://github.com/necolas/normalize.css
3.2 特殊样式
-
CSS3盒子模型(box-sizing):-webkit-box-sizing:border-box;
-
去除移动端链接点击背景高亮:-webkit-tap-highlight-color:transparent;
-
去除浏览器默认外观样式(才能后续给button和input自定义样式):-webkit-appearance:none;
-
禁用长按页面时的弹出菜单:
img,a { -webkit-touch-callout:none; }
4. 移动端常见布局
4.1 流式布局(百分比布局)
-
通过盒子的宽度设置成百分比来根据屏幕的宽度进行伸缩,不受固定像素的限制,内容向两侧填充
-
min-width:280px:最小宽度为280px,小于则不缩放。 -
max-width:1280px:最大宽度为1280px,大于则不缩放。
4.2 flex布局
详情可见::https://www.cnblogs.com/mtdj/p/16256154.html ->伸缩布局
4.3 rem适配布局
适用条件(媒体查询+rem实现元素动态大小变化):
-
页面文字大小随屏幕大小变化而变化
-
流式布局和flex布局主要针对宽度布局,rem可设置高度
-
实现屏幕变化时,元素高度和宽度等比例变化
4.3.1 rem基础
-
rem单位(root em):相对单位,类似于em,em相对父元素字体大小;但rem的基准是相对于html元素的字体大小。
-
例子:根元素(html)设置font-size=12px;非根元素width:2rem;则换算为24px
-
rem优点:可以通过修改唯一的html元素的文字大小,调整使用rem的元素大小,实现整体控制
4.3.2 媒体查询
媒体查询(Media Query)是CSS3新语法,目的是通过查询是否满足媒体条件,进而设置样式。为了防止混乱,媒体查询一般按照从小到大的顺序来写,这样代码更简洁(CSS的层叠性)
-
使用@media查询,可以针对不同的媒体类型定义不同的样式
-
@media可以针对不同屏幕尺寸设置不同的样式
-
重置浏览器大小过程中,页面会个根据其宽度和高度重新渲染页面
-
目前针对很多苹果手机、Android手机,平板设备等都用得到媒体查询
样式:
@media mediatype and|not|only (media feature) { CSS-code; }
-
查询类型 mediatype
将不同终端设备划分为不同的类型,称为媒体类型
值 说明 all 用于所有设备 print 用于打印机和打印预览 screen 用于电脑屏幕、平板电脑、智能手机等 -
关键字 and|not|only
关键字将media type或多个media feature连接到一起作为媒体查询的条件
值 说明 and 将多个媒体特性连接到一起 not 排除某个媒体类型,可省略 only 指定媒体类型,可省略 -
媒体特性 (media feature)
每种媒体类型都具体各自不同的特性,根据不同媒体类型的媒体特性设置不同的展示风格,暂时了解3个,注意要加小括号
值 解释说明 width 定义输出设备页面可见区域的宽度 min-width 定义输出设备中页面最小可见区域宽度(包含等于)大于等于值 max-width 定义输出设备中页面最大可见区域宽度(包含等于)小于等于值
例:当屏幕尺寸不超过800px时,设置body背景色为pink
@media screen and (max-width:800px) { body { background-color: pink; } }
引入资源(理解)
当样式比较繁多时,可以针对不同媒体使用不同的css样式表。原理就是在link中判断设备尺寸,然后引入不同的css文件
<link rel=“stylesheet” href=“style320.css” media=“screen and (min-width:320px)”>
5. less
一门CSS预处理语言,扩展CSS的动态特性
-
Less(Leaner Style Sheets):一门CSS扩展语言,也称为CSS预处理器。作为CSS的一种形式的扩展,并没有减少CSS功能,而是在现有CSS语法上,为CSS加入程序式语言特性。
-
在CSS语法基础上,引入变量、Minxin(混入)、预算、函数等功能,大大简化CSS编写,并降低维护成本,Less更少代码做更多事
-
Less中文网址:http://lesscss.cn/
-
常见CSS预处理器:Sass、Less、Stylus
5.1 Less变量
@变量名:值; @color:pink //定义一个粉色的变量 //引用变量 body{ background-color: @color; }
-
变量名不能包含特殊字符、不能数字开头、大小写敏感
-
使用场景:主题色,比如通用颜色、样式、字体大小方案
5.2 Less嵌套
-
子元素的样式直接写到父元素里即可
<div class="header"> <a href="">文字</a> </div> less:
.header { width: 200px; height: 200px; background-color: pink; a { color: red; } } -
针对交集|伪类|伪元素选择器,
-
若内层选择器前没有&,则被解析为父选择器的后代;
-
有&解析为父元素自身或父元素的伪类
a { color: red; &:hover { color: antiquewhite; } } -
5.3 Less运算
任何数字、颜色或者变量都可以参与运算,Less提供+ - * / 算术运算,运算结果更新到css文件中
@border: 5px + 50; //可直接进行运算 div { width: 200px + 50; height: 200px * 2; border: @border solid pink; }
注意:
- 运算符左右空格隔开 1px + 5,
- 但对于2个不同单位值运算结果取第一个值的单位
- 只有一个单位则取该单位
6. rem实际开发适配方案
6.1 技术方案1
-
一般情况下,设计1-2套效果图适应大部分屏幕,现基本以750px为主
-
选一套标准尺寸以750px为主
-
用屏幕尺寸 /划分份数(一般是15、10、20份数)= html文字大小,所以不同屏幕得到不同字体大小
-
页面元素rem值 = 页面元素本身px / html字体大小
6.2 技术方案2
简洁高效的rem适配方案flexible.js
-
定义:终端设备适配的解决方案,可以在不同的终端设备实现页面适配,
是一个适配移动端的javascript框架。根据设备尺寸不同,设置html字体大小,使用rem作为样式单位 -
原理:将当前设备划分为10等份,只需要确定当前设备的html文字大小即可,让flexible.js页面元素计算rem值,
当屏幕尺寸大于750px时,使用媒体查询将html的文字大小固定为 75px!important(提高权重)
步 骤:
-
我们再不需要在写不同屏幕的媒体查询,因为里面 js 做了处理
-
它的原理是把当前设备划分为 10 等份,但是不同设备下,比例还是一致的
-
我们要做的,就是确定好我们当前设备的 html 文字大小就可以了,
比如当前设计稿是 750px,那么我们只需要把 html 文字大小设置为 75px(750 / 10)就可以 -
里面页面元素 rem 值:页面元素的 px 值 / 75
-
剩余的,让 flexible.js 来去算
可以参考别人的笔记:https://blog.csdn.net/weixin_42214698/article/details/122573541
响应式布局
-
使用媒体查询针对不同宽度的设备进行布局和样式设置,从而达到适配不同设备的目的(PC、移动端、pad端)
-
响应式需要一个父级作为布局容器(container),来配合子级元素来实现变化效果。
平时我们的响应式尺寸划分:
-
超小屏幕(手机,小于768px):设置宽度为100%
-
小屏幕(平板,大于等于768px):设置宽度为750px
-
中等屏幕(桌面显示器,大于等于992px):宽度设置为970px
-
大屏幕(大桌面显示器,大于等于1200px):宽度设置为1170px
例:响应式导航栏
当屏幕宽度小于787px时,导航栏中的li从全在一行变为一行三个
<style> * { margin: 0; padding: 0; } ul { list-style: none; } .container { width: 750px; margin: 0 auto; } .container li { float: left; width: 93.75px; height: 30px; line-height: 30px; background-color: green; } /* 媒体查询 */ @media screen and (max-width:767px) { .container { width: 100%; } .container li { width: 33.33%; } } </style> <div class="container"> <ul> <li>导航栏</li> <li>导航栏</li> <li>导航栏</li> <li>导航栏</li> <li>导航栏</li> <li>导航栏</li> <li>导航栏</li> <li>导航栏</li> </ul> </div>
Bootstrap
基于html、css、JavaScript,简洁灵活,使得web开发更加快捷,由于控制权在框架本身,使用者要按照框架规范的某种规范进行开发
使用步骤:
-
创建文件夹结构
-
创建html骨架结构
<!-- 要求当前网页使用IE浏览器最高版本的内核来渲染 --> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <!-- [if It IE 9] --> <!-- 解决IE9一下浏览器对html5新增标签的不识别。并导致CSS不起作用的问题 --> <!-- <script src="http://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> --> <!-- 解决IE9一下浏览器对CSS3媒体查询的不识别 --> <!-- <script src="http://oaa.maxcdn.com/respond/1.4.2/respond.min.js"></script> --> <!-- [endif] -->
- 引入相关样式文件
Bootstrap内部已经引入了 normalize.css
<!-- 引入bootstrap核心样式文件 --> <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
- 书写内容
注:
-
直接拿bootstrap预先定义好的样式使用
-
修改bootstrap原来的样式,注意权重问题
-
学好bootstrap的关键在于知道它定义了哪些样式,以及这些样式能实现什么效果
布局容器:
-
Bootstrap需要为页面内容和栅格系统包裹一个.container容器,Bootstrap预先定义好了这个类,叫.container。它提供了两个作此用处的类。
-
注意:Bootstrap使用有个要求,必须要先创建一个.container的容器,然后将内容放在里面。
1. container类:
响应式布局的容器,固定宽度
-
大屏(>=1200px)宽度定为1170px
-
中屏(>=992px)宽度定为970px
-
小屏(>=768px)宽度定为750px
-
超小屏(100%)
2. container-fluid类
-
流式布局容器,百分百宽度
-
占据全部视口(viewport)的容器
-
适合于单独做移动端开发
栅格系统
-
Bootstrap提供了一套响应式、移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列。
-
Bootstrap里面container宽度是固定的,但是不同屏幕下,container的宽度不同,我们再把container划分为12等份。
-
注意:rem是根据屏幕大小来划分的,而栅格系统是根据container里面的内容进行划分的。
栅格选项参数:
-
行(row)必须放到container布局容器里面
-
我们实现列的平均划分,需要给列添加类前缀
-
xs-extra small:超小;sm-small:小;md-medium:中等;lg-large:大;
-
列(column)大于12,多余的”列(column)“所在的元素将被作为一个整体另起一行排列
-
每一列默认有左右15px的padding
-
可以同时为一列指定多个设备的类名,以便划分不同份数,例如”class="col-md-4 col-sm-6"
<!-- 如果子元素的份数相加等于12,则子元素刚好能占满整个container的宽度 --> <div class="row"> <div class="col-lg-3">1</div> <div class="col-lg-3">2</div> <div class="col-lg-3">3</div> <div class="col-lg-3">4</div> </div> <!-- 如果子元素的份数相加小于12,则子元素刚好能占不满container的宽度,则后面会有空白 --> <div class="row"> <div class="col-lg-6">1</div> <div class="col-lg-2">2</div> <div class="col-lg-2">3</div> <div class="col-lg-1">4</div> </div> <!-- 如果子元素的份数相加大于12,则多余的子元素会另起一行显示 --> <div class="row"> <div class="col-lg-6">1</div> <div class="col-lg-2">2</div> <div class="col-lg-2">3</div> <div class="col-lg-3">4</div> </div> <!-- 为每个子元素指定多个类名,在不同屏幕大小下所占的份数不同 --> <!-- 大屏幕一行四个,中等屏幕一行三个,小屏一行两个,超小一行一个 --> <div class="row"> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">1</div> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">2</div> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">3</div> <div class="col-lg-3 col-md-4 col-sm-6 col-xs-12">4</div> </div>
列嵌套
一个列内再分若干份小列
注意:列嵌套最好再加一个行row(必须叫这个名字),这样可以去除父元素默认的15px padding值,并使高度与父级一致
<!-- 列嵌套 --> <div class="col-sm-4"> <div class="row"> <div class="col-sm-6">小列</div> <div class="col-sm-6">小列</div> </div> </div>
列偏移:
-
使用
.offset-md-*
类可以将列向右侧偏移。 -
这些类实际是通过使用*选择器为当前元素增加了左侧的边距(margin),会根据不同的设备宽度自动计算出margin-left值。
<!-- 列偏移 --> <div class="row"> <div class="col-lg-4">1</div> <div class="col-lg-4 offset-md-4">2</div> </div>
列排序
通过使用.col-md-push-和.col-md-pull-类就可以很容易的改变列(column)的顺序。
<!-- 列排序 --> <div class="row"> <div class="col-lg-4 col-lg-push-8">左侧</div><!-- 推 --> <div class="col-lg-8 col-lg-pull-4">右侧</div><!-- 拉 --> </div>
响应式工具:
为了加快对移动设备友好的页面开发工作,利用媒体查询功能,并使用这些工具类可以方便的针对不同设备展示或隐藏页面内容。
类名 | 超小屏 | 小屏 | 中屏 | 大屏 |
---|---|---|---|---|
.hidden-xs | 隐藏 | 可见 | 可见 | 可见 |
.hidden-sm | 可见 | 隐藏 | 可见 | 可见 |
.hidden-md | 可见 | 可见 | 隐藏 | 可见 |
.hidden-lg | 可见 | 可见 | 可见 | 隐藏 |
与之相反的,是visible-xs
visible-sm
visible-md
visible-lg
是显示某个页面内容。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?