Blogger Information
Blog 54
fans 6
comment 31
visits 106643
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
CSS属性值简写和相对单位学习总结
吾逍遥
Original
1317 people have browsed it

一、学到的新认识

本意味CSS属性值简写和相对单位已经很熟悉了,结果老师讲课后,我又接触了几个陌生的概念

1. outline

翻译是”轮廓”。也许你奇怪不就是一个属性而已嘛,但我在做前端布局调整时最难的就是定位元素边界,只有知道边界才能知道布局问题出在哪,如不居中是因为它本身样式不对还是父元素样式不对。以前我最常用border定边界,今天发现老师用outline介绍盒模型时就发现新的技能了,然后百度下border和outline的区别。二者最大区别: 其实老师已经讲到就是border会影响元素的盒模型从而影响整体布局,而outline则不占空间,对整体布局没有影响,非常适合定位元素边界来排查布局的问题

2. 属性值简写的要素和顺序

其实在做前端时经常属性值简写,这里我特别注意老师讲的属性值顺序,如padding、margin和background-position值是有顺序,还要特别记忆,而border、outline这些复合属性值则顺序无关,而我在font这个复合属性值时本以为也无关,结果却是与顺序有关。此时我就思考顺序有关或无关是从哪可以查到,还有更深入的就是简写的要素哪些可以忽略,如border:solid red;是可以的。学习就要打破沙锅问到底,正好有这些名师,培训结束了就没地方提问了。相信你也想知道答案,可继续看本文,我在第三节已经分析。

3. background-clip:content-box

content-box一出现就让我就想到以前经常遇到box-sizing:content-box。它们有之间有什么区别呢?经查得出如下结论:

  • box-sizing是指如何计算盒模型的总宽度和总高度,就是我们设置元素的width和height到底指哪些。标准盒模型其默认值content-box。即
    width = content width;
    height = content height
    若是border-box则计算是这样的:
    width = border-left + padding-left + content width + padding-right + border-right
    heigth = border-top + padding-top + content heigth + padding-bottom + border-bottom
  • background-clip指定元素背景所在的区域。默认值border-box,还可取content-boxpadding-box。至于text取值可以忽略,它兼容性不好。
    border-box: 表示元素的背景从border区域(包括border)以内开始保留背景
    padding-box: 表示元素的背景从padding区域(包括padding)以内开始保留
    content-box: 表示元素的背景从内容区域以内开始保留

4. em和rem

相对单位,布局自适应知识之一,重点要掌握它们的本质,究竟是相对谁来计算。

