CSS如何工作
| 先决条件: | 基本计算机知识,安装的基本软件,基本知识 developer.mozilla.org/en-US/Learn/Getting_started_with_the_web/Dealing_with_files\">处理文件和HTML基础知识(了解 HTML简介)。 |
|---|---|
| 目的: | 要了解CSS是什么,以及它是如何工作的基本水平。 |
什么是 CSS?
CSS是一种用于指定如何向用户呈现文档的语言 —如何指定他们的风格,布局 etc.
一个网页文档通常是用标记语言结构化的文本文件 — HTML 是最常用的标记语言, 但你依然可以遇见一些其他的标记语言,比如SVG或者XML| SVG or XML.
向用户呈现文档意味着将文档转换为适合受众群体的可用表单。 浏览器,例如 .org / zh-CN / docs / Glossary / Mozilla_Firefox"class ="glossaryLink"> Firefox , class ="glossaryLink"> Chrome 或 Internet Explorer , 被设计成例如在计算机屏幕,投影仪或打印机上可视地呈现文档。
CSS如何影响HTML??
Web浏览器将CSS规则应用于文档以影响它们的显示方式。 CSS规则由以下形成:
- 一组 属性 的集合,它的内容表示 HTML 的内容如何呈现。比如,我想让元素的宽度是其父元素的50%,元素背景是红色。
- 一个 选择器,它选择了要应用这些属性值的元素。比如,我想要应用我的CSS规则到HTML文档中的所有段落。
样式表中包含的一组CSS规则确定了网页的外观,你将在下一篇文章中了解更多关于CSS语法的内容 — CSS Syntax.
一个基础CSS示例
上面的描述可能意义不明确,所以让我们通过提出一个快速示例来确保清楚描述的。首先,我们使用一个简单的HTML文档,包含一个 <h1> 元素和一个 <p> 元素((注意到,使用 <link> 元素将样式表应用到 HTML):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My CSS experiment</title>
<link rel="stylesheet" href="style.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;
}
第一条规则使用 h1 选择器开始,这意味着它将其属性值应用到 <h1> 元素,它包含三个属性及其值(每个属性/值对称为声明):
- 第一个声明设置文本的颜色是蓝色;
- 第二个声明将背景颜色设置为黄色;
- 第三个声明在标题周围放置一个1像素宽的边框,实线(不是虚线、点线等),边框颜色是黑色。
第二个规则从 p 选择器开始,这意味着规则仅仅对 <p> 元素生效。它包含一条设置字体颜色为红色的声明。
在Web浏览器中,上面的代码将产生以下输出:

