HTML 是网页使用的语言,定义了网页的结构和内容。浏览器访问网站,其实就是从服务器下载 HTML 代码,然后渲染出网页。

HTML 的全名是“超文本标记语言”(HyperText Markup Language),上个世纪90年代由欧洲核子研究中心的物理学家蒂姆·伯纳斯-李(Tim Berners-Lee)发明。它的最大特点就是支持超链接,点击链接就可以跳转到其他网页,从而构成了整个互联网。

1999年,HTML 4.01 版发布,成为广泛接受的 HTML 标准。2014年,HTML 5 发布,这是目前正在使用的版本。

浏览器的网页开发,涉及三种技术:HTMLCSSJavaScriptHTML 语言定义网页的结构和内容,CSS 样式表定义网页的样式,JavaScript 语言定义网页与用户的互动行为。HTML 语言是网页开发的基础,CSSJavaScript 都是基于 HTML 才能生效,即使没有这两者,HTML 本身也能使用,可以完成基本的内容展示。由于我们之前已经看过了原生的JavaScript,所以接下来的章节只介绍 HTML 语言。

下面就是一个简单网页的 HTML 源码:

上面这段代码,可以保存成文件hello.html。浏览器打开这个本地文件,就能看到文字“Hello HTML”:

浏览器右键菜单的“查看源码”(View page source),可以展示当前网页的 HTML 源码:

1 网页的基本概念

1.1 标签

网页的 HTML 代码由许许多多不同的标签(tag)构成。学习 HTML 语言,就是学习各种标签的用法。

下面就是标签的一个例子:

<

上面代码中,<title></title>就是一对标签。

标签用来告诉浏览器,如何处理这段代码。标签的内容就是浏览器所要渲染的、展示在网页上的内容。

标签放在一对尖括号里面(比如<title>),大多数标签都是成对出现的,分成开始标签和结束标签,结束标签在标签名之前加斜杠(比如</title>)。但是,也有一些标签不是成对使用,而是只有开始标签,没有结束标签,比如上一节示例的<meta>标签。

<

上面代码中,<meta>标签就没有结束标签</meta>

这种单独使用的标签,通常是因为标签本身就足够完成功能了,不需要标签之间的内容。实际应用中,它们主要用来提示浏览器,做一些特别处理。

标签可以嵌套:

<

上面代码中,<div>标签内部包含了一个<p>标签。

嵌套时,必须保证正确的闭合顺序,不能跨层嵌套,否则会出现意想不到的渲染结果:

<!--Wrong-->

上面代码就是错误的嵌套,闭合顺序不正确。

HTML 标签名是大小写不敏感,比如<title><TITLE>是同一个标签。不过,一般习惯都是使用小写。

另外,HTML 语言忽略缩进和换行。下面几种写法的渲染结果是一样的:

<

进一步说,整个网页的 HTML 代码完全可以写成一行,浏览器照样解析,结果完全一样。所以,正式发布网页之前,开发者有时会把源码压缩成一行,以减少传输的字节数。

各种网页的样式效果,比如内容的缩进和换行,主要靠 CSS 来实现。

1.2 元素

浏览器渲染网页时,会把 HTML 源码解析成一个标签树,每个标签都是树的一个节点(node)。这种节点就称为网页元素(element)。所以,“标签”和“元素”基本上是同义词,只是使用的场合不一样:标签是从源码角度来看,元素是从编程角度来看,比如<p>标签对应网页的p元素。

嵌套的标签就构成了网页元素的层级关系:

<

上面代码中,div元素内部包含了一个p元素。上层元素又称为“父元素”,下层元素又称为“子元素”,即divp的父元素,pdiv的子元素。

1.3 块级元素,行内元素

所有元素可以分成两大类:块级元素(block)和行内元素(inline)。

块级元素默认占据一个独立的区域,在网页上会自动另起一行,占据 100% 的宽度:

<p>Hello</p>
<p>HTML</p>

上面代码中,p元素是块级元素,因此浏览器会将内容分成两行显示:

行内元素默认与其他元素在同一行,不产生换行。比如,span就是行内元素,通常用来为某些文字指定特别的样式:

<

上面代码中,span元素是行内元素,因此浏览器会将两行内容放在一行显示:

1.4 属性

属性(attribute)是标签的额外信息,使用空格与标签名和其他属性分隔:

<

上面代码中,<img>标签有两个属性:srcwidth

属性可以用等号指定属性值,比如上例的demo.jpg就是src的属性值。属性值一般放在双引号里面,这不是必需的,但推荐总是使用双引号。

注意,属性名是大小写不敏感的,onclickonClick是同一个属性。

HTML 提供大量属性,用来定制标签的行为,后面的章节会有更详细的介绍。

2 网页的基本标签

符合 HTML 语法标准的网页,应该满足下面的基本结构:

<!DOCTYPE html>

不管多么复杂的网页,都是从上面这个基本结构衍生出来的。

前面说过,HTML 代码的缩进和换行,对于浏览器不产生作用。所以,上面的代码完全可以写成一行,渲染结果不变。上面这样分行写,只是为了提高可读性。

