博客列表 >浅析em/rem/vw/vh与响应式布局

浅析em/rem/vw/vh与响应式布局

培(信仰)
培(信仰)原创
2020年12月19日 00:23:16826浏览

浅析em/rem/vw/vh与响应式布局

什么是em rem

em是一种相对长度单位,相对于自身元素的字号大小,如果没有设置字号,则继承父元素的字号大小。
rem是根元素的字号大小。

  1. <h2>hello</h2>
  2. <div></div>
  1. /* 一般浏览器默认16px 那么默认html的font-size就是1em=16px*/
  2. h2 {
  3. /* 1.5em=1.5*16px=24px */
  4. font-size: 1.5em;
  5. }
  6. html {
  7. /* 此时 1em=24px */
  8. font-size: 1.5em;
  9. /* 由于此次设置了font-size 那么此时h2 的 1.5em 就是 36px */
  10. }
  11. body div {
  12. /* 1em=24px */
  13. font-size: 1em;
  14. /* 从现在起忘记像素px */
  15. /* width: 300px;
  16. height: 300px; */
  17. background-color: violet;
  18. width: 10em;
  19. height: 8em;
  20. }
  21. /* 缩小盒子 */
  22. body div {
  23. /* 此时 1em=12px */
  24. font-size: .5em;
  25. }
  26. /* 放大盒子 */
  27. body div {
  28. /* 此时 1em=48px */
  29. font-size: 2em;
  30. }
  31. /* 盒子的字号font-size使用了em,所有只需要设置font-size属性就可以控制盒子大小 */

应用 :用em制作一组响应式按钮组件

  1. <button class="btn small">button1</button>
  2. <button class="btn normal">button2</button>
  3. <button class="btn larger">button3</button>
  1. /* 基础样式 */
  2. .btn {
  3. background-color: #1e9fff;
  4. color: #fff;
  5. border: none;
  6. outline: none;
  7. padding: 0.5em 1em;
  8. border-radius: 0.3em;
  9. }
  10. /* 伪类悬停 */
  11. .btn:hover {
  12. /* 透明度 0`1之间的值*/
  13. opacity: 0.8;
  14. /* 鼠标样式:将鼠标设置为手型 */
  15. cursor: pointer;
  16. box-shadow: 0 0 3px #888;
  17. transition: 0.3s;
  18. }
  19. /* 如果想设置三个不同大小的按钮,只需要为这三个按钮指定不同的字号 */
  20. .samll {
  21. font-size: 10px;
  22. }
  23. .normal {
  24. font-size: 16px;
  25. }
  26. .larger {
  27. font-size: 24px;
  28. }

简单理解:em是以自身font-size为基本单位;rem以html的font-size为基本单位

