九、HTML5新增元素,浏览器前缀,CSS常见函数扩展及BFC的深入了解
# 1、HTML5新增元素
# 1.1.HTML5语义化元素
在HMTL5之前,我们的网站分布层级通常包括哪些部分呢?
- header、nav、main、footer
但是这样做有一个弊端:
- 我们往往过多的使用div, 通过id或class来区分元素;
- 对于浏览器来说这些元素不够语义化;
- 对于搜索引擎来说, 不利于SEO的优化;
HTML5新增了语义化的元素:
<header>
:头部元素<nav>
:导航元素<section>
:定义文档某个区域的元素<article>
:内容元素<aside>
:侧边栏元素<footer>
:尾部元素
# 1.2.HTML5其他新增元素
Web端事实上一直希望可以更好的嵌入音频和视频, 特别是21世纪以来, 用户带宽的不断提高, 浏览器因为和视频变得非常容易.
- 在HTML5之前是通过flash或者其他插件实现的, 但是会有很多问题;
- 比如无法很好的支持HTML/CSS特性, 兼容性问题等等;
HTML5增加了对媒体类型的支持:
- 音频:
<audio>
- 视频:
<video>
- 音频:
Video和Audio使用方式有两个:
- 一方面我们可以直接通过元素使用video和autio;
- 另一方面我们可以通过JavaScript的API对其进行控制;
# 1.3.HTML5新增元素 - video
HTML <video>
元素 用于在HTML或者XHTML文档中嵌入媒体播放器,用于支持文档内的视频播放。
<video src-"../video/xxxx.mp4" controls></video>
- video常见的属性
常见属性 | 值的方式 | 属性作用 |
---|---|---|
src | URL地址 | 视频播放的URL地址 |
width | pixels(像素) | 设置video宽度 |
height | pixels(像素) | 设置video高度 |
controls | Boolean类型 | 是否显示控制栏,包括音量,跨帧,暂停/恢复播放。 |
autoplay | Boolean类型 | 是否视频自动播放(某些浏览器需要添加muted, 比如Chrome) |
muted | Boolean类型 | 是否静音播放 |
preload | none/metadata/auto | 是否需要预加载视频. metadata表示预加载元数据(比如视频时长等) |
poster | URL地址 | 一海报帧的URL(相当于设置视频未播放时的封面) |
- video支持的视频格式
- 每个视频都会有自己的格式, 浏览器的video并非支持所有的视频格式
video的兼容性写法
在
<video>
元素中间的内容,是针对浏览器不支持此元素时候的降级处理。内容一:通过
<source>
元素指定更多视频格式的源;内容二:通过p/div等元素指定在浏览器不支持video元素的情况, 显示的内容;
<video src-"../video/xxxx.mp4" controls width="500" autoplay muted>
<source src="./video/xxxx.webm"></source>
<source src="./video/xxxx.ogg"></source>
<p>你的浏览器不支持HTML5的video元素,请更换浏览器查看</p>
</video>
2
3
4
5
# 1.4.HTML5新增元素 - audio
HTML <audio>
元素用于在文档中嵌入音频内容, 和video的用法非常类似- 常见属性
常见属性 | 值的方式 | 属性作用 |
---|---|---|
src | URL地址 | 音频播放的URL地址 |
controls | Boolean类型 | 是否显示控制栏,包括音量,进度,暂停/恢复播放 |
autoplay | Boolean类型 | 是否视频自动播放(某些浏览器需要添加muted, 比如Chrome) |
muted | Boolean类型 | 是否静音播放 |
preload | none/metadata/auto | 是否需要预加载视频. metadata表示预加载元数据(比如视频时长等) |
audio支持的音频格式
每个音频都会有自己的格式, 浏览器的audio并非支持所有的视频格式
具体的支持的格式可以通过下面的链接查看: audio支持的音频格式查看 (opens new window)
补充:在<audio>
元素中间的内容,是针对浏览器不支持此元素时候的降级处理。
<audio src="../media/逍遥叹.mp3" controls autoplay muted>
<source src="../media/逍遥叹.ogg"></source>
<p>你的浏览器不支持HTML5的audio元素,请更换浏览器查看</p>
</audio>
2
3
4
# 2、input元素的扩展内容和新增全局属性 data-*
# 2.1.input元素的扩展内容
HTML5对input元素也进行了扩展,在之前我们已经学习过的其中几个属性也是HTML5的特性:
- placeholder:输入框的占位文字
- multiple:多个值
- autofocus:最多输入的内容
另外对于input的type值也有很多扩展:
- date
- time
- number
- tel
- color
- 等等…
查看MDN文档: input的type的更多扩展 (opens new window)
# 2.2.新增全局属性 data-*
- 在HTML5中, 新增一种全局属性的格式 data-*, 用于自定义数据属性:
- data设置的属性可以在JavaScript的DOM操作中通过dataset轻松获取到;
- 通常用于HTML和JavaScript数据之间的传递;
<div class="box" title="abc" data-name="lyk" data-age="23">
box
</div>
<script>
const boxEl = document.querySelector(".box")
console.log(boxEl.dataset) //DOMStringMap {name: 'lyk', age: '23'}
</script>
2
3
4
5
6
7
- 在小程序中, 就是通过data-来传递数据的, 所以该全局属性必须要掌握
# 3、CSS属性 - white-space和text-overflow
# 3.1.CSS属性 - white-space
- white-space用于设置空白处理和换行规则
- normal:合并所有连续的空白,允许单词超屏时自动换行
- nowrap:合并所有连续的空白,不允许单词超屏时自动换行
- pre:阻止合并所有连续的空白,不允许单词超屏时自动换行
- pre-wrap:阻止合并所有连续的空白,允许单词超屏时自动换行
- pre-line:合并所有连续的空白(但保留换行),允许单词超屏时自动换行
# 3.2.CSS属性 - text-overflow
text-overflow通常用来设置文字溢出时的行为
- clip:溢出的内容直接裁剪掉(字符可能会显示不完整)
- ellipsis:溢出那行的结尾处用省略号表示
text-overflow生效的前提是overflow不为visible
常见的是将white-space、text-overflow、overflow一起使用:实现单行文字超出显示省略号
.nowrap-ellipsis {
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
2
3
4
5
# 4、CSS中常用的函数扩展
# 4.1.CSS中的函数var、calc、blur、gradient
我们有使用过很多个CSS函数:
- 比如rgb/rgba/translate/rotate/scale等;
- CSS函数通常可以帮助我们更加灵活的来编写样式的值;
下面我们再学习几个非常好用的CSS函数:
- var: 使用CSS定义的变量;
- calc: 计算CSS值, 通常用于计算元素的大小或位置;
- blur: 毛玻璃(高斯模糊)效果;
- gradient:颜色渐变函数
# 4.2.CSS函数 - var
- CSS中可以自定义属性
- 属性名需要以两个减号(--)开始;
- 属性值则可以是任何有效的CSS值;
div {
--more-color:red;
}
2
3
- 我们可以通过var函数来使用: (前提span是div的子元素)
span {
color:var(--more-color)
}
2
3
- 规则集定义的选择器, 是自定义属性的可见作用域(只在选择器内部有效)
- 所以推荐将自定义属性定义在html中,也可以使用 :root选择器;
:root {
--moreColor:pink; /* 在:root里面定义变量,这样所有的元素都可以使用该变量了 */
}
2
3
# 4.3.CSS函数 - calc
calc() 函数允许在声明 CSS 属性值时执行一些计算。
- 计算支持加减乘除的运算:+ 和 - 运算符的两边必须要有空白字符。
通常用来设置一些元素的尺寸或者位置
.box .bar {
display:inline-block;
width:calc(100% - 70px)
height:100px;
background-color:#ffoooo;
}
2
3
4
5
6
# 4.4.CSS函数 - blur
blur() 函数将高斯模糊应用于输出图片或者元素;
- blur(radius)
- radius, 模糊的半径, 用于定义高斯函数的偏差值, 偏差值越大, 图片越模糊;
通常会和两个属性一起使用:
- filter: 将模糊或颜色偏移等图形效果应用于元素;
- backdrop-filter: 为元素后面的区域添加模糊或者其他效果;
<style>
img {
/* filter: blur(5px); */
}
.box {
display: inline-block;
position: relative;
/* filter: blur(5px); */
}
.cover {
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
background-color: rgba(255,255,255,0.2);
backdrop-filter: blur(10px);
}
</style>
<div class="box">
<img src="./kobe01.jpg" alt="">
<div class="cover"></div>
</div>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 4.5.CSS函数 - gradient
<gradient>
是一种<image>CSS
数据类型的子类型,用于表现两种或多种颜色的过渡转变。- CSS的
<image>
数据类型描述的是2D图形; - 比如background-image、list-style-image、border-image、content等;
<image>
常见的方式是通过url来引入一个图片资源;- 它也可以通过CSS的
<gradient>
函数来设置颜色的渐变;
- CSS的
<gradient>
常见的函数实现有下面几种:- linear-gradient():创建一个表示两种或多种颜色线性渐变的图片;默认:上到下进行颜色渐变
- radial-gradient():创建了一个图像,该图像是由从原点发出的两种或者多种颜色之间的逐步过渡组成;
- repeating-linear-gradient():创建一个由重复线性渐变组成的
<image>
; - repeating-radial-gradient():创建一个重复的原点触发渐变组成的
<image>
; - 等等;
<style>
.box {
width: 200px;
height: 100px;
/* background-color: orange; */
/* background-image: linear-gradient(red, blue); */
/* 改变方向 */
/* background-image: linear-gradient(to right, red, blue); */
/* background-image: linear-gradient(to right top, red, blue); */
/* background-image: linear-gradient(-45deg, red, blue); */
/* background-image: linear-gradient(to right, red, blue 40px, orange 60%, purple 100%); */
/* radial-gradient */
/* background-image: radial-gradient(red, blue); */
background-image: radial-gradient(at 0% 50%, red, blue);
}
</style>
<div class="box"></div>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 5、浏览器前缀
有时候可能会看到有些CSS属性名前面带有:-o-、-xv-、-ms-、mso-、-moz-、-webkit-
官方文档专业术语叫做:vendor-specific extensions(供应商特定扩展)
为什么需要浏览器前缀了?
- CSS属性刚开始并没有成为标准,浏览器为了防止后续会修改名字给新的属性添加了浏览器前缀;
上述前缀叫做浏览器私有前缀,只有对应的浏览器才能解析使用
- -o-、-xv-:Opera等
- -ms-、mso-:IE等
- -moz-:Firefox等
- -webkit-:Safari、Chrome等
注意:不需要手动添加,后面学习了模块化打包工具会自动添加浏览器前缀
# 6、BFC的深入了解
# 6.1.了解FC – Formatting Context(设置上下文格式)
FC的全称是Formatting Context,元素在标准流里面都是属于一个FC的;
块级元素的布局属于Block Formatting Context(BFC)
- 也就是block level box都是在BFC中布局的;
行内级元素的布局属于Inline Formatting Context(IFC)
- 而inline level box都是在IFC中布局的
# 6.2.了解BFC – Block Formatting Context(块格式上下文)
block level box都是在BFC中布局的,那么这个BFC在哪里呢?拿出来给我看看。
- W3C解释:Floats, absolutely positioned elements,block containers(such as inline-blocks,table-cells,and table-captions) that are not block boxes, and block boxes with 'overflow' other than 'visible'(except when that value has been propagated to the viewport) establish new block formatting contexts for their contents.(浮动、绝对定位元素、不是块框的块容器(如内联块、表格单元格和表格标题)以及具有“溢出”而不是“可见”的块框(除非该值已传播到视口)为其内容建立新的块格式上下文。)
MDN上有整理出在哪些具体的情况下会创建BFC:
- 根元素(
<html>
) - 浮动元素(元素的 float 不是 none)
- 绝对定位元素(元素的 position 为 absolute 或 fixed)
- 行内块元素(元素的 display 为 inline-block)
- 表格单元格(元素的 display 为 table-cell,HTML表格单元格默认为该值),表格标题(元素的 display 为 table-caption,HTML表格标题默认为该值)
- 匿名表格单元格元素(元素的 display 为 table、table-row、 table-row-group、table-header-group、table-footer-group(分别是HTML table、row、tbody、thead、tfoot 的默认属性)或 inline-table)
- overflow 计算值(Computed)不为 visible 的块元素
- 弹性元素(display 为 flex 或 inline-flex 元素的直接子元素)
- 网格元素(display 为 grid 或 inline-grid 元素的直接子元素)
- display 值为 flow-root 的元素
- 根元素(
# 6.3.BFC有什么作用呢?
我们来看一下官方文档对BFC作用的描述:
In a block formatting context, boxes are laid out one after the other, vertically, beginning at the top of a containing block. The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse
In a block formatting context, each box's left outer edge touches the left edge of the containing block (for right-to-left formatting, right edgestouch). This is true even in the presence of floats (although a box's line boxes may shrink due to the floats), unless the box establishes a new block formatting context (in which case the box itself may become narrower due to the floats).
【在块格式上下文中,从包含块的顶部开始,垂直地一个接一个地布置框。两个同级框之间的垂直距离由“边距”属性确定。块格式上下文中相邻块级别框之间的垂直边距折叠
在块格式上下文中,每个框的左外边缘都与包含块的左边缘接触(对于从右到左的格式,为右边缘接触)。即使存在浮点数(尽管方框的线框可能会因浮点数而缩小),也会出现这种情况,除非方框建立了新的块格式上下文(在这种情况下,方框本身可能会因浮点数而变窄)。】
简单概况如下:
- 在BFC中,box会在垂直方向上一个挨着一个的排布;
- 垂直方向的间距由margin属性决定;
- 在同一个BFC中,相邻两个box之间的margin会折叠(collapse);
- 在BFC中,每个元素的左边缘是紧挨着包含块的左边缘的;
那么这个东西有什么用呢?
- 解决margin的折叠问题;
- 解决浮动高度塌陷问题;
# 6.4.BFC的作用一:解决折叠问题(权威)
- 在同一个BFC中,相邻两个box之间的margin会折叠(collapse)
- 官方文档明确的有说:The vertical distance between two sibling boxes is determined by the 'margin' properties. Vertical margins between adjacent block-level boxes in a block formatting context collapse.【两个同级框之间的垂直距离由“边距”属性确定。块格式上下文中相邻块级别框之间的垂直边距折叠。】
- 那么如果我们让两个box是不同的BFC呢?那么就可以解决折叠问题。
<!-- 最终box和bar上下的间距为50px,出现了折叠 -->
<style>
.box {
width: 100px;
height: 100px;
background-color: red;
margin-bottom: 30px;
}
.bar {
width: 100px;
height: 100px;
background-color: pink;
margin-top: 50px;
}
</style>
<div class="box"></div>
<div class="bar"></div>
<!-- 解决折叠:让他们处于不同的bfc 上面6.2有讲如何创建一个新的bfc -->
<!--方法1:给box设置:display:inline-block 创建新的bfc-->
<!--方法2:给box套一层父元素contain;然后让父元素创建新的bfc,导致box在新的bfc中布局;
即可解决垂直方向上外边距的折叠问题,及父子元素之间的margin传递问题-->
<style>
.contain {
/* border: 1px solid transparent;*/ /*防止box的margin传递给父元素*/
/* 触发BFC 如下 */
overflow: auto;
/* display: inline-block; */
/* display: flow-root; */
/* display: table-cell; */
/* display: flex; */
/* display: grid; */
/* display: table; */
background-color: yellow;
}
.contain .box {
width: 100px;
height: 100px;
background-color: red;
margin-bottom: 30px;
}
.bar {
width: 200px;
height: 100px;
background-color: pink;
margin-top: 50px;
}
</style>
<div class="contain">
<div class="box"></div>
</div>
<div class="bar"></div>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 6.5.BFC的作用二:解决浮动高度塌陷(权威)
网上有很多说法,BFC可以解决浮动高度塌陷,可以实现清除浮动的效果。
- 但是从来没有给出过BFC可以解决高度塌陷的原理或者权威的文档说明;
- 他们也压根没有办法解释,为什么可以解决浮动高度的塌陷问题,但是不能解决绝对定位元素的高度塌陷问题呢?
事实上,BFC解决高度塌陷需要满足两个条件:
- 浮动元素的父元素触发BFC,形成独立的块级格式化上下文(Block Formatting Context);
- 浮动元素的父元素的高度是auto的;(即浮动元素的父元素没有设置height,默认为:auto)
<style>
.contain {
border: 1px solid #000;
/* 在父元素contain没有设置高度的情况下,即height:auto;
触发BFC;即可解决由于子元素浮动导致父元素高度塌陷的情况;
触发父元素bfc的方法如下 */
overflow: auto;
/* display: inline-block; */
/* display: flow-root; */
/* display: table-cell; */
/* display: flex; */
/* display: grid; */
/* display: table; */
background-color: yellow;
}
.contain .box {
float: left;
width: 100px;
height: 100px;
background-color: red;
margin-bottom: 30px;
}
.bar {
width: 200px;
height: 100px;
background-color: pink;
margin-top: 50px;
}
</style>
<div class="contain">
<div class="box"></div>
</div>
<div class="bar"></div>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
- BFC的高度是auto的情况下,是如下方法计算高度的
- 1.如果只有inline-level,是行高的顶部和底部的距离;
- 2.如果有block-level,是由最底层的块上边缘和最底层块盒子的下边缘之间的距离
- 3.如果有绝对定位元素,将被忽略;
- 4.如果有浮动元素,那么会增加高度以包括这些浮动元素的下边缘