在css中单位长度用的最多的是px、em、rem,这三个的区别是:
px是固定的像素,一旦设置了就无法因为适应页面大小而改变。
em和rem相对于px更具有灵活性,他们是相对长度单位,意思是长度不是定死了的,更适用于响应式布局。
对于em和rem的区别一句话概括:em相对于父元素,rem相对于根元素。
rem中的r意思是root(根源),这也就不难理解了。
em
- 子元素字体大小的em是相对于父元素字体大小
- 元素的width/height/padding/margin用em的话是相对于该元素的font-size
上代码:
<div>
我是父元素div
<p>
我是子元素p
<span>我是孙元素span</span>
</p>
</div>
div {
font-size: 40px;
width: 10em; /* 400px */
height: 10em;
border: solid 1px black;
}
p {
font-size: 0.5em; /* 20px */
width: 10em; /* 200px */
height: 10em;
border: solid 1px red;
}
span {
font-size: 0.5em;
width: 10em;
height: 10em;
border: solid 1px blue;
display: block;
}
结果如下:
巩固测验:你能说出孙元素span的font-size和width吗?
答案:我猜你会说10px、100px,哈哈,其实逻辑上是正确的,但是如果你是chrome浏览器我不得不告诉你应该是12px、120px。因为chrome设置的最小
字体大小为12px,意思就是说低于12px的字体大小会被默认为12px,当然这一尬境可以由css3解决,这里就不多说了。
chrome默认的字体大小是12px,也就是1em默认为12px,如果最外层的父元素直接把font-size设为1.5em,那么该元素的字体大小为18px(12*1.5)。
rem
rem是全部的长度都相对于根元素,根元素是谁?<html>元素。通常做法是给html元素设置一个字体大小,然后其他元素的长度单位就为rem。
上代码:(html代码如上,只是把css代码的元素长度单位变了)
html {
font-size: 10px;
}
div {
font-size: 4rem; /* 40px */
width: 30rem; /* 300px */
height: 30rem;
border: solid 1px black;
}
p {
font-size: 2rem; /* 20px */
width: 15rem;
height: 15rem;
border: solid 1px red;
}
span {
font-size: 1.5rem;
width: 10rem;
height: 10rem;
border: solid 1px blue;
display: block;
}
所以你可以说出span的font-size具体值吗?
当用rem做响应式时,直接在媒体中改变html的font-size那么用rem作为单位的元素的大小都会相应改变,很方便。
看到这里我想我们都更深刻的体会了em和rem的区别(参照物不同)。
总结:
在做项目的时候用什么单位长度取决于你的需求,我一般是这样的:
像素(px):用于元素的边框或定位。
em/rem:用于做响应式页面,不过我更倾向于rem,因为em不同元素的参照物不一样(都是该元素父元素),所以在计算的时候不方便,相比之下rem就只有一个参照物(html元素),这样计算起来更清晰。
文字大小随着容器的大小变化,是css新特性容器查询
先来看看例子
<div class="container">
<div class ="box"> 右下角拖动我,可以根据容器改变字号 </div>
</div>
关键的css代码
.container{
container-type :inline-size;
}
.box{
font-size:5cqw
}
CSS 容器查询是什么
在响应式布局布局中,经常使用媒体查询(Media Queries)检测视窗的宽高,实现自元素样式的自动调整。但是在一些页面设计中,元素的容器尺寸发生变化时,元素的样式也需要随之变化。很显然,媒体查询无法支持这种场景。为了解决这类问题,CSS 增加了一个新的特性 容器查询(Container Queries)。
容器查询
为了支持容器查询,CSS 的新规范中增加了 container-type
、container-name
和 container
三个属性。container
是 container-type
和 container-name
的简写属性,用来显式声明某个元素是一个查询容器,并且定义查询容器的类型(由 container-type
指定)和查询容器的名称(由 container-name
指定,使用反斜杠(/
)隔开。
除此之外,要用 @container
来声明容器查询的样式,比如在下面的例子中,当 <main>
元素的宽度小于 800px 时,<span>
元素中的字体颜色被置为 gray
:
main{
container:inline-size/ name;
// 等价于
//container-type:inline-size;
//container-name:name;
}
@container name (max-width:800px){
span{
color:gray;
}
}
<main>
<span>fdsfsd</span>
</main>
容器查询单位
容器查询单位和视窗单位(vw,vh,vmin,vmax等)相似,不同的是,视窗单位是相对浏览器视窗尺寸计算,容器查询尺寸是相对于查询容器尺寸计算
1cqw等于查询容器宽度的1%
1cqh等于查询容器高度的1%
1cqi等于查询容器内联大小(inline-size)的1%
1cqd等于查询容器块大小(block-size)的1%
1cqmin 等于1cqi或1cqd中较小的一个值
1cqmax 等于1cqi或1cqd中较大的一个值
容器查询单位出现之后,可以帮助我们在处理组件内元素样式,eg:font-size,padding,margin等。节省很多时间跟精力,
eg:我们可以使用容器查询单位代替手动增加字体大小
.card-title{
font-size:1rem;
}
//容器宽度大于400
@container (width>400px){
.card-title{
font-size:1.15rem;
}
}
//容器宽度大于600
@container (width>600px){
.card-title{
font-size:1.25rem;
}
}
使用容器查询单位简化
.card-title{
font-size: clamp(.8rem, 10cqw + .8rem, 2.5rem);
}
当然我们也可以用vw 视窗单位来设置font-size
.card-title{
font-size: clamp(.8rem, 10vw + .8rem, 2.5rem);
}