一、媒体查询
1.概念
- 媒体查询Media Queries,可以根据不同的设备为其实现不同的样式。@media可以根据不同的屏幕尺寸设置不同的样式,页面布局分别适应移动端,pc端等,在调整浏览器大小页面会根据媒体的宽度和高度来重新布置样式。媒体查询可以用于检测很多东西:自动检测视口(viewpoint)的宽度和高度;设备的宽度和高度;旋转方向(智能设备的横竖屏);分辨率大小。
- 语法
@media(条件){区域{样式}}
<!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>Document</title>
<style>
/* 使用媒体查询, 根据不同的视口宽度, 设置不同的根字号 */
/* 宽度300px的时候 给html设置30px的字体大小 */
@media (width: 300px) {
html {
font-size: 30px;
}
body {
background-color: #0a0;
}
}
/* 宽度400px的时候 给html设置40px的字体大小 */
@media (width: 400px) {
html {
font-size: 40px;
}
body {
background-color: #ff0;
}
}
</style>
</head>
<body>
</body>
</html>
二、移动端适配
1.单位
- 绝对单位 100px 360deg 60s 1000ms等固定单位
- 相对单位
- em 参考当前容器的文字大小
- rem 参考根据html标签的文字大小
- % 百分比大小
- vw 参考视口宽度进行计算
- vh 参考视口高度进行计算
2.rem适配
1.媒体查询的适配
- 利用媒体查询针对各个屏幕尺寸去设置一个不同的根字体标签大小。由于我们开发者书写的是一个固定的rem值,根据rem要乘以跟标签字体大小去计算的原理,即可实现适配
- 缺点:屏幕尺寸非常多 书写起来过于繁琐
2.手淘团队封装的flexible.js框架配合px to rem插件快速实现适配
- 1.下载flexible.js文件 地址:github.com/pjehan/Flex…
- 2.引入方式
<script src="./flexible.js"></script> - 3.原理:利用js的方式给每一个屏幕尺寸都设置一个根标签的字体大小(当前屏幕宽度的尺寸/10)
3.如何计算rem值
- 1.公式:?rem=测量出的宽度数值/ui设计师给的设计稿对应的根标签字体大小
- 2.注意:移动端使用的是二倍图 如果ui设计师给的是一张750的设计稿 所以设计稿尺寸应该除以2 真实尺寸应该是375,根标签字体大小应该是37.5
- 3.VsCode推荐插件 px to rem 设定好宽度一键转换rem值(力推)
4.px to rem使用方法
1.VsCode插件商店搜索px to rem 点击安装(有很多个建议使用推荐的插件 如下图)
2.安装完毕后,点击齿轮图标进行默认宽度设置自定义更改不是固定值(看具体需求)
3.由于插件无法直接设置小数,可以打开右下角设置,搜索找到setting.json文件 进行调整
3.vw、vh适配
- 1.概念
- 相对视口的尺寸进行计算结果
- vw (viewport width)根据视口宽度进行计算结果 1vw=1/100视口宽度
- vh (viewport height)根据视口高度进行计算结果 1vh=1/100视口高度
- 2.适配原理
- 1.vw: 确定设计稿对应的vw尺寸(1/100的视口宽度)
- 查看设计稿宽度-->确定参考设备宽度(视口宽度)-->确定vw尺寸(1/100视口宽度)
- vw单位的尺寸=px/(1/100视口宽度)
- 2.vh: 确定设计稿对应的vh尺寸(1/100的视口宽度)
- 查看设计稿高度-->确定参考设备高度(视口高度)-->确定vh尺寸(1/100视口高度)
- vh单位的尺寸=px/(1/100视口高度)
- 3.注意:在世纪开发中,vw和vh不会混用, 在实现不同宽度设备中,网页元素尺寸会等比例缩放,vh是1/100视口高度,全面屏视口高度大,如果昏庸可能导致变形。
rem适配
- 1.vw: 确定设计稿对应的vw尺寸(1/100的视口宽度)
<!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>
* {
margin: 0;
padding: 0;
}
/* 1. 不同的视口, HTML标签字号不同, 字号是视口宽度的1/10 */
@media (width:320px) {
html {
font-size: 32px;
}
}
@media (width:375px) {
html {
font-size: 37.5px;
}
}
@media (width:414px) {
html {
font-size: 41.4px;
}
}
/* 2. 书写盒子尺寸, 单位rem */
.box {
width: 5rem;
height: 3rem;
background-color: pink;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
vw/vh Demo
<!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>体验vw和vh</title>
<style>
* {
margin: 0;
padding: 0;
}
/* 1. vw = 1/100视口宽度 */
/* 2. vh = 1/100视口高度 */
.box {
width: 100px;
height: 100px;
border: 10px solid #000;
}
.son {
width: 1vw;
height: 50vw;
background-color: #0a0;
}
</style>
</head>
<body>
<!-- 创建一个屏幕宽度一半的正方形 -->
<div class="box">
<div class="son"></div>
</div>
</body>
</html>