说明
1. 部分参考O'Reilly Media出版的HTML and CSS和HTML with CSS & XHTML
2. 部分参考作者兼续在简书上的笔记https://www.jianshu.com/p/727dbfcef685
一、基本概念
简称
HTML
是HyperText Markup Language
的缩写,译为超文本标记语言
CSS
是Cascading Style Sheets
的缩写,译为层叠样式表
元素类型
- 块(block)元素,前后都有一个换行
- 如
<h1>~<h6>
,<p>
,<blockquote>
- 特点是: 特立独行
- 如
- 内联(inline)元素,总在“行内”出现,
- 如
<q>
,<a>
,<em>
- 特点是: 随波逐流
- 如
- void元素,这个元素没有实际内容,会用简写来表示
<img>
,<br>
- 这样能提高效率
浏览器与服务器惯例
浏览器不会显示空白符和换行,制表符等
Web服务器默认文件名为"index.html"或"default.htm"。如果浏览器向Web服务器请求一个目录而不是文件时,例如http://www.starbuzzcoffee.com/images/或http://www.starbuzzcoffee.com/。Web服务器会尝试查找这个目录中的一个默认文件。"index.html"或"default.htm"。所以,要从根目录(或任何其他目录)默认地返回一个文件,只需要把这个文件命名为"index.html"或"default.htm"。
htm是微软服务器的一个怪癖
如果末尾没有正斜杠,如果该目录确实存在,那么浏览器会自动帮你加上末尾的斜线
file:///
文件URL有3个正斜杠而不是2个。当浏览器从你的计算机本地读取文件时会使用file协议。- 例如,文件file:///chapter4/starbuzz/index.html会告诉浏览器index.html在路径chapter4/starbuzz/下。
- 记忆:http url中删去网站名也会有3个正斜杠
HTML5不再只是用来建立Web页面,Web页面主要是静态页面,上有一些图像和链接,可能还有一些漂亮的效果,比如菜单。总的而言,是用来阅读的。另一方面,Web应用则用来交互,用来完成具体工作。就像你的桌面计算机上的应用一样,只使用Web应用就能在Web上完成工作。如社交媒体应用、地图应用和游戏。
http://www.mydomain.com:8000/index.html。
- 8000是一个可以放在HTTP URL中的可选的“端口”。
- 网站名就像一个地址,端口则像是这个地址的邮箱号(例如,一个复合公寓里),通常Web上的所有东西都会传送到一个默认端口(80),不过有时Web服务器会配置为在另外一个不同的端口接收请求(如8000)。这种情况经常在测试服务器上出现。正常的Web服务器几乎都在端口80接收请求。如果你没有指定端口,则默认为80。
www.starbuzzcoffee.com是一个网站名。其中www是域中特定服务器的名字。starbuzzcoffee.com则是域名。域名由ICANN(The Internet Corporation for Assigned Names and Numbers)控制,要保留域名,每年还需要交纳少许注册费。域名可以用于多个网站,如business.starbuzzcoffee.com或student.starbuzzcoffee.com。
怎么把文件传输到web服务器呢?方法有很多,大多数主机代理商支持一种叫做FTP的文件传输方式(File Transfer Protocol,文件传输协议),还有一种叫做SFTP安全文件传输协议(Secure File Transfer Protocol)。
常用的FTP应用程序
- Fetch (http://fetchsoftworks.com/)[Mac/收费]
- Transmit (http://www.panic.com/transmit/)[Mac/收费]
- Cyberduck (http://cyberduck.ch/)[Mac/免费]
URL统一资源定位符uniform Resource Location。是一个全局地址global address,可用来定位Web上的任意资源,包括HTML液面,视频音频和很多其他形式的Web内容。除了制定资源的位置,URL还可以制定用来获取资源的协议。
http://www.starbuzzcoffee.com/index.html。http是接收资源的协议。中间是网站名,最后是从根目录到资源的绝对路径。
- http是超文本传输协议HpyerText Transfer Protocol。
- 超文本文件HpyerText documents,通常就是HTML页面。
要创建服务器脚本,大多数托管公司都支持PHP, Ruby on Rails, Perl, Python, Node.js, and Java当然还有很多其他的语言。
规范
遵照标准编写html,尽量减少错误,用doctype告诉浏览器你使用的哪一版本的html,可以减少浏览器显示效果的差异。现在html5的doctype很简单,告诉浏览器你在使用标准html:
1
2
3
4
5
6<!DOCTYPE html>
#虽然上述例子中DOCTYPE用了大写而html用了小写,但是这两者都是大小写不敏感的。
#<!doctype html>或<!DOCTYPE HTML>均可
#每个html页面都应该加
#标签、属性名、属性值等,有的有大小写之别,而有的则没有。
#HTML标准规定所有的字符串除特别说明外都是要区分大小写的页面中增加
标记指定字符编码,通常使用utf-8,它是Unicode系列中的一个编码。如下:
1
2<meta charset="utf-8">
#这个标记要放到<head>元素中所有其他元素的上面html标准验证工具:W3C验证http://validator.w3.org
以后html不再有版本号,甚至不是html5,从现在起它只是"HTML"。标准改变,浏览器会继续支持老方式,同时也会支持新的方式,这叫做向后兼容性(backwards compatibility)。
Element = Opening Tag + Content + Closing Tag。我们把一对开始标记和结束标记,称为匹配标记matching tags。
元素=开始标记+内容+结束标记
属性的写法:属性名=“属性值”,
<a href="top10.html">Great Movies</a>
处理XHTML时,
<br/>
的语法更为严格,只要看到<br>
就应该改写成<br/>
。不过除非要规划或者编写与XHTML兼容的页面,否则在HTML中都应该使用`spec规范:就是一个文档,制定了HTML标准是什么,也就是说HTML中有哪些元素和属性等。这个文档由World Wide Web Consortium (W3C, for short)万维网协会维护。
二、实践
一般
- 规划页面时先设计大的块元素,然后用内联元素完善。
- 尽可能使用元素告诉浏览器内容的含义。
- id属性是唯一标识元素的方法,可以使用大小写,不过必须一致,
(每次都用小写会更容易些),
id在它的页面必须唯一。任何元素都可以有id属性进行标示。
- id的要求:一定用一个字母(AZ或者az)开头,后面可以是任意字母,数字,横线,下划线,冒号或点号,但不能加空格。
- 任何元素都可以增加title属性,为其增加工具提示文体(tooltip text)。这些信息通常会在鼠标移到元素上时显示title的内容,以达到补充说明或者提示的效果。
- 将自己的注释放到HTML中,格式为
<!--注释内容-->
。 - 用Mac系统中的文本编辑编写HTML时,需将其改为纯文本模式。默认为“富文本”模式,这种模式下,在保存文件时,会增加它自己的格式和特殊字符。修改为纯文本文件的步骤:
链接
同一网站内的网页使用相对地址(相对路径),外部网页使用绝对地址(相对路径,即URL)。
相对路径
<a href="beverages/elixir.html">elixirs</a>
..
表示上溯到父目录。"../.."
表示上溯两层目录。
上溯的相对路径<a href="../lounge.html">Back to the Lounge</a>
相对路径:相对于链接的源Web页面指向网站中其他文件的一个链接,就像在地图上一样,终点总是相对于起点。 绝对路径:从根目录去获得特点的页面或文件。带id的元素有一个特殊特性:你可以直接链接这些元素。
- 如
<a href="index.html#chai">see chai tea</a>
- 方法为在链接后加#,再加上目标标识符(id)。
- 如
通常在页面的最上面定义一个目标"top",并在页面最下面定义一个目标"Back to top"。要链接到同一页面的top目标,可以写为
<a href="#top">Back to top</a>
链接要简洁,可以在title中提供额外的信息,不要使用诸如"单击这里",或"这一页"之类的链接标签,不要把链接放在一起。
一般用
http://wickedlysmart.com/buzz/index.html#Coffee
进行链接,不能使用http://wickedlysmart.com/buzz#Coffee
的形式进行链接,因为浏览器会在末尾加正斜杠,可能取代id引用,不过可以用http://wickedlysmart.com/buzz/#Coffee
嵌套
- 适当嵌套元素,嵌套时要完全嵌套
- 嵌套元素要当心,不要把
<a>
元素嵌到另一个<a>
元素中,会让访问者迷惑。不允许在<img>
等void元素中嵌套其他内联元素。
工具
- Dreamweaver
- Hype(Tumult)
- Coda(Panic)
- Flux(The Escapers)
- Microsoft Expression Web
- Amaya (Open source, developed by the W3C)
- Eclipse (by the Eclipse Foundation)
三、HTML首部元素
html
根元素
web页面的根元素,只有<head>
和<body>
能直接放在<html>
标签中
head
页面头部- head包含有关页面的信息,只能放置
<title>
,<meta>
和<style>
元素。 <meta>
: 关于页面的信息,属性包括charset : 指定字符集
,通常为utf-8<title>
: 页面标题<style>
: 页面样式,属性包括type: 样式类型
, 一般为"text/css",如<style type="text/css">...</style>
- 以前,
人们认为以后可能还会有其他样式。事实表明,完全用
<style>
不带任何属性,任何浏览器都知道你指的是CSS。
- head包含有关页面的信息,只能放置
四、HTML页面主体
body
主体元素 web页面的主体元素h1- h6
6级标题标题默认是粗体,例如:
<h1>
一级标题</h1>
p
段落块元素,paragraph的缩写,例如:
<p>...</p>
a
超链接- 内联元素,at的缩写,如
<a href=""></a>
<a>
元素的内容可以是文字,图像甚至块元素(html5)href
: hyper reference的缩写,指定链接地址title
: 所要链接页面的文本描述target
: 告诉浏览器使用一个不同的窗口,使用_blank作为目标,就会打开一个新的窗口显示页面。如果多个<a>
元素都指定_blank作为target,那么每个链接都会在一个新的空窗口中打开,如果指定另一个名字,如Coffee,那么有相同目标名的所有链接都会在同一个Coffee窗口中打开。<a>
元素包围图像时,IE浏览器会在图像周围加一个边框,显示这是一个链接(Safari浏览器,不会这么做)
- 内联元素,at的缩写,如
em
强调内联元素,emphasize的缩写,例如:
<em>强调</em>
br
换行- void元素,break的缩写,例如
<br>
<br>
既不是块元素,也不是内联元素
- void元素,break的缩写,例如
code
显示计算机程序代码块元素,例如:
<code>...</code>
pre
原样显示文本块元素,例如:
<pre></pre>
。通常显示的时候,会保留空格和空行。strong
加粗文本内联元素 例子:
<strong>加粗</strong>
五、引用
q
短引用作为现有段落的一部分,大部分浏览器会加引号,内联元素,quotation的缩写
blockquote
长引用- 需要单独显示,
<blockquote>
创建了单独的一个文本块,另外把文字稍稍缩进,使它更像一个引用。它是个块元素。 - 如果想引用一段或者多段文字,就要使用
<blockquote>
,不过如果只想把一个引用放在现有的文字里,作为其中一个部分,就可以使用<q>
。 - 可以把
<p>
放到<blockquote>
中,形成多个段落 - 可以把
<q>
放到<blockquote>
中,表示引用的引用 - 缩进是某些浏览器显示
<blockquote>
的效果,不是所有的浏览器对<blockquote>
都缩进。
- 需要单独显示,
六、列表
<ol>
和<li>
(或者<ul>
和<li>
)总是要一起使用,列表可以嵌套,例如:
1 | <ul> |
li
列表项
块元素,list item的缩写
ol
有序列表
块元素, ordered list的缩写,浏览器负责编号
ul
无序列表
块元素, unordered list的缩写
dl
,dt
,dd
定义列表
每一项都由一个定义术语和定义描述组成
1 | <dl> |
- Burma Shave Sign...
- Road signs common in the US
- Route 66
- Most famous road in the U.S. highway system
七、字符实体character entity
用简单缩写来指定特殊字符,但并不保证在所有浏览器上都能显示
输入实体时都会用到
&
,例如字符>
的缩写是>
,字符'<'的缩写是<
。如果内容中确实需要一个字符&
,就要使用&
。除了用实体名还可以用实体的数字编号比如
d
,并不是所有实体都有名字,所以这种情况下,只能使用数字。详尽的字符实体清单:http://www.unicode.org/charts/
八、图像
img
图片
- void元素,image的缩写
src
: 必要属性,指定img的源文件位置,可以指定相对位置alt
: 必要属性,指定描述这个图像的一些文本,可以在图像无法显示的时候显示文本,也可以帮视力障碍的用户,这个属性得加,不然无法通过html标准验证width
: 指定图像宽度height
: 指定图像高度- 例子:
<img src="" alt="" width="800" height="600">
图片格式
- Web上最常用的3种格式: JPEG, PNG 和 GIF
- 照片和复杂图像使用JPEG,支持1600万种不同颜色,有损格式,缩小文件时会丢掉图像信息,不支持透明度,不支持动画,文件较小,便于Web高效显示
- PNG,GIF适合单色图像和线条构成的图像,如logo,剪切画和图像中的小文本,都是无损格式,都支持透明度,都比相应的JPEG更大些
- PNG可以包含上百万种颜色,有PNG-8,PNG-24和PNG-32,选哪一种取决于你需要表示多少种颜色。PNG会压缩文件来缩小文件大小,不过不会丢掉信息,所以认为这种一种“无损”格式。
- GIF最多表示256种不同颜色,但是能支持动画
图片实践
在
img
属性中指定宽度和长度的原因是浏览器预先知道了长宽就可以在显示图像之前就开始建立页面布局,否则浏览器得先下载图像,知道大小,然后再重新调整布局。width和height也可以用来图片缩放,不过由于各种原因,还是不要这样达到目的的好。因为浏览器在调整图像之前还是必须得下载完整的大图像
图像宽度要小于800像素,是一个好经验。大多数人通常都会把浏览器宽度设置为800-1280像素,所以一般经验是将图像最大宽度设置为800像素。
图像可以作为指向其他Web页面的链接,将
img
放在a
元素的内容中,如下所示:1
2
3<a href="html/seattle_classic.html">
<img src="thumbnails/seattle_classic.jpg" alt="A classic iPod in Seattle, WA">
</a>分辨率,一般是96像素/英寸。习惯的标准是72像素/英寸ppi。CSS像素是1英寸的1/96(96 ppi)
- 所以3”宽和高的图像,要使用288288的像素(963=288)
- 英尺 用 ' 表示,英寸用 '' 表示
用蒙版处理logo的小技巧
九、容器
标记逻辑区
逻辑区就是页面上彼此相关的一组元素,div
和span
容器用来标记一组元素
div
块元素容器
在属于一个逻辑区的元素周围放置
<div>
开始和结束标记div中的元素也会从div继承一些属性(如font-size,color等)
可以用div为页面增加更多结构,进一步展示页面的底层逻辑结构,但不要为了加结构而不必要地增加结构,在完成任务的前提下让结构尽可能简单
你也可以嵌套结构,例如可以把cats,dogs的
<div>
放在一个pets<div>
中,如:1
2
3
4<div class="pets">
<div class="cats">...</div>
<div class="dogs">...</div>
</div>
span
内联元素容器
类似于div,不过是针对内联元素的,建立内联内容的逻辑分组,如:
1 | <ul> |
- Buddha Bar, Claude Challe
- When It Falls, Zero 7
- Earth 7, L.T.J. Bukem
- Le Roi Est Mort, Vive Le Roi!, Enigma
- Music for Airports, Brian Eno
十、表格
table
表格
用<table>
标记开始一个表格,一行用<tr>
开始,每个<th>
分别是某一列的表头,表头是前后排列的。每个<td>
元素包含表格中的一个单元格。例子:
1 | <table> |
caption
标题
增加标题<caption>...</caption>
,
放在<table>
元素之下,<tr>
元素之上(即使你后面要用css把它显示在下方),默认会显示在表格上方。
background-color 背景色
添加颜色, 设置背景色即可,如:
1 | th { |
颜色交替
为各行指定交替的颜色, 能够更容易得区分各行, 可以先定义一个新类, cellcolor, 然后把这个类增加到你希望着色的各行(tr)上,如:
1 | .cellcolor { |
另外还可以用下面的nth-child
伪类实现
nth-child
伪类
nth-child
伪类是一种更高级地选择元素的方法,例如让偶数段落有红色背景,奇数段落有绿色背景:
1 | p:nth-child(even){ |
这个伪类还可以更加灵活,用数字n制定简单表达式,如奇偶数:
1 | p:nth-child(2n){ |
合并单元格
就是说有的单元格要跨越多行,可以使用rowspan属性,指定一个数据单元格占多少行,然后从这个单元格所跨越的其他行中删除相应的表格元素。表格元素还能跨多列,只要为td元素增加colspan属性,然后指定列数,跨多列时需要删除同一行中的表格数据元素,例如:
1 | <tr> |
嵌套表格
表格里可以嵌套表格,只需要把另一个table元素放在一个td中,例如:
1 | <tr> |
处理表格双线
默认情况下每个单元格都有边框,会形成双线,分散注意力,可以在table中将border-spacing
设置为0px,还可以用border-collapse
的css属性来折叠边框,使单元格之间根本没有边框间距,这样浏览器会忽略所有边框间距,然后将紧挨的两个边框合并成一个边框,例如
1 | table { |
其他实践
- 如果希望表头放在表格的左侧,可以把表格表头元素放在各行中,而不是都放在第一行中。
- html表格允许你用html标记指定表格的结构,而css表格则提供一种方法,可以用一种类似表格的方式显示块级元素。
- 需要在页面中创建表格数据时就用html表格,不过如果只需要对其他类型的内容使用一种类似表格的表现方式,就可以用css表格显示布局。
- 表格单元格确实有内边距和边框,不过单元格之间的空间border-spacing是针对整个表格定义的,不能单独设置每个表格单元格的外边距,不过可以在垂直方向和水平方向上设置不同的边框间距,如
border-spacing: 10px 30px
,10像素水平间距,30像素垂直边框间距。
十一、表单
表单form
action属性包含Web服务器的url, method属性确定表单数据如何发送到服务器,如POST,另外input 是内联元素, 如果想要有换行用
<br>
。表单的
name
属性。它相当于表单和处理表单的服务器脚本之间的一个黏合剂。value
属性,可以为submit
更改别的名字,为文本输入元素的输入域提供默认文本。<input>
中可限制文本,用maxlength
,但是<textarea>
中没有办法限制用户输入多少文本。name="extras[]"
,这只是一个普通的表单元素名,名字里有没有中括号对于浏览器没有任何的影响。那为什么要使用这样的元素名呢?因为编写processorder.php服务器脚本所用的脚本语言(PHP)希望得到一点提示,想知道一个表单变量可能包含多个值。提供这个提示的做法就是在名字后面增加一个[]。例子如下:
1 | <form action="http://wickedlysmart.com/hfhtmlcss/contest.php" method="POST"> |
POST
和GET
请求
- 浏览器发送数据的方法主要有两种,POST和GET。POST和GET完成的任务是一样的,都是把表单数据从浏览器发送到服务器,不过采用了两种不同的方式,POST会打包你的表单变量,在后台把它们发送到服务器,GET也会打包你的表单变量,但是会把这些数据追加到URL的最后,然后向服务器发送一个请求。
- 那么什么时候使用post什么时候使用get呢?
- 如果你希望用户能够对提交表单后的结果页面加书签,就必须使用GET,因为如果使用POST就无法加书签了。
- 那什么时候需要加书签呢?假设服务器返回一个搜索列表,你可能希望用户对结果加书签,那么他们就能直接查看这些结果,而不用再填写表单。
- 另外,如果你有一个处理订单的服务器脚本,可能不希望给这个页面加标签,因为否则每次他们返回这个标签时,都会重新提交这个订单。
- 还有一种情况肯定不想用GET,比如你的表单中的数据是私有的,如信用卡或口令,url是明文看到的,所以不安全。最后,如果你用了
textarea
就应该用POST,因为可能会发送大量数据,get和post对数据量都有限制,但是post要宽松的多。
可访问性
应该用
<label>
元素来标记那些标签,<label>
元素可以提供页面结构的更多的信息,使你能更容易地使用css对标签设置样式,另外对于有视力障碍的人,也有助于他们使用的屏幕阅读器更准确地标识表单元素。必须为表单元素增加一个id属性,然后增加一个label,设置其for属性为相应的id。例如:
1
2
3
4<input type="radio" id="whole_beantype" name="beantype" value="whole">
<label for="whole_beantype">Whole bean</label><br>
<input type="radio" id="ground_beantype" name="beantype" value="ground" checked>
<label for="ground_beantype">Ground</label>
field
和legend
分组
当表单变的越来越大时,在视觉上对元素分组会很有帮助,可以用fieldset做到,legend为这一组提供一个标签,例如:
1 | <fieldset> |