整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

D3.js实战教程:2 操作DOM

章涵盖

  • 为D3项目设置本地开发环境
  • 从 DOM 中选择元素
  • 将 HTML 或 SVG 元素添加到选区
  • 设置和修改DOM元素的属性和样式

现在我们已经确定了 D3 的角色及其工具生态系统,是时候开始工作了!在本章中,我们将为第一个可视化奠定基础,同时学习如何使用 D3 操作 DOM(文档对象模型)。

DOM 操作是任何 D3 项目的根源,并且您将在本章中学习的技术可能是您作为 D3 开发人员最常使用的技术。首先,我们将介绍选择,它允许我们从 DOM 中获取单个或多个元素。您会发现 D3 使选择变得非常简单和直观。然后,一旦我们做出选择,我们就会想用它做一些事情。我们在 D3 项目中经常执行的一项操作是将 HTML 或 SVG 元素添加到选择中。例如,为了创建可视化效果,我们经常将 SVG 形状附加到 SVG 容器内。最后,我们调整这些 SVG 形状的位置、大小和颜色。我们通过设置它们的属性和样式来做到这一点。

由于本书重点关注在本地开发环境中构建项目,因此在我们深入研究 D3 技术之前,您需要拥有一个。在 2.2 节中,我们将解释如何使用 VS Code 及其 Live Server 扩展在几分钟内准备好本地环境。

2.1 您的第一个 D3 可视化

在本章和下一章中,您将开发第一个 D3 可视化:如图 2.1 所示的条形图。尽管我们在第 1 章中提到 D3 不一定是制作简单、经典图表的最有效工具,但条形图非常适合介绍 D3 的基本概念。坚持使用我们,很快您就会拥有坚实的基础,使您能够轻松构建复杂的可视化。

我们的条形图背后的数据来自数据可视化协会 ( datavisualizationsociety.org )主办的2021 年数据可视化 - 行业状况调查。

图2.1 数据可视化从业者最流行的技术。我们将在本章中开始构建这个条形图。



2,181 名数据可视化从业者(从专业人士到学生再到业余爱好者)回答了 2021 年行业状况调查。我们将可视化调查中一个问题的答案:“您经常使用哪些技术来可视化数据?”,受访者可以从预定义列表中选择所有适用的工具。在图 2.1 中,您可以看到生成的条形图,其中工具垂直列出,每个条形的长度代表选择该工具的受访者数量。根据这项调查,D3 跻身数据可视化工具前 10 名。让我们开始吧!

2.2 准备环境

在开始使用 D3 之前,我们需要决定在哪里构建和运行我们的项目。我们可以使用在线代码编辑器,例如 Observable ( observablehq.com ) 或 Codepen ( codepen.io ),这些选项非常适合快速测试和共享代码。但由于本书的目标是帮助您准备好将 D3 项目发送到网站和 Web 应用程序中,因此我们将选择本地开发环境。

现在,如果设置开发环境的想法让您感到畏缩,请不要担心。那种需要花半天的时间流汗、哭泣的日子已经一去不复返了。借助现代工具,您的整个设置第一次不会超过几分钟,之后只需单击按钮即可启动并运行。

此时,您可能想知道为什么我们不能简单地使用浏览器打开 HTML 文件,就像我们在第 1 章中的 SVG 形状库练习中所做的那样。虽然这种方法有时可以很好地工作,但最终会导致浏览器拒绝执行具体任务和抛出错误。出于安全原因,某些浏览器阻止使用 JavaScript 加载本地文件,而是需要通过 Web 服务器加载它们。由于在 D3 项目中,我们通常需要加载数据文件,因此我们确实需要一个 Web 服务器。

在本书中,我们将使用代码编辑器Visual Studio Code(也称为 VS Code),通常与其 Live Server 扩展结合使用,后者提供本地 Web 服务器。但如果您已经有了首选设置,请随意使用它并跳至第 2.2.1 节。

笔记

我们将在本书第一部分中使用的项目结构非常简单,而且有点老式。我们的目标是让环境尽可能简单,以便您可以专注于学习 D3。但是,如果您是一名更高级的开发人员并且希望使用基于模块的项目,那么您完全可以这样做。有关通过 npm 安装 D3 并将库导入文件的说明,请参阅第 8 章的开头(第 8.2 节)。

