这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
2.1 CSS入门
2.1.1 什么是CSS
CSS(层叠样式表)用于设置和布置网页——例如,更改内容的字体、颜色、大小和间距,将其拆分为多个列,或添加动画和其他装饰功能。这个模块为你掌握 CSS 的过程提供了一个温和的开端,包括它如何工作的基础知识,语法是什么样的,以及如何开始使用它来为 HTML 添加样式。
一份文档是由标记语言组织起来的文本文件 —— HTML 是最常见的标记语言,但你可能也听说过其他可标记语言,如 SVG 或 XML。
展示一份文档给用户实际上是将文档变成用户可用的文件。Browsers:如 Firefox,Chrome, 或 Edge,都可以将文档在电脑屏幕、投影仪或打印机等设备上进行可视化。
备注: 浏览器有时候也被称为 user agent,大致可以当这个程序是一个存在于计算机系统中的人。当我们讨论 CSS 时,浏览器是 User agent 的主要形式,然而它并不是唯一的一个。还有其他可用的 user agents — 像是那些可以把 HTML 和 CSS 文档转换为可以打印的 PDF 文档的软件。
CSS 可以用于给文档添加样式 —— 比如改变标题和链接的颜色及大小。它也可用于创建布局 —— 比如将一个单列文本变成包含主要内容区域和存放相关信息的侧边栏区域的布局。它甚至还可以用来做一些特效,比如动画。查看本段内容中所给出的特定案例。
CSS 语法
CSS 是一门基于规则的语言 —— 你能定义用于你的网页中特定元素样式的一组规则。比如“我希望页面中的主标题是红色的大字”
下面这段代码使用非常简单的 CSS 规则实现了之前提到的效果:
h1 {
color: red;
font-size: 5em;
}
语法由一个 选择器 (selector)起头。它 选择 (selects) 了我们将要用来添加样式的 HTML 元素。在这个例子中我们为一级标题(主标题<h1> (en-US)
)添加样式。
接着输入一对大括号{ }
。在大括号内部定义一个或多个形式为 属性 (property):值 (value); 的 声明 (declarations)。每个声明都指定了我们所选择元素的一个属性,之后跟一个我们想赋给这个属性的值。
冒号之前是属性,冒号之后是值。不同的 CSS 属性 (properties) (en-US) 对应不同的合法值。在这个例子中,我们指定了 color
属性,它可以接受许多颜色值;还有 font-size
属性,它可以接收许多 size units 值。
一个 CSS 样式表可以包含很多个规则。
h1 {
color: red;
font-size: 5em;
}
p {
color: black;
}
你会发现你已经很快掌握了一些属性的值,但是属性可以接受的值远不止这些。在 MDN 上每个属性都有单独的页面,不论你是忘记了某个属性,还是想要知道一个属性还能接受什么其它的值,这些页面都可以帮助你。
备注: 在 MDN 上的 ****CSS reference ****页面列举了所有的 CSS 属性页面(同时也包括其它的 CSS 特性)。另外,当你想要寻找一个 CSS 特性的更多内容时,多使用你的搜索引擎来搜索 "mdn css-feature-name" 。例如,搜索 "mdn color" 和 "mdn font-size"!
CSS 模块
你可以通过 CSS 为许多东西添加样式,CSS 由许多模块 (modules) 构成。你可以在 MDN 上浏览这些模块的参考内容 (MDN reference),许多模块都被组织在自己单独的文档页面。例如,我想查找一下 MDN reference 的 Backgrounds and Borders 模块的相关内容,来了解它是用来做什么的、它还包括什么属性、它还有什么其它特性等。你也可以在 CSS Specification 查找(见下文),它定义了 CSS 规范。
在这个阶段你不必过于担心 CSS 是如何组织的 (how CSS is structured),但是它能帮助你更好的掌握 CSS。例如,你注意到某个属性和另外一些属性的相似点,并且它们可能确实是相同的格式。
举个具体点的例子:如上文中的 Backgrounds and Borders 模块 — 你会发现 background-color
和 border-color
这两个属性在逻辑上相通。并且它也确实如此。
CSS 规范
所有的标准 Web 技术 (HTML, CSS, JavaScript 等) 都被定义在一个巨大的文档中,称作 规范 specifications (或者简称为 "specs"),它是由 (像是 W3C (en-US), WHATWG, ECMA 或 Khronos (en-US)) 这些规范化组织所发布的,其中还定义了各种技术是如何工作的。
CSS 也不例外——它是由 W3C(万维网联盟) 中的一个名叫 CSS Working Group 团体发展起来的。这个团体是由浏览器厂商和其他公司中对 CSS 感兴趣的人作为代表组成的。也有其他的人员,比如受邀专家 (invited experts) ,他们作为不从属于任何组织的独立声音加入团体。
新的 CSS 特性被开发出来,或是因为某个浏览器热衷于开发新功能,或是因为 Web 设计人员与开发者要求增加一个新特性,又或是 CSS Working Group 内部的讨论决定。CSS 始终在发展,并伴随着新的特性。然而,有一件事情从始至终都未改变,那就是不让新的改变破坏旧的网站,即使是 2000 年建立的网站,如今也能正常访问!
作为一个 CSS 新手,你会发现阅读 CSS 规范 中的内容非常吃力——它旨在为工程师在用户代理 (user agents) 中实现对 CSS 各种特性的支持,而不是作为一本为 Web 开发者理解 CSS 内容的教程。即使是有经验的开发者,也更倾向于使用 MDN 文档或者其它教程。但是,知晓它的存在,理解 CSS、规范 和 浏览器支持(见下文)之间的关系是很有价值的。
浏览器支持
让所有的浏览器都同时支持一个 CSS 新特性是不现实的,通常都会一个空档期——一些浏览器已经支持而另一些仍未支持。因此,查看特性的实现状态是非常有用的。在 MDN 上的每个属性的页面中都标有它们对应的状态,你可以通过这种方法来查看你是否可以去使用它。
2.1.2 实战
添加 CSS 试试看?
我们最想做的就是让 HTML 文档能够遵守我们给它的 CSS 规则。其实有三种方式可以实现,而目前我们更倾向于利用最普遍且有用的方式——在文档的开头链接 CSS。
在与之前所说的 HTML 文档的相同目录创建一个文件,保存并命名为 styles.css
。(看后缀知道此文件就是 CSS 文件)
为了把 styles.css
和 index.html
连接起来,可以在 HTML 文档中,<head>
语句模块里面加上下面的代码:
<link rel="stylesheet" href="styles.css">
<link>
语句块里面,我们用属性 rel
,让浏览器知道有 CSS 文档存在(所以需要遵守 CSS 样式的规定),并利用属性 href
指定,寻找 CSS 文件的位置。你可以做测试来验证 CSS 是否有效:在 styles.css
里面加上 CSS 样式并观察显示的结果。下面,用你的编辑器打出下面的代码。
h1 {
color: red;
}
保存 HTML 和 CSS 文档,刷新浏览器网页,不出意外你将看到网页顶层的大标题变成红色了。如果看到这个现象,恭喜你:你已经成功将某些 CSS 样式运用到 HTML 上了。
用逗号将不同选择器隔开,即可一次使用多个选择器。譬如,若要将所有段落与列表变成绿色,只需:
p, li {color: green;}
改变元素的默认行为
只要一个 HTML 文档标记正确,即使像我们的例子那么简单,浏览器都会尽全力将其渲染至可读状态。标题默认使用大号粗体;列表旁总有项目符号。这是因为浏览器自带一个包含默认样式的样式表,默认对任何页面有效。没有了它们,所有文本会夹杂在一起变得一团糟,我们只得从头开始规定,好糟糕。话说回来,所有现代浏览器的默认样式都没什么差距。
不过你可能对浏览器的默认样式不太满意。没关系,只需选定那个元素,加一条 CSS 规则即可。就拿我们的无序列表 <ul>
举个例子吧,它自带项目符号,不过要是你跟它有仇,你就可以这样移除它们:
li {list-style-type: none;}
欢迎参阅 MDN 上的 list-style-type
属性,看看到底有哪些值被支持。 list-style-type
页首提供互动性示例,您可以输入不同的值来瞅一瞅它们到底有什么用。关于每个值的详细描述都规规整整地列在下面。
通过参阅上述页面,你会发现你不仅能移除项目符号——你甚至能改变它们。赶快试试 square
,它能把默认的小黑球变成方框框。
使用类名
目前为止,我们通过 HTML 元素名规定样式。如果你愿意所有元素都一个样,也不是不可以,但大多数情况下,我估计你都不愿意。我知道你想干啥,你想用这种方式样式化这一片元素,又想用那种方式样式化那一片元素,真贪心。不过没关系,你可以给 HTML 元素加个类名(class),再选中那个类名,这样就可以了,大家基本上都这么用。
举个例子吧,咱们把 class 属性加到表里面第二个对象。你的列表看起来应该是这样的:
<ul>
<li>项目一</li>
<li class="special">项目二</li>
<li>项目 <em>三</em></li>
</ul>
在 CSS 中,要选中这个 special
类,只需在选择器的开头加个西文句点(.)。在你的 CSS 文档里加上如下代码:
.special {
color: orange;
font-weight: bold;
}
保存再刷新,就可以看到变化。
这个 special
类型可不局限于列表,它可以应用到各种元素上。举个例子,你可能也想让段落里边的 <span>
一起又橙又粗起来。试试把special
类属性加上去,保存,刷新,哇,生活就是这么美好。
有时你会发现选择器中,HTML 元素选择器跟类一起出现:
li.special {
color: orange;
font-weight: bold;
}
这个意思是说,“选中每个 special
类的 li
元素”。你真要这样,好了,它对 <span>
还有其它元素不起作用了。你可以把这个元素再添上去就是了:
li.special,
span.special {
color: orange;
font-weight: bold;
}
你们都是懒人,肯定不想每加一个 special 类的元素就改一遍 CSS 表,你肯定想把一个类的属性应用到多个元素上。所以说,有时还是别管元素,光看类就完事了,除非你意志坚定,坚持对这个类的某一种元素创造规则,还不让其它元素用。
根据元素在文档中的位置确定样式
有时候,您希望某些内容根据它在文档中的位置而有所不同。这里有很多选择器可以为您提供帮助,但现在我们只介绍几个选择器。在我们的文档中有两个 <em>
元素 ——一个在段落内,另一个在列表项内。仅选择嵌套在<li>
元素内的<em>
我们可以使用一个称为包含选择符的选择器,它只是单纯地在两个选择器之间加上一个空格。
将以下规则添加到样式表。
li em {color: rebeccapurple;}
该选择器将选择<li>
内部的任何<em>
元素(<li>
的后代)。因此在示例文档中,您应该发现第三个列表项内的<em>
现在是紫色,但是在段落内的那个没发生变化。
另一些可能想尝试的事情是在 HTML 文档中设置直接出现在标题后面并且与标题具有相同层级的段落样式,为此需在两个选择器之间添加一个 +
号 (成为 相邻选择符)
也将这个规则添加到样式表中:
h1 + p {
font-size: 200%;
}
下面的示例包含了上面的两个规则。尝试添加规则使位于段落中的 span 变为红色。如果没问题,您将看到在第一段中的 span 会变为红色,但是第一个列表项中的 span 不会改变颜色。
备注: 如你所见,CSS 给我们提供了几种定位元素的方法。到目前为止,我们只触及了皮毛!我们将对这些选择器进行适当的研究,更多的内容将在我们后面的选择器章节中介绍。
根据状态确定样式
在这篇教程中我们最后要看的一种修改样式的方法就是根据标签的状态确定样式。一个直观的例子就是当我们修改链接的样式时。当我们修改一个链接的样式时我们需要定位(针对) <a>
(锚)标签。取决于是否是未访问的、访问过的、被鼠标悬停的、被键盘定位的,亦或是正在被点击当中的状态,这个标签有着不同的状态。你可以使用 CSS 去定位或者说针对这些不同的状态进行修饰——下面的 CSS 代码使得没有被访问的链接颜色变为粉色、访问过的链接变为绿色。
a:link {
color: pink;
}
a:visited {
color: green;
}
你可以改变链接被鼠标悬停的时候的样式,例如移除下划线,下面的代码就实现了这个功能。
a:hover {
text-decoration: none;
}
同时使用选择器和选择符
你可以同时使用选择器和选择符。来看一些例子:
/* selects any <span> that is inside a <p>, which is inside an <article> */
article p span { ... }
/* selects any <p> that comes directly after a <ul>, which comes directly after an <h1> */
h1 + ul + p { ... }
你可以将多种类型组合在一起。试试将下面的代码添加到你的代码里:
body h1 + p .special {
color: yellow;
background-color: black;
padding: 5px;
}
上面的代码为以下元素建立样式:在 <body>
之内,紧接在 <h1>
后面的 <p>
元素的内部,类名为 special。
在我们提供的原始 HTML 文档中,与之符合的元素只有<span class="special">
.
如果你现在觉得这份代码太复杂了,别担心,一旦你开始编写更多的 CSS 代码,你很快就能找到窍门。
2.1.3 实战2
在你的 HTML 里面应用 CSS
在文档中应用 CSS 的三种方法
外部样式表
在 Getting started with CSS 中我们将外部样式表链接到页面。这是将 CSS 附加到文档中的最常见和最有用的方法,因为您可以将 CSS 链接到多个页面,从而允许您使用相同的样式表设置所有页面的样式。在大多数情况下,一个站点的不同页面看起来几乎都是一样的,因此您可以使用相同的规则集来获得基本的外观。
外部样式表是指将 CSS 编写在扩展名为.css
的单独文件中,并从 HTML <link>
元素引用它的情况:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My CSS experiment</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<h1>Hello World!</h1>
<p>This is my first CSS example</p>
</body>
</html>
CSS 文件可能如下所示:
h1 {
color: blue;
background-color: yellow;
border: 1px solid black;
}
p {
color: red;
}
<link>
元素的 href
属性需要引用你的文件系统中的一个文件。
在上面的例子中,CSS 文件和 HTML 文档在同一个文件夹中,但是你可以把 CSS 文件放在其他地方,并调整指定的路径以匹配,例如:
<!-- Inside a subdirectory called styles inside the current directory -->
<link rel="stylesheet" href="styles/style.css">
<!-- Inside a subdirectory called general, which is in a subdirectory called styles, inside the current directory -->
<link rel="stylesheet" href="styles/general/style.css">
<!-- Go up one directory level, then inside a subdirectory called styles -->
<link rel="stylesheet" href="../styles/style.css">
内部样式表
内部样式表是指不使用外部 CSS 文件,而是将 CSS 放在 HTML 文件<head>
标签里的<style>
标签之中。
于是 HTML 看起来就像下面这个样子:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My CSS experiment</title>
<style>
h1 {
color: blue;
background-color: yellow;
border: 1px solid black;
}
p {
color: red;
}
</style>
</head>
<body>
<h1>Hello World!</h1>
<p>This is my first CSS example</p>
</body>
</html>
有的时候,这种方法会比较有用(比如你使用的内容管理系统不能直接编辑 CSS 文件),但该方法和外部样式表比起来更加低效。在一个站点里,你不得不在每个页面里重复添加相同的 CSS,并且在需要更改 CSS 时修改每个页面文件。
内联样式
内联样式表存在于 HTML 元素的 style 属性之中。其特点是每个 CSS 表只影响一个元素:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My CSS experiment</title>
</head>
<body>
<h1 style="color: blue;background-color: yellow;border: 1px solid black;">Hello World!</h1>
<p style="color:red;">This is my first CSS example</p>
</body>
</html>
除非你有充足的理由,否则不要这样做! 它难以维护(在需要更新时,你必须在修改同一个文档的多处地方),并且这种写法将文档结构和文档表现混合起来了,这使得代码变得难以阅读和理解。将不同类型的代码分开存放在不同的文档中,会让我们的工作更加清晰。
在某些地方,内联样式更常见,甚至更可取。如果您的工作环境确实很严格(也许网站管理系统 (CMS) 仅允许您编辑 HTML 正文),则可能不得不使用它们。您也会发现它们很长时间被应用在 HTML 电子邮件中,以便与尽可能多的电子邮件客户端兼容。
选择器
每个 CSS 规则都以一个选择器或一组选择器为开始,去告诉浏览器这些规则应该应用到哪些元素上。以下都是有效的选择器或组合选择器的示例。
h1
a:link 状态选择器
.manythings 类选择器
#onething ID选择器
* 通配符选择器
.box p
.box p:first-child
h1, h2, .intro
专一性
通常情况下,两个选择器可以选择相同的 HTML 元素。考虑下面的样式表,其中我有一个规则,其中有一个将段落设置为蓝色的 p 选择器,还有一个将选定元素设置为红色的类。
.special {
color: red;
}
p {
color: blue;
}
比方说,在我们的 HTML 文档中,我们有一个带有特殊类的段落。这两条规则都适用,那么谁赢了?你认为我们的段落会变成什么颜色?
<p class="special">What color am I?</p>
CSS 语言有规则来控制在发生碰撞时哪条规则将获胜——这些规则称为级联规则和专用规则。在下面的代码块中,我们为 p 选择器定义了两个规则,但是段落最后是蓝色的。这是因为将其设置为蓝色的声明将出现在样式表的后面,而稍后的样式将覆盖以前的样式。这就是起作用的级联。
p {
color: red;
}
p {
color: blue;
}
但是,在我们同时使用了类选择器和元素选择器的前一个例子中,类将获胜,使得段落变红——即使它出现在样式表的前面。一个类被描述为比元素选择器更具体,或者具有更多的特异性,所以它获胜了。
属性和值
在最基本的层面上,CSS 由两个组成部分组成:
- 属性: 人类可读的标识符,指示您想要更改的样式特征 (例如
font-size
、width
、background-color
)。 - 值: 每个指定的属性都有一个值,该值指示您希望如何更改这些样式特性 (例如,要将字体、宽度或背景色更改为。)
下面的图像突出显示单个属性和值。属性名为 color
, 值为 blue
.
与值配对的属性称为 CSS 声明。CSS 声明放在 CSS 声明块中。下一张图片显示了我们的 CSS,并突出显示了声明块。
最后,CSS 声明块与选择器配对,以生成 CSS 规则集 (或 CSS 规则)。我们的图像包含两个规则,一个用于 h1
选择器,另一个用于 p
选择器。h1
的规则被突出显示。
将 CSS 属性设置为特定值是 CSS 语言的核心功能。CSS 引擎计算哪些声明应用于页面的每个元素,以便适当地布局和样式它。重要的是要记住,在 CSS 中,属性和值都是区分大小写的。每对中的属性和值由冒号 (:
) 分隔。
函数
calc() 函数
虽然大多数值是相对简单的关键字或数值,但也有一些可能的值以函数的形式出现。一个例子是 calc() 函数。这个函数允许您在 CSS 中进行简单的计算,例如:
<div class="outer"><div class="box">The inner box is 90% - 30px.</div></div>
.outer {
border: 5px solid black;
}
.box {
padding: 10px;
width: calc(90% - 30px);
background-color: rebeccapurple;
color: white;
}
如下所示:
一个函数由函数名和一些括号组成,其中放置了该函数的允许值。在上面的 calc()
示例中,我要求此框的宽度为包含块宽度的 90%,减去 30 像素。这不是我可以提前计算的东西,只是在 CSS 中输入值,因为我不知道 90% 会是什么。与所有值一样,MDN 上的相关页面将有使用示例,这样您就可以看到函数是如何工作的。
transform 函数
另一个例子是 <transform>
,例如 rotate()
。
<div class="box"></div>
.box {
margin: 30px;
width: 100px;
height: 100px;
background-color: rebeccapurple;
transform: rotate(0.8turn)
}
以上代码的输出如下所示:
@规则
到目前为止,我们还没有遇到 @rules
(发音为 "at-rules")。这是一些特殊的规则,为 CSS 提供了一些关于如何表现的指导。有些 @rules
规则很简单,有规则名和值。例如,要将额外的样式表导入主 CSS 样式表,可以使用 @import
:
@import 'styles2.css';
您将遇到的最常见的 @rule 之一是 @media
,它允许您使用媒体查询来应用 CSS,仅当某些条件成立 (例如,当屏幕分辨率高于某一数量,或屏幕宽度大于某一宽度时)。
在下面的 CSS 中,我们将给 <body>
元素一个粉红色的背景色。但是,我们随后使用 @media 创建样式表的一个部分,该部分仅适用于视口大于 30em 的浏览器。如果浏览器的宽度大于 30em,则背景色将为蓝色。
body {
background-color: pink;
}
@media (min-width: 30em) {
body {
background-color: blue;
}
}
在这些教程中,你将遇到一些其他的 @rules
规则
查看是否可以将媒体查询添加到 CSS 中,该查询将根据视口宽度更改样式。更改浏览器窗口的宽度以查看结果。