Skip to content

CSS 基础

CSS

  • 层叠样式表 (Cascading Style Sheets)
  • css可以用来为网页创建样式表,通过样式表可以对网页进行装饰。
  • 所谓层叠,可以将整个网页想象成是一层一层的结构,层次高的将会覆盖层次低的。
  • 而css就可以分别为网页的各个层次设置样式。

三种使用方式

方式优点缺点推荐程度
内联样式简单、直接不可复用、结构与表现耦合不推荐
内部样式表可复用、部分分离仅限当前页面不推荐
外部样式表完全分离、可复用、支持缓存需额外文件✅ 推荐

行内样式

  • 可以将css样式编写到元素的style属性当中
  • 将样式直接编写到style属性中,这种样式我们称为内联样式
  • 内联样式只对当前的元素的内容起作用,内联样式不方便复用
  • 内联样式属于结构与表现耦合,不方便后期的维护,不推荐使用
html
<p style="color:red;font-size:40px;">锄禾日当午,汗滴禾下土</p>
<p style="color:red;font-size:40px;">谁知盘中餐,粒粒皆辛苦</p>

内部样式表

  • 可以将css样式编写到head中的style标签里
  • 将样式表编写到style标签中,然后通过css选择器选中指定元素
  • 然后可以同时为这些元素一起设置样式,这样可以使样式进一步的复用
  • 将样式表写到style标签中,也可以使表现和结构进一步分离,它也是我们推荐的使用方式
html
<!-- style标签 写在 html文件的head 中 -->
<style type="text/css">
  p {
    color: red;
    font-size: 40px;
  }
</style>

外部样式表

  • 还可以将样式表编写到外部的css文件中,然后通过link标签将外部的css文件引入到当前页面中,这样外部文件中的css样式表将会应用到当前页面中。
  • 将css样式统一编写到外部的样式表中,完全使结构和表现分离,可以使样式表可以在不同的页面中使用,
  • 最大限度的使样式可以进行复用,将样式统一写在样式表中,然后通过link标签引入,可以利用浏览器的缓存
  • 加快用户访问的速度,提高了用户体验,所以在开发中我们最推荐使用的方式就是外部的css文件
html
<!-- link标签 写在 html文件的head 中 -->
<link rel="stylesheet" type="text/css" href="style.css" />
css
// style.css 文件中的内容
p {
  color: red;
  font-size: 40px;
}

CSS语法

选择器 声明块

  • 选择器: 通过选择器可以选中页面中指定的元素,并且将声明块中的样式应用到选择器对应的元素上。

  • 声明块: 声明块紧跟在选择器的后边,使用一对 {} 括起来,声明块中实际上就是一组一组的名值对结构, 这一组一组的名值对我们称为声明,在一个声明块中可以写多个声明,多个声明之间使用 ; 隔开, 声明的样式名和样式值之间使用 : 来连接。

  • 注释: 作用和HTML注释类似,只不过它必须编写在style标签中,或者是css文件中。

选择器(重要)

元素选择器

css
/* 为页面中的所有p元素,设置一个字体颜色为红色 */
/*
 * 元素选择器
 * 作用:通过元素选择器可以选取页面中的所有指定元素
 * 语法:标签名 {}
 */
p {
  color: red;
}

id选择器

css
/*
 * id选择器
 * - 通过元素的id属性值选中唯一的一个元素
 * - 语法:#id属性值 {}
 */
#id1 {
  font-size: 20px;
}

类选择器

html
<!-- 我们可以为元素设置class属性。class属性和id属性类似,
只不过class属性可以重复。拥有相同class属性值的元素,我们说他们是一组元素。
可以同时为一个元素设置多个class属性值,多个值之间使用空格隔开。-->
<p class="p2 hello">锄禾日当午</p>
<p class="p2">锄禾日当午</p>
<p class="p2">锄禾日当午</p>
css
/*
 * 类选择器
 * - 通过元素的class属性值选中一组元素
 * - 语法:
 *   .class属性值 {}
 */
.p2 {
  color: red;
}

通配选择器

css
/*
 * 通配选择器
 * - 他可以用来选中页面中的所有的元素
 * - 语法:* {}
 */

并集 & 交集 选择器

并集选择器

