课前
- 反馈
- 复习
- 作业点评
今日学习内容
-
rem、em单位
-
媒体查询
-
rem与媒体查询的结合(重点:如何划分档位、如何设置font-size值)
-
项目实战
- 优惠券
em与rem的区别
-
em:自己的font-size值
<div class="father"> <div class="child"></div> </div>.father { font-size: 20px; } .child { width: 2em; height: 2em; background-color: pink; } -
rem:html元素的font-size值
html { font-size: 100px; } .child { font-size: 30px; width: 2rem; height: 2rem; background-color: pink; }
之前做的页面还有什么问题?
- 文字的大小也要自适应
- 流式布局和flex布局解决的是宽度自适应,而高度很难解决。
如何实现?靠媒体查询
@media mediatype and|not|only (media feature){
css代码...
}
各单词解释
- 用@media开头,注意@符号
- mediatype媒体类型
- all 用于所有设备
- print 用于打印机
- screen 用于电脑屏幕,平板电脑,智能手机屏幕
- 关键字and not only
- and表示且的意思,满足多个条件
- not表示排除掉某个,比如not print表示不包括打印机
- only表示仅某一个设备
- media feature 媒体特性 必须有小括号包含
- 设备宽度width/max-width/min-width
- 设备高度height
- 设备方向: portrait (竖屏模式) | landscape (横屏模式)
示例:
.box {
width: 100%;
background-color: pink;
}
@media screen and (width: 400px) {
.box {
height: 40px;
}
}
@media screen and (width: 500px) {
.box {
height: 50px;
}
}
元素宽高的自适应为什么必须要等比例?
示例:
.box {
width: 100%;
background-color: pink;
}
@media screen and (width: 400px) {
.box {
height: 40px;
}
}
@media screen and (width: 500px) {
.box {
height: 100px;
}
}
原因:如果不等比例样式就会乱掉
只使用媒体查询有什么不好?
示例:
<header></header>
<footer></footer>
header {
position: fixed;
top: 0;
left: 0;
width: 100%;
background-color: pink;
}
footer {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background-color: pink;
}
@media screen and (width: 400px) {
header {
height: 20px;
}
footer {
height: 40px;
}
}
@media screen and (width: 500px) {
header {
height: 25px;
}
footer {
height: 22.5px;
}
}
坏处:代码重复性太高
rem与媒体查询结合使用
header {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 0.5rem;
background-color: pink;
}
footer {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
height: 1rem;
background-color: pink;
}
@media screen and (width: 400px) {
html {
font-size: 40px;
}
}
@media screen and (width: 500px) {
html {
font-size: 50px;
}
}
当浏览器窗口不等于媒体查询中的width怎么办?
在工作中我们一般不使用width,一般使用max-width和min-width。有三种方式:
-
同时使用min-width和max-width
@media screen and (min-width: 0px) and (max-width: 399px) { html { font-size: 30px; } } @media screen and (min-width: 400px) and (max-width: 499px) { html { font-size: 40px; } } @media screen and (min-width: 500px) { html { font-size: 50px; } } -
只使用min-width(稍微推荐)
@media screen and (min-width: 0px) { html { font-size: 30px; } } @media screen and (min-width: 400px) { html { font-size: 40px; } } @media screen and (min-width: 500px) { html { font-size: 50px; } }
几个问题:
- 如果窗口不等于min-width或max-width时怎么办?就按照上一个font-size进行计算。所以当窗口在一个阶段内进行变化时,页面上的所有使用rem的元素不会发生任何变化
真正工作中会怎么做?
第一步:档位划分
@media screen and (min-width: 0px) {
html {
font-size: 85.3333px;
}
}
@media screen and (min-width: 375px) {
html {
font-size: 100px;
}
}
@media screen and (min-width: 480px) {
html {
font-size: 128px;
}
}
@media screen and (min-width: 540px) {
html {
font-size: 144px;
}
}
@media screen and (min-width: 640px) {
html {
font-size: 170.6666px;
}
}
几个问题:
-
min-width和max-width的值如何确定,即档位应该如何划分?
可以随便写,这里只是列出了业内最常用的屏幕尺寸。档位划分得越细,页面的自适应效果就越细腻。
-
font-size值如何确定?
分两步:
-
先确定375px屏幕尺寸的font-size值。
为什么?因为UI图是以iphone6/7/8为标准设计的,尺寸为750px,对应的逻辑分辨率为375px。
那这里为什么要设置为100px?其实可以随便设置,这里设置100px是为了接下来方便计算,比如测得一个图片宽度为24px,我们就可以很快地计算出rem值为0.12rem。
-
再计算出别的屏幕尺寸的font-size值
拿414px屏幕尺寸举例:用375除以100得到3.75,然后再用414除以3.75。(或者:414/它的font-size = 375/100。其实就是要等比例)
-
第二步:把UI图测量的尺寸换算成rem单位
-
根据UI图得出css像素值
eg:测得UI图div元素的宽为375px,因为是2倍图,所以css像素值为187.5px
-
把px换算成rem
eg:css像素值 / 用iphone6/7/8打开时根元素font-size的值 = 187.5px / 100px = 1.875rem
问题:这里为什么要除以用iphone6/7/8打开时根元素font-size的值呢?因为UI图就是以iphone6/7/8为标准出的
比如用187.5px / 150px = 1.25rem,然后用iphone6/7/8打开,结果显示的是1.25rem * 100px * 2 = 250px,和UI图尺寸不符
比如用187.5px / 100px = 1.875rem,然后用iphone6/7/8打开,结果显示的是1.875rem * 100px * 2 = 375px,和UI图尺寸相符
比如用187.5px / 100px = 1.875rem,然后用iphoneXR打开,结果显示的是1.875rem * 110.4px * 2 = 414px,和UI图尺寸不符,但是是等比例缩放的,这正是UI所想要的效果
第三步:重置body元素的fontSize值
/* 由于字体会继承,所以需要重置一下body的font-size */
body {
font-size:12px;
}
最后浏览器是怎么运行的呢?
-
如何用iphone6/7/8打开
则会执行下面这段代码:
@media screen and (min-width: 375px) { html { font-size: 100px; } }这时html的font-size值变为了100px,再去执行下面这段代码:
.box { width: 1.875rem; }这时浏览器就会这样计算:1.875 x 100 x 2(2倍屏)= 375px,占屏幕宽度的一半
-
如何用iphoneXR(物理分辨率为828x1792)打开
则会执行下面这段代码:
@media screen and (min-width: 414px) { html { font-size: 110.4px; } }这时html的font-size值变为了110.4px;,再去执行下面这段代码:
.box { width: 1.875rem; }这时浏览器就会这样计算:1.875 x 110.4 x 2(2倍屏)=414px,占屏幕宽度的一半
检查大家是否真的理解了rem与媒体查询结合使用
题目:UI图尺寸为1024px(3倍图),如何进行档位划分?
@media screen and (min-width: 0px) {
html {
font-size: 93.75px;
}
}
@media screen and (min-width: 320px) {
html {
font-size: 93.75px;
}
}
@media screen and (min-width: 341.333px) {
html {
font-size: 100px;
}
}
@media screen and (min-width: 500px) {
html {
font-size: 146.48px;
}
}