HTML5 & CSS3 新手指南 - 第四部分(共 12 部分)





5.00/5 (8投票s)
布局你的第一个网页
在之前的文章中,我们已经了解了 HTML5 和 CSS,并且尝试了几种不同的方法来更改文本字体和装饰。在本文中,我们将构建一个完整的网页,并深入探讨 CSS 的概念模型。
我们将学习以下内容
从基础开始
创建一个网站就像创作一件艺术品。有一些规则,但并没有什么能真正阻止你创造任何你想要的东西。浏览器页面是你的画布,你的画笔是 HTML5,你的颜料是 CSS。
但是,即使是最好的艺术家也需要在脑海中有一些创作的想法。更多人会创建草图,构建原型,并准备大量材料。草图背后的想法是“规划”。以下是我们开始这个过程的方法:
- 创造愿景
- 绘制草图
- 尝试并保存好的内容
前两个步骤已经在上一篇文章中提到过,第三个步骤是你可能会一遍又一遍地重复,直到满意为止。
创造愿景
愿景可以是任何东西,例如,从关于单体的知情白皮书到复杂的交互式游戏。在本文中,我们将创建一个个人主页。是的,这个页面将完全围绕你、你喜欢的东西等等。
嘿,如果你不喜欢个人主页的想法,你可以随意提出你自己的想法。网页设计的重点应该是你的满意度。本文将提供框架。
绘制草图
对于这个网站,本文将演示如何创建具有易于识别的部分和功能的网页。多年来,人们已经习惯了某些东西,这就是我们在设计中将牢记的。
我们将创建一个 PC 浏览器网页,而不是智能手机网页。请记住,我们只是在初步尝试。以下是我们想要创建内容的草图:
是的,这确实只是一张手绘草图。我们可以使用 CAD 工具等,但在粗略勾勒设计时,这并非真正必要。
请注意,有三个区域:页眉 (header)、导航 (nav) 和内容 (content)。页眉位于页面顶部,导航栏沿左侧延伸,内容占据其余空间。内容的详细草图将在稍后给出。
尝试并保存好的内容
从现在开始,我们将进行编码、测试、评估和重复。欢迎来到编程世界。
首先,我们必须创建 HTML5 网页的最外层结构,所以请打开你的编辑器并输入以下代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>My First Web Page</title>
<style type="text/css">
/* All the styling will go here */
</style>
</head>
<body>
<!-- All of the content will go here -->
</body>
</html>
你可以随意删除 body 和 style 元素中的注释。它们只是占位符。页面标题也可以是你喜欢的任何其他名称。
我们还没有决定需要多少页面,所以我们将暂缓任何决定,直到我们获得页面模型。
页眉、导航和内容
网上大部分网页由页眉、导航区域和内容组成。页眉不一定在顶部或跨越整个页面,导航也不一定在左侧。这是非常传统的设计。
HTML5 为网页的这些部分提供了语义化元素。
<header></header> <nav></nav>
让我们将这两个元素放入我们的网页中,看看它的样子。
<body> <header></header> <nav></nav> </body>
嗯,什么都没显示。页面是空白的!那么,我们从中了解到什么?我们发现语义化元素默认可能不显示任何内容。但是,我们有 CSS。所以,我们应该输入一些 CSS 定义来帮助。
在 style 元素中,输入以下内容:
header { border: 1px solid blue; background-color: lightgray; } nav { border: 1px solid red; background-color: lightblue; }
现在我们已经为这两个元素定义了边框和背景颜色。在浏览器中重新加载网页,我们可以看到这些元素的位置。稍后,如果需要,我们可以去除边框和颜色。
不幸的是,你看到的是页面顶部的两条线。为了填充这些区域,我们需要内容。要快速扩展元素,请在页眉和导航内容区域输入一些文本。
<body> <header>Header</header> <nav>Navigation</nav> </body>
现在当你重新加载网页时,你会在页眉元素中看到“Header”字样,在导航元素中看到“Navigation”字样。
成功!
但是导航元素紧挨着页眉元素下方,占据了整个浏览器窗口的宽度。我们需要将导航元素做得更窄。在你的 style 中为导航元素输入此内容:
width: 120px;
重新加载页面,你将看到导航元素现在只有 120 像素宽。但是,你可能会问,高度呢?嗯,我们可以将其添加到 style 元素中的 nav 选择器:
height: 100%;
这将确保导航部分随着网页内容而增长,而不是根据窗口大小。尽管如此,现在添加它是个好主意,所以继续输入吧。
标题
现在让我们处理页眉。在草图中,我们左边有一个图片,中间有文字,页眉右下角有一个较小的区域留给页面标题。现在,页面标题部分是为了显示我们在多页网站中的位置。我们将放置一些东西,以防万一我们需要它,并知道我们可以随时将其删除。
所以,我们有三个部分。嗯。我们如何将页眉空间分成这样?
首先,让我们尝试将一些内联元素放入页眉元素中。我们知道内联元素会从左到右堆叠,所以我们应该没问题。删除页眉部分中的“Header”一词,然后输入:
<header> <img id="siteimage" src="somepicture.png" /> <span id="sitename">My Vanity Page</span> <span id="sitepagetitle">Page Title</span> </header>
如果你需要图片,请使用这张图片 somepicture.png
重新加载页面。
嗯,这确实不是我们想要的,所以我们必须做些别的。
仔细观察草图,你应该会注意到图像在左边,网站标题在中间,页面标题在右边。我们真正需要做的是将这些东西分开,这样图片靠左,页面标题靠右,网站标题浮动在中间。
图片已经靠左了,但其他两部分需要处理。
我们需要稍微思考一下。:-( 显然我们需要 CSS 来实现这种布局,所以让我们看看 CSS 是如何工作的,然后我们可以确定我们需要做什么。
仅默认设置
在我们深入研究属性和模型的检查之前,我们应该先看看可以分配给任何 CSS 属性的两个默认值。
- initial
- inherit
级联样式表 (Cascading Style Sheets) 的“级联”操作始于浏览器。当浏览器显示网页时,它将使用一套默认值,有时称为定义表,用于字体、字号、颜色等。所有属性都有一个默认值,如果文档没有额外的样式信息,将使用这些默认值。
我们在上面创建页眉和导航元素时,看到了使用初始设置的作用。我们什么都没看到,因为这些元素默认没有边框和背景颜色。
然而,当这是期望的效果时,可以使用“initial”值在 CSS 文档中设置默认值。
<p style="color: red;">Initial settings are built into the browser, but they <em style="color: initial;">can be changed</em> with style sheets.</p>
在上面的示例中,color 属性被设置为整个段落的红色。但是,em 元素指定其颜色为“initial”,从而从浏览器的定义表中获取值。
一些元素的属性设置为其父元素中相应属性的值。这称为继承,这也是级联的工作方式。元素从其父元素继承许多属性,父元素又从它们的父元素继承,依此类推,直到我们达到浏览器中的初始设置。
参考上面的例子,如果 em 元素没有声明颜色为“initial”,那么它将从其父元素(在此示例中为段落)继承颜色(红色)。
但是,有些属性不被继承。CSS 没有规定所有属性都应该被继承,因此它提供了一个标准的属性值,可用于强制继承:值为“inherit”。
有了这些信息,让我们来看看 CSS 模型,W3C 称之为“盒子模型”。
盒子模型 (边框、轮廓、外边距、内边距)
CSS 基于“盒子模型”来制定布局和显示,通过定义外边距、边框、内边距和内容。下图演示了该模型:
内容位于盒子的最中心。围绕内容,我们看到三层。内边距是围绕内容的空白。边框紧挨着内边距的外面。外边距是最外层,包含围绕其他所有内容的空白。轮廓不是真正的层,但它可以像边框一样渲染在边框的外面。
这些层中的每一层都通过 CSS 属性来表示。每一层还可以细分为四个部分:顶部、右侧、底部、左侧。这样我们就有了顶边框、右外边距、左内边距等。这些层的默认值通常都为零,这意味着元素没有内边距、外边距或边框,除非另外指定。
实际宽度
CSS 属性width和height仅描述内容的宽度和高度,而不是其周围所有东西的。元素的实际尺寸包括内边距、边框宽度和外边距值。因此,当一个元素具有如下 CSS 定义时:
width: 200px;
height: 100px;
border: 1px solid brown; /* 1 pixel wide each side, solid line, color brown */
padding: 8px 8px 8px 8px; /* 8 pixels padding each side */
margin: 3px 3px 3px 3px; /* 3 pixels margin each side */
元素在浏览器页面上的实际宽度为 224px。你可以使用以下公式:
True width = element width property + left padding + right padding + left border width + right border width + left margin + right margin
代入数字,得到:
224px = 200px + 8px + 8px + 1px + 1px + 3px + 3px
我们不将轮廓包含在此计算中,因为轮廓不包含在任何尺寸计算中。它可以显示,但浏览器在确定尺寸和位置时会忽略它。
尺寸、定位、浮动、对齐
HTML5 文档中的元素按其在文档中的定义顺序显示。默认情况下,它们会从左到右、从上到下排列。块级元素会通过换行将其与前一个元素分隔开。内联元素会水平堆叠,当一行内容超出时,会移动到该行第一个元素下方。
因为块级元素是垂直堆叠的,所以它们默认会占据网页的整个宽度。它们的高度也根据其内容进行调整。
我们在网页中看到了这一点,但让我们看看我们可以做什么来改变它。
维度
CSS 元素的尺寸由其宽度和高度定义,这对应于称为“width”和“height”的 CSS 属性。这些属性的值定义了内边距内内容的宽度和高度(参照盒子模型)。
nav { width: 120px; height: 100%; }
我们可以说,以百分比表示的值是相对值,而带有特定符号(如 px 或 em)的值是静态值。例如,我们的导航元素具有 120 像素的静态宽度和 100% 的相对高度。
定位
使用position属性的关键字值或定义元素顶部、底部、右侧或左侧位置的值,元素的定位也可以是相对的或静态的。
以下是 position 属性的值:
- relative
- absolute
- static
- fixed
Absolute 定位根据 left、top、right 和 bottom 属性的值将元素放置在页面的精确位置。此位置相对于元素的第一个非静态定位的祖先元素。
Static 定位是默认值。此属性值指示元素按照其在文档中的定义顺序显示。
Fixed 定位告诉浏览器将元素相对于浏览器放置。这意味着,例如,滚动不会影响该元素。
那么,我们的页眉部分呢?
没有指定,页眉内容被定位为静态元素。也许我们可以绝对定位它们。这肯定是有意义的,但当我们在不知道浏览器窗口宽度的情况下,中间和右侧的绝对位置究竟在哪里?
显然,绝对定位不是答案。
浮动和对齐
改变流动顺序的一种方法是为 float 属性设置一个值。告诉一个元素浮动会使其他元素围绕它流动,而 float 值指定元素如何被锚定。
例如,当我指定“float: left”时,这意味着元素将靠左对齐,并且文档中在它后面的元素将围绕该元素的右侧浮动。
好了,图片已经靠左对齐了,所以让我们尝试将页面标题浮动到右边:
#sitepagetitle { float: right; }
这有所改进,但我们需要修复一些问题。首先,让我们将网站标题居中。现在,我们应该怎么做?
我们可以告诉页眉使用 text-align 属性将其文本对齐到中心。我们试试:
<header> text-align: center; ... </header>
嗯。这绝对不是我们想要的。指定文本居中对齐也会影响 img 元素,因为它是一个内联元素。因此,我们无法像块级元素那样给它一个绝对位置。然而,如果我们将其浮动到左边:
#siteimage { float: left; }
好了,这完全是个失败。我们必须找到一种方法将图像放在左边并保持页眉尺寸正确。看起来我们要么找到一种方法来居中文本网站名称,要么将 img 元素更改为块级元素。真是一团糟。也许如果我们只是给页眉设置尺寸……
header { text-align: center; height: 60px; ... }
不错。我们强制页眉高度与图像高度匹配,但页面标题需要移到底部,并且网站标题的字体应该更大、更好看。
为了将页面标题文本移到底部,我们可以将 span 标签更改为 div 标签,然后从那里继续。内联元素在定位和对齐方面受到限制。因为 div 是块级元素,所以移动元素会更容易。
然后,因为我们要更改该 div 的位置,所以需要将页眉的位置属性值更改为“relative”。这是必要的,因为页眉的子元素必须在页眉的位置属性为“relative”的情况下才能正确进行定位。
完成这些之后,我们可以将页面标题 div 的 position 属性设置为“absolute”,然后将其固定在右下角。所以,让我们完成这些:
<head> ... * { font-family: Segoe UI, Arial, sans; /* Changes font on all elements */ } header { ... position: relative; /* change this to fix page title position */ } ... #sitepagetitle { float: right; position: absolute; /* this will anchor the page title div */ bottom: 0; /* to the bottom-right corner of the */ right: 2px; /* header element */ font-size: small; /* Make this less noticeable */ } ... #sitename { font-size: 24px; /* Make this more noticeable */ font-weight: bold; } ... <header> ... <div id="sitepagetitle">Page Title</div> </header>
这很好,并且几乎与我们草图完全一致。一旦你在浏览器中看到这个,就去改变窗口的大小。无论窗口有多宽,页面标题文本始终会保持在右下角,图像始终会悬挂在左边,网站标题文本始终会悬挂在中间。
嗯,它并不是窗口的真正中间。因为 img 元素浮动在左边,所以文本居中的计算发生在图像右边缘(加上任何外边距)和窗口右边缘(减去任何内边距)之间。
绝对居中文本的一种方法是将其——仅此文本——放入一个块级元素中,并使该块级元素跨越页眉的宽度。以下是一种实现方法:
<style type="text/css"> ... #sitename { ... width: 100%; /* keep it the width of the header */ position: absolute; /* by default, it will snap left */ } </style> <header> ... <div id="sitename">My Vanity Page</div> /* change span to div */ ... </header>
现在文本绝对是居中了。如果我们让 sitename div 的边框可见,你会看到它们占据了整个页眉元素的宽度。
也许下一步我们可以做的是制作一个导航菜单的模型。当导航栏是垂直元素时,最简单的制作方法是创建一个 ul 元素。
<nav> <ul> <li>My Story</li> <li>Links</li> <li>Music</li> <li>Video</li> </ul> </nav>
是的,这看起来……还可以。在屏幕上看到这个布局后,似乎导航链接更好的解决方案是让它们在页眉下方水平排列。很多网站也是这样做的,所以我们不会做一些奇怪的事情。
首先,让我们去掉 nav 元素的宽度限制。我们可以直接删除该定义。既然我们在这里,我们也应该删除高度的规范。而且……请耐心等待……删除边框定义。CSS 定义中的 nav 选择器现在应该如下所示:
nav { background-color: lightblue; }
刷新浏览器应该会显示如下:
显示
好了,没有画什么草图,我们可以轻松想象一排菜单项,以“我的故事”开始,然后是“链接”,等等。我们有一个列表,但它碰巧是垂直排序的。看起来我们可能需要一些新的东西,比如一排按钮。
嗯,我们可以保留 ul 元素,同时也可以有一排按钮。我们只需要用一些巧妙的 CSS 属性告诉浏览器如何显示列表。我们将使用的第一个属性是“display”。
display 属性告诉浏览器在显示元素时需要使用哪种类型的盒子。块级元素的 display 默认值为“block”。内联元素的 display 默认值为“inline”。但是,我们可以用 display 属性改变这一切。
这些是你最可能使用的常见值:
- none
- inline
- block
- inline-block
还有其他几个,但这四个应该涵盖了你所需要的一切。
none 值会完全从显示的网页中移除元素及其后代。它的作用类似于“visibility: hidden;”,但与 visibility 属性不同,所有子元素都会被移除,而不管它们的 display 或 visibility 设置如何。
将 display 设置为inline 会告诉浏览器像显示内联元素一样显示该元素,而不是块级元素。元素的内容与前面的元素内联放置,而不是整个盒子结构。
我们为导航输入的 ul 元素通常会显示每个 li 元素为一个块级项目。也就是说,每个 li 元素的内容会单独显示在一行。
但是,我们可以通过向 CSS 文档添加一个新定义来改变这种行为,使其在一行中排列:
<style type="text/css"> ... nav ul > li { display: inline; } ... </style>
等等,有点不对劲。
选择器和特异性
当你定义 CSS 属性时,你是通过使用选择器将它们分配给元素的。选择器是左括号('{')前面的文本,它匹配元素。到目前为止,你已经看到了一种通过名称、id 值或 class 值匹配元素的方法。
CSS 还可以基于其他因素定位特定元素。以下是一些例子:
li { display: inline; } /* matches element type */
ul > li { display: inline; } /* matches li children of ul elements */
nav ul > li { display: inline; } /* matches li children of */
/* ul descendants of nav elements */
li,em { color: blue; } /* matches li or em elements */
我们有这么多方法来定位 CSS 中的元素,是因为我们有时需要更具体地定位。如果上面示例中的所有 CSS 选择器都使用了,那么浏览器只会使用其中一个来设置 display 属性。浏览器使用的规则由选择器的特异性决定。
通常,你越具体,浏览器选择你想要的规则的可能性就越大。此外,你可能不希望页面上的所有 li 元素都显示为内联元素,而只是导航中的那些元素。
现在,我们可以为导航元素中的所有 li 项目设置 class 属性为一个特定的值,然后将其用作类选择器,但使用“nav ul > li”更紧凑,也酷得多。
因此,有了文件中新的 CSS 定义,nav 元素看起来如下:
这样看起来好多了,但所有东西都挤在一起了。我分不清我应该有一个“我的故事”链接还是“我的故事链接”。我们需要在视觉上将它们区分开。让我们在它们之间留出一些空间,并使它们的颜色与背景不同。同时,我们也应该确保它们都具有相同的宽度。
nav ul {
margin: 0;
padding: 0; /* remove all space around the ul and li bits */
}
nav ul > li {
display: inline; /* show li elements in left-right order */
background-color: #9DC8C6; /* make the li elements a little darker */
padding: 4px; /* put some space around the li text */
text-align: center; /* center the text so the spacing is even */
width: 80px; /* make them the same width */
}
嗯,这几乎看起来是正确的。我们为 li 元素设置了宽度,从 ul 中移除了内边距和外边距,这样页眉和导航内容之间就不会有空间,我们居中了文本,但仍然有些地方不对。
li 元素的宽度不同,浅蓝色背景也不够高。所以,我们将尝试对 li 元素的 display 做另一件事。我们将 display 属性更改为“inline-block”。
... nav ul > li { display: inline-block; ...
inline 和 inline-block 之间的区别在于,“inline”渲染 元素为一个内联元素,而“inline-block”渲染 元素为一个块级元素。相似之处在于,使用“inline”或“inline-block”设置时,元素会作为内联元素显示。渲染操作构建对象,显示操作将其放置在特定位置。
现在它看起来真的很酷。我们只需要内容和页脚。内容稍后会出现,但我们可以轻松设置一个标准的页脚。
<footer>My Vanity Page Copyright 2014, Me [9999 hits]</footer>
好吧,这看起来很糟糕。我们需要一种方法来格式化页脚中的信息并使其简单。
表格
表格是一种简单而有效的方法,可以在你不太关心精确测量时,将数据制成表格并格式化项目为列。
现在不要误会我的意思。我们可以用 CSS 很好地实现精确度,但如果你想快速完成某些事情,表格是获得简单格式的好方法。
<footer>
<table>
<tr>
<td>My Vanity Page</td>
<td>Copyright 2014, Me</td>
<td>[9999 hits]</td>
</tr>
</table>
</footer>
嗯,它仍然看起来很糟糕,但我们可以快速用一些 CSS 来修复它:
footer table { margin-top: 2em; width: 100%; }
table 元素会将其单元格均匀地分布在其宽度上。它还会继承其容器的文本对齐方式,在本例中就是默认的“left”。我们真正想做的是让左单元格的文本靠左,右单元格的文本靠右,中间文本居中。
我们只需要在一个地方使用它——页脚——并且每个三个单元格都需要不同的东西。我们这里要做的是为每个单元格分配一个唯一的 id 值,并在 CSS 中进行修复。
#footleft { width: 25%; text-align: left; } #footcenter { text-align: center; } #footright { width: 25%; text-align: right; } ... <tr> <td id="footleft">My Vanity Page</td> <td id="footcenter">Copyright 2014, Me</td> <td id="footright">[9999 hits]</td> </tr> ...
我们使用了“footleft”、“footright”和“footcenter”的 id 值。现在看起来很棒。它也能很好地重置尺寸:
我建议你现在将此文件另存为“vanity_template.html”。我们可以将它用作多个页面的模板文件。我们需要对导航和页脚中那个奇怪的点击计数器进行一些调整,但它基本上已经完成了。
你已经创建了你的第一个 HTML5 网页,其中包含大量 CSS。如果你没有按照文章的步骤进行,可以从这里复制全部代码:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>My First Web Page</title> <style type="text/css"> * { font-family: Segoe UI, Arial, sans; } header { background-color: lightgray; text-align: center; height: 60px; position: relative; } nav { background-color: lightblue; } nav ul { margin: 0; padding: 0; } nav ul > li { display: inline-block; background-color: #9DC8C6; padding: 4px; text-align: center; width: 80px; } #sitepagetitle { float: right; position: absolute; bottom: 0; right: 2px; font-size: small; } #siteimage { float: left; } #sitename { font-size: 24px; font-weight: bold; width: 100%; position: absolute; } footer table { margin-top: 2em; width: 100%; } #footleft { width: 25%; text-align: left; } #footcenter { text-align: center; } #footright { width: 25%; text-align: right; } </style> </head> <body> <header> <img id="siteimage" src="somepicture.png" /> <div id="sitename">My Vanity Page</div> <div id="sitepagetitle">Page Title</div> </header> <nav> <ul> <li>My Story</li> <li>Links</li> <li>Music</li> <li>Video</li> </ul> </nav> <footer> <table> <tr> <td id="footleft">My Vanity Page</td> <td id="footcenter">Copyright 2014, Me</td> <td id="footright">[9999 hits]</td> </tr> </table> </footer> </body> </html>
摘要
在本章中,我们深入研究了创建实际网页的过程。我们经历了设计、测试、优化和重复的过程,直到我们敲定了一个看起来不错的文件。生成的代码相当简短,HTML5 部分也非常简洁。在下一篇文章中,我们将探讨如何在文档中添加一些音频和视频,以及一些很酷的 CSS 效果。
本系列中的其他文章
- 第一部分 - 编写你的第一个代码
- 第二部分 - 在基础知识上构建
- 第三部分 - 样式化你的第一个网页
- 第四部分 - 布局你的第一个网页
历史
2014-04-09:首次发布。