这篇文章继续学习 CSS 基础知识,主要学习 CSS 复合选择器、CSS 元素显示模式等知识,同时会还会介绍 Emmet 语法,它能提高 HTML/CSS 代码的编写速度。
CSS 复合选择器
之前说过,CSS 选择器主要有两大类:基础选择器和复合选择器。复合选择器是建立在基础选择器之上,对基本选择器进行组合形成的:
- 复合选择器可以更准确、更高效地选择目标元素
- 复合选择器是由两个或多个基础选择器,通过不同的方式组合而成的
- 常用的复合选择器包括:后代选择器、子选择器、并集选择器、伪类选择器等
后代选择器
后台选择器又被称为包含选择器,可以选择祖先元素中的后代元素,其语法规则为
1 | ancestor descendant { |
- ancestor descendant 分别表示祖先元素和后代元素,它们之间用空格分隔
- ancestor descendant 可以是任何基础选择器,最终选择的是 ancetor 中的后代元素 descendant
- descendant 可以是 ancestor 的任意层级后代元素(儿子、孙子等等)
如下是一个示例:
1 | <head> |
子选择器
子元素选择器(子选择器)只能选择某一元素的最近一级子元素,即直接子元素,其语法规则为:
1 | parent > child { |
- parent 和 child 分别表示父元素和子元素,它们之间用
>分隔 - child 必须是 parent 的直接后代,不能是孙子元素等
并集选择器
并集选择器可以选择多组标签,为它们定义相同的样式。通常用于集体声明。并集选择器是各个选择器之间用 , 分隔,任何形式的选择器都可以作为并集选择器:
1 | selector1, selector2 { |
如下是一个示例:
1 | #google, |
- 习惯将并集选择器的多个 selector 用多行书写
- 最后一个 selector 之后不需要添加
,
伪类选择器
伪类选择器用于定义某些选择器的特殊状态,或者选择第 1 个、2 个… n 个元素。伪类选择器使用冒号来表示,例如 :hover、:first-child 等。有很多伪类选择器,这里先介绍最常用的 链接伪类选择器 以及 :focus 伪类选择器。
a:link选择所有未被访问的链接a:visited选择所有已被访问的链接a:hover选择鼠标指针位于其上的链接a:active选择活动链接(鼠标未弹起的连接)
如下是一个示例:
1 | a:link { |
- 为了确保样式生效,一般按照
LVHA的顺序声明 - 由于 a 链接在浏览器中具有默认样式,所以实际开发中一般都需要给链接单独指定样式
- 实际开发中,一般只需要链接的常规状态(
a)和 hover 状态(a:hover)定义样式即可
:focus 伪类选择器用于选择获取焦点的表单元素。焦点就是光标,一般只有表单元素才能获取光标,因此这个伪类选择器主要用于表单元素上。
1 | input:focus { |
CSS 的元素显示模式
网页的标签非常多,在不同地方会用到不同类型的标签,了解他们的特点可以更好地布局我们的网页。元素显示模式就是元素(标签)以什么方式进行显式,例如 <div> 会独占一行,而多个 span 可以在同一行显示。HTML 元素一般分为块元素和行内元素两种类型。
常见的块元素有 <h1>-<h6>, <p>, <div>, <ul>, <ol>, <li>,div 是最典型的块元素。块元素的特点:
- 独占一行显示
- 高度、宽度、外边距、内边距都可以控制
- 宽度默认是容器(父级)宽度的 100%
- 是一个容器及盒子,里面可以放行内或块级元素
注意事项:
- 文字类的元素内不能使用块级元素。
<p>标签、<h1>-<h6>等标签一般都用于存放文字,它们都属于文字类的元素,里面不能放其他块级元素。因此<p>标签内是不能存放<div>标签的。
常见的行内元素有 <a>, <strong>, <b>, <em>, <i>, <del>, <s>, <ins>, <u>, <span> 等,其中 <span> 是最典型的行内元素。行内元素的特点:
- 相邻行内元素会在一行显示,一行可以显示多个行内元素
- 高、宽设置是无效的
- 默认宽度就是它本身内容的宽度
- 行内元素只能容纳文本或者其他行内元素
注意下事项:
- 链接标签
<a>内不能再放置链接 <a>标签内可以放块级元素,但是给<a>转换一下块级模式更安全
对比下块级元素和行内元素的宽度、高度规则:
-
块级元素:
- 默认情况下,宽度自动撑满父容器。若显式设置了宽度,则按照设置的值来
- 默认情况下,高度由其内容撑开。若显式设置了高度,则按照设置的值来。
-
行内元素:
- 无法设置 width 和 height
- 它们的大小完全由其内容撑开
在行内元素中有几个特殊的标签,<img />、<input />, <td>,它们同时具有行内元素和块级元素的特性,有时会将它们称为行内块元素。行内块元素的特点:
- 和相邻行内元素在一行上,一行可以显示多个(行内元素的特点)
- 默认宽度就是它本身内容的宽度(行内元素的特点)
- 高度、行高、外边距、内边距都可以控制(块级元素的特点)
元素显示模式转换
特殊情况下,我们需要元素显示模式的转换。简单理解就是:一个模式的元素需要另一种模式的特性,例如要增加链接 <a>(行内元素)的触发范围(设置宽度、高度),就需要将 <a> 的显示模式转换块级元素。
在 CSS 中,可以通过 display 属性将元素的显示模式转换为其他类型。常用的值有:
block将元素设置为块级元素inline将元素设置为行内元素inline-block将元素设置为行内块元素
例如,要将一个 <a> 标签的显示模式转换成块级元素,可以这样写:
1 | a { |
如下则将 <span> 标签的显示模式转换为行内块元素:
1 | span { |
一个示例:小米侧边栏
下面的代码实现了一个简单小米官网侧边栏布局
1 |
|
其中效果如下:
这里需要注意的一处 CSS 效果是实现文字垂直居中,它使用的技巧是 让文字的行高等于盒子的高度,就可以让文字在当前盒子内垂直居中。它的原理是这样:
- 行高 = 上边距 + 文字高度 + 下边距
- 当行高等于盒子高度时,上边距和下边距的自动调整(平均分配),就能让文字自动垂直居中了
CSS 背景
通过 CSS 背景属性,可以给页面元素添加背景样式。背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。
背景颜色
backgroud-color 属性用于设置元素的背景颜色。其语法规则为:
1 | background-color: transparent | color; |
- 一般情况下,元素的背景颜色默认值是 transparent,也可以手动设置背景颜色为 transparent
背景图片
background-image 属性用于设置元素的背景图片,背景图片常见于 logo、一些装饰性的小图片、或者超大的背景图片。优点是非常便于控制位置(精灵图也是一种运用场景)。其语法规则为:
1 | background-image: none | url(url); |
- none:表示无背景图片
- url:使用绝对或者相对地址指定背景图像。url 里面的路径不需要加引号
页面元素既可以添加背景颜色,也可以添加背景图片,如果同时设置背景颜色和背景图片,背景图片会覆盖在背景颜色的上面。
背景平铺
background-repeat 属性用于设置背景图片的平铺方式。其语法规则为:
1 | background-repeat: repeat | no-repeat | repeat-x | repeat-y; |
- repeat:默认值,背景图像在垂直和水平方向上平铺
- no-repeat:不平铺
- repeat-x:背景图像在水平方向上平铺
- repeat-y:背景图像在垂直方向上平铺
背景图片位置
background-position 属性用于设置背景图片的位置。其语法规则为:
1 | background-position: x y; |
x 和 y 分表表示水平和垂直坐标,可以使用方位词或者精确单位:
- 方位词:top | bottom | left | right | center
- 精确单位:百分数 | 由浮点数和单位标识符组成的长度值
如果参数使用方位词,则两个值的顺序无关,例如 left top 和 top left 效果相同。因为浏览器可以自动根据方位词推断出其指定的是 x 位置还是 y 位置。一旦确定某个值是 x 位置还是 y 位置,另外一个值也就自动确定了。
- left/right:肯定是指定 x 位置
- topp/bottom:肯定是指定 y 位置
如果只指定了一个方位名词,另一个省略,则第二个值默认居中对齐。
如果参数值是精确坐标,第一个参数必须是 x 位置,第二个参数必须是 y 位置。如果只指定了一个数值,那么该数值一定是 x 坐标,另一个默认垂直居中。
方位名词和精确坐标也可以混合使用,此时第一个值必须是 x 坐标,第二个值必须是 y 坐标,例如:
1 | background-position: left 50px; |
而如下设置则是无效的,因为 x 坐标设置为 top 是无效的。
1 | background-position: top 50px; |
背景图像固定(背景附着)
background-attachment 属性用于设置背景图像是否固定或者随着页面的其余部分滚动。其语法规则为:
1 | background-attachment: scroll | fixed; |
- scroll:默认值,背景图像是随对象内容滚动的
- fixed:背景图像固定
背景复合写法
为了简化背景属性的代码,可以将背景属性的各个值合并写入一个背景复合属性 backgroud 中。当使用简写形式时,没有特定的顺序,一般习惯约定顺序为:
1 | background: 背景颜色 背景图片地址 背景平铺 背景图像滚动 背景图片位置; |
例如:
1 | background: transparent url(images/bg.jpg) no-repeat fixed left 50px; |
背景色半透明
CSS3 提供了背景颜色半透明的效果,其语法规则为:
1 | background: rgba(0, 0, 0, 0.5); |
- rgba 中的最后一个参数是 alpha 透明度。其取值范围在 0~1 之间:0 表示完全透明,1 表示完全不透明
- 习惯将
0.5中的 0 省略掉,写成rgba(0, 0, 0, .5) - 注意,这个效果设置的是背景色半透明,盒子里面的内容不受影响
Emmet 语法
Emmet 语法的前身是 Zen coding,它使用缩写来提高 HTML/CSS 代码的编写速度。VS code 内部已经集成了该语法。
快速生成 HTML 结构
- 直接输入标签名,然后按 Tab 键,可快速生成对应的 HTML 标签结构
- 相生成多个相同的标签,输入
标签名*数字,然后按 Tab 键,即可生成对应个数的 HTML 标签,例如div*3即可生成 3 个 div 标签 - 对于有父子关系的标签,可以使用
parent>child,然后再按 Tab 键,即可快速生成对应的嵌套 HTML 结构,例如ul>li,即可快速生成:
1 | <ul> |
- 对于有兄弟关系的标签,使用
label1+label2,然后再按 Tab 键即可快速生成对应的并列 HTML 结构,例如div+p即可快速生成:
1 | <div></div> |
- 如果要生成带有指定类名或 ID 名的标签,可以使用
mark.classname或mark#idname,然后再按 Tab 键,即可生成具有特定类名或 ID 属性的 mark 标签。如果省略 mark,则默认生成的是div标签,例如.test或#test,即可快速生成:
1 | <div class="test"></div> |
- 如果想生成的类名、标签名带有自增顺序,可以借助
$,例如h1.test$*3可以生成如下结构:
1 | <h1 class="test1"></h1> |
div#id$*3 可以生成如下结构:
1 | <div id="id1"></div> |
- 如果想要在生成的标签内部写入内容,可以使用
{},例如div{hello}可以生成如下结构:
1 | <div>hello</div> |
快速生成 CSS 样式
Emmet 语法同样适用于 CSS,它采用缩写形式即可快速生成 CSS 样式,以下是个几个示例:
w再按 Tab 键,可以快速生成width: ;ti再按 Tab 键,可以快速生成text-indent: ;fsi再按 Tab 键,可以快速生成font-style: italic;