下面就依次介绍,这个基本结构的主要标签。它们构成了网页的骨架。

(1)<!doctype>

网页的第一个标签通常是<!doctype>,表示文档类型,告诉浏览器如何解析网页。

一般来说,只要像下面这样,简单声明doctypehtml即可。浏览器就会按照 HTML 5 的规则处理网页。

<!doctype html>

有时,该标签采用完全大写的形式,以便区别于正常的 HTML 标签。因为<!doctype>本质上不是标签,更像一个处理指令。

<!DOCTYPE html>

(2)<html>

<html>标签是网页的顶层容器,即标签树结构的顶层节点,也称为根元素(root element),其他元素都是它的子元素。一个网页只能有一个<html>标签。

该标签的lang属性,表示网页内容默认的语言:

<

上面代码表示,网页是中文内容。如果是英文内容,zh-CN要改成en

(3)<head>

<head>标签是一个容器标签,用于放置网页的元信息。它的内容不会出现在网页上,而是为网页渲染提供额外信息:

<!doctype html>

<head><html>的第一个子元素。如果网页不包含<head>,浏览器会自动创建一个。

<head>的子元素一般有下面七个,后文会一一介绍:

  • <meta>:设置网页的元数据。
  • <link>:连接外部样式表。
  • <title>:设置网页标题。
  • <style>:放置内嵌的样式表。
  • <script>:引入脚本。
  • <noscript>:浏览器不支持脚本时,所要显示的内容。
  • <base>:设置网页内部相对 URL 的计算基准。

(4)<meta>

<meta>标签用于设置或说明网页的元数据,必须放在<head>里面。一个<meta>标签就是一项元数据,网页可以有多个<meta><meta>标签约定放在<head>内容的最前面。

不管什么样的网页,一般都可以放置以下两个<meta>标签:

<

上面例子中,第一个<meta>标签表示网页采用 UTF-8 格式编码,第二个<meta>标签表示网页在手机端可以自动缩放。

<meta>标签有如下五个属性:

(a)charset 属性

<meta>标签的charset属性,用来指定网页的编码方式。该属性非常重要,如果设置得不正确,浏览器可能无法正确解码,就会显示乱码:

<

上面代码声明,网页为 UTF-8 编码。虽然开发者可以使用其他的编码方式,但正确的做法几乎总是应该采用 UTF-8

注意,这里声明的编码方式,应该与网页实际的编码方式一致,即声明了utf-8,网页就应该使用 UTF-8 编码保存。如果这里声明了utf-8,实际却是使用另一种编码(比如 GB2312),并不会导致浏览器的自动转码,网页可能会显示为乱码。

(b)name 属性,content 属性

<meta>标签的name属性表示元数据的名字,content属性表示元数据的值。它们合在一起使用,就可以为网页指定一项元数据:

<

上面代码包含了三个元数据:description是网页内容的描述,keywords是网页内容的关键字,author是网页作者。

元数据有很多种,大部分涉及浏览器内部工作机制,或者特定的使用场景,这里就不一一介绍了。下面是一些例子:

<

(c)http-equiv 属性,content 属性

<meta>标签的http-equiv属性用来覆盖 HTTP 回应的头信息字段,content属性是对应的字段内容。这两个属性与 HTTP 协议相关,属于高级用法,这里就不详细介绍了:

<

上面代码可以覆盖 HTTP 回应的Content-Security-Policy字段。

下面是另一些例子:

<

(5)<title>

<title>标签用于指定网页的标题,会显示在浏览器窗口的标题栏:

<

搜索引擎根据这个标签,显示每个网页的标题。它对于网页在搜索引擎的排序,有很大的影响,应该精心安排,反映网页的主题。

<title>标签的内部,不能再放置其他标签,只能放置无格式的纯文本。

(6)<body>

<body>标签是一个容器标签,用于放置网页的主体内容。浏览器显示的页面内容,都放置在它的内部。它是<html>的第二个子元素,紧跟在<head>后面:

<

4 空格和换行

HTML 语言有自己的空格处理规则。标签内容的头部和尾部的空格,一律忽略不计:

<

上面代码中,hello前面的空格和world后面的空格,浏览器一律忽略不计。

标签内容里面的多个连续空格(包含制表符t),会被浏览器合并成一个:

<

上面代码中,helloworld之间有多个连续空格,浏览器会将它们合并成一个。网页渲染的结果是,helloworld之间只有一个空格。

浏览器还会将文本里面的换行符(n)和回车符(r),替换成空格:

<

上面代码中,helloworld之间有多个换行,浏览器会将它们替换成空格,然后再将多个空格合并成一个。网页渲染的结果是,helloworld之间有一个空格:

这意味着,HTML 源码里面的换行,不会产生换行效果。

5 注释

HTML 代码可以包含注释,浏览器会自动忽略注释。注释以<!--开头,以-->结尾,下面就是一个注释的例子:

<!-- 这是一个注释 -->

注释可以是多行的,并且内部的 HTML 都不再生效了:

<!--

上面代码是一个注释的区块,内部的代码都是无效的,浏览器不会解析,更不会渲染它们。