二、属性值简写

  • 属性值简写便于阅读,目前学到常见有font,border,padding、margin和background,以后要学的flex和grid等也是。最常见的简写如下演示
  1. /* font-size: 20px;
  2. font-style: italic;
  3. font-weight: bolder;
  4. font-family: Tahoma; */
  5. /* font属性值简写 顺序不是无关 要素可以忽略部分 */
  6. font: italic bolder 40px Tahoma;
  7. /* font: bolder 30px Tahoma; */
  8. /* font: 30px Tahoma; */
  9. font: 30px; /*无效*/
  10. /* border-width: 2px;
  11. border-style: solid;
  12. border-color: seagreen; */
  13. /* border简写 顺序无关,要素可以任选一个或多个,不过没有style则默认为none即不显示,但它仍然占空间*/
  14. border: 10px solid seagreen;
  15. /* border: solid 10px seagreen; */
  16. /* border: solid 10px; */
  17. /* border:10px; */
  18. line-height: 200px;
  19. /* padding-top: 10px;
  20. padding-right: 15px;
  21. padding-bottom: 20px;
  22. padding-right: 25px; */
  23. /* padding简写 顺序:上 右 下 左 */
  24. padding: 10px 15px 20px 25px;
  25. padding: 10px 15px 20px; /* 上是10px 左右是15px 下是20px */
  26. padding: 10px 15px; /* 上下是10px 左右是15px */
  27. padding: 10px; /* 上下左右都是10px */
  28. /* margin简写 顺序同padding */
  29. margin: 10px 15px 20px 25px;
  30. background-image: url(https://img.php.cn/upload/course/000/000/003/5a530c9c6c775990.jpg);
  31. background-repeat: no-repeat;
  32. /* 简写 顺序:x轴 y轴 它的顺序可通过left、top、bottom和right指写,默认是left top */
  33. background-position: 20px 30px;
  34. /* background-position:right 20px bottom 10px */

效果https://codepen.io/woxiaoyao81/pen/abZOjMZ

三、属性值简写的要素和顺序(重点)

  • 简写要素 简写要素是否可以忽略要依据语法定义,常见查询定义的平台就是MDN。如outline的语法定义https://developer.mozilla.org/zh-CN/docs/Web/CSS/outline
    [ <’outline-color’> || <’outline-style’> || <’outline-width’> ]
    中括号[]表示要素组合,尖括号<>是要素,||表示或关系意味简写值组合可以是这些要素中一个或多个,即可以忽略任何要素。如下:
    outline:red solid;
    outline:dotted 2px;
    不过为了显示要注意outline-style要设置,其默认是none,相同语法定义有border。
    再看下font的语法定义https://developer.mozilla.org/zh-CN/docs/Web/CSS/font
    [ [ <’font-style’> <font-variant-css21> || <’font-weight’> || <’font-stretch’> ]? <’font-size’> [ / <’line-height’> ]? <’font-family’> ] 除了前面讲的符号,又出现了问号? 它和正则表达式中意义差不多,就是 匹配零次或一次 。从中可以看出font-size和font-family是必要的要素,不可忽略,其它可以忽略。

  • 简写顺序 我们知道margin、padding、background-postion属性简写是有顺序,而border和outline复合属性是无顺序的。而要想知道是否有顺序还是要看MDN语法定义,如
    outline各要素是或关系,简写要素是无序的
    而font简写要素见上面定义,其中font-style、font-weight和font-stretch是无序的,但它们组合和font-size是有序的,剩下的就好理解了,可以按我思路分析简写要素是否有顺序。

  • 上面列举都是复合属性,而对单值属性的顺序含义则是要看MDN详细说明了,如padding语法定义https://developer.mozilla.org/zh-CN/docs/Web/CSS/padding
    [ \<length\> | \<percentage\> ]{1,4}
    解释就是要素是长度或百分比,个数是1到4。没有或关系就是有顺序的,具体顺序有链接文章中有详细介绍,无论1个值、2个值、3个值和4个值都介绍非常清楚。

  1. /* border简写 顺序无关,要素可以任选一个或多个,不过没有style则默认为none即不显示,但它仍然占空间*/
  2. border: 10px solid seagreen;
  3. /* border: solid 10px seagreen; */
  4. /* padding简写 顺序:上 右 下 左 */
  5. padding: 10px 15px 20px 25px;
  6. padding: 10px 15px 20px; /* 上是10px 左右是15px 下是20px */
  7. padding: 10px 15px; /* 上下是10px 左右是15px */
  8. padding: 10px; /* 上下左右都是10px */
  9. /* font简写 顺序部分无序,有部分有序,要素也是部分可忽略*/
  10. font: italic bolder 40px Tahoma;
  11. /* font: bolder 30px Tahoma; */
  12. /* font: 30px Tahoma; */

四、相对单位em和rem(重点)

多端布局要求自适应,其中相对单位em和rem是重点,正如小程序端的rpx相对单位,使用它们可以快速适应不同端、不同设备。下面几个概念一定要记清楚

1. em是当前字号的相对单位

不知同学们是否还记得朱老师在上课提出的疑问:em是等于当前元素的font-size,再用它设置当前元素fong-size为什么没报错? 我开始想到是它在解析时执行二个过程,如font-size:0.8em时,就是第一次时em是默认值,如视频中提到的16px,而第一次则16px0.8=12.8px,也就是em等于当前元素的font-size最终结果,一般情况下就是我们在chrome浏览器*Elements面板的Computed所看到的计算结果


上面结论对吗? 上面结论是我上课时认为的,但在写本文时感觉只能是对了一部分,如果是这样就很像编程中递归出现死循环。百度时我看这篇文章http://caibaojian.com/rem-vs-em.html,和老师提的差不多,不过我注意了其中一点,就是父元素。浏览器解析em时处理方法有否可能有两种方式
font-size值中有em时,则它等于父元素的font-size,因为它是继承元素!!
解析非继承元素如padding、margin等值中有em时,则是等于本元素的font-size
以上认识不知道是否正确,欢迎老师和其它同仁批评指正。


font-size小于12px时,浏览器如何处理em和当前元素的font-size 我们知道当font-size小于12px时, 如10px,此时浏览器显示时将替换为12px,那么此时em是等于10px还是12px? 其实在第一点我就特别提示是一般情况下em是等于Elements面板Computed计算结果,若是小于12px替换为12px仅仅是影响显示时font-size,而真正的em仍然是根据10px来计算。这点要注意。

2. rem是根元素字体大小

rem是根据html的字体大小来决定的,一般在使用中有以下几个技巧

  • 将html的font-size设置为0.625em,body的font-size设置为1.6rem,,便于获取整数的大小。如1.8rem就是18px。
  • 一般元素的font-size要以rem为单位,而padding和margin则以em为单位
  • 设置html属性时推荐使用:root伪类代表它,因为并不是所有文档根元素都是html
  • 不是所有属性值单位都采用相对单位,如border和position一般采用px来定义
  1. :root {font-size: 0.625em; }
  2. *{font-size: 1.6rem;}
  3. .box:last-of-type{
  4. font-size: 2rem;
  5. padding: 1em;
  6. height: 200px;
  7. background-clip:content-box;
  8. background-color: seagreen;
  9. background-image: none;
  10. }

效果https://codepen.io/woxiaoyao81/pen/abZOjMZ

五、学习的总结

  • 属性值简写便于阅读,但要注意属性要素是否可以忽略顺序是有序还是无序
  • em和rem使用自适应多端,但要一定认清它们大小等于谁。px常用于border和position。
  • margin、padding只能设置宽度不能设置样式和颜色,它是透明的;而border可设置宽度、样式和颜色。
  • 学会用outline定位元素边界,排查布局的问题,而border不适合定位元素边界,因为它占空间,影响布局,而outline只是轮廓,不影响布局。
  • 关于background-position中xy轴(0,0)分析见以后定位文章,提醒的是它是变化的,默认为盒模型border内left top即左上为(0,0)。

源码在我的Giteehttps://gitee.com/freegroup81/phpcn13
Githubhttps://github.com/woxiaoyao81/phpcn13

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:怎么这么优秀呢, 你不成功都难
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
2 comments
吾逍遥 2020-10-14 07:39:12
相互学习,不断提高
2 floor
ccc2020 2020-10-13 19:48:42
写的很好,学习了
1 floor
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!