css
/*
 * 为id为p1的元素,class为p2的元素,还有h1,同时设置一个背景颜色为黄色
 */
/*
 * 选择器分组
 * - 通过选择器分组可以同时选中多个选择器对应元素
 * - 语法:选择器1, 选择器2, 选择器N {}
 */
#p1,
.p2,
h1 {
  background-color: yellow;
}

交集选择器

css
/*
 * 为拥有class为p3的span元素设置一个背景颜色为黄色
 *
 * 复合选择器(交集选择器)
 * - 作用:可以选中同时满足多个选择器的元素
 * - 语法:选择器1选择器2选择器N {}
 */
span.p3 {
  background-color: yellow;
}

/*
 * 对于id选择器来说,不建议使用复合选择器,因为 id 是唯一的。
 * p#p1 {
 *     background-color: red;
 * }
 */

后代选择器 & 子元素选择器

后代选择器

css
/*
 * 为div中的span设置一个颜色为绿色
 * 后代元素选择器
 * - 作用: 选中指定元素的指定后代元素
 * - 语法: 祖先元素 后代元素 {}
 */
div span {
  color: greenyellow;
}

子元素选择器

css
/*
 * 为div的子元素span设置一个背景颜色为黄色
 * 子元素选择器
 * - 作用: 选中指定父元素的指定子元素
 * - 语法: 父元素 > 子元素
 */
div > span {
  background-color: yellow;
}

IE6 及以下的浏览器不支持子元素选择器

属性选择器

属性选择器(Attribute Selectors) 是 CSS 中一类强大的选择器,它允许你根据 HTML 元素的属性是否存在或属性值是否匹配特定条件来选中元素。属性选择器对大小写敏感

选择器含义示例匹配的 HTML 元素
[attr]存在 attr 属性[title]<p title="hello">
[attr="val"]属性值完全等于 val[type="submit"]<input type="submit">
[attr~="val"]属性值是空格分隔的列表,其中包含 val[class~="btn"]<div class="btn primary">
[attr|="val"]属性值以 val 开头,且后面是 - 或结束[lang|="en"]<html lang="en"><html lang="en-US">
[attr^="val"]属性值以 val 开头(前缀)[href^="https"]<a href="https://example.com">
[attr $ ="val"]属性值以 val 结尾(后缀)[href $ =".pdf"]<a href="doc.pdf">
[attr*="val"]属性值包含 val(子串)[title*="home"]<a title="go home now">

兄弟选择器

css
/*
 * 为span后的一个p元素设置一个背景颜色为黄色
 * 后一个兄弟元素选择器
 * - 作用:可以选中一个元素后紧接着的指定的兄弟元素
 * - 语法:前一个 + 后一个
 */
span + p {
  background-color: yellow;
}

/*
 * 选中后边的所有兄弟元素
 * - 语法:前一个 ~ 后边所有
 */
span ~ p {
  background-color: yellow;
}

伪类和伪元素