注释有助于理解代码的含义,复杂的代码块前面最好加上注释。

html 源码_HTML从零开始——简单介绍相关推荐

  1. 集合之TreeMap源码分析,简单介绍什么是红黑树,SortedMap和NavigableMap之间的关系和区别

    TreeMap底层实现 1. TreeMap底层实现是红黑树,并且树的节点是内部类Entry类型 2. 红黑树的定义 ① 每个节点是黑色或红色:②根节点是黑色:③所有的叶节点是黑色,不是真正的叶节点, ...

  2. fastslam matlab,fastslam 快速定位和构图的源码,一个简单的例子,3D建模,可以用作学习智能机器人自主移动 matlab 272万源代码下载- www.pudn.com...

    文件名称: fastslam下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 31 KB 上传时间: 2015-03-19 下载次数: 22 详细说明:快速定 ...

  3. Android系统源码目录及功能介绍

    Android的移植按如下流程:     1.android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     2.正确挂载文件系统,确保内核启动参数和 android 源代码 ...

  4. (已更新)趣味制作生成微信小程序源码下载-安装简单方便

    这是一个diy类型的制作生成小程序源码 里面有多种素材生成,可以用来娱乐吧! 比如有的类型如:退出酒场告知书,喝酒认怂书,等等 小程序安装的话还是挺方便的,特别适合新手 PS:里面的二维码的话小编替换 ...

  5. GLSurfaceView源码分析以及简单使用

    GLSurfaceView源码分析以及简单使用 一. GLSurfaceView 如果我们没有使用过,从名字可以看出其与OpenGL以及Surfaceview有关,GLSurfaceView有以下特点 ...

  6. 【SemiDrive源码分析】【X9芯片启动流程】08 - X9平台 lk 目录源码分析 之 目录介绍

    [SemiDrive源码分析][X9芯片启动流程]08 - X9平台 lk 目录源码分析 之 目录介绍 一./rtos/lk/ 目录结构分析 1.1 /rtos/lk_boot/ 目录结构分析 1.2 ...

  7. 【小程序源码】检讨书生成微信小程序工具源码-安装搭建简单

    对于经常写检讨的小伙伴来说,福音来了 因为这是一款检讨书生成小程序 所以再也不用为了写检讨而烦恼了哦 支持自定义字数下线,主题自定义 支持多种类型检讨比如:学生党的,男朋友,领导演讲稿,共青团申请书等 ...

  8. 一对一视频聊天软件源码,实现简单侧边栏弹出动画

    一对一视频聊天软件源码,实现简单侧边栏弹出动画的相关代码 <!DOCTYPE html> <html lang="en"><head><m ...

  9. 【微信小程序控制硬件②】 开始微信小程序之旅,导入小程序Mqtt客户端源码,实现简单的验证和通讯于服务器.(附带源码)

    文章目录 一.前言: 二.注册微信小程序: 三.本博文连接和微信物联有何区别: 四.微信小程序`MQTT`客户端源码导入注意事项: 五.下载: 微信物联网生态主要分在微信硬件开发平台与腾讯物联开发平台 ...

最新文章

  1. 谈谈机器学习模型的部署
  2. jittor和pytorch生成网络对比之cogan
  3. PHP+jQuery+Ajax实现用户登录与退出
  4. 编辑器,webstorm,phpstorm系列配置方法汇总-笔记
  5. python中闭包详解
  6. linux 内核网络,数据接收流程图
  7. 真正的焦虑感来自对比
  8. java 删除n天前的文件_linux自动删除n天前备份
  9. 第五章 站在巨人的肩膀上
  10. Oracle LiveLabs实验:Introduction to Oracle Spatial Studio
  11. 网站瞬间变黑白颜色代码
  12. Spring实战第五章idea复现
  13. 用c语言编写计算器计划报告书,用c语言编写计算器计划报告书.docx
  14. C++ Qt 05:Qt布局管理器 - 荒 木 - 博客园
  15. 计算机网络之传输层笔记
  16. [Linux Audio Driver] SM6350平台音频bring up ( 一 )
  17. golang fmt包中的占位符
  18. 25、Venkman(JavaScript Debugger)调试工具
  19. 使用MATLAB对于Excel表格进行处理
  20. 本科毕业设计(云计算、深度学习、Python)

热门文章

  1. IMP-00009:异常结束导出文件解决方案
  2. 极速收藏!巨详细的分布式架构知识体系
  3. 文本检测算法新思路:基于区域重组的文本检测
  4. 华为超大云数据中心落地贵州,这些硬核技术有利支撑“东数西算”
  5. 常见的6种MySQL约束
  6. 【华为云技术分享】云图说 | 容器交付流水线ContainerOps,提升持续交付效率
  7. 解密昇腾AI处理器--DaVinci架构(计算单元)
  8. 3分钟创建一个游戏类容器应用【华为云分享】
  9. php二分法 冒泡 快速排序,PHP 常见算法【冒泡排序, 快速排序, 插入排序, 取舍排序, 二分法查找, .】...
  10. 算法 - 斐波那契数列问题(转自微信公众号码农翻身)