1. CSS属性继承
-
CSS的某些属性具有继承性(Inherited):
-
如果一个属性具备继承性, 那么在该元素上设置后, 它的后代元素都可以继承这个属性
-
当然, 如果后代元素自己有设置该属性, 那么优先使用后代元素自己的属性(不管继承过来的属性权重多高)
-
-
如何知道一个属性是否具有继承性呢?
- 常见的
font-size/font-family/font-weight/line-height/color/text-align都具有继承性
-
注意:继承过来的是计算值, 而不是设置值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .box { color: red; /* font-size: 30px; */ /* 相对于自身字体(父元素的字体) */ /* 浏览器 16px */ font-size: 2em;/* 32px */ } p { /* font-size: 2em; */ // 此处也是32px } </style> </head> <body> <div class="box"> box本身的内容 <p>我是p元素</p> </div> </body> </html>inherit可以强制继承,如:border: inherit;
- 常见的
-
多学会查阅文档, 文档中每个属性都有标明其继承性的:
2. CSS属性层叠
-
CSS的翻译是层叠样式表, 什么是层叠呢?
-
对于一个元素来说, 相同一个属性我们可以通过不同的选择器给它进行多次设置
-
那么属性会被一层层覆盖上去,但是最终只有一个会生效
-
-
多个样式属性覆盖上去, 哪一个会生效呢?
-
判断一: 选择器的权重, 权重大的生效, 根据权重可以判断出优先级
-
判断二: 先后顺序, 权重相同时, 后面设置的生效
-
-
为了方便比较CSS属性的优先级,可以给CSS属性所处的环境定义一个权值(权重)
- !important:10000
- 内联样式:1000
- id选择器:100
- 类选择器、属性选择器、伪类:10
- 元素选择器、伪元素:1
- 通配符:0
| 选择器 | 千位 | 百位 | 十位 | 个位 | 优先级 |
|---|---|---|---|---|---|
h1 | 0 | 0 | 0 | 1 | 0001 |
h1 + p::first-letter | 0 | 0 | 0 | 3 | 0003 |
li > a[href*="en-us" > .inline-warning] | 0 | 0 | 2 | 2 | 0022 |
#identifier | 0 | 1 | 0 | 0 | 0100 |
| 内联样式 | 1 | 0 | 0 | 0 | 1000 |
3. 元素的类型
-
HTML定义元素类型的思路:
-
HTML元素有很多, 比如h元素/p元素/div元素/span元素/img元素/a元素等等;
-
当我们把这个元素放到页面上时, 这个元素到底占据页面中一行多大的空间呢?
- 为什么我们这里只说一行呢? 因为垂直方向的高度通常是内容决定的
-
比如一个
h1元素的标题, 我们必然是希望它独占一行的, 其他的内容不应该和标题放在一起 -
比如一个
p元素的段落, 必然也应该独占一行, 其他的内容不应该和段落放在一起 -
而类似于
img/span/a/strong/i元素, 通常是对内容的某一个细节的特殊描述,没有必要独占一行
-
-
为了区分哪些元素需要独占一行, 哪些元素不需要独占一行, HTML将元素区分(本质是通过CSS的)成了两类:
-
块级元素(block-level elements): 独占父元素的一行
-
行内级元素(inline-level elements):多个行内级元素可以在父元素的同一行中显示
-
-
CSS中有个display属性,能修改元素的显示类型,有4个常用值
-
block:让元素显示为块级元素
-
inline:让元素显示为行内级元素
-
inline-block:让元素同时具备行内级、块级元素的特征
- 对外来说,它是一个行内级元素
- 对内来说,它是一个块级元素
-
none:隐藏元素
-
-
display值的特性
4. 元素的隐藏方法
-
display设置为none
- 元素不显示出来, 并且也不占据位置, 不占据任何空间(和不存在一样)
-
visibility设置为hidden
- 设置为hidden, 虽然元素不可见, 但是会占据元素应该占据的空间
- 默认为visible, 元素是可见的
-
rgba设置颜色, 将a的值设置为0(只能设置某个元素的属性,如color、background-color)
-
rgba的a设置的是alpha值, 可以设置透明度,** 不影响子元素**
background-color: transparent; /* rgba(0,0,0,0) */
-
-
opacity设置透明度, 设置为0
- 设置整个元素的透明度, 会影响所有的子元素
5. overflow
-
overflow用于控制内容溢出时的行为
- visible:溢出的内容照样可见
- hidden:溢出的内容直接裁剪
- scroll:溢出的内容被裁剪,但可以通过滚动机制查看
- 会一直显示滚动条区域,滚动条区域占用的空间属于width、height
- auto:自动根据内容是否溢出来决定是否提供滚动机制
6. HTML嵌套的规范
-
块级元素、inline-block元素
-
一般情况下,可以包含其他任何元素(比如块级元素、行内级元素、inline-block元素)
-
特殊情况,
p元素不能包含其他块级元素
-
-
行内级元素(比如
a、span、strong等)- 一般情况下,只能包含行内级元素,不能嵌套块级元素
7. CSS样式不生效排查技巧
为何有时候编写的CSS属性不好使,有可能是因为
-
选择器的优先级太低
-
选择器没选中对应的元素
-
CSS属性的使用形式不对
✓ 元素不支持此CSS属性,比如span默认是不支持width和height的
✓ 浏览器不支持此CSS属性,比如旧版本的浏览器不支持一些css module3的某些属性
✓ 被同类型的CSS属性覆盖,比如font覆盖font-size
建议
- 充分利用浏览器的开发者工具进行调试(增加、修改样式)、查错
8. 替换元素补充
<img /> 是行内元素还是块级元素?
<img />标签没有独占一行,所以是行内元素,这没啥问题
既然是行内元素为什么能够设置宽高呢?
<img />标签属于替换元素,具有内置的宽高属性,所以可以设置,具体解释看下面。
8.1 元素的定义
从元素本身的特点来讲,可以分为不可替换元素和替换元素; 元素相关的MDN解释
8.2 不可替换元素
(X)HTML的大多数元素是不可替换元素,即其内容直接表现给用户端(例如浏览器)- 如:
<h1>我是标题</h1>
8.3 可替换元素
-
浏览器根据元素的标签和属性,来决定元素的具体显示内容
-
例如浏览器会根据
<img>标签的src属性的值来读取图片信息并显示出来,而如果查看(X)HTML代码,则看不到图片的实际内容;又例如根据<input>标签的type属性来决定是显示输入框,还是单选按钮等 -
(X)HTML中的
<img>、<input>、<textarea>、<select>、<object>都是替换元素。这些元素往往没有实际的内容,即是一个空元素 -
如:
<img src="xxx.jpg"/>、<input type="submit" name="Submit" value="提交"/> -
可替换元素的性质同设置了display:inline-block的元素一致
8.4 特殊的可替换元素
-
<img>属于可替换元素 -
<img>同时具有行内元素,行内块,和块级元素的特性 -
替换元素一般有内在尺寸,所以具有
width和height,可以设定- 如果不指定
<img>的width和height时,就按其内在尺寸显示,也就是图片被保存的时候的宽度和高度
- 如果不指定
-
对于表单元素,浏览器也有默认的样式,包括宽度和高度
-
<img>、<input>属于行内替换元素。height/width/padding/margin均可用。效果等于块元素