特性伪类伪元素
作用选择元素的状态或位置创建或选中虚拟内容/部分
数量一个元素可同时匹配多个伪类一个元素只能有一个 ::before 和一个 ::after
语法单冒号 :(如 :hover推荐双冒号 ::(如 ::before
生成新元素是(虚拟元素)

伪类

伪类用于选择元素的特定状态或特殊位置,不是真实存在于 HTML 中的类,而是由 CSS 提供的一种“虚拟类”。

常见伪类说明
:hover鼠标悬停时的状态
:focus元素获得焦点时(如输入框被点击)
:active元素被激活时(如点击按钮的瞬间)
:visited已访问过的链接
:first-child父元素的第一个子元素
:nth-child(n)父元素的第 n 个子元素
:not(selector)排除匹配 selector 的元素
:first-of-type父元素的第一个指定类型的子元素
:nth-of-type(n)父元素的第 n 个指定类型的子元素
css
a:hover {
  color: red;
}
p:first-child {
  font-weight: bold;
}

伪元素

伪元素用于创建不在文档中的虚拟元素,通常用来插入装饰性内容或选中内容的特定部分(如首行、首字母)。
语法(现代标准使用双冒号 ::,但单冒号 : 仍被兼容)

常见伪元素说明
::before在元素内容前插入内容
::after在元素内容后插入内容
::first-line选中元素的第一行文本
::first-letter选中元素的第一个字母
::selection选中用户高亮(选中)的文本
::placeholder选中输入框或文本域中的占位符文本
css
p::first-letter {
  font-size: 2em;
  color: blue;
}
.quote::before {
  content: "“";
}
.quote::after {
  content: "”";
}

⚠️ 注意

::before 和 ::after 必须配合 content 属性使用,否则不会显示。

选择器优先级

像儿子可以继承父亲的遗产一样,在CSS中,祖先元素上的样式,也会被他的后代元素所继承。
利用继承,可以将一些基本的样式设置给祖先元素,这样所有的后代元素将会自动继承这些样式。
但是并不是所有的样式都会被子元素所继承,比如:背景相关的样式都不会被继承,边框相关的样式、定位相关的样式。

  • 当使用不同的选择器,选中同一个元素时并且设置相同的样式时,
  • 这时样式之间产生了冲突,最终到底采用哪一个选择器定义的样式,由选择器的优先级(权重)决定
  • 优先级高的优先显示
优先级选择器类型示例
🔴 最高!importantcolor: red !important;
🟠 高内联样式<div style="...">
🟡 中高ID 选择器#main
🟢 中类 / 属性 / 伪类.btn, [disabled], :focus
🔵 低元素 / 伪元素p, ::before
⚪ 很低通配符*
⚪ 最低继承inherited styles

⚠️ 注意

  • !important
    覆盖所有其他规则(包括内联样式)。应尽量避免使用,会破坏样式可维护性。
  • 相同优先级时
    后定义的规则胜出(CSS 的“层叠”特性)。
  • 继承的样式
    继承的样式优先级为 0,任何显式声明都会覆盖它。

长度单位

单位类型相对基准受嵌套影响响应式典型用途
px绝对单位屏幕物理像素(固定值)固定尺寸(图标、边框、精确布局)
%相对单位父元素对应属性的值
(如 width: 50% → 父宽的 50%)
自适应容器、流体布局
em相对单位当前元素自身的 font-size
(若未设置,则继承父级)
是(嵌套会累积)文本内间距、按钮 padding、局部缩放
rem相对单位根元素 <html>font-size全局布局、组件尺寸、可访问性设计
vw视口单位1% 的视口宽度
(1vw = viewport width × 1%)
极强全屏横幅、响应式标题、流体字体
vh视口单位1% 的视口高度
(1vh = viewport height × 1%)
极强全屏区块、登录页、动态高度区域

说明

视口(Viewport):指浏览器内容可视区域,不包括地址栏、工具栏等

颜色单位

表示法示例透明度支持兼容性
关键字red, transparenttransparent所有浏览器
Hex#ff0000, #f00所有浏览器
Hex (8位)#ff000080较新浏览器
RGB / RGBArgb(255,0,0), rgba(...,0.5)所有浏览器
HSL / HSLAhsl(0,100%,50%)IE9+
HWBhwb(0, 0%, 50%)较新浏览器

附录

附1:inline-block基线对齐

  • 在使用 inline-block 元素时,它们的垂直对齐默认是按照 基线(baseline) 对齐。
  • 如果某个元素内部没有内容或其 overflow 不为 visible,则它的基线会退化为 底部 margin 边缘。
  • 这会导致多个 inline-block 元素在垂直方向上出现错位。
  • 解决方法:使用 vertical-align 属性(如 top、middle、bottom、baseline 等)来统一对齐方式。

附2:元素之间的关系

  • 父元素:直接包含子元素的元素
  • 子元素:直接被父元素包含的元素
  • 祖先元素:直接或间接包含后代元素的元素,父元素也是祖先元素
  • 后代元素:直接或间接被祖先元素包含的元素,子元素也是后代元素
  • 兄弟元素:拥有相同父元素的元素叫做兄弟元素

附3:a标签的伪类书写顺序

text
/*
 * 涉及到a的伪类一共有四个:
 *   :link
 *   :visited
 *   :hover
 *   :active
 * 但是注意:在书写时必须按照这个顺序来写,否则可能出现语法错误
 * 而这四个选择器的优先级是一样的。
 */

Released under the MIT License.