博客列表 >css 响应式布局所对应的几个基本属性单位详解(rem / em / vh / vw)

css 响应式布局所对应的几个基本属性单位详解(rem / em / vh / vw)

祥子弟弟
祥子弟弟原创
2020年12月20日 20:26:311368浏览

一、em 与 rem 的原理与应用

在编写页面的时候,我们经常会对元素的字体大小进行设置,以达到自己想要的效果。而在 css 中设置字体的几个常用的基本单位有三个,分别是:px / em / rem。
其中 px 是一个绝对单位,一旦使用 px 对字体进行定义,那么页面就会按照精确的像素进行展示。同时,px 与 em 和 rem 可以进行换算。
em 和 rem 是一个相对的单位,使用 em 和 rem 单位可以让我们的页面变得更加的灵活,它们允许用户调整浏览器的大小来达到最佳的显示效果。
既然是一个相对的单位,那 em 和 rem 都必定会有一个参考物。

  • em

em 的参考物就是它父级元素中的 font-size 属性的大小,rem 的参考物则来自根元素,也就是 html 的 font-size 属性的大小。
我们可以知道的是在现在的所有浏览器中,html 元素的 font-size 的默认值都是 16px,也就是说此时 body 中的 1em = 1 * 16px,如果不在 body 中重新设置 font-size 属性的话,那么 body 就会继承它的父元素 html 中的 font-size 属性,当然,既然这么说了,我们可以自己再重新设置 font-size 属性值,html 中的 font-size 属性值也同样可以由我们自一开始就重新定义,没有定义的就是默认值,也就是 16px。如果在一开始定义了 font-size 属性,那么这个元素的子元素就会继承它的 font-size,同理往后延伸。

  • rem

如果说 em 是一个比较活泼的小可爱,那么 rem 就是一个比较刻板的小可爱了。你可以把它看成是以一个“固定的” em 值,因为它的参考物只有根元素,也就是 html 设置成什么,它就是什么。
拿个案例来说明吧。比如说,当一个页面的 html 中的 font-size 为默认值 16px 时,它的子元素 body 又不想用这个值,重新定义了个 2em,而 body 中的子元素 p 也叛逆起来,重新定义了个 1.5em,而 p 的子元素 span 就有些刻板了,它决定追随 html 的脚步,它给自己设置了个 1.5rem。此时 body 中的 2em = 2 x 16px = 32px(因为 em 的参考对象是它的父元素),而 p 中的 1.5em = 1.5 x 32px = 48px(此时 p 中的 em 参考对象是 body 中的 font-size,所以在 p 元素中,1em = 1 x 32px = 32px),span 中的 1.5rem = 1.5 x 16px = 24px(因为 rem 是直接继承自 html 元素的 font-size)。
我们来通过一个案例来了解 em / rem 的原理。
我们来设置一个同时拥有大小字号的标题
html 中的内容如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>em和rem的原理</title>
  6. </head>
  7. <body>
  8. <h2>怪谈<span>之都市怪谈</span></h2>
  9. </body>
  10. </html>

浏览器效果如下:

在这里,我们想要将这个“之都市怪谈”给变成小一号的字体。我们之前说过,可以使用 px 直接设置成死的,不过这样会出现不好的体验:当浏览器的大小变化时,“之都市怪谈”这几个字不会随着变化,浏览效果极差。这个时候 rem 的作用就显现出来了。

  1. html {
  2. /* 在这里重置了根元素的字号大小,1.25em = 1.25 * 16px = 20px */
  3. font-size: 1.25em;
  4. }
  5. h2 {
  6. /* 在设置font-size的时候不建议使用em为单位 */
  7. font-size: 1.5rem;
  8. }
  9. h2 span {
  10. font-size: 1rem;
  11. }

这样,我们就能得到一个想要的结果,而且不论是浏览器的大小如何变化,它也能给你想要的效果。

em 的应用场景:em 单位经常被用于设置盒子的 padding 属性,margin 属性,width 属性,border-radius 属性之类的,这样等盒子继承不同大小的字号时,盒子会随着均匀的放大或者缩小。

我们可以将 em 单位应用在盒子的设置中,示例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>em的应用</title>
  6. </head>
  7. <body>
  8. <button class="btn small">button</button>
  9. <button class="btn normal">button</button>
  10. <button class="btn large">button</button>
  11. </body>
  12. </html>

我们设计三个不同大小的按钮。

  1. .btn {
  2. background-color: #1eafff;
  3. color: #fff;
  4. border: none;
  5. outline: none;
  6. padding: 0.5em 1em;
  7. border-radius: 0.5em;
  8. }
  9. .btn:hover {
  10. /* 透明度 */
  11. opacity: 0.8;
  12. /* 将鼠标设置为手型 */
  13. cursor: pointer;
  14. /* 设置阴影,外发光效果 */
  15. box-shadow: 0 0 3px #888;
  16. /* 增加延时效果 */
  17. transition: 0.3s;
  18. }
  19. /* 如果想设置三个不同大小的按钮,只需要为这三个按钮指定不同的自豪就可以了 */
  20. .small {
  21. font-size: 0.5em;
  22. }
  23. .normal {
  24. font-size: 1em;
  25. }
  26. .large {
  27. font-size: 1.25em;
  28. }

显示效果如下:

当你缩小或者放大浏览器时,这些按钮会随着均匀的改变。

二、视口单位:vh / vw

视口:指的是浏览器的可视区域,视口不包含地址栏,菜单栏,工具条,状态栏。

可以使用的四种视口单位:

单位 解释
vw 视口宽度(视口的“初始包含块”的宽度的百分之一)
vh 视口高度(视口的“初始包含块”的高度的百分之一)
vmin 视口宽度或高度,选择小的那个
vmax 视口宽度或高度,选择大的那个

vh 和 vw 俩单位也是相对的单位,这个相对的是视口,也就是浏览器的可视区域,1vh 表示的就是当前浏览器所展示的可视区域的高度 1%,1vw 同理表示当前浏览器可视区域宽度的 1%。

示例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>vh/vw的演示</title>
  6. </head>
  7. <body>
  8. <div class="box"></div>
  9. </body>
  10. </html>

定义一个盒子,让它的宽度和高度始终分别占据视口的 50%。

  1. * {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. }
  6. box {
  7. background-color: skyblue;
  8. width: 50vw;
  9. height: 50vh;
  10. margin: auto;
  11. }

效果如下:

可以看到的是,此时的宽和高都是当前视口的一半,但是并不是一个正方形,而要得到一个正方形就必须使得当前视口的宽和高都一样,这时候就引出了 vmax 和 vmin 这两个单位。

  1. html {
  2. margin: 0;
  3. padding: 0;
  4. box-sizing: border-box;
  5. }
  6. box {
  7. background-color: skyblue;
  8. width: 50vmin;
  9. height: 50vmin;
  10. margin: auto;
  11. }

这样不管视口的大小如何变化,最后得到的 box 就一定会是一个正方形。vmin 是随着两者小的那个变化,vmax 则是随着两者大的那一方变化的。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议