此文章转载自MDN,MDN整理了其中CSS基础部分。
介绍
层叠样式表(Cascading Style Sheet,简称:CSS)是为网页添加样式的代码。
和 HTML 类似,CSS 也不是真正的编程语言,甚至不是标记语言。它是一门样式表语言,这也就是说人们可以用它来选择性地为 HTML 元素添加样式。
css的使用
我们写一个简单的css:
p {
color: red;
}
首先新建一个 styles 文件夹,在其中新建一个 style.css 文件,将这三行 CSS 保存在这个新文件中。
然后再将该 CSS 文件连接至 HTML 文档,否则 CSS 代码不会对 HTML 文档在浏览器里的显示效果有任何影响。
打开 index.html 文件,然后将下面一行粘贴到文档头(也就是 和 标签之间)。
<link href="styles/style.css" rel="stylesheet">
保存 index.html 并用浏览器将其打开。应该看到段落文字变红。
CSS规则集详解
我们看一下上一段CSS代码的结构
整个结构称为 规则集(通常简称“规则”),各部分释义如下:
选择器(Selector)
HTML 元素的名称位于规则集开始。它选择了一个或多个需要添加样式的元素(在这个例子中就是 p 元素)。要给不同元素添加样式只需要更改选择器就行了。
声明(Declaration)
一个单独的规则,如 color: red; 用来指定添加样式元素的属性。
属性(Properties)
改变 HTML 元素样式的途径。(本例中 color 就是
元素的属性。)CSS 中,由编写人员决定修改哪个属性以改变规则。
属性的值(Property value)
在属性的右边,冒号后面即属性的值,它从指定属性的众多外观中选择一个值(我们除了 red 之外还有很多属性值可以用于 color )。
注意其他重要的语法:
- 每个规则集(除了选择器的部分)都应该包含在成对的大括号里({})。
- 在每个声明里要用冒号(:)将属性与属性值分隔开。
- 在每个规则集里要用分号(;)将各个声明分隔开。
如果要同时修改多个属性,只需要将它们用分号隔开,就像这样:
p {
color: red;
width: 500px;
border: 1px solid black;
}
也可以选择多种类型的元素并为它们添加一组相同的样式。将不同的选择器用逗号分开。例如:
p, li, h1 {
color: red;
}
选择器
选择器有许多不同的类型。上面只介绍了元素选择器,用来选择 HTML 文档中给定的元素。但是选择操作可以更加具体。下面是一些常用的选择器类型:
选择器名称 | 选择的内容 | 实例 |
---|---|---|
元素选择器(也称作标签或类型选择器) | 所有指定 (该) 类型的 HTML 元素 | p 选择 <p> |
ID 选择器 | 具有特定 ID 的元素(单一 HTML 页面中,每个 ID 只对应一个元素,一个元素只对应一个 ID) | #my-id 选择 <p id="my-id"> 或 <a id="my-id"> |
类选择器 | 具有特定类的元素(单一页面中,一个类可以有多个实例) | .my-class 选择 <p class="my-class"> 和 <a class="my-class" > |
属性选择器 | 拥有特定属性的元素 | img[src] 选择 <img src="myimage.png"> 而不是 <img> |
伪(Pseudo)类选择器 | 特定状态下的特定元素(比如鼠标指针悬停) | a:hover 仅在鼠标指针悬停在链接上时选择 <a> 。 |
选择器的种类远不止于此,更多信息请参阅资料
字体和文本
说明:中文字体文件较大,不适合直接用于 Web Font。
在探索了一些 CSS 基础后,我们来把更多规则和信息添加至 style.css 中,从而让示例更美观。首先,让字体和文本变得更漂亮。
- 第一步,找到之前 Google Font 输出的地址。并以 元素的形式添加进 index.html 文档头( 和 之间的任意位置)。代码如下:
<link href="https://fonts.font.im/css?family=Open+Sans" rel="stylesheet" type="text/css">
以上代码为网页下载 Open Sans 字体,从而使自定义 CSS 中可以对 HTML 元素应用这个字体。
- 接下来,删除 style.css 文件中已有的规则。虽然测试是成功的了,但是红字看起来并不太舒服。
- 将下列代码添加到相应的位置,用你在 Google Fonts 找到的字体替代 font-family 中的占位行。( font-family 意味着你想要你的文本使用的字体。)这条规则首先为整个页面设定了一个全局字体和字号(因为 是整个页面的父元素,而且它所有的子元素都会继承相同的 font-size 和 font-family):
html {
/* px 表示“像素(pixels)”: 基础字号为 10 像素 */
font-size: 10px;
/* Google fonts 输出的 CSS */
font-family: 'Open Sans', sans-serif;
}
备注:
- CSS 文档中所有位于 /* 和 */ 之间的内容都是 CSS 注释,它会被浏览器在渲染代码时忽略。你可以在这里写下对你现在要做的事情有帮助的笔记。
- /* */ 不可嵌套,/这样的注释是/不行/的/。CSS 不接受 // 注释。
- 接下来为文档体内的元素(
<h1> (en-US
)、<li>
和<p>
)设置字号。将标题居中显示,并为正文设置行高和字间距,从而提高页面的可读性。
h1 {
font-size: 60px;
text-align: center;
}
p, li {
font-size: 16px;
/* line-height 后面可以跟不同的参数,如果是数字,就是当前字体大小乘上数字 */
line-height: 2;
letter-spacing: 1px;
}
可以随时调整这些 px 值来获得满意的结果。
CSS盒模型
编写 CSS 时你会发现,你的工作好像是围绕着一个一个盒子展开的——设置尺寸、颜色、位置,等等。页面里大部分 HTML 元素都可以被看作若干层叠的盒子。
并不意外,CSS 布局主要就是基于盒模型的。每个占据页面空间的块都有这样的属性:
padding
:即内边距,围绕着内容(比如段落)的空间。border
:即边框,紧接着内边距的线。margin
:即外边距,围绕元素外部的空间。
这里还使用了:width
:元素的宽度background-color
:元素内容和内边距底下的颜色color
:元素内容(通常是文本)的颜色text-shadow
:为元素内的文本设置阴影display
:设置元素的显示模式(暂略)
开始在页面中添加更多 CSS 吧!大胆将这些新规则都添加到页面的底部,而不要纠结改变属性值会带来什么结果。
更改页面颜色
html {
background-color: #00539F;
}
这条规则将整个页面的背景颜色设置为 所计划的颜色。
文档体格式设置
body {
width: 600px;
margin: 0 auto;
background-color: #FF9500;
padding: 0 20px 20px 20px;
border: 5px solid black;
}
现在是 <body>
元素。以上条声明,我们来逐条查看:
width: 600px;
—— 强制页面永远保持 600 像素宽。margin: 0 auto;
—— 为 margin 或 padding 等属性设置两个值时,第一个值代表元素的上方和下方(在这个例子中设置为 0),而第二个值代表左边和右边(在这里,auto 是一个特殊的值,意思是水平方向上左右对称)。你也可以使用一个,三个或四个值,参考 这里 。background-color: #FF9500;
—— 如前文所述,指定元素的背景颜色。我们给 body 用了一种略微偏红的橘色以与深蓝色的 元素形成反差,你也可以尝试其他颜色。padding: 0 20px 20px 20px;
—— 我们给内边距设置了四个值来让内容四周产生一点空间。这一次我们不设置上方的内边距,设置右边,下方,左边的内边距为 20 像素。值以上、右、下、左的顺序排列。border: 5px solid black;
—— 直接为 body 设置 5 像素的黑色实线边框。
定位页面主标题并添加样式
h1 {
margin: 0;
padding: 20px 0;
color: #00539F;
text-shadow: 3px 3px 1px black;
}
你可能发现页面的顶部有一个难看的间隙,那是因为浏览器会在没有任何 CSS 的情况下 给 <h1> (en-US)
等元素设置一些默认样式。但这并不是个好主意,因为我们希望一个没有任何样式的网页也有基本的可读性。为了去掉那个间隙,我们通过设置 margin: 0;
来覆盖默认样式。
至此,我们已经把标题的上下内边距设置为 20 像素,并且将标题文本与 HTML 的背景颜色设为一致。
需要注意的是,这里使用了一个text-shadow
属性,它可以为元素中的文本提供阴影。四个值含义如下:
- 第一个值设置水平偏移值 —— 即阴影右移的像素数(负值左移)。
- 第二个值设置垂直偏移值 —— 即阴影下移的像素数(负值上移)。
- 第三个值设置阴影的模糊半径 —— 值越大产生的阴影越模糊。
- 第四个值设置阴影的基色。
不妨尝试不同的值看看能得出什么结果。
图像居中
img {
display: block;
margin: 0 auto;
}
最后,我们把图像居中来使页面更美观。可以复用 body
的 margin: 0 auto
,但是需要一点点调整。 <body>
元素是块级元素,意味着它占据了页面的空间并且能够赋予外边距和其他改变间距的值。而图片是内联元素,不具备块级元素的一些功能。所以为了使图像有外边距,我们必须使用 display: block
给予其块级行为。
备注:
- 以上说明假定所选图片小于页面宽度(600 pixels)。更大的图片会溢出 body 并占据页面的其他位置。要解决这个问题,可以: 1)使用 图片编辑器 来减小图片宽度; 2)用 CSS 限制图片大小,即减小 元素 width 属性的值(比如 400 px)。
- 如果你暂时不能理解 display: block 和块级元素与行内元素的差别也没关系;随着你对 CSS 学习的深入,你将明白这个问题 。
实践
新建一个HTML原始文件
<!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">
<link href="styles/style.css" rel="stylesheet">
<title>一起来学习css吧!</title>
</head>
<body>
<h1>我是一级标题</h1>
<p>这是一个段落文本。在文本中有一个 <span>span element </span>并且还有一个 <a href="http://example.com">链接</a></p>
<p>这是第二段。包含了一个<em>强调</em>元素。</p>
<ul>
<li>项目1</li>
<li>项目2</li>
<li>项目<em>3</em></li>
</ul>
</body>
</html>
在HTML 文档的相同目录创建一个文件,保存并命名为 styles.css
。(看后缀知道此文件就是 CSS 文件)
为了把 styles.css 和 index.html 连接起来,可以在 HTML 文档中, 语句模块里面加上下面的代码:
<link rel="stylesheet" href="styles.css">
<link>
语句块里面,我们用属性 rel
,让浏览器知道有 CSS 文档存在(所以需要遵守 CSS 样式的规定),并利用属性 href
指定,寻找 CSS 文件的位置。你可以做测试来验证 CSS 是否有效:在 styles.css
里面加上 CSS 样式并观察显示的结果。下面,用你的编辑器打出下面的代码。
h1 {
color: red;
}
保存 HTML 和 CSS 文档,刷新浏览器网页,不出意外你将看到网页顶层的大标题变成红色了。如果看到这个现象,恭喜你:你已经成功将某些 CSS 样式运用到 HTML 上了。当然假设没有达到预想结果,可以仔细检查每句代码是否正确,加油:)
样式化 HTML 元素
通过上一节将大标题变成红色的例子,我们已经展示了我们可以选中并且样式化 HTML 元素。我们通过触发元素选择器实现这一点——元素选择器,即直接匹配 HTML 元素的选择器。例如,若要样式化一个文档中所有的段落,只需使用选择器 p
。若要将所有段落变成绿色,你可以利用如下方式:
p {
color: green;
}
用逗号将不同选择器隔开,即可一次使用多个选择器。譬如,若要将所有段落与列表变成绿色,只需:
p, li {
color: green;
}
改变元素的默认行为
只要一个 HTML 文档标记正确,即使像我们的例子那么简单,浏览器都会尽全力将其渲染至可读状态。标题默认使用大号粗体;列表旁总有项目符号。这是因为浏览器自带一个包含默认样式的样式表,默认对任何页面有效。没有了它们,所有文本会夹杂在一起变得一团糟,我们只得从头开始规定,好糟糕。话说回来,所有现代浏览器的默认样式都没什么差距。
不过你可能对浏览器的默认样式不太满意。没关系,只需选定那个元素,加一条 CSS 规则即可。就拿我们的无序列表
- 举个例子吧,它自带项目符号,不过要是你跟它有仇,你就可以这样移除它们:
li {
list-style-type: none;
}
把上述代码加到你的 CSS 里面试一试!
欢迎参阅 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;
}
该选择器将选择
- 内部的任何元素(
- 的后代)。因此在示例文档中,您应该发现第三个列表项内的现在是紫色,但是在段落内的那个没发生变化。
另一些可能想尝试的事情是在 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; }
在下面的例子中,你可以对超链接的不同状态尝试各种各样的值。我已经编写了一些规则,然而你肯定已经发现粉色看上去太浅以至于不好辨认。——换一个更好的颜色吧。你能将链接变为黑体吗?
我们对鼠标悬停于链接上的情况删除了下划线。你当然可以让超链接在任何情况下都没有下划线。但需要注意的是,对一个实际的站点,需要让浏览者知道“链接是链接”。为了让浏览者注意到一段文字中的某些部分是可点击的,最好保留 link 状态下的下划线。— 这是下划线的本来作用。不管你用 CSS 来做什么,都应当使得变化后的文档看上去更加清晰明了。— 在后面,当我们遇到类似的情况时,我们将适时指出。
备注:
在本教程以及整个 MDN 站点中,你会经常看到“无障碍”这个词。“无障碍”一词的意思是,我们的网页应当让每一个访客都能够理解、使用。
你的访客可能在一台使用鼠标和键盘操作的计算机前,也可能正在使用带有触摸屏的手机,或者正在使用屏幕阅读软件读出文档内容,或者他们需要使用更大的字体,或者仅仅使用键盘浏览站点。
一个朴素的 HTML 文档一般来说对任何人都是可以无障碍访问的,当你开始为它添加样式,记得不要破坏这种无障碍。同时使用选择器和选择符
你可以同时使用选择器和选择符。来看一些例子:
/* 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 代码,你很快就能找到窍门。总结
在本教程中,我们学习了使用 CSS 为文档添加样式的几种方法。在教程的剩下部分,我们将继续这个话题。不过,你现在已经有了足够的知识为文本建立样式;根据目标元素的不同用不同的方式应用样式;在 MDN 文档中查找属性和值。