VS Code 在开发人员中广受欢迎。它是免费、开源、易于使用且功能强大的。它具有内置的 Git 命令(无需在侧面打开终端窗口!)并且高度可定制。如果您的计算机上尚未安装 VS Code,可以从 Visual Studio Code 官方网站(https://code.visualstudio.com/Download)下载。拥有 VS Code 后,您将需要安装其Live Server 扩展。

如果您需要安装帮助,请参阅附录 A。本附录还包含有关如何使用 Live Server 扩展启动和停止本地 Web 服务器的说明。

笔记

如果您还没有下载代码文件,请在本书的 Github 存储库 ( https://github.com/d3js-in-action-third-edition/code-files ) 上下载。从现在到本章结束,我们将使用该chapter_02/start文件夹。如果您在任何时候遇到困难并需要查看解决方案,您可以在该chapter_02/end文件夹中找到它。使用本章的代码文件时,仅打开一个开头或一个结尾代码编辑器中的文件夹。如果您一次打开所有章节的文件并使用 Live Server 扩展来为项目提供服务,则某些路径将无法按预期工作,尤其是当我们将数据集加载到项目中时。代码文件分为多个部分。当我们转到本书中的新部分时,您可以继续处理初始代码文件或从专用于该部分的文件夹重新开始。两种选择都应该导致相同的结果。

2.2.1 我们第一个D3项目的结构

我们将在下一章中处理的 D3 项目都将具有类似的结构,如图 2.2 所示。

图2.2 我们的第一个D3项目的文件夹结构


在项目的根目录下,我们有一个index.html文件,其中包含项目的初始标记。在本书的第一部分中,我们也将在此处将 D3 库、JavaScript 文件和 CSS 文件加载到项目中。

然后我们有三个文件夹:

  • 该/css文件夹包含与项目相关的所有 CSS 文件。虽然本书不重点介绍 CSS,但我们偶尔会使用它。为简单起见,我们还将样式分组到最少量的文件中。但请记住,在专业项目中,CSS 文件夹的结构可能更加复杂,并且通常涉及 SASS 或 LESS 等 CSS 预处理器。
  • 该/data文件夹包含我们的数据集。对于条形图,我们的数据集是一个 CSV 文件,其中值用逗号分隔。数据集的每一行都包含一种技术,后面是计数,或者调查受访者选择该技术的次数。
  • 最后,该/js文件夹包含我们的 JavaScript 文件。为了简单起见,我们将把 D3 代码写入一个文件main.js. 但稍后,我们将讨论如何将代码拆分为多个文件或组件,以获得更好的可维护性和可测试性。

2.2.2 将D3加载到项目中

在开始之前,请通过查看 VS Code 窗口的左下角来检查您的 Web 服务器是否正在运行。它应该显示“端口 5500”,表明服务器正在运行。如果显示“上线”,请单击以启动实时服务器。现在我们已经启动并运行了 Web 服务器,在开始使用 D3 编码之前我们还需要做一件事:将 D3 库加载到我们的项目中。在本书中,我们将使用两种主要方法。第一个是添加一个脚本标签来index.html链接到最新版本的 D3。我们可以使用这种方法加载整个 D3 库或仅加载特定模块。第二种方法是将 D3 作为 NPM 模块加载,主要适合使用 React 或其他 JavaScript 框架构建的站点。

在本章中,我们将选择第一种方法,因为它是最简单的。随着本书的进展,我们将开始使用第二种方法,它更能代表当今专业 D3 项目的构建方式。

在 VS Code 或您选择的代码编辑器中,打开index.html位于文件夹根目录的文件。在结束正文标记 ( </body>) 之前,使用标记加载 D3 库的版本 7,这是撰写本书时的最新版本script。main.js添加另一个脚本标签以加载位于文件夹中的文件/js并保存您的项目。您可以在清单 2.1.a 中了解如何继续。

<script src="https://d3js.org/d3.v7.min.js"></script>
<script src="js/main.js"></script>

笔记

d3js.org的主页始终包含如何将最新版本的 D3 库加载到项目中的说明和代码片段。

浏览器按照与 中列出的脚本标签相同的顺序读取 JavaScript 文件index.html。我们必须先加载D3库main.js。否则,浏览器将无法访问main.js. 它会抛出错误并且代码不会执行。

我们还希望脚本成为网页上最后加载的内容,因此我们将脚本标签放置在结束正文标签 ( ) 之前</body>。通过这种方法,我们可以减少页面的加载时间,而不必在显示 DOM 之前等待脚本加载。在尝试从脚本文件中操作 DOM 之前,我们还要确保 DOM 可用。

清单 2.1.a 在脚本标签中加载整个 D3 库 - index.html

<!DOCTYPE html>
<html>
<head> ... </head>
<body>
  <div class="container">
    <h1>You are about to start working with D3!</h1>
  </div>
 
  <script src="https://d3js.org/d3.v7.min.js"></script> #A
 
  <script src="js/main.js"></script> #B
 
</body> #C
</html>

现在,让我们测试 D3 库和main.js文件是否已正确加载到我们的项目中。在代码编辑器中,转到/js文件夹并打开main.js. 将以下代码片段复制粘贴到 中main.js,然后保存文件。

d3.select("h1").style("color", "plum");

在下一节中,我们将详细解释此代码片段中的 D3 方法的用途,但现在,我们假设我们已选择标题 h1 并将其颜色更改为 CSS 颜色名称“plum”。如果你在浏览器中查看你的项目,标题的颜色应该已经改变,如图 2.3 所示。

图2.3 D3修改的标题颜色


现在我们已经确认 D3 已加载到我们的项目中,您可以从 中删除片段main.js和 h1 标题index.html。在下一节中,我们将介绍 D3 选择。

2.3 选择元素

在构建 D3 项目时,我们不断地操作 DOM,任何 DOM 操作都是从选择开始的。选择就像从 DOM 中抓取一个元素并准备好进行进一步操作。D3 有两种选择方法:d3.select()和d3.selectAll()。

该方法d3.select()采用选择器作为参数,并返回与该选择器匹配的第一个元素。此方法链接到d3对象并用于选择一个元素。如图2.4所示,选择器参数可以是类属性、id、标签名称或上述的任意组合,就像我们在CSS中使用的选择器一样。

图2.4 select()方法


让我们以图 2.5 所示的虚构 DOM 示例为例。它由一个包含 h1 标题的 div 元素、一个带有 class 的段落元素intro和另一个带有 id 的 div组成viz-container。该 div 将另一个段落和一个 SVG 容器包装在一起。最后,SVG 容器包含三个圆形元素。这些圆圈中的第一个和最后一个有类faded。

图 2.5 一个虚构的 DOM 示例



如果我们想要选择 h1 标题,我们可以使用它的标签名称作为传递给该d3.select()方法的选择器,如下所示:

d3.select("h1");

同样,如果我们想选择带有 class 的段落intro或带有 id 的 div viz-container,我们可以使用它们各自的 class 或 id 属性作为选择器。与 CSS 选择器一样,类名前面有一个点 ( .), ID 前面有一个主题标签 ( #)。

d3.select(".intro");
d3.select("#viz-container");

我们还可以使用选择器的组合。例如,如果我们想选择 div 内 id 为 的段落元素viz-container,我们在两个选择器之间留一个空格。

d3.select("#viz-container p");

需要记住的一件重要事情是,该方法d3.select()仅返回 DOM 中与其选择器匹配的第一个元素。例如,我们的 DOM 示例中有三个圆形元素,如图 2.6 所示。但选择d3.select("circle")只返回第一个,而忽略其他。

图2.6 d3.select()方法返回的DOM元素


那么,如果我们需要在选择中包含多个元素,我们该怎么办呢?这就是我们使用该d3.selectAll()方法的时候。d3.selectAll()工作原理与 类似d3.select(),只不过它返回与其选择器匹配的所有 DOM 元素。例如,如果我们回到虚构的 DOM 示例,d3.selectAll("circle")则返回 DOM 中包含的所有圆形元素。

图2.7 d3.selectAll()方法返回的DOM元素

有时了解这一点也很有帮助,就像在 CSS 中一样,我们可以将多个选择器字符串分组,并用逗号分隔。例如,在下面的代码片段中,我们选择h1类为 的标题和段落intro。

d3.selectAll("h1, .intro");

图 2.8 用逗号对选择器进行分组


大多数时候,您需要将您的选择存储到 JavaScript 常量中,以便以后可以重用和操作它们。您可以像使用任何 JavaScript 常量 ( const) 或变量 ( let) 一样存储 D3 选择。

const myCircles = d3.selectAll("circle");

2.4 将元素添加到选择中

选择固然很好,但如果我们不对它们做任何事情,它们就没有多大用处。D3 中的典型模式是执行选择以将另一个元素附加到其中。尽管普通 JavaScript 已经允许我们附加元素,但 D3 使其变得更加容易。

用于将元素添加到选择的主要 D3 方法是selection.append()。该append()方法添加一个新元素作为选择的最后一个子元素,并采用元素的类型或标签的名称作为参数。

图2.9append()方法

让我们回到我们虚构的 DOM 示例。如果我们想添加一个矩形元素作为 SVG 容器的最后一个子元素,我们首先选择 SVG 容器,然后将追加方法链接到选择。要附加的节点类型(元素)作为参数rect传递给该方法。append()

d3.select("svg").append("rect");

图2.10 使用selection.append()方法添加一个元素作为选择的最后一个子元素


我们还可以d3.selectAll("div")选择 DOM 中的每个 div 节点,并向每个节点添加一个段落元素,如图 2.11 所示。

d3.selectAll("div").append("p");

图 2.11 当与 d3.selectAll() 结合使用时,append 方法将节点添加到选择的每个元素中。


为了将我们所学到的知识付诸实践,让我们开始构建本章简介中描述的条形图。

确保start第 2 章代码文件的文件夹在代码编辑器中仍然打开,并且本地 Web 服务器正在运行。如果您需要回顾如何使用 VS Code 的 Live Server 扩展启动 Web 服务器,请参阅附录 A。打开该文件index.html并注意它包含一个带有 class 的 div 元素responsive-svg-container。

正如第 1 章中所讨论的,大多数 D3 可视化都是使用 SVG 元素构建的,我们的条形图也不例外。为此,我们需要一个 SVG 容器,用于制作图表的 SVG 形状将放入其中。我们现在将添加这个 SVG 元素。

main.js打开文件夹中包含的文件/js。使用方法d3.select(),选择类为 的 divresponsive-svg-container并在该 div 中添加一个 SVG 元素。由于 div 是空的,因此可以使用append()或insert()方法。它们将具有完全相同的效果。以下代码片段显示了该append()方法如何链接到选择。

d3.select(".responsive-svg-container")
  .append("svg");

保存文件main.js并在浏览器中查看项目。视口中看不到任何变化,但如果打开检查器,您将看到 SVG 元素已添加到 DOM,这正是我们想要的!

图2.12 添加到DOM树的SVG元素

在下一节中,我们将通过给 SVG 一个viewBox属性来使其具有响应能力。

2.5 设置和修改属性

在第一章中,我们广泛讨论了主要的 SVG 元素以及决定其位置和大小的属性。我们还解释说,作为 D3 开发人员,您将需要在代码中设置和修改这些属性。现在是学习如何做的时候了!

可以使用D3方法设置和修改属性selection.attr(),其中“attr”代表“属性”。如图2.13所示,该attr()方法有两个参数,第一个是属性的名称,第二个是属性的值。该值可以直接设置,也可以通过访问器函数设置,我们将在第 3 章中讨论。

图 2.13 attr() 方法

在我们的条形图练习中,围绕 SVG 容器的 div 元素具有类responsive-svg-container。main.css如果您打开文件夹中的文件/css,您将看到此类应用了响应式 SVG 元素容器所需的所有样式,如第 1.2.2 节中所述。这里,容器的max-width属性为 1200px,这也是条形图的最大宽度。

为了让我们的 SVG 容器在适应其容器的同时保持其宽高比,我们只需要设置其 viewBox 属性。我们将使用attr()该方法。正如您在下一个代码片段中看到的,传递给该方法的第一个参数attr()是属性的名称,在本例中为viewBox。请注意该属性名称的“B”字母是大写字母。表示属性区分大小写,必须遵守viewBox属性的驼峰式大小写表示法,以便浏览器识别它。

第二个参数是属性的值viewBox,它是四个数字的列表。前两个数字是viewBox坐标系的原点,位于(0,0)。最后两个数字是 viewBox 的宽度和高度。宽度对应于max-width容器 div 的属性,因此为 1200px,让我们估计高度为 1600px。如果需要的话,我们可以稍后调整。我们的 viewBox 属性的值为"0 0 1200 1600"。

d3.select(".responsive-svg-container")
  .append("svg")
    .attr("viewBox", "0 0 1200 1600");

设置 SVG 元素的 viewBox 属性,保存main.js并在检查器中查看您的项目。您将看到该viewBox属性已添加到 SVG 元素中,如图 2.14 所示。此外,如果您缩小浏览器的视口,SVG 元素将进行调整,同时保持其纵横比为 1200:1600。

图 2.14 具有 viewBox 属性的 SVG 元素



让我们将最新的代码保存到一个名为svg我们很快就会使用的 JavaScript 常量中。

const svg = d3.select(".responsive-svg-container")
  .append("svg")
    .attr("viewBox", "0 0 1200 1600");

每次我们使用.append()或.insert()方法向选择添加新元素时,我们都会更改选择返回的元素。例如,当我们重用constant时svg,它不会返回带有类的div responsive-svg-container,而是返回我们添加到其中的SVG容器。

D3 缩进约定

在进一步讨论之前,我们先讨论一下 D3 缩进约定。在我们最后的代码片段中,您可能已经注意到每个链接的方法都写在一个新行上。这样做有助于提高可读性,尤其是当超过 2 或 3 个方法链接在一起时。您可能还注意到该append()方法缩进了两个空格,而 attr() 方法使用了四个缩进空格,因此遵循缩进约定。

在 D3 中,每次我们将新元素附加到选择时,我们都会更新选择所针对的 DOM 元素。当我们设置新添加元素的属性和样式时,适当的缩进可以帮助我们了解属性和样式应用于哪个选择。

D3 缩进约定



当多个元素一个接一个地附加时,缩进约定特别方便。想象一下,添加 SVG 元素并设置 viewBox 属性后,我们将一个 group 元素附加到 SVG 容器中,其类为my-group. 然后,我们将一个矩形元素附加到组中并设置其所需的属性。正如您在上图中看到的,我们需要链接多个方法才能实现这一点。但是,由于缩进约定,链很容易阅读,我们一目了然地看到每个属性应用于哪个选择或元素。

条形图,就像我们正在构建的那样,由矩形组成,而 SVG 矩形是使用元素创建的rect。为了练习选择和attr()方法,我们将在条形图中添加一个矩形,该矩形将代表在调查中选择 D3.js 工具的数据可视化从业者的数量。data.csv如果你打开文件夹中的文件/data,你会发现有414名练习者表示他们经常使用D3。

在 中main.js,首先调用常量svg,它返回 SVG 容器。rect在 SVG 容器内添加一个元素。在下面的代码片段中,我们使用了append()方法来添加 rect 元素,但我们也可以使用方法insert()。保存您的项目并确认该rect元素已添加到 SVG 中。

const svg = d3.select(".responsive-svg-container")
  .append("svg")
    .attr("viewBox", "0 0 1200 1600");
 
svg
  .append("rect");

该rect元素存在于 DOM 中,但在屏幕上尚不可见,因为尚未设置其所需的属性。我们知道 SVG 矩形需要四个属性才能出现在屏幕上。您可以参考 1.2.2 节来回顾这些概念。和x属性y控制矩形左上角的位置。我们(10, 10)暂时将其放置在。矩形的宽度对应于有多少练习者选择 D3 作为工具,即 414,其高度可以是任意数字,我们将使用 16。通过分别给出 414 和 16 的 和 属性值,我们的矩形width将height宽度为 414 像素,高度为 16 像素。这四个属性的值以数字形式传递。

svg
  .append("rect")
    .attr("x", 10)
    .attr("y", 10)
    .attr("width", 414)
    .attr("height", 16);

最后,矩形的 fill 属性设置为 CSS 颜色名称"turquoise"并作为字符串传递。

svg
  .append("rect")
    .attr("x", 10)
    .attr("y", 10)
    .attr("width", 414)
    .attr("height", 16)
    .attr("fill", "turquoise");

请注意我们在这里如何使用缩进约定:当我们追加矩形时创建的新选择使用两个缩进空格,而方法attr()使用四个空格。这样,我们就可以清楚地看出属性已应用于元素rect。

保存项目后,该矩形将在浏览器的视口中可见。

图 2.15 附加到 SVG 容器中的矩形元素

2.6 设置和修改样式

为了使我们的可视化元素具有我们想要的外观和感觉,我们需要能够对其应用样式。传统的 CSS 样式表方法是一种很好的方法,而且通常是出于可维护性目的的更好选择。但有时,直接使用 D3 设置和修改样式属性很方便,特别是当样式旨在表示数据时。

D3允许我们用方法设置和修改元素的样式属性selection.style()。该方法有两个参数。第一个是样式属性的名称,第二个是其值。

图2.16 style()方法


回到我们的条形图练习,在 中main.js,将一个style()方法链接到 SVG 容器选择,该方法存储在名为 的常量中svg。就像下面的代码片段一样,使用该style()方法将边框应用到 SVG 容器。您可以给它任何您想要的值。这里我们使用简写属性来应用宽度为 1px 的黑色边框。

const svg = d3.select(".responsive-svg-container")
  .append("svg")
    .attr("viewBox", "0 0 1200 1600")
    .style("border", "1px solid black");

SVG 容器周围的边框将帮助我们可视化我们正在工作的空间。它还将帮助我们理解该style()方法是如何工作的。

保存您的项目并在浏览器中查看它。在 DOM 检查器中找到 SVG 容器。您应该看到在 style 属性中添加了 border 属性,如图 2.17 所示。这意味着该style()方法注入内联样式。

图 2.17 使用 style() 方法应用边框

使用 SVG 元素时,某些样式可以作为属性或使用内联样式应用,例如 和fill属性stroke。没有严格的规则表明我们应该使用 theattr()或 thestyle()方法来应用此类属性,但一些开发人员更喜欢保持一致,并且始终将表示属性应用为 CSS 或内联样式,而不是使用属性。这可能是一个好主意,特别是当我们希望通过将生成形状的代码与指示形状的代码分开来使级联样式易于管理时。在本书中,我们将使用 attr() 和 style() 方法以及外部 CSS 文件来设置 SVG 元素的表示属性。

让我们用一个例子来说明这一点。在 中main.js,将一个style()方法链接到矩形选择,并使用此方法对矩形应用不同颜色的第二个填充。在下面的代码片段中,我们使用 CSS color "plum"。

svg
  .append("rect")
    .attr("x", 10)
    .attr("y", 10)
    .attr("width", 414)
    .attr("height", 16)
    .attr("fill", "turquoise")
    .style("fill", "plum");

现在,打开main.css文件并向矩形添加第三个填充属性。这里我们使用了CSS颜色"orange"。

rect {
  fill: orange;
}

图 2.18 填充作为属性、来自永恒样式表和内联样式应用

我们的矩形现在具有三个填充属性,应用方式不同。它有一个 color 填充"turquoise",作为属性应用,另一个 color 填充"plum",作为内联样式,最后一个 color 填充"orange",从外部 CSS 样式表应用。这当然不是我们在现实生活中会做的事情,仅用于演示目的。

保存您的项目并注意使用样式属性应用的填充如何覆盖其他两个。在图 2.19 中,您可以看到如何应用级联样式。内联样式会覆盖任何其他样式,后跟从外部 CSS 样式表应用的样式。填充属性排在最后。牢记这条规则将帮助您制定适合您的习惯、团队和项目的策略,同时避免困惑为什么一种风格在屏幕上可见而另一种风格不可见。

我们现在知道如何执行选择、向 DOM 添加元素以及如何定位它们并设置它们的样式。但是像我们在这里所做的那样将矩形一一添加到我们的条形图中根本没有效率。在下一章中,我们将学习数据绑定如何帮助我们一次添加所有矩形。main.js在我们到达那里之前,请从和 中删除与矩形相关的代码main.css。文件 main.js 现在仅包含清单 2.1.b 中的代码。

清单 2.1.b 第 2 章末尾的 main.js 内容

const svg = d3.select(".responsive-svg-container")
  .append("svg")
    .attr("viewBox", "0 0 1200 1600")
    .style("border", "1px solid black");

访问 D3 模块文档

D3 包含一系列模块,我们可以独立使用这些模块,也可以根据项目的需要进行组合。每个模块包含多个执行相关任务的方法。

我们在本章中讨论的所有方法都是模块d3-selection ( https://github.com/d3/d3-selection ) 的一部分。该模块托管在 github 上,是值得信赖且始终最新的资源。

如果您是 Web 开发新手,此类 API 文档一开始可能会令人生畏,但您参考它的次数越多,您就会开始更好地理解其技术语言。

2.7 总结

  • D3 项目需要 Web 服务器才能正常运行。在本地开发环境中访问 Web 服务器的一种快速简便的方法是使用 VS Code 的 Live Server 扩展。
  • 有两种方法可以将 D3 库加载到项目中:通过index.html向库链接添加脚本标记或作为 NPM 模块。在本书的第一章中,为了简单起见,我们使用脚本标签方法。
  • D3库可以全部加载,也可以只加载我们需要的D3模块,这样可以提高我们项目的性能。
  • 通过脚本标签加载文件和库时,脚本标签列出的顺序与浏览器读取脚本的顺序相同。这意味着链接到 D3 库的脚本标签必须出现在加载我们使用 D3 的 JavaScript 文件的脚本标签之前。否则,浏览器将无法访问 JavaScript 文件中使用的 D3 方法,并且会引发错误。
  • d3.select()在 D3 中,我们可以使用和方法从 DOM 中选择元素d3.selectAll()。第一个方法仅返回第一个元素,而第二个方法则返回与其选择器匹配的所有 DOM 元素。
  • 作为参数传递给select()和selectAll()方法的选择器字符串与 CSS 样式表中使用的选择器相同。它们使用标签名称、类名称、id 或这些名称的组合来标识 DOM 元素。
  • 该append()方法允许添加一个元素作为选择的最后一个子元素。该insert()方法的工作原理类似,但添加一个元素作为选择的第一个子元素。两种方法都将元素的类型作为参数。
  • 该attr()方法用于向元素添加或修改属性。它需要两个参数:属性的名称及其值。
  • 该style()方法允许设置和修改 DOM 元素的样式属性。它还需要两个参数:样式属性的名称及其值。
  • 通过该style()方法,我们应用内联样式,覆盖从外部 CSS 样式表和表示属性应用的样式。

战wxPython系列-056

GDI系统中的设备上下文包含一些基本元素,例如颜色,画刷,画笔或字体等等。wx.Colour定义设备上下文中对象显示的颜色。wx.Brush是一个用于填充区域的绘图工具,它用于绘制形状的背景,它有颜色和风格。wx.Pen用于绘制形状的轮廓,它有颜色、宽度和样式。wx.Font则是一个决定文本外观的对象。

一、wx.Colour简介

wx.Colour是表示红、绿、蓝(RGB)强度值和Alpha值组合的对象,用于确定绘图颜色。有效的RGB和Alpha值范围为0 ~ 255。

可以使用wx.Colour类来定义各种各样的颜色。例如可以使用SetTextForeground和SetTextBackground函数来定义一个设备上下文中文本的颜色,也可以使用wx.Colour来创建画笔和刷子。

有多种方法来创建wx.Colour对象,例如可以使用RGB三元色的值(0到255)来构建wx.Colour,或者通过一个标准的字符串,比如WHITE或者CYAN,或者从另外一个wx.Colour对象创建。还可以直接使用系统预定的颜色对象指针: wx.BLACK, wx.WHITE, wx.RED, wx.BLUE, wx.GREEN, wx.CYAN,和 wx.LIGHT_GREY等。使用wx.NullColour对象用来代表未初始化的颜色对象。

可以使用wx.SystemSettings类可以获取很多系统默认的颜色,比如3D表面颜色,默认的窗口背景颜色,菜单文本颜色等等。

下面列出了目前支持的标准颜色:aquamarine, black, blue, blue violet, brown, cadet blue, coral, cornflower blue, cyan, dark gray, dark green, dark olive green, dark orchid, dark slate blue, dark slate gray, dark turquoise, dim gray, firebrick, forest green, gold, goldenrod, gray, green, green yellow, indian red, khaki, light blue, light gray, light steel blue, lime green, magenta, maroon, medium aquamarine, medium blue, medium forest green, medium goldenrod, medium orchid, medium sea green, medium slate blue, medium spring green, medium turquoise, medium violet red, midnight blue, navy, orange, orange red, orchid, pale green, pink, plum, purple, red, salmon, sea green, sienna, sky blue, slate blue, spring green, steel blue, tan, thistle, turquoise, violet, violet red, wheat, white, yellow, 和 yellow green。

wx.Colour常用方法

  • Red(self):返回红色值。
  • Green(self):返回绿色值。
  • Blue(self):返回蓝色值。
  • Alpha(self):返回alpha值,在不支持alpha的平台上,它总是返回wx.ALPHA_OPAQUE。
  • GetRed(self):返回红色值。
  • GetGreen(self):返回绿色值。
  • GetBlue(self):返回蓝色值。
  • GetRGB(self):获取单个32位值的RGB或RGBA颜色值。注意,GetRGB返回的值以0作为其最高字节,独立于Alpha实际返回的值。所以对于完全不透明的颜色,GetRGBA的返回值是0xFFBBGGRR,而GetRGB的返回值是0x00BBGGRR。
  • GetRGBA(self):获取单个32位值的RGB或RGBA颜色值。注意,GetRGB返回的值以0作为其最高字节,独立于Alpha实际返回的值。所以对于完全不透明的颜色,GetRGBA的返回值是0xFFBBGGRR,而GetRGB的返回值是0x00BBGGRR。
  • GetLuminance(self):返回颜色亮度值(公式: 0.299*R+0.587*G+0.114*B)。
  • Set (self, red, green, blue, alpha=ALPHA_OPAQUE):使用给定值设置RGB值。
  • Set (self, RGB):使用给定值设置RGB值。
  • Set (self, str):使用类似html的语法:”#”后面跟着6个十六进制数字,分别表示红、绿、蓝分量的字符串来设置RGB值, 或者使用系统预定义的颜色字符串如wx.Colour(“pale green”)来设置。
  • SetRGB(self, colRGB):从单个32位值设置RGB或RGBA颜色值。数colRGB和colRGBA应该分别采用0x00BBGGRR和0xAABBGGRR的形式,其中0xRR、0xGG、0xBB和0xAA是红色、绿色、蓝色和alpha分量的值。
  • SetRGBA(self, colRGBA):从单个32位值设置RGB或RGBA颜色值。数colRGB和colRGBA应该分别采用0x00BBGGRR和0xAABBGGRR的形式,其中0xRR、0xGG、0xBB和0xAA是红色、绿色、蓝色和alpha分量的值。

二、演示

下面的例子演示了如何使用颜色值。

#颜色(wx.Colour)

import wx

class SampleColour(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleColour, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        self.SetTitle("实战wxPython: GDI-颜色")
        self.SetSize(400, 320)

        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.Centre()

    def OnPaint(self, e):
        dc = wx.PaintDC(self)
        dc.SetPen(wx.Pen("#d4d4d4"))

        dc.SetBrush(wx.Brush(wx.BLUE))
        dc.DrawRectangle(30, 15, 90, 60)

        dc.SetBrush(wx.Brush(wx.GREEN))
        dc.DrawRectangle(150, 15, 90, 60)

        dc.SetBrush(wx.Brush(wx.RED))
        dc.DrawRectangle(270, 15, 90, 60)

        dc.SetBrush(wx.Brush(wx.Colour("dark gray")))
        dc.DrawRectangle(30, 105, 90, 60)

        dc.SetBrush(wx.Brush(wx.Colour("magenta")))
        dc.DrawRectangle(150, 105, 90, 60)

        dc.SetBrush(wx.Brush(wx.Colour("medium goldenrod")))
        dc.DrawRectangle(270, 105, 90, 60)

        dc.SetBrush(wx.Brush('#5f3b00'))
        dc.DrawRectangle(30, 195, 90, 60)

        dc.SetBrush(wx.Brush('#4c4c4c'))
        dc.DrawRectangle(150, 195, 90, 60)

        dc.SetBrush(wx.Brush('#785f36'))
        dc.DrawRectangle(270, 195, 90, 60)

def main():
    app = wx.App()
    sample = SampleColour(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()

上面的实例我们使用三种不同的颜色设置方法进行画刷的颜色填充,使用DrawRectangle()方法绘制矩形。

图1:wx.Colour演示

三、本文知识点

  • 了解设置wx.Colour演示的三种方法。
  • 了解系统内建颜色字符串。
  • 为画笔和画刷设置颜色。

前一篇:wxPython - GDI系统简介

欢迎关注,评论,收藏,点赞,和转发。

二部分 CSS


第八章 css基础知识


  • css基础知识:
  • css样式表的定义
  • css:(Cascading Style Sheets)层叠样式表;
  • 分类及位置:内部样式-head区域style标签里面
  • 外部样式-link调用
  • 内联样式-标签元素里面
  • css内的注释:/*注释内容*/
  • css样式表的语法
  • CSS规则由两个主要的部分构成:要添加样式的盒子名或者标签名、和要添加的样式。
  • 盒子名或者标签名{属性:值;}
  • CSS中几种颜色的表示方法
  • 用颜色名表示
  • 有17个预先确定的颜色,它们是
  • aqua, black, blue, fuchsia, gray, green, lime, maroon, navy,
  • olive, orange, purple, red, silver, teal, white, and yellow
  • 用十六进制的颜色值表示(红、绿、蓝)
  • #FF0000或者#F00
  • 用rgb(r,g,b)函数表示
  • 如:rgb(255,255,0)
  • 用hsl(Hue,Saturation,Lightness)函数表示(色调、饱和度、亮度)
  • 如:hsl(120,100%,100%),色调0代表红色,120代表绿色,240代表
  • 蓝色
  • 用rgba(r,g,b,a)函数表示
  • 其中a表示的是改颜色的透明度,取值范围是0~1,其中0代表完全透明
  • 用hsla(Hue,Saturation,Lightness,alpha)函数表示
  • 色调、饱和度、亮度、透明度
  • 例子
 <div style="position:absolute;top:0px">
	<div style="background-color:gray;">background-color:gray</div>
	<div style="background-color:#F00;">background-color:#F00</div>
	<div style="background-color:#ffff00;">background-color:#ffff00</div>
	<div style="background-color:rgb(255,0,255);">background-color:rgb(255,0,255)</div>
	<div style="background-color:hsl(120,80%,50%);">background-color:hsl(120,80%,50%)</div>
	<div style="background-color:rgba(255,0,255,0.5);">background-color:rgba(255,0,255,0.5)</div>
	<div style="background-color:hsla(120,80%,50%,0.5);">background-color:hsla(120,80%,50%,0.5)</div>
</div>
  • 内部样式表
  • 当单个页面需要设置样式时,就应该使用内部样式表。
  • 使用 <style></style>标签在文档<head></head>里面定义内部样式表
<head>
 <style type="text/css" >
 p{color:red;}
 </style>
</head>
  • 从外部引入到样式分为两种:(注意写在head标签里面)
  • 当样式需要应用于很多页面时,就需要用到外部样式表,首先需要创建一个css文件,然后引用到我们的页面中。
  • Link样式表式: <link rel=”stylesheet” type=”text/css” href=”my.css”(href表示路径)>
  • Html式: <style type="text/css">@import url("css.css");></style>
  • 内联样式表(优先级高)
  • 写在标签里面的样式
  • 如:<p style="color:red;"></p>
  • 表示给p标签里面的文字颜色设置为红色
  • 区别:外链样式与导入样式
  • link标签是属于xhtml范畴,而@import则是css2.1中特有的。link标签除了可以加载CSS外,还可以做很多其它的事情,比如定义RSS,定义rel连接属性等,@import就只能加载CSS了。
  • 加载的顺序的区别,link加载的css时,是一种并行(没有尝试是否是这样)加载CSS方式,而@impor则在整个页面加载完成后才加载。
  • 兼容性的区别,因@import``CSS2.1才特有的,所以对于不兼容CSS2.1的浏览器来说,无效。
  • 在样式控制上(比如动态改变网页的布局时,使用javascript操作DOM)的区别,此时@import就无能为力了。

  • 样式的优先级补充
  • 相同权值情况下,CSS样式的优先级总结来说,就是——就近原则(离被设置元素越近优先级别越高):
  • 内联样式表(标签内部) > 嵌入样式表(当前文件中)> 外部样式表(外部文件中)
  • 权值不同时,浏览器是根据权值来判断使用哪种css样式的,哪种样式权值高就使用哪种样式
  • 层叠优先级是:
  • 浏览器缺省< 外部样式表 < 内部样式表 < 内联样式
  • 其中样式表又有:类选择器 < 类派生选择器<ID选择器 < ID派生选择器
  • 派生选择器以前叫上下文选择器,所以完整的层叠优先级是:
  • 浏览器缺省 <外部样式表 < 外部样式表类选择器 < 外部样式表类派生选择器< 外部样式表ID选择器< 外部样式表ID派生选择器< 内部样式表 < 内部样式表类选择器 < 内部样式表类派生选择器 < 内部样式表ID选择器 < 内部样式表ID派生选择器 < 内联样式…共12个优先级
  • 另外,如果同一个元素在没有其他样式的作用影响下,其Class定义了多个并以空格分开,其优先级顺序为:
  • 一个元素同时应用多个class,后定义的优先(即近者优先),加上!important者最优先!

第九章 css选择器(上)

  • css选择器:
  • class类选择器可以重复利用
  • id选择器唯一
  • 标签选择器
  • 什么是选择器:css选择器就是要改变样式的对象
  • 选择器{属性:值;属性:值;}
  • 标签选择器:页面中所有的标签都是一个选择器 p{color:red;}
  • ID选择器
  • 选择id命名的元素 以 # 开头 #p1{color:#0f0;}
  • 类选择器
  • class选择器,选择clas命名的元素 以.开头 .first{color:#00f;}
  • css代码写完后上线前要经过压缩处理
  • 本地和服务器分两个css版本(备份)
  • 压缩后注释都清除,空间体积减少
  • 群组选择器
  • 选择多个元素,以逗号隔开 #main,.first,span,a,h1{color:red;}
  • 包含选择器
  • 选择某元素的后代元素,也称后代选择器,父类与子类间以空格隔开p
  • span{color:red;}
  • 属性选择器
  • 选择包含某一属性的元素
  • a[title]{color:red;} 选择包含title的a标签
  • a[title][href]{color:red;} 选择包含title和href的a标签
  • > + 选择器子类选择器:只选择子元素(只选择儿子)(相当于包含元素)
  • p > span{color:red;}
  • 相邻兄弟选择器:只选择后面的相邻兄弟元素
  • p + span{color:red;}

第十章 css选择器(下)


  • <a>伪类选择器
  • a:link {color:#FF0000;} / 未访问的链接 / (只用于a标签)
  • a:visited {color:#00FF00;} / 已访问的链接 / (只用于a标签)
  • a:hover {color:#FF00FF;}/* 鼠标移动到链接上
  • */(可和其他标签结合一起用)
  • a:active {color:#0000FF;} / 选定的链接 /
  • 注意
  • 伪类选择器的排序很重要,a:link a:visited a:hover a:active,记作lvha
  • 输入伪类选择器(针对表单)
  • input:focus{color:red;} / 键盘输入焦点 /
  • 其他伪类选择器
  • p:first-child{color:red;} /* 第一个p */
  • :before 在元素之前添加内容。
  • :after 在元素之后添加内容。
  • css优先规则
  • 内联样式表-> ID 选择器—> Class 类选择器->标签选择器

第十一章 背景属性


  • 背景属性:
  • 背景的添加 :
  • 背景颜色的添加:
  • background:red;
  • backgronnd-color:red;
  • 背景图片的添加:
  • background:url(“images/1.jpg”);
  • backgronnd-image:url(“images/1.jpg”);
  • 背景的平铺
  • 什么是平铺?平铺就是图片是否重复出现
  • 不平铺:background-repeat:no-repeat;
  • 水平方向平铺:background-repeat:repeat-x;
  • 垂直方向平铺:background-repeat:repeat-y;
  • 完全平铺:默认为完全平铺
  • 背景图片的定位
  • 背景图片的定位就是可以设置显示背景图片的位置,通过属性background-position来实现
  • background-position的取值可为英文单词或者数值和百分值。
  • background-positon的英文单词取值
  • top left
  • top center
  • top right
  • center left
  • center center
  • center right
  • bottom left
  • bottom center
  • ottom right
  • background-positon的数值取值
  • background-position:x y;
  • positon的百分值取值
  • background-position:x% y%;
  • 背景图片的大小
  • 背景图片的大小可以通过属性background-size来设置background-size的取值可为数值和百分值。
  • background-size的数值取值
  • background-size:x y;
  • background-size的数值取值
  • background-size:x% y%;
  • 背景图片的滚动
  • 背景图片是否随着内容的滚动而滚动由background-attachment设置
  • background-attachment:fixed; 固定,不随内容的滚动而滚动
  • background-attachment:scroll; 滚动,随内容的滚动而滚动

第十二章 文字文本属性


  • css文字文本属性:
  • 文字属性
  • color:red; 文字颜色
  • font-size:12px; 文字大小
  • font-weight:“bold” 文字粗细(bold/normal)
  • font-family:“宋体” 文字字体
  • font-variant:small-caps小写字母以大写字母显示
  • 文本属性
  • text-align:center; 文本对齐(right/left/center)
  • line-height:10px; 行间距(可通过它实现文本的垂直居中)
  • text-indent:20px; 首行缩进
  • text-decoration:none;
  • 文本线(none/underline/overline/line-through)
  • letter-spacing: 字间距

第十三章 盒子模型


  • 盒子模型
  • 盒子模型就是一个有高度和宽度的矩形区域
  • 所有html标签都是盒子模型
  • div标签自定义盒子模型
  • 所有的标签都是盒子模型
  • class和id的主要差别是:class用于元素组(类似的元素,或者可以理解为某一类元素),而id用于标识单独的唯一的元素。
  • 盒子模型的组成
  • 盒子模型组成部分:
  • 自身内容:width、height 宽高
  • 内边距: padding
  • 盒子边框: border 边框线
  • 与其他盒子距离: margin外边距
  • 内容+内边距+边框+外边距=面积
  • border 边框
  • 常见写法 border:1px solid #f00;
  • 单独属性:
  • border-width:
  • border-style:
  • dotted 点状虚线
  • dashed(虚线)
  • solid(实线)
  • double(双实线)
  • border-color (颜色)
  • padding 内边距
  • 值:像素/厘米等长度单位、百分比
  • padding:10px; 上下左右
  • padding:10px 10px; 上下 左右
  • padding:10px 10px 10px; 上 左右 下
  • padding:10px 10px 10px 10px; 上 右 下 左(设置4个点–>顺时针方向)
  • 单独属性:
  • padding-top:
  • padding-right:
  • padding-bottom:
  • padding-left:
  • 当设置内边距的时候会把盒子撑大,为了保持盒子原来的大小,应该高度和宽度进行减小,根据width和height减小
  • margin 外边距
  • 值:与padding相同
  • 单独属性:与padding相同
  • 外边距合并:两个盒子同时设置了外边距,会进行一个外边距合并

补充盒子模型内容


  • 标准盒子模型
  • 盒子模型是css中一个重要的概念,理解了盒子模型才能更好的排版。其实盒子模型有两种,分别是 ie盒子模型和标准 w3c 盒子模型。他们对盒子模型的解释各不相同,先来看看我们熟知的标准盒子模型
  • 从上图可以看到标准 w3c 盒子模型的范围包括 margin、border、padding、content,并且 content部分不包含其他部分
  • IE盒子模型
  • 从上图可以看到 ie盒子模型的范围也包括 margin、border、padding、content
  • 和标准 w3c 盒子模型不同的是:ie 盒子模型的 content 部分包含了 border和 padding
  • IE盒子模型width = padding+border+内容
  • 标准盒子模型 = 内容的宽度(不包含border+padding)
  • 例:
  • 一个盒子的 margin为 20px,border 为 1px,padding为 10px,content 的宽为 200px、高为 50px,假如用标准 w3c 盒子模型解释,那么这个盒子需要占据的位置为:宽 20*2+1*2+10*2+200=262px、高 20*2+1*2*10*2+50=112px,盒子的实际大小为:宽 1*2+10*2+200=222px、高 1*2+10*2+50=72px;假如用ie 盒子模型,那么这个盒子需要占据的位置为:宽 20*2+200=240px、高 20*2+50=70px,盒子的实际大小为:宽 200px、高 50px
  • 那应该选择哪中盒子模型呢?当然是“标准 w3c 盒子模型”了。怎么样才算是选择了“标准 w3c盒子模型”呢?很简单,就是在网页的顶部加上 doctype 声明。
  • 假如不加doctype 声明,那么各个浏览器会根据自己的行为去理解网页,即 ie浏览器会采用 ie 盒子模型去解释你的盒子,而 ff会采用标准w3c 盒子模型解释你的盒子,所以网页在不同的浏览器中就显示的不一样了。
  • 反之,假如加上了 doctype 声明,那么所有浏览器都会采用标准 w3c盒子模型去解释你的盒子,网页就能在各个浏览器中显示一致了。

  • 用 jquery 做的例子来证实一下
<html>
<head>
<title>你用的盒子模型是?</title>
<script language="javascript" src="jquery.min.js"></script>
<script language="javascript">
var sbox = $.boxmodel ? "标准w3c":"ie";
document.write("您的页面目前支持:"+sbox+"盒子模型");
</script>
</head>
<body>
</body>
</html>
  • 上面的代码没有加上 doctype 声明,在 ie 浏览器中显示 ie盒子模型,在 ff 浏览器中显示“标准w3c盒子模型”。
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html>
<head>
<title>你用的盒子模型是标准w3c盒子模型</title>
<script language="javascript" src="jquery.min.js"></script>
<script language="javascript">
var sbox = $.boxmodel ? "标准w3c":"ie";
document.write("您的页面目前支持:"+sbox+"盒子模型");
</script>
</head>
<body>
</body>
</html>
  • 代码2 与代码1 唯一的不同的就是顶部加了 doctype声明。在所有浏览器中都显示“标准 w3c盒子模型”
  • 所以为了让网页能兼容各个浏览器,让我们用标准 w3c 盒子模型
  • 扩展
  • 学会使用box-sizing布局

第十四章 块元素、行元素与溢出


  • 基本概念
  • 块级元素:默认情况下独占一行的元素,可控制宽高、上下边距;
  • 行内元素:默认情况下一行可以摆放多个的元素,不可控制宽高和上下边距
  • 行块转换
  • display:none; 不显示
  • display:block; 变成块级元素
  • display:inline; 变成行级元素
  • display:inline-block; 以块级元素样式展示,以行级元素样式排列
  • 溢出
  • overflow:hidden; 溢出隐藏
  • overflow:scroll; 内容会被修剪,浏览器会显示滚动条
  • overflow:auto; 如果内容被修剪,则产生滚动条
  • 文本不换行:white-space:nowrap;
  • 长单词换行:word-wrap:break-word;
  • 行内元素和快级元素小结
  • 一、块级元素:block element
  • 每个块级元素默认占一行高度,一行内添加一个块级元素后无法一般无法添加其他元素(float浮动后除外)。两个块级元素连续编辑时,会在页面自动换行显示。块级元素一般可嵌套块级元素或行内元素;
  • 块级元素一般作为容器出现,用来组织结构,但并不全是如此。有些块级元素,如只能包含块级元素。
  • DIV 是最常用的块级元素,元素样式的display:block都是块级元素。它们总是以一个块的形式表现出来,并且跟同级的兄弟块依次竖直排列,左右撑满。
  • 二、行内元素:inline element
  • 也叫内联元素、内嵌元素等;行内元素一般都是基于语义级(semantic)的基本元素,只能容纳文本或其他内联元素,常见内联元素 “a”。比如 SPAN元素,IFRAME元素和元素样式的display : inline的都是行内元素。例如文字这类元素,各个字母 之间横向排列,到最右端自动折行。
  • 三、block(块)元素的特点:
  • ①、总是在新行上开始;
  • ②、高度,行高以及外边距和内边距都可控制;
  • ③、宽度缺省是它的容器的100%,除非设定一个宽度。
  • ④、它可以容纳内联元素和其他块元素
  • 四、inline元素的特点
  • ①、和其他元素都在一行上;
  • ②、高,行高及外边距和内边距不可改变;
  • ③、宽度就是它的文字或图片的宽度,不可改变
  • ④、内联元素只能容纳文本或者其他内联元素
  • 对行内元素,需要注意如下:
  • 设置宽度width 无效。 设置高度height无效,可以通过line-height来设置。 设置margin
  • 只有左右margin有效,上下无效。
  • 设置padding只有左右padding有效,上下则无效。注意元素范围是增大了,但是对元素周围的内容是没影响的。
  • 五、常见的块状元素
  • address – 地址
  • blockquote – 块引用
  • center – 举中对齐块
  • dir – 目录列表
  • div – 常用块级容易,也是CSS layout的主要标签
  • dl – 定义列表
  • fieldset – form控制组
  • form – 交互表单
  • h1 – 大标题
  • h2 – 副标题
  • h3 – 3级标题
  • h4 – 4级标题
  • h5 – 5级标题
  • h6 – 6级标题
  • hr – 水平分隔线
  • isindex – input prompt
  • menu – 菜单列表
  • noframes – frames可选内容,(对于不支持frame的浏览器显示此区块内容
  • noscript – 可选脚本内容(对于不支持script的浏览器显示此内容)
  • ol – 有序表单
  • p – 段落
  • pre – 格式化文本
  • table – 表格
  • ul – 无序列表
  • 六、常见的内联元素
  • a – 锚点
  • abbr – 缩写
  • acronym – 首字
  • b – 粗体(不推荐)
  • bdo – bidi override
  • big – 大字体
  • br – 换行
  • cite – 引用
  • code – 计算机代码(在引用源码的时候需要)
  • dfn – 定义字段
  • em – 强调
  • font – 字体设定(不推荐)
  • i – 斜体
  • img – 图片
  • input – 输入框
  • kbd – 定义键盘文本
  • label – 表格标签
  • q – 短引用
  • s – 中划线(不推荐)
  • samp – 定义范例计算机代码
  • select – 项目选择
  • small – 小字体文本
  • span – 常用内联容器,定义文本内区块
  • strike – 中划线
  • strong – 粗体强调
  • sub – 下标
  • sup – 上标
  • textarea – 多行文本输入框
  • tt – 电传文本
  • u – 下划线
  • 七,可变元素
  • 可变元素为根据上下文语境决定该元素为块元素或者内联元素。
  • applet - java applet
  • button - 按钮
  • del- 删除文本
  • iframe - inline frame
  • ins - 插入的文本
  • map - 图片区块(map)
  • object - object对象
  • script - 客户端脚本
  • 八、行内元素与块级元素有什么不同
  • 区别一:
  • 块级:块级元素会独占一行,默认情况下宽度自动填满其父元素宽度
  • 行内:行内元素不会独占一行,相邻的行内元素会排在同一行。其宽度随内容的变化而变化。
  • 区别二:
  • 块级:块级元素可以设置宽高
  • 行内:行内元素不可以设置宽高
  • 区别三:
  • 块级:块级元素可以设置margin,padding
  • 行内:行内元素水平方向的margin-left; margin-right;
  • padding-left; padding-right;可以生效。但是竖直方向的margin-bottom; margin-top; padding-top; padding-bottom;却不能生效。
  • 区别四:
  • 块级:display:block;
  • 行内:display:inline;
  • 替换元素有如下:(和img一样的设置方法)
  • <img>、<input>、<textarea>、<select>
  • <object>都是替换元素,这些元素都没有实际的内容
  • 可以通过修改display属性来切换块级元素和行内元素

第十五章 定位


  • static静态定位(不对它的位置进行改变,在哪里就在那里)
  • 默认值。没有定位,元素出现在正常的流中(忽略 top,bottom, left, right 或者 z-index 声明)。
  • fixed固定定位(参照物–浏览器窗口)—做 弹窗广告用到
  • 生成固定定位的元素,相对于浏览器窗口进行定位。 元素的位置通过 "left", "top", "right"以及 "bottom"属性进行规定。
  • relative(相对定位 )(参照物以他本身)
  • 生成相对定位的元素,相对于其正常位置进行定位。
  • absolute(绝对定位)(除了static都可以,找到参照物–>与它最近的已经有定位的父元素进行定位)
  • 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位。
  • 元素的位置通过 “left", "top", "right" 以及 "bottom" 属性进行规定
  • z-index
  • z-index 属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面。
  • 定位的基本思想: 它允许你定义元素框相对于其正常位置应该出现的位置,或者相对于父元素、另一个元素甚至浏览器窗口本身的位置。
  • 一切皆为框
  • 块级元素: div、h1或p元素 即:显示为一块内容称之为 “块框“ ;
  • 行内元素: span,strong,a等元素 即:内容显示在行中称 “行内框”;
  • 使用display属性改变成框的类型 即:display:block; 让行内元素设置为块级元素,display:none; 没有框
  • 相对定位:
  • 如果对一个元素进行相对定位,它将出现在它所在的位置上。
  • 通过设置垂直或水平位置,让这个元素“相对于”它的起点进行移动
  • .adv_relative { position: relative; left: 30px; top: 20px; }
  • 绝对定位:
  • 元素的位置相对于最近的已定位祖先元素,如果元素没有已定位 的祖先元素,它的位置相对于最初的包含块。 .adv_absolute { position: absolute; left: 30px; top: 20px; }


第十六章 框架


  • frameset框架:
  • <frameset> —- 用来定义一个框架;双标签
  • 不能和 <body> 一起使用
  • rows、cols属性
  • rows 定义行表示框架有多少行(取值 px/%/ * )
  • cols 定义列表示框架有多少列(取值px/ %/ * )
  • frame子框架
  • <frame> —- 表示框架中的某一个部分;单标签,要跟结束标志
  • src 显示的网页的路径
  • name 框架名
  • frameborder 边框线(取值 0 / 1)
  • <noframes>属性
  • <noframes> 提供不支持框架的浏览器显示body的内容;双标签
<frameset>
 <frame src=“” />
 <frame src=“” />
 <frame src=“” />
 <noframes>
 <body>内容</body>
 </noframes>
</frameset>
  • <iframe>内联框架
  • iframe元素会创建包含另外一个文档的内联框架(即行内框架)
  • 允许和 body 一起使用
  • width 宽(取值 px / %)
  • height 高(取值 px / %)
  • name 框架名
  • frameborder 边框线(取值 0 / 1)
  • src 显示的网页的路径

第十七章 css高级属性


  • opacity透明属性
  • opacity
  • 对于IE6/7/,使用filter:alpha(opacity:值;) 值为0-100
  • 对于Webkit,Opera,Firefox,IE9+,使用opacity:值; 值为0-1
  • 对于早期火狐,使用-moz-opacity:值; 值为0-1
  • 所以写透明属性时,一般写法是
 {	
 opacity:0.5;
 filter:alpha(opacity:50);/*0-100*/
 -moz-opacity:0.5;	/*取值0-1*/-->针对早起版本的火狐兼容问题的解决
}
  • border-radius圆角边框属性
  • 向 div 元素添加圆角边框
  • border-radius:10px;
  • box-shadow阴影属性
  • box-shadow属性向框添加阴影效果,后面跟4个参数。
  • box-shadow:0px 0px 10px #000;
  • <embed>属性
  • 是HTML5中新增的标签,媒体嵌入插件标签,可以通过<embed>插入音频或视频
  • <embed src=“media/music.mp3” />
  • 格式.mid .wav .mp3等

  • CSS部分导图总结




  • css常见简写