这不怎么好看,但是说明了 CSS 是如何工作的。
主动学习:编写第一个CSS
现在我们给你一个机会来编写自己的一点CSS。你可以使用下面的实时可编辑示例的输入区域,有一些简单的HTML元素和一些CSS属性,用类似于上面看到的方式,试着添加一些简单的样式声明到你的CSS,来定义 HTML 的样式。
如果写错了,你可以随时点击 "重置" 按钮重置。如果你真的不知道怎么写,点击显示结果按钮看到一个可行的回答。
Playable code
<div class="body-wrapper" style="font-family: 'Open Sans Light',Helvetica,Arial,sans-serif;">
<h2>HTML Input</h2>
<textarea id="code" class="html-input" style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;"><h1>Hello World!</h1>
<p>This is a paragraph.</p>
<ul>
<li>This is</li>
<li>A list</li>
</ul></textarea>
<h2>CSS Input</h2>
<textarea id="code" class="css-input" style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;">h1 {
}
p {
}
li {
}</textarea>
<h2>Output</h2>
<div class="output" style="width: 90%;height: 10em;padding: 10px;border: 1px solid #0095dd;"></div>
<div class="controls">
<input id="reset" type="button" value="Reset" style="margin: 10px 10px 0 0;">
<input id="solution" type="button" value="Show solution" style="margin: 10px 0 0 10px;">
</div>
</div>
var htmlInput = document.querySelector(".html-input");
var cssInput = document.querySelector(".css-input");
var reset = document.getElementById("reset");
var htmlCode = htmlInput.value;
var cssCode = cssInput.value;
var output = document.querySelector(".output");
var solution = document.getElementById("solution");
var styleElem = document.createElement('style');
var headElem = document.querySelector('head');
headElem.appendChild(styleElem);
function drawOutput() {
output.innerHTML = htmlInput.value;
styleElem.textContent = cssInput.value;
}
reset.addEventListener("click", function() {
htmlInput.value = htmlCode;
cssInput.value = cssCode;
drawOutput();
});
solution.addEventListener("click", function() {
htmlInput.value = htmlCode;
cssInput.value = 'h1 {\n color: blue;\n background-color: yellow;\n border: 1px solid black;\n}\n\np {\n color: red;\n}\n\nli {\n text-shadow: 2px 2px 3px purple;\n}';
drawOutput();
});
htmlInput.addEventListener("input", drawOutput);
cssInput.addEventListener("input", drawOutput);
window.addEventListener("load", drawOutput);
CSS实际上如何工作?
当浏览器显示文档时,它将文档的内容与其样式信息组合。它分两个阶段处理文档:
关于 DOM
DOM具有树状结构。 标记语言中的每个元素,属性和文字都将成为 DOM节点 / a>。 节点由它们与其他DOM节点的关系定义。 一些元素是子节点的父节点,子节点具有兄弟节点。
了解DOM有助于您设计,调试和维护CSS,因为DOM是您的CSS和文档的内容满足。
DOM表示
而不是一个漫长而无聊的解释,让我们举一个例子来看看DOM和CSS如何一起工作。
让我们假设下面的HTML代码:
<p> Let's use: <span>Cascading</span> <span>Style</span> <span>Sheets</span> </p>
在DOM中,与我们的< p> 元素相对应的节点是父节点。 它的孩子是一个文本节点和对应于我们的< span> 元素的节点。 SPAN 节点也是父节点,文本节点作为子节点:
P ├─ "Let's use:" ├─ SPAN | └─ "Cascading" ├─ SPAN | └─ "Style" └─ SPAN └─ "Sheets"
这是浏览器如何解释先前的HTML片段 - 渲染上面的DOM树,然后在浏览器中输出它:
p {margin:0;}
应用 CSS 到 DOM
假设我们在文档中添加了一些CSS,以便对其进行风格化。 同样,HTML如下:
<p> Let's use: <span>Cascading</span> <span>Style</span> <span>Sheets</span> </p>
如果我们应用以下CSS:
span {
border: 1px solid black;
background-color: lime;
}
浏览器将解析HTML并从中创建一个DOM,然后解析CSS。 由于CSS中唯一可用的规则有一个 span 选择器,它将应用该规则到三个跨度中的每一个。 更新的输出如下:
如何将CSS应用到HTML
有三种不同的方式将CSS应用于HTML文档,有的方式比其他方式更有用。在这里,我们将简要回顾一下每一种方式:
外部样式表
你已经在这篇文章看到了外部样式表,但是并不知道它的名字。外部样式表是你的CSS写在一个单独的扩展名为.css的文件中,并从HTML <link> 元素中引用它,此时 HTML 文件看起来像这样:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My CSS experiment</title>
<link rel="stylesheet" href="style.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;
}
这种方法是最好的,因为你可以使用一个样式表来设置多个文档的样式,并且更新的时候只需要在一个地方更新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声明,被 style 属性包括着:
<!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>
在非必要的情况下不要这么做,这样很难维护(你可能在每个文档的多个地方需要更新多次同样的信息),并且它将 CSS 的样式和 HTML 结构混合在一起,使CSS难以阅读和理解。保持不同类型的代码分离和纯净使得开发和维护代码更为容易。
您唯一使用内联样式是当您的工作环境是受限制性的(也许您的CMS只允许您编辑HTML主体)。
下一步
到了这里你应该理解了 CSS 的基本工作原理和你的浏览器如何处理 CSS。接下来你将会学习 CSS 语法 (CSS syntax).