注:IE9之前的版本需要通过createElement创建HTML5新标签,然后引入html5shiv.js。
按默认分类
- 块级元素(block)
- 行内元素(inline)
- 行内块元素(inline-block)
块级元素(block)
- 元素独占一行显示(块级元素有默认宽度)
- 可以设置宽度和高度
- 当两个块级元素发生嵌套关系时,子元素如果没有设置宽度,那么该子元素的宽度与父元素的宽度一致。
- 代表:div, h1, p, ul
行内元素(inline)
- 元素不会独占一行,与其他行内元素在同一行显示
- 不可以设置宽度和高度,其宽度由内容决定
- 当两个行内元素发生嵌套关系时,子元素的宽度会根据内容自动调整
- 代表:span, a, strong, em
行内块元素(inline-block)
- 元素不会独占一行,与其他行内块元素在同一行显示
- 可以设置宽度和高度
- 当两个行内块元素发生嵌套关系时,子元素的宽度会根据设置的宽度来调整
- 代表:img, input, button
以上是常见的块级元素、行内元素和行内块元素的特点和代表性标签,但实际上,可以通过CSS的display属性来修改元素的显示方式,使其从块级元素变为行内元素或行内块元素,或者反之。
除了默认的块级元素、行内元素和行内块元素,还存在其他特殊类型的元素:
- 表格相关元素:table、tr、th、td等,用于创建表格结构。
- 列表相关元素:ul(无序列表)、ol(有序列表)、li(列表项),用于创建列表。
- 表单相关元素:form、input、select、textarea等,用于创建表单并收集用户输入。
- 头部、段落和标题元素:header、nav、p、h1、h2等,用于组织文档结构和内容。
- 文本样式元素:strong、em、span等,用于对文本进行加粗、斜体等样式设置。
- 嵌入内容元素:img、video、audio等,用于嵌入图片、视频、音频等多媒体内容。
- 可替换元素:iframe、object等,用于嵌入外部资源或插件。
需要注意的是,这些元素的默认展示方式可能会根据浏览器的不同而有所差异,可以使用CSS来控制元素的样式和展示效果。此外,HTML5还引入了一些新的语义化元素,如article、section、footer等,用于更好地描述页面结构和内容。
除了常见的元素类型,HTML还有一些特殊的元素和属性:
<div>
元素:<div>
元素是一个通用的容器元素,常用于组织和布局页面内容。<span>
元素:<span>
元素也是一个通用的容器元素,不会独占一行,常用于为文本或其他行内元素添加样式或处理。<iframe>
元素:<iframe>
元素用于在页面中嵌入另一个HTML文档或外部网页。它可以创建一个独立的浏览上下文,在其中显示其他网页的内容。<script>
元素:<script>
元素用于嵌入JavaScript代码或引入外部的JavaScript文件。它可以在页面中执行脚本。<style>
元素:<style>
元素用于嵌入CSS样式代码或引入外部的CSS文件。它用于定义页面的样式。<meta>
元素:<meta>
元素用于设置HTML文档的元数据,如字符集、页面描述、关键词等。它位于<head>
标签中。id
属性和class
属性:id
属性用于唯一标识一个元素,而class
属性用于指定一个或多个元素的类别。这些属性通常用于JavaScript和CSS选择器。
这些是HTML中一些常见和特殊的元素和属性。它们提供了丰富的功能和灵活性,用于创建各种类型的网页和交互式内容。
当然,还有其他一些比较特殊的HTML元素和属性:
<header>
元素:<header>
元素表示页面或者页面内某个区块的页眉,通常包含网站的标题、导航菜单、搜索框等内容。<nav>
元素:<nav>
元素用于定义页面的导航部分,通常包含一组导航链接或菜单。<footer>
元素:<footer>
元素表示页面或者页面内某个区块的页脚,通常包含版权信息、联系方式、相关链接等内容。<figure>
元素和<figcaption>
元素:<figure>
元素用于将一组相关的媒体内容(如图片、图表、视频等)与其标题(<figcaption>
)进行关联,并进行标注。<time>
元素:<time>
元素用于表示日期和时间。它可以帮助浏览器、搜索引擎和辅助技术正确地解读和展示时间相关的内容。data-*
属性:data-*
属性是自定义数据属性,可以用于存储与元素相关的自定义数据。这些属性可以供JavaScript访问,而不会影响到元素的样式和行为。<details>
元素和<summary>
元素:<details>
元素用于创建一个可折叠的内容区域,而<summary>
元素用于定义折叠区域的摘要或标题。
这些特殊的元素和属性提供了更多的语义化标记和功能,有助于开发人员更好地描述和组织页面的结构,提高可访问性并增强用户体验。
语义化的重要性
- 使开发者更容易理解代码,减少差异化,方便团队开发和维护。
- 使机器更容易理解页面内容,方便搜索爬虫、读屏幕软件、盲人设备和移动设备等其他设备解析。
页面结构的注意事项
- 尽可能减少使用没有语义的div和span元素。
- 块级元素和内联元素的嵌套必须符合web标准,例如内联元素不能嵌套块级元素。
HTML、XHTML和HTML5的关系
- HTML属于SGML(标准通用标记语言)。
- XHTML属于XML(可扩展标记语言),是对HTML进行XML严格化的结果。
- HTML5可以简单理解为h5 ≈ HTML + CSS3 + JavaScript + API,它减少了对外部插件的需求(例如Flash),具有更优秀的错误处理能力,并提供更多可以替代脚本的标记。
HTML5的新特性
- 新的语义化元素:article、footer、header、nav、section等。
- 增强的表单功能,包括新的表单控件:calendar、date、time、email、url、search等。
- 新的API:音频(用于媒体回放的video和audio元素)、图形(绘图canvas元素)等。
- 新的API:离线存储,可以通过创建cache manifest文件来创建应用程序缓存。
- 新的API:本地存储,包括localStorage(没有时间限制的数据存储)和sessionStorage(会话数据存储,关闭浏览器窗口数据将被删除)。
- 新的API:实时通信,提供设备能力。
Doctype
Doctype的作用是指明文档类型(DTD)并确保浏览器以标准模式解析页面。它位于HTML文档的最开始,用于告诉浏览器如何解析页面的元素和属性。
常见的Doctype声明包括:
HTML 4.01 Strict:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
它定义了HTML 4.01的严格版本,不允许使用过时的元素和属性,并要求标签闭合、属性值加引号等。HTML 4.01 Transitional:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
它是HTML 4.01的过渡版本,允许使用过时的元素和属性,对于老旧网页的兼容性较好。XHTML 1.0 Strict:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
它是XHTML 1.0的严格版本,要求语法更加规范,必须使用小写标签名、属性值必须加引号等。HTML5:
<!DOCTYPE html>
HTML5中的Doctype声明非常简洁,只需一个简单的<!DOCTYPE html>
即可,这是因为HTML5以标准模式解析,省略了DTD的引用。
选择合适的Doctype声明取决于页面开发者的需求和目标浏览器的支持情况。对于现代化的网页开发,推荐使用HTML5的Doctype声明。
盒模型
盒模型由内向外分为content, padding, border, margin四层。
盒模型存在两种标准:标准模型和IE模型。
标准模型
- 在标准模型中,盒模型的宽高仅包括内容(content)的宽高。
IE模型
- 盒模型的宽高包括内容(content)、填充(padding)和边框(border)的总宽高。
如何设置两种模型
- 标准模型:box-sizing: content-box;
- IE模型:box-sizing: border-box;
JS获取盒模型对应的宽高
- 使用dom.style.width/height方法只能获取到dom元素内联样式所设置的宽高。换句话说,如果样式是在style标签或外部CSS文件中设置的,则无法通过这种方法获取dom的宽高。
- 使用dom.currentStyle.width/height方法可以获取页面渲染完成后的结果,无论是通过哪种方式设置的样式,都能获取到,但仅适用于IE浏览器。
- 使用window.getComputedStyle(dom).width/height方法原理与第二种方法相同,但兼容性更好,适用于更多的浏览器。
- 使用dom.getBoundingClientRect().width/height方法根据元素在视窗中的绝对位置来获取宽高。
- 使用dom.offsetWidth/offsetHeight方法获取元素的实际宽高,包括边框、填充和滚动条等。
边距重叠
- 边距重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容、填充、边框)重合在一起形成一个单一边界。
BFC
- BFC(块级格式化上下文)根据块级盒子布局。
BFC的原理
- 内部的box会在垂直方向上依次排列。
- 每个元素的margin box的左边与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。
- 相邻box的垂直方向间距由margin决定,属于同一个BFC的相邻box的margin会发生重叠。
- BFC的区域不会与浮动区域的box重叠。
- BFC是一个页面上独立的容器,外部元素不会影响BFC内的元素,反之亦然。
- 计算BFC高度时,浮动元素也会参与计算。
如何创建BFC(边距重叠产生原因)
- float属性不为none(脱离文档流)。
- position为absolute或fixed。
- display为inline-block、table-cell、table-caption、flex、inline-flex。
- overflow不为visible。
- 根元素的垂直margin不会被重叠。
防止外边距重叠解决方案
- 外层元素使用padding代替。
- 内层元素使用透明边框border: 1px solid transparent。
- 内层元素使用绝对定位position: absolute。
- 外层元素使用overflow: hidden。
- 内层元素使用float: left或display: inline-block。
- 内层元素使用padding: 1px。
BFC应用场景
- 实现自适应两栏布局。
- 清除内部浮动。
浮动float的误解和误用
浮动最初设计用于实现文字环绕效果,即在一段文字中间插入图片并让文字环绕图片。但是,后来大家发现结合float + div可以实现之前通过table实现的网页布局,因此就被“误用”于网页布局了
浮动元素脱离了正常的文档流,并且会影响周围元素的布局。浮动元素会向左或向右移动,并尽可能靠近其容器的左侧或右侧。
浮动元素会导致父元素的高度塌陷,即父元素的高度无法自适应包含浮动元素的内容。
浮动元素在某些情况下会出现重叠或遮挡的问题,需要通过清除浮动来解决。
最常用的清除浮动的方法是使用clearfix技巧,给父元素添加一个clearfix的类,其中包含以下CSS样式:
.clearfix::after { content: ""; display: table; clear: both; }
这样可以清除浮动元素对父元素高度的影响。
浮动也可以用于创建多列布局,使元素像瀑布一样纵向排列。
由于浮动的一些问题和限制,现在更常用的布局方法是使用flexbox或grid布局。这些新的布局方式更加灵活、强大,并且能够解决浮动带来的一些问题。
总结:盒模型、BFC和浮动都是CSS中常见的概念和技术,了解它们的原理和应用场景,可以帮助我们更好地进行页面布局和设计。同时,需要注意正确使用浮动,并避免误解和误用带来的问题。
优化后的内容如下:
为什么float会导致父元素塌陷?
- float的破坏性:float破坏了父标签的原本结构,使得父标签出现了坍塌现象。
- 导致这一现象的最根本原因在于:被设置了float的元素会脱离文档流,我们的浮动是左右浮动,所以我们的块级元素都是左右排列。其根本原因在于float的设计初衷是解决文字环绕图片的问题。
- 包裹性也是float的一个非常重要的特性。普通的div如果没有设置宽度,它会撑满整个屏幕,在之前的盒子模型那一节也讲到过。而如果给div增加float:left之后,它突然变得紧凑了,宽度发生了变化,把内容中的三个字包裹了——这就是包裹性。为div设置了float之后,其宽度会自动调整为包裹住内容宽度,而不是撑满整个父容器,对于高度不同的容器,float排版出来的网页严丝合缝。
清除浮动(clear)
- 额外添加标签,在最后一个浮动的盒子的后面添加一个新标签,然后该标签可以清除浮动。
- 使用overflow清除浮动,在浮动的大盒子(父级标签)的样式中添加overflow:hidden。常用于ul li,给ul添加overflow:hidden。
- 使用伪类:after清除浮动。
- 编写一个通用的clearfix类,在需要清除浮动的地方直接添加该样式。
.clearfix:before,
.clearfix:after {
content: '';
display: table;
}
.clearfix:after {
clear: both;
}
.clearfix {
/*照顾ie6*/
zoom: 1;
}
使用方法:
<div class="box clearfix"></div>
定位position
position用于网页元素的定位,可设置static/relative/absolute/fixed/inherit。
- static:默认值。
- relative:会导致自身位置的相对变化,而不会影响其他元素的位置和大小。
- absolute:元素脱离了文档结构,导致父元素塌陷,元素具有“包裹性”,元素会悬浮在页面上方,会遮挡住下方的页面内容。设置top、left值时,元素是相对于最近的定位上下文来定位的,而不是相对于浏览器定位。
- fixed:元素脱离了文档结构,根据窗口(或iframe)确定位置。
URL、src、href
- src是指向资源的来源。
- href是指向需要连接的目标位置。
- URL是通用的“连接”的专业术语,在HTML语法中几乎不会使用。
- URL不是属性,src和href是属性。src用于替换当前元素,href用于在当前文档和引用资源之间建立联系,也就是说src引用的路径是图片自身的路径,href引用的路径是需要跳转到的位置。
link/import的差别
本质上,这两种方式都是为了加载CSS文件,但还是存在一些细微的差别。
- 老旧标准的差别:link属于XHTML标签,而@import是CSS提供的一种方式。link标签除了加载CSS外,还可以做很多其他的事情,比如定义RSS、定义rel连接属性等,@import只能加载CSS。
- 加载顺序的差别:当一个页面被加载时(浏览者浏览页面时),link引用的CSS会同时被加载,而@import引用的CSS会等到页面全部被下载完再被加载。因此,在使用@import加载CSS的页面上,开始时可能没有样式(闪烁),特别是在网速较慢时更明显。
- 兼容性的差别:由于@import是CSS2.1提出的,所以旧的浏览器不支持,只有IE5以上的浏览器可以识别,而link标签没有这个问题。
- 使用DOM控制样式时的差别:当使用JavaScript控制DOM改变样式时,只能使用link标签,因为@import不是DOM可以控制的。
px
PX实际上是像素,用于设置字体大小时比较稳定和精确。但是这种方法存在一个问题,当用户在浏览器中缩放页面时,会破坏我们的Web页面布局。这对于那些关心网站可用性的用户来说是一个大问题。因此,提出了使用"em"来定义Web页面的字体大小。
em
EM根据基准值来缩放字体大小。EM实质上是一个相对值,而不是具体的数值。这种技术需要一个参考点,通常是以"font-size"作为基准。例如,WordPress官方主题Twentytwelve的基准是14px=1em。
rem
REM是相对于根元素来设置字体大小的,这样就避免了需要了解父元素大小的问题。使用REM时,只需在根元素确定一个参考值即可。
px、em和rem的浏览器兼容性
除了IE6-IE8之外,其他浏览器都支持em和rem属性,而px是所有浏览器都支持的。所以,为了浏览器的兼容性,可以同时使用"px"和"rem",用"px"实现IE6-8下的效果,然后用"rem"实现其他浏览器的效果。
form的作用
- 直接提交表单。
- 使用submit/reset按钮。
- 便于浏览器保存表单数据。
- 第三方库可以整体提取值。
- 第三方库可以进行表单验证。