em实现响应式布局

  1. <button>放大</button>
  2. <div class="panel">
  3. <h2>各种知名网站的404页面,看看谁更有创意?</h2>
  4. <div class="panel-body">
  5. <p>大厂的 404 页面都长啥样?看到最后一个,我笑了~
  6. 每天浏览各大网站,难免会碰到404页面啊。你注意过404页面么?下面这些知名网站的404页面,以供大家欣赏,看看哪个网站更有创意</p>
  7. </div>
  8. </div>
  1. <style>
  2. html {
  3. font-size: 0.75em;
  4. /* 后面可以直接用rem来引用12px来定义字号或者其他属性 */
  5. }
  6. .panel {
  7. /* 此时panel 是 1rem=0.75em=12px */
  8. /* 如果不写 默认字号是1个rem 1rem */
  9. font-size: 1rem;
  10. /* 此时如果panel中的其他属性使用em单位时就是12px;
  11. 如果panel的font-size:2rem;那么 此时的em就是24px;
  12. 也就是说em是本元素的其他使用属性使用em计算的基本单位
  13. em会随着不同元素的设置而不同,rem始终等于html的font-size设置*/
  14. padding: 1em;
  15. border-radius: .5em;
  16. /* 边框一定不要用em/rem,一定要用px */
  17. border: 1px solid #999;
  18. background-color: #eee;
  19. margin: 2em;
  20. }
  21. .panel h2 {
  22. /* 以后的字号,都要使用rem设置 */
  23. font-size: 1.2rem;
  24. /* 此时h2 字号就设置成了1.2rem=1.2*12px=14.4px
  25. 此时em=1.2rem=1.2*12px=14.4px */
  26. margin: 1em;
  27. }
  28. .panel p {
  29. font-size: 1.1rem;
  30. text-indent: 2em;
  31. }
  32. /* 屏幕宽度 >= 800px ,字号放大14px */
  33. @media screen and (min-width: 800px){
  34. /* 14/16 = 0.875em */
  35. html {
  36. font-size: 0.875em;
  37. }
  38. .panel {
  39. background-color: wheat;
  40. }
  41. }
  42. /* 屏幕宽度 >= 1000px ,字号放大16px */
  43. @media screen and (min-width: 1000px){
  44. /* 16/16 = 1em */
  45. html {
  46. font-size: 1em;
  47. }
  48. .panel {
  49. background-color: lightcyan;
  50. }
  51. }
  52. /* 屏幕宽度 >= 1200px ,字号放大16px */
  53. @media screen and (min-width: 1200px){
  54. /* 20/16 = 1.25em */
  55. html {
  56. font-size: 1.25em;
  57. }
  58. .panel {
  59. background-color: skyblue;
  60. }
  61. }
  62. /* 扩展通过js动态增加时间控制字号大小 */
  63. .panel.large {
  64. font-size: 1.5rem;
  65. }
  66. </style>
  1. <script>
  2. document.querySelector('button').addEventListener('click',(ev)=>{
  3. const panel = document.querySelector('.panel');
  4. panel.classList.toggle('large');
  5. if (panel.classList.contains('larger')) ev.target.innerHTML='缩小';
  6. else ev.target.innerHTML = '放大';
  7. })
  8. </script>

总结
rem 和 em 单位是由浏览器基于你的设计中的字体大小计算得到的像素值。
em 单位基于使用他们的元素的字体大小。
rem 单位基于 html 元素的字体大小。
em 单位可能受任何继承的父元素字体大小影响
rem 单位可以从浏览器字体设置中继承字体大小。
使用 em 单位应根据组件的字体大小而不是根元素的字体大小。
在不需要使用em单位,并且需要根据浏览器的字体大小设置缩放的情况下使用rem。
使用rem单位,除非你确定你需要 em 单位,包括对字体大小。
媒体查询中使用 rem 单位
不要在多列布局中使用 em 或 rem -改用 %。
不要使用 em 或 rem,如果缩放会不可避免地导致要打破布局元素。

视口单位:vw/vh

视口:浏览器用于显示文档的可视区域
不包括地址栏,菜单栏,工具栏,状态栏

  1. vh:视口的"初始包含块"的高度的百分之一(1/100)相对高度
  2. vw:视口的"初始包含块"的宽度的百分之一(1/100)相对宽度
  3. 初始包含块:目前可以简单的理解为"html"
  1. <div class="box"></div>
  1. .box{
  2. width: 50vw;
  3. height: 50vh;
  4. background-color: lightgreen;
  5. margin:auto;
  6. }

怎么获得一个正方形的区块呢?

  1. .box{
  2. /* 谁小以谁为标准 */
  3. width: 80vmin;
  4. height: 80vmin;
  5. background-color: lightgreen;
  6. margin:auto;
  7. }
  8. .box{
  9. /* 谁大以谁为准 */
  10. width: 80vmax;
  11. height: 80vmax;
  12. background-color: lightgreen;
  13. margin:auto;
  14. }

css原生变量

  1. <a href="">hello</a>
  1. body {
  2. /* 2015年以后支持变量 */
  3. --color:#f00;
  4. --hover-color:#0f0;
  5. --a-border:1px solid;
  6. /* css预处理器,用js来编译css代码,less,sass用考拉来做
  7. 功能也比css原生变量强 */
  8. }
  9. a{
  10. /* color:#f00; */
  11. color:var(--color);
  12. }
  13. a:hover{
  14. /* color:#0f0;
  15. border: 1px solid; */
  16. color: var(--hover-color);
  17. border: var(--a-border);
  18. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议