CSS
CSS引入方式
将CSS
作用到HTML
主要有四种方式,分别为HTML
元素添加内联样式、<style>
标签嵌入样式、<link>
标签引入外部样式、@import
导入外部样式。
内联方式
<div style="color: red"></div>
特点
- 不需要额外的
HTTP
请求。 - 适合
HTML
电子邮件与富文本编辑器的使用。 - 内联样式比外部样式具有更高的优先级,可以覆盖外部样式。
- 可以在不更改直接主
CSS
样式表的情况下更改样式,直接将规则添加到元素。 - 适合于动态样式,对于每个元素的样式都不同的情况可以直接将样式作用到单个元素。
不足
- 页面维护可能会非常棘手
- 过多添加同样的样式会导致页面复杂
嵌入方式
<style>
div {
color: blue;
}
</style>
特点
CSS
与HTML
一起作为一个文件,不需要额外的HTTP
请求- 适合于动态样式,对于不同的用户从数据库加载不同样式嵌入到页面
不足
- 嵌入样式不能被浏览器缓存并重新用于其他页面
链接方式
<link rel="stylesheet" href="Path To stylesheet.css">
特点
- 可以通过替换
CSS
文件以改变网站的主题。 - 只需在单个
CSS
文件中进行一次更改,所有网站页面都会更新。 - 多个页面请求的网站速度有所提高,
CSS
在第一次访问时就被浏览器缓存。
不足
- 每个链接的
CSS
文件都需要一个附加的HTTP
请求
导入方式
<style>
@import url("Path To stylesheet.css");
</style>
特点
- 在不更改
HTML
标签的情况下添加新的CSS
文件
不足
- 需要额外的
HTTP
请求
link与@import差异
<link>
属于HTML
提供的标签,@import
属于CSS
语句,值得注意的是@import
导入语句需要写在CSS
样式表的开头,否则无法正确导入外部文件。@import
是CSS2.1
才出现的概念,所以如果浏览器版本较低例如IE4
与IE5
等,无法正确导入外部样式文件,当然也可以利用这一点来隐藏对于这些旧版本的浏览器的CSS2
规则。- 当
HTML
文件被加载时,<link>
引用的文件会同时被加载,而@import
引用的文件则会等页面全部下载完毕再被加载,所以有时候浏览@import
加载CSS
的页面时会没有样式,也就是闪烁现象,网速慢的时候就比较明显。 - 使用
<link>
标签可以设定rel
属性,当rel
为stylesheet
时表示将样式表立即应用到文档,为alternate stylesheet
时表示为备用样式表,不会立即作用到文档,可以通过JavaScript
取得<link>
标签对象,通过设置disabled
来实现样式表的立即切换,可用作切换主题等功能,而@import
不属于DOM
无法使用JavaScript
来直接控制。 <link>
与@import
混用可能会对网页性能有负面影响,在一些低版本IE
中<link>
与@import
混用会导致样式表文件逐个加载,破坏并行下载的方式导致页面加载变慢。此外无论是哪种浏览器,若在<link>
中引入的CSS
中继续使用@import
加载外部CSS
,同样会导致顺序加载而不是并行加载,因为浏览器需要先解析<link>
引入的CSS
发现@import
外部CSS
后再次引入外部CSS
,这样就导致页面加载变慢。
CSS选择器
使用CSS
对HTML
页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到选择器。HTML
页面中的元素就是通过CSS
选择器进行控制的。
id选择器
<div id="s1">id选择器</div>
<style>
#s1 {
color: red;
}
</style>
类选择器
<div class="s2">类选择器1</div>
<div class="s2">类选择器2</div>
<div class="s3">类选择器3</div>
<style>
.s2{
color: green;
}
/* 可以将多个选择器写在一起 */
.s2,.s3,#s1{
font-style:italic;
}
</style>
标签选择器
<p>标签选择器1</p>
<p>标签选择器2</p>
<style>
p{
color: blue;
}
</style>
相邻选择器
<div id="s4">相邻选择器 +</div>
<div>相邻选择器</div>
<!-- + 只选择紧邻的兄弟 -->
<div id="s5">相邻选择器 ~</div>
<div class="s6">相邻选择器</div>
<div class="s6">相邻选择器</div>
<div class="s6">相邻选择器</div>
<!-- ~ 选择兄弟以及兄弟的兄弟..... -->
<style>
#s4 + div{
color: #0033ff;
}
#s5 ~ .s6{
color: #FFD700;
}
</style>
子元素选择器
<div class="s7">
<div>子元素选择器</div>
<em>
<div>子元素选择器不被选择</div>
<div>子元素选择器不被选择</div>
</em>
</div>
<style>
/* 子选择器会选择下一级 */
.s7 > div{
color: #E066FF;
}
</style>
后代选择器
<div class="s8">
<div>后代选择器</div>
<em>
<div>后代选择器</div>
<div>后代选择器</div>
</em>
</div>
<style>
/* 后代选择器会选择全部后代 */
.s8 div{
color: #7CFC00;
}
</style>
通配符选择器
<div class="s9">
<div>通配符选择器</div>
<em>通配符选择器</em>
</div>
<style>
.s9 * {
color: #3370CC
}
</style>
属性选择器
<div rel="s10" >属性选择器</div>
<style>
div[rel="s10"]{
color: #573CC4
}
</style>
CSS伪类与伪元素
CSS
引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或者是列表中的第一个元素。
伪类
伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以通过:hover
来描述这个元素的状态。虽然它和普通的css
类相似,可以为已有的元素添加样式,但是它只有处于dom
树无法描述的状态下才能为元素添加样式,所以将其称为伪类。
状态性伪类
是基于元素当前状态进行选择的。在与用户的交互过程中元素的状态是动态变化的,因此该元素会根据其状态呈现不同的样式。当元素处于某状态时会呈现该样式,而进入另一状态后,该样式也会失去。
:link
应用于未被访问过的链接。:hover
应用于鼠标悬停到的元素。:active
应用于被激活的元素。:visited
应用于被访问过的链接,与:link
互斥。:focus
应用于拥有键盘输入焦点的元素。
结构性伪类
CSS3
新增选择器,利用dom
树进行元素过滤,通过文档结构的互相关系来匹配元素,能够减少class
和id
属性的定义,使文档结构更简洁。
div:first-child
选择属于其父元素的第一个子元素的每个div
元素。div:last-child
选择属于其父元素最后一个子元素的每个div
元素。div:nth-child(n)
选择属于其父元素的第n个子元素的每个div
元素。div:nth-last-child(n)
同上,从这个元素的最后一个子元素开始算。div:nth-of-type(n)
选择属于其父元素第n
个div
元素的每个div
元素。div:nth-last-of-type(n)
同上,但是从最后一个子元素开始计数。div:first-of-type
选择属于其父元素的首个div
元素的每个div
元素。div:last-of-type
选择属于其父元素的最后div
元素的每个div
元素。div:only-child
选择属于其父元素的唯一子元素的每个div
元素。div:only-of-type
选择属于其父元素唯一的div
元素的每个div
元素。:empty
选择的元素里面没有任何内容。:checked
匹配被选中的input
元素,这个input
元素包括radio
和checkbox
。:default
匹配默认选中的元素,例如提交按钮总是表单的默认按钮。:disabled
匹配禁用的表单元素。:enabled
匹配没有设置disabled
属性的表单元素。:valid
匹配条件验证正确的表单元素。
伪元素
用于创建一些不在文档树中的元素,并为其添加样式。实际上,伪元素就是选取某些元素前面或后面这种普通选择器无法完成的工作。控制的内容和元素是相同的,但它本身是基于元素的抽象,并不存在于文档结构中。比如说,我们可以通过::before
来在一个元素前增加一些文本,并为这些文本添加样式。
CSS3
规范中要求使用单冒号:
用于CSS3
伪类,双冒号::
用于 CSS3
伪元素,目的是区分伪类和伪元素。
::first-letter
选择元素文本的第一个字。::first-line
选择元素文本的第一行。::before
在元素内容的最前面添加新内容。::after
在元素内容的最后面添加新内容。::selection
匹配用户被用户选中或者处于高亮状态的部分。::placeholder
匹配占位符的文本,只有元素设置了placeholder
属性时,该伪元素才能生效。
代码示例
<!DOCTYPE html>
<html lang="zh">
<head>
<title>CSS选择器</title>
</head>
<body>
<div id="s1">id选择器</div>
<div class="s2">类选择器1</div>
<div class="s2">类选择器2</div>
<div class="s3">类选择器3</div>
<p>标签选择器1</p>
<p>标签选择器2</p>
<div id="s4">相邻选择器 +</div>
<div>相邻选择器</div>
<!-- + 只选择紧邻的兄弟 -->
<div id="s5">相邻选择器 ~</div>
<div class="s6">相邻选择器</div>
<div class="s6">相邻选择器</div>
<div class="s6">相邻选择器</div>
<!-- ~ 选择兄弟以及兄弟的兄弟..... -->
<div class="s7">
<div>子元素选择器</div>
<em>
<div>子元素选择器不被选择</div>
<div>子元素选择器不被选择</div>
</em>
</div>
<div class="s8">
<div>后代选择器</div>
<em>
<div>后代选择器</div>
<div>后代选择器</div>
</em>
</div>
<div class="s9">
<div>通配符选择器</div>
<em>通配符选择器</em>
</div>
<div rel="s10" >属性选择器</div>
<div >
<div class="s11">伪类选择器例</div>
</div>
<style>
#s1 {
color: red;
}
.s2{
color: green;
}
.s2,.s3,#s1{
font-style:italic;
}
p{
color: blue;
}
#s4 + div{
color: #0033ff;
}
#s5 ~ .s6{
color: #FFD700;
}
/* 子选择器会选择下一级 */
.s7 > div{
color: #E066FF;
}
/* 后代选择器会选择全部后代 */
.s8 div{
color: #7CFC00;
}
.s9 * {
color: #3370CC;
}
div[rel="s10"]{
color: #573CC4;
}
.s11:first-child{
color: #55AA55;
}
</style>
</body>
</html>
CSS伪类与伪元素
CSS
引入伪类和伪元素概念是为了格式化文档树以外的信息。也就是说,伪类和伪元素是用来修饰不在文档树中的部分,比如,一句话中的第一个字母,或者是列表中的第一个元素。
伪类
伪类用于当已有元素处于的某个状态时,为其添加对应的样式,这个状态是根据用户行为而动态变化的。比如说,当用户悬停在指定的元素时,我们可以通过:hover
来描述这个元素的状态。虽然它和普通的css
类相似,可以为已有的元素添加样式,但是它只有处于dom
树无法描述的状态下才能为元素添加样式,所以将其称为伪类。
状态性伪类
是基于元素当前状态进行选择的。在与用户的交互过程中元素的状态是动态变化的,因此该元素会根据其状态呈现不同的样式。当元素处于某状态时会呈现该样式,而进入另一状态后,该样式也会失去。
:link
应用于未被访问过的链接。:hover
应用于鼠标悬停到的元素。:active
应用于被激活的元素。:visited
应用于被访问过的链接,与:link
互斥。:focus
应用于拥有键盘输入焦点的元素。
结构性伪类
CSS3
新增选择器,利用dom
树进行元素过滤,通过文档结构的互相关系来匹配元素,能够减少class
和id
属性的定义,使文档结构更简洁。
div:first-child
选择属于其父元素的第一个子元素的每个div
元素。div:last-child
选择属于其父元素最后一个子元素的每个div
元素。div:nth-child(n)
选择属于其父元素的第n个子元素的每个div
元素。div:nth-last-child(n)
同上,从这个元素的最后一个子元素开始算。div:nth-of-type(n)
选择属于其父元素第n
个div
元素的每个div
元素。div:nth-last-of-type(n)
同上,但是从最后一个子元素开始计数。div:first-of-type
选择属于其父元素的首个div
元素的每个div
元素。div:last-of-type
选择属于其父元素的最后div
元素的每个div
元素。div:only-child
选择属于其父元素的唯一子元素的每个div
元素。div:only-of-type
选择属于其父元素唯一的div
元素的每个div
元素。:empty
选择的元素里面没有任何内容。:checked
匹配被选中的input
元素,这个input
元素包括radio
和checkbox
。:default
匹配默认选中的元素,例如提交按钮总是表单的默认按钮。:disabled
匹配禁用的表单元素。:enabled
匹配没有设置disabled
属性的表单元素。:valid
匹配条件验证正确的表单元素。
伪元素
用于创建一些不在文档树中的元素,并为其添加样式。实际上,伪元素就是选取某些元素前面或后面这种普通选择器无法完成的工作。控制的内容和元素是相同的,但它本身是基于元素的抽象,并不存在于文档结构中。比如说,我们可以通过::before
来在一个元素前增加一些文本,并为这些文本添加样式。
CSS3
规范中要求使用单冒号:
用于CSS3
伪类,双冒号::
用于 CSS3
伪元素,目的是区分伪类和伪元素。
::first-letter
选择元素文本的第一个字。::first-line
选择元素文本的第一行。::before
在元素内容的最前面添加新内容。::after
在元素内容的最后面添加新内容。::selection
匹配用户被用户选中或者处于高亮状态的部分。::placeholder
匹配占位符的文本,只有元素设置了placeholder
属性时,该伪元素才能生效。
CSS优先级
当样式表比较复杂时,很容易出现多个样式对作用于一个标签的情况,这时就需要注意CSS
优先级来决定哪些样式会被作用于该标签,哪些会被覆盖。
选择器的优先级
对于标签自有的属性,选择器的优先级规则为:
内联样式 > ID 选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器
当如下几个选择器作用于同一个标签时本例显示的颜色为red
,可以在浏览器的Elements
选中相应元素,在Styles
查看样式的覆盖情况并调试。
<div id="i1" class="c1">T1</div>
<style>
#i1 {
color: red;
}
.c1 {
color: blue;
}
:nth-child(1){
color: green;
}
div {
color: grey;
}
</style>
选择符的优先级
选择符是由基本选择器组成,基本分为:
后代选择符: #i1 .c1 .c2
子选择符:#i1 > .c1 > .c2
相邻选择符:.c1 + .c2
计算选择符中 ID
选择器的个数a
,计算选择符中类选择器、属性选择器以及伪类选择器的个数之和b
,计算选择符中标签选择器和伪元素选择器的个数之和c
。按a
、b
、c
的顺序依次比较大小,大的则优先级高,相等则比较下一个。若最后两个的选择符中a
、b
、c
都相等,则按照"就近原则"来判断,此外,拥有!important
的属性具有最高的优先级。
<div id="i2" class="c2">
<div>T2</div>
</div>
<style>
#i2 div {
color: red;
}
.c2 > div {
color: green;
}
div > div {
color: blue;
}
:nth-child(1){
color: black;
}
div {
color: grey;
}
</style>
第一个选择符 a:1 b:0 c:1
第二个选择符 a:0 b:1 c:1
第三个选择符 a:0 b:0 c:2
第四个选择符 a:0 b:1 c:0
第五个选择符 a:0 b:0 c:1
优先级顺序依次为: 1 2 4 3 5
多重样式优先级
外部样式表和内部样式表的优先级由其引入顺序有关,一般认为内部样式优先级大于外部样式,也可以认为其相等,因为如果外部样式放在内部样式的后面引入,则外部样式将覆盖内部样式。
内联样式 > 内部样式 > 外部样式 > 浏览器默认样式
继承样式
一般来说对于文字样式的设置都会具有继承性,例如font-family
、font-size
、font-weight
、color
等等,当需要继承样式时,最近的祖先样式比其他祖先样式优先级高。
<div style="color: red;">
<div style="color: blue;">
<div >T3</div> <!-- 显示蓝色 -->
</div>
</div>
代码
<!DOCTYPE html>
<html lang="zh">
<head>
<title>CSS样式优先级</title>
</head>
<style>
#i1 {
color: red;
}
.c1 {
color: blue;
}
:nth-child(1){
color: green;
}
div {
color: grey;
}
#i2 div {
color: red;
}
.c2 > div {
color: green;
}
div > div {
color: blue;
}
</style>
<body>
<div id="i1" class="c1">T1</div>
<br>
<div id="i2" class="c2">
<div>T2</div>
</div>
<br>
<div style="color: red;">
<div style="color: blue;">
<div style="color: inherit;">T3</div> <!-- 显示蓝色 -->
</div>
</div>
</body>
</html>
常用 CSS 属性
CSS背景属性(Background)
- background:在一个声明中设置所有的背景插件
- background-attachment:设置背景图像是否固定或者随着页面的其余部分滚动
- background-color:设置元素的背景颜色
- background-image:设置元素的背景图像
- background-position:设置背景图像的开始位置
- background-repeat:设置是否及如何重复背景图像
CSS边框属性(Border和Outline)
- border:在一个声明中设置所有的边框属性
- border-bottom:在一个声明中设置所有的下边框属性
- border-bottom-color:设置下边框的颜色
- border-bottom-style:设置下边框的样式
- border-bottom-width:设置下边框的宽度
- border-color:设置四条边框的颜色
- border-left:在一个声明中设置所有的左边框属性
- border-left-color:设置左边框的颜色
- border-left-style:设置左边框的样式
- border-left-width:设置左边框的宽度
- border-right:在一个声明中设置所有右边框的属性
- border-right-color:设置右边框的颜色
- border-right-style:设置右边框的样式
- border-right-width:设置右边框的宽度
- border-style:设置四条边框的样式
- border-top:在一个声明中设置所有上边框的属性
- border-top-color:设置上边框的颜色
- border-top-style:设置上边框的样式
- border-top-width:设置上边框的宽度
- border-width:设置四条边框的宽度
- outline:在一个声明中设置所有的轮廓属性
- outline-color:设置轮廓的颜色
- outline-style:设置轮廓的样式
- outline-width:设置轮廓的宽度
CSS文本属性(Text)
- color:设置文本的颜色
- direction:规定文本的方向/书写方向
- letter-spacing:设置字符间距
- line-height:设置行高
- text-align:规定文本的水平对齐方式
- text-decoration:规定添加到文本的装饰效果
- text-indent:规定文本块首行的缩进
- text-shadow:规定添加到文本的阴影效果
- text-transform:控制文本的大小写
- unicode-bidi:设置文本方向
- white-space:规定如何处理元素中的空白
- word-spacing:设置单词间距
CSS字体属性(Font)
- font:在一个声明中设置所有字体属性
- font-family:规定文本的字体系列
- font-size:规定文本的字体尺寸
- font-size-adjust:为元素规定aspect值
- font-stretch:收缩或拉伸当前的字体系列
- font-style:规定文本的字体压实
- font-variant:规定文本的字体样式
- font-weight:规定字体的粗细
CSS外边距属性(Margin)
- margin:在一个声明中设置所有的外边距属性
- margin-bottom:设置元素的下外边距
- margin-left:设置元素的左外边距
- margin-right:设置元素的右外边距
- margin-top:设置元素的上外边距
CSS内边距属性(Padding)
- padding:在一个声明中设置所有的内边距属性
- padding-bottom:设置元素的下内边距
- padding-left:设置元素的左内边距
- padding-right:设置元素的右内边距
- padding-top:设置元素的上内边距
CSS列表属性(List)
- list-style:在一个声明中设置所有的列表属性
- list-style-image:将图像设置为列表项标记
- list-position:设置列表项标记的放置位置
- list-style-type:设置列表项标记的类型
CSS尺寸属性(Dimension)
- height:设置元素高度
- max-height:设置元素的最大高度
- max-width:设置元素的最大宽度
- min-height:设置元素的最小高度
- min-width:设置元素的最小宽度
- width:设置元素的宽度
CSS定位属性(Positioning)
- bottom:设置定位元素下外边距边界与其包含块下边界之间的偏移
- clear:规定元素的哪一侧不允许其他浮动元素
- clip:剪裁绝对定位元素
- cursor:规定要显示的光标类型(形状)
- display:规定元素应该生成的框的类型
- float:规定框是否应该浮动
- left:设置定位元素左外边距边界与其包含块左边界之间的偏移
- overflow:规定当内容溢出元素框时发生的事情
- position:规定元素定位类型
- right:设置定位元素右外边距边界与其包含块右边之间的偏移
- top:设置定位元素上外边距边界与其包含块上边之间的偏移
- vertical-align:设置元素的垂直对其方式
- visibility:规定元素是否可见
- z-index:设置元素的堆叠顺序
CSS表格属性(Table)
- border-collapse:规定是否合并表格边框
- border-spacing:规定相邻单元格边框之间的距离
- caption-side:规定表格标题的位置
- empty-cells:规定是否显示表格中的空单元格上的边框和背景
- table-layout:设置用于表格的布局算法
CSS3新特性
CSS3
是最新的CSS
标准,旨在扩展CSS2.1
。
圆角
通过border-radius
属性可以给任何元素制作圆角。
border-radius
: 所有四个边角border-*-*-radius
属性的缩写。border-top-left-radius
: 定义了左上角的弧度。border-top-right-radius
: 定义了右上角的弧度。border-bottom-right-radius
: 定义了右下角的弧度。border-bottom-left-radius
: 定义了左下角的弧度。
<div id="t1"></div>
<style>
#t1{
height: 100px;
width: 100px;
background-color: blue;
border-radius: 10px;
}
</style>
盒阴影
box-shadow: h-shadow v-shadow blur spread color inset
h-shadow
: 必需,水平阴影的位置,允许负值。v-shadow
: 必需,垂直阴影的位置,允许负值。blur
: 可选,模糊距离。spread
: 可选,阴影的大小。color
: 可选,阴影的颜色。在CSS颜色值寻找颜色值的完整列表。inset
: 可选,从外层的阴影改变阴影内侧阴影。
<div id="t2"></div>
<style>
#t2{
height: 100px;
width: 100px;
border: 1px solid #eee;
box-shadow: 5px 5px 5px #aaa;
}
</style>
背景
CSS3
中包含几个新的背景属性,提供更大背景元素控制。
background-image
: 规定背景图片路径。background-clip
: 规定背景的绘制区域。background-origin
: 规定背景图片的定位区域。background-size
: 规定背景图片的尺寸。
<div id="t3"></div>
<style>
#t3{
height: 100px;
width: 100px;
border: 1px solid #eee;
background-image: url(https://blog.touchczy.top/favicon.ico);
background-size:30px 30px;
background-repeat:repeat;
background-origin:content-box;
}
</style>
渐变
CSS3
渐变可以在两个或多个指定的颜色之间显示平稳的过渡。
Linear Gradients
: 线性渐变,向下/向上/向左/向右/对角方向。Radial Gradients
: 径向渐变,由中心定义。
<div id="t4"></div>
<style>
#t4{
height: 100px;
width: 100px;
border: 1px solid #eee;
background-image: linear-gradient(to right, red , yellow);
}
</style>
文本效果
CSS3
对文本进行了更多的支持。
hanging-punctuation
: 规定标点字符是否位于线框之外。punctuation-trim
: 规定是否对标点字符进行修剪。text-align-last
: 设置如何对齐最后一行或紧挨着强制换行符之前的行。text-emphasis
: 向元素的文本应用重点标记以及重点标记的前景色。text-justify
: 规定当text-align
设置为justify
时所使用的对齐方法。text-outline
: 规定文本的轮廓。text-overflow
: 规定当文本溢出包含元素时发生的事情。text-shadow
: 向文本添加阴影。text-wrap
: 规定文本的换行规则。word-break
: 规定非中日韩文本的换行规则。word-wrap
: 允许对长的不可分割的单词进行分割并换行到下一行。
<div id="t5">Text</div>
<style>
#t5{
height: 100px;
width: 100px;
border: 1px solid #eee;
color: #fff;
text-shadow: -1px 3px 5px #333;
}
</style>
字体
CSS3
可以使用@font-face
规则加载所需字体。
font-family
: 必需,规定字体的名称。src
: 必需,定义字体文件的URL
。font-stretch
: 可选,定义如何拉伸字体,默认是normal
。font-style
: 可选,定义字体的样式,默认是normal
。font-weight
: 可选,定义字体的粗细,默认是normal
。unicode-range
: 可选,定义字体支持的UNICODE
字符范围,默认是U+0-10FFFF
。
<div id="t6">Text</div>
<style>
@font-face{
font-family: ff;
src: url(https://cdn.jsdelivr.net/gh/WindrunnerMax/Yolov3-Train@2d965d2/keras-yolo3/font/FiraMono-Medium.otf);
}
#t6{
height: 100px;
width: 100px;
border: 1px solid #eee;
font-family:ff;
}
</style>
2D转换
CSS3
转换可以对元素进行移动、缩放、转动、拉长或拉伸。
transform
: 适用于2D
或3D
转换的元素。transform-origin
: 允许更改转化元素位置。
<div id="t7"></div>
<style>
#t7{
height: 100px;
width: 100px;
border: 1px solid #eee;
transform:rotate(10deg);
}
</style>
3D转换
CSS3
可以使用3D
转换来对元素进行格式化。
transform
: 向元素应用2D
或3D
转换。transform-origin
: 允许你改变被转换元素的位置。transform-style
: 规定被嵌套元素如何在3D
空间中显示。perspective
: 规定3D
元素的透视效果。perspective-origin
: 规定3D
元素的底部位置。backface-visibility
: 定义元素在不面对屏幕时是否可见。
<div id="t8"></div>
<style>
#t8{
height: 100px;
width: 100px;
border: 1px solid #eee;
transform:rotateX(10deg);
}
</style>
动画
CSS3
可以创建动画,它可以取代许多网页动画图像、Flash
动画和JavaScript
实现的效果。
@keyframes
: 规定动画。animation
: 所有动画属性的简写属性,除了animation-play-state
属性。animation-name
: 规定@keyframes
动画的名称。animation-duration
: 规定动画完成一个周期所花费的秒或毫秒,默认是0
。animation-timing-function
: 规定动画的速度曲线,默认是ease
。animation-fill-mode
: 规定当动画不播放时,例如当动画完成时,或当动画有一个延迟未开始播放时,要应用到元素的样式。animation-delay
: 规定动画何时开始,默认是0
。animation-iteration-count
: 规定动画被播放的次数,默认是1
。animation-direction
: 规定动画是否在下一周期逆向地播放,默认是normal
。animation-play-state
: 规定动画是否正在运行或暂停,默认是running
。
<div id="t9"></div>
<style>
@keyframes animation{
from {background:red;}
to {background:yellow;}
}
#t9{
height: 100px;
width: 100px;
border: 1px solid #eee;
animation:animation 5s ease infinite alternate;
}
</style>
过渡
CSS3
中可以使元素从一种样式转变到另一个的时候,无需使用Flash
动画或JavaScript
。
transition
: 简写属性,用于在一个属性中设置四个过渡属性。transition-property
: 规定应用过渡的CSS
属性的名称。transition-duration
: 定义过渡效果花费的时间,默认是 0。transition-timing-function
: 规定过渡效果的时间曲线,默认是ease
。transition-delay
: 规定过渡效果何时开始,默认是 0。
<div id="t10"></div>
<style>
#t10{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: red;
transition: all .5s;
}
#t10:hover{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: yellow;
transition: all .5s;
}
</style>
Flex布局
Flex
布局也称弹性布局,可以为盒状模型提供最大的灵活性,是布局的首选方案,现已得到所有现代浏览器的支持。
基础
通过指定display: flex
来标识一个弹性布局盒子,称为FLEX
容器,容器内部的盒子就成为FLEX
容器的成员,容器默认两根轴线,水平的主轴与垂直的交叉轴,主轴的开始位置叫做main start
,结束位置叫做main end
;交叉轴的开始位置叫做cross start
,结束位置叫做cross end
,容器成员默认按照主轴排列。
容器属性
flex-direction
flex-direction
属性决定主轴的方向,取值为row | row-reverse | column | column-reverse
。
row
默认值:主轴为水平方向,起点在左端。row-reverse
:主轴为水平方向,起点在右端,容器成员顺序与row
顺序相反。column
:主轴为垂直方向,起点在上沿。column-reverse
:主轴为垂直方向,起点在下沿,容器成员顺序与column
顺序相反。
<div id="t1">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<!--
3
2
1
-->
<style>
#t1{
display: flex;
flex-direction: column-reverse;
}
</style>
flex-wrap
flex-wrap
属性决定当轴线方向放不下成员时,是否换行,取值为nowrap | wrap | wrap-reverse
。
nowrap
默认:不换行,当空间不足时,会按轴线方向成员大小比例缩小的成员。wrap
:距离不够时换行,新起一行排列。wrap-reverse
:距离不够时换行,新起的一行在上方。
<div id="t2" style="width: 20px;">
<div>4</div>
<div>5</div>
<div>6</div>
</div>
<!--
45
6
-->
<style>
#t2{
display: flex;
flex-wrap: wrap;
}
</style>
flex-flow
flex-flow
属性是flex-direction
属性和flex-wrap
属性的简写形式,默认row nowrap
。
<div id="t3" style="width: 20px;">
<div>7</div>
<div>8</div>
<div>9</div>
</div>
<!--
87
9
-->
<style>
#t3{
display: flex;
flex-flow: row-reverse wrap;
}
</style>
justify-content
justify-content
属性定义了成员在主轴上的对齐方式,可以很容易地实现多种布局,取值为flex-start | flex-end | center | space-between | space-around
。
flex-start
默认值:左对齐。flex-end
:右对齐。center
: 居中对齐。space-between
:两端对齐,成员之间的间隔都相等。space-around
:每个成员两侧的间隔相等,成员之间的间隔比成员与边框的间隔大一倍。
<div id="t4">
<div>a</div>
<div>b</div>
<div>c</div>
</div>
<!-- abc[水平居中] -->
<style>
#t4{
display: flex;
justify-content: center;
}
</style>
align-items
align-items
属性定义成员在交叉轴上如何对齐,取值为flex-start | flex-end | center | baseline | stretch
。
stretch
默认值:如果成员未设置高度或设为auto
,将占满整个容器的高度。flex-start
:交叉轴的起点对齐。flex-end
:交叉轴的终点对齐。center
:交叉轴的中点对齐。baseline
: 成员的第一行文字的基线对齐。
<div id="t5" style="height: 50px;">
<div>d</div>
<div>e</div>
<div>f</div>
</div>
<!-- def[垂直居中] -->
<style>
#t5{
display: flex;
align-items: center;
}
</style>
align-content
align-content
属性定义了多根轴线的对齐方式。如果成员只有一根轴线,该属性不起作用,取值为flex-start | flex-end | center | space-between | space-around | stretch
。
stretch
默认值:轴线占满整个交叉轴。flex-start
:与交叉轴的起点对齐。flex-end
:与交叉轴的终点对齐。center
:与交叉轴的中点对齐。space-between
:与交叉轴两端对齐,轴线之间的间隔平均分布。space-around
:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
<div id="t6" style="height: 50px;width: 20px;">
<div>g</div>
<div>h</div>
<div>i</div>
</div>
<!--
g
hi
[交叉轴space-between]
-->
<style>
#t6{
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
</style>
成员属性
order
order
属性定义成员的排列顺序,数值越小,排列越靠前,默认为0
。
<div class="flexBox">
<div style="order: 3;">j</div>
<div style="order: 1;">k</div>
<div style="order: 2;">l</div>
</div>
<!-- klj -->
<style>
.flexBox{
display: flex;
}
</style>
flex-grow
flex-grow
属性定义成员的放大比例,默认为0
。
<div class="flexBox">
<div style="flex-grow: 1;">m</div>
<div style="flex-grow: 2;">n</div>
<div style="flex-grow: 3;">o</div>
</div>
<!-- m n o -->
<style>
.flexBox{
display: flex;
}
</style>
flex-shrink
flex-shrink
属性定义了成员的缩小比例,默认为1
,即如果空间不足,该成员将缩小。
<div class="flexBox" style="width: 100px;">
<div style="flex-shrink: 1;width: 100px;">p</div>
<div style="flex-shrink: 2;width: 100px;">q</div>
<div style="flex-shrink: 3;width: 100px;">r</div>
</div>
<!-- p q r -->
<style>
.flexBox{
display: flex;
}
</style>
flex-basis
flex-basis
属性定义了在分配多余空间之前,成员占据的主轴空间main size
,浏览器根据这个属性,计算主轴是否有多余空间,它的默认值为auto
,即成员的本来大小。
<div class="flexBox">
<div>s</div>
<div style="flex-basis: 40px;">t</div>
<div>u</div>
</div>
<!-- s t u -->
<style>
.flexBox{
display: flex;
}
</style>
flex
flex
属性是flex-grow
, flex-shrink
和flex-basis
的简写,默认值0 1 auto
。后两个属性可选。
<div class="flexBox">
<div style="flex: 1;">v</div>
<div style="flex: 1;">w</div>
<div style="flex: 1;">x</div>
</div>
<!-- v w x -->
<style>
.flexBox{
display: flex;
}
</style>
align-self
align-self
属性允许单个成员有与其他成员不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
<div class="flexBox" style="height: 50px;">
<div>y</div>
<div style="align-self: center;">z</div>
<div>0</div>
</div>
<!-- y z 0 -->
<style>
.flexBox{
display: flex;
}
</style>
代码示例
<!DOCTYPE html>
<html lang="zh">
<head>
<title>FLEX布局</title>
</head>
<body>
<div id="t1">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<!--
3
2
2
-->
<div id="t2" style="width: 20px;">
<div>4</div>
<div>5</div>
<div>6</div>
</div>
<!--
45
6
-->
<div id="t3" style="width: 20px;">
<div>7</div>
<div>8</div>
<div>9</div>
</div>
<!--
87
9
-->
<div id="t4">
<div>a</div>
<div>b</div>
<div>c</div>
</div>
<!-- abc[水平居中] -->
<div id="t5" style="height: 50px;">
<div>d</div>
<div>e</div>
<div>f</div>
</div>
<!-- def[垂直居中] -->
<div id="t6" style="height: 50px;width: 20px;">
<div>g</div>
<div>h</div>
<div>i</div>
</div>
<!--
g
hi
[交叉轴space-between]
-->
<div class="flexBox">
<div style="order: 3;">j</div>
<div style="order: 1;">k</div>
<div style="order: 2;">l</div>
</div>
<!-- klj -->
<div class="flexBox">
<div style="flex-grow: 1;">m</div>
<div style="flex-grow: 2;">n</div>
<div style="flex-grow: 3;">o</div>
</div>
<!-- m n o -->
<div class="flexBox" style="width: 100px;">
<div style="flex-shrink: 1;width: 100px;">p</div>
<div style="flex-shrink: 2;width: 100px;">q</div>
<div style="flex-shrink: 3;width: 100px;">r</div>
</div>
<!-- p q r -->
<div class="flexBox">
<div>s</div>
<div style="flex-basis: 40px;">t</div>
<div>u</div>
</div>
<!-- s t u -->
<div class="flexBox" style="height: 50px;">
<div>y</div>
<div style="align-self: center;">z</div>
<div>0</div>
</div>
<!-- y z 0 -->
</body>
<style>
#t1{
display: flex;
flex-direction: column-reverse;
}
#t2{
display: flex;
flex-wrap: wrap;
}
#t3{
display: flex;
flex-flow: row-reverse wrap;
}
#t4{
display: flex;
justify-content: center;
}
#t5{
display: flex;
align-items: center;
}
#t6{
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
.flexBox{
display: flex;
}
</style>
</html>
Grid布局
目前CSS
布局方案中,网格布局可以算得上是最强大的布局方案了。它可以将网页分为一个个网格,然后利用这些网格组合做出各种各样的布局。Grid
布局与Flex
布局有一定的相似性,都可以指定容器内部多个成员的位置。不同之处在于,Flex
布局是轴线布局,只能指定成员针对轴线的位置,可以看作是一维布局。Grid
布局则是将容器划分成行和列,产生单元格,然后指定成员所在的单元格,可以看作是二维布局。
基础
通过指定display: grid;
指定容器使用Grid
布局,Grid
布局中采用网格布局的区域,称为容器,容器内部采用网格定位的子元素,称为成员。容器中水平区域称为行,垂直区域称为列,可以将其看作二位数组。划分网格的线就称为网格线,正常情况下n
行有n + 1
根水平网格线,m
列有m + 1
根垂直网格线。注意当容器设置为Grid
布局以后,容器子元素的float
、display: inline-block
、display: table-cell
、vertical-align
和column-*
等设置都将失效。
容器属性
grid-template-rows grid-template-columns
grid-template-rows
属性定义每一行的行高,设定为多少行就设置多少个值,取值可以为固定像素,也可以为百分比,grid-template-columns
属性定义每一列的列宽,设定为多少列就设置多少个值,取值可以为固定像素,也可以为百分比。
<div id="t1">
<div>0</div>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
</div>
<!--
0 1 2
3 4 5
6 7 8
-->
<style>
#t1{
display: grid;
grid-template-rows: 30px 30px 30px;
grid-template-columns: 30px 30px 30px;
}
</style>
repeat
repeat()
函数可以简化重复的值,其可以自动重复设定的规则。
<div id="t2">
<div>9</div>
<div>a</div>
<div>b</div>
<div>c</div>
<div>d</div>
<div>e</div>
</div>
<!-- 9 ab cd e -->
<style>
#t2{
display: grid;
grid-template-columns: repeat(3,30px 10px); /* 设定为重复3次 30px 10px 规则 */
}
</style>
auto-fill
有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行或每一列容纳尽可能多的单元格,这时可以使用auto-fill
关键字表示自动填充,当容器不足容纳成员时会自适应换行。
<div id="t3" style="width: 60px;">
<div>f</div>
<div>g</div>
<div>h</div>
</div>
<!--
f g
h
-->
<style>
#t3{
display: grid;
grid-template-columns: repeat(auto-fill,30px);
}
</style>
fr
为表示比例关系,网格布局提供了fr
关键字。如果两列的宽度分别为1fr和2fr,就表示后者是前者的两倍。
<div id="t4">
<div>i</div>
<div>j</div>
<div>k</div>
</div>
<!--
i j k
-->
<style>
#t4{
display: grid;
grid-template-columns: 1fr 2fr 3fr;
}
</style>
minmax
minmax()
函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值,当距离不够时会从最大值自动减少长度或宽度到设定最小值为止。
minmax( [ <length> | <percentage> | min-content | max-content | auto ] , [ <length> | <percentage> | <flex> | min-content | max-content | auto ] )
。
<div id="t5">
<div>l</div>
<div>m</div>
<div>n</div>
</div>
<!--
l m n
-->
<style>
#t5{
display: grid;
grid-template-columns: 30px minmax(30px,100px) 30px;
}
</style>
auto
auto
关键字表示由浏览器自己决定长度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width
,且这个值大于最大宽度。
<div id="t6">
<div>o</div>
<div>p</div>
<div>q</div>
</div>
<!--
o p q
-->
<style>
#t6{
display: grid;
grid-template-columns: 10px auto 30px;
}
</style>
grid-row-gap
grid-row-gap属性设置行与行的间隔,即行间距。
<div id="t7">
<div>r</div>
<div>s</div>
<div>t</div>
</div>
<!--
r
s
t
-->
<style>
#t7{
display: grid;
grid-template-rows: 30px 30px 30px;
grid-row-gap: 10px;
}
</style>
grid-column-gap
grid-column-gap
属性设置列与列的间隔,即列间距。
<div id="t8">
<div>u</div>
<div>v</div>
<div>w</div>
</div>
<!--
u v w
-->
<style>
#t8{
display: grid;
grid-template-columns: repeat(3,30px);
grid-column-gap: 10px;
}
</style>
grid-gap
grid-gap
属性是grid-column-gap
和grid-row-gap
的合并简写形式,如果grid-gap
省略了第二个值,浏览器认为第二个值等于第一个值。
<div id="t9">
<div>x</div>
<div>y</div>
<div>z</div>
<div>A</div>
</div>
<!--
x y
z A
-->
<style>
#t9{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
grid-gap: 10px 10px;
}
</style>
grid-template-areas
网格布局允许指定区域area
,一个区域由单个或多个单元格组成,grid-template-areas
属性用于定义区域。区域的命名会影响到网格线。每个区域的起始网格线,会自动命名为{areaName}-start
,终止网格线自动命名为{areaName}-end
。
<div id="t10">
<div>B</div>
<div>C</div>
<div>D</div>
<div>E</div>
</div>
<!--
B C
D E
-->
<style>
#t10{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
/* 先划分出4个单元格,然后将其定名为a到d的4个区域,分别对应这4个单元格。*/
grid-template-areas: 'a b' 'c d';
}
</style>
grid-auto-flow
划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是先行后列,通过设置grid-auto-flow
可以更改为先列后行,grid-auto-flow
属性除了设置成row
和column
,还可以设成row dense
和column dense
,这两个值主要用于,某些项目指定位置以后,剩下的项目怎么自动放置。
<div id="t11">
<div>F</div>
<div>G</div>
<div>H</div>
<div>I</div>
</div>
<!--
F H
G I
-->
<style>
#t11{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
grid-auto-flow: column;
}
</style>
justify-items
justify-items
属性设置成员中内容的水平位置,取值为start | end | center | stretch
。
stretch
默认值:拉伸,占满单元格的整个宽度。start
:对齐单元格的起始边缘。end
:对齐单元格的结束边缘。center
:单元格内部居中。
<div id="t12">
<div>J</div>
</div>
<!--
J
-->
<style>
#t12{
display: grid;
justify-items: center;
}
</style>
align-items
align-items
属性设置成员中内容的垂直位置,取值为start | end | center | stretch
。
stretch
默认值:拉伸,占满单元格的整个宽度。start
:对齐单元格的起始边缘。end
:对齐单元格的结束边缘。center
:单元格内部居中。
<div id="t13" style="height: 50px">
<div>K</div>
</div>
<!--
K
-->
<style>
#t13{
display: grid;
align-items: center;
}
</style>
place-items
place-items
属性是align-items
属性和justify-items
属性的合并简写形式,如果省略第二个值,则浏览器认为与第一个值相等。
<div id="t14" style="height: 50px">
<div>L</div>
</div>
<!--
L
-->
<style>
#t14{
display: grid;
place-items: center center;
}
</style>
justify-content
justify-content
属性是整个内容区域在容器里面的水平位置,也就是成员的水平分布,取值为start | end | center | stretch | space-around | space-between | space-evenly
。
<div id="t15">
<div>M</div>
<div>N</div>
</div>
<!--
M N
-->
<style>
#t15{
display: grid;
grid-template-columns: repeat(2,30px);
justify-content: space-around;
}
</style>
align-content
align-content
属性是整个内容区域在容器里面的垂直位置,也就是成员的垂直分布,取值为start | end | center | stretch | space-around | space-between | space-evenly
。
<div id="t16" style="height: 50px;">
<div>O</div>
<div>P</div>
</div>
<!--
O P
-->
<style>
#t16{
display: grid;
grid-template-columns: repeat(2,30px);
align-content: center;
}
</style>
place-content
place-content
属性是align-content
属性和justify-content
属性的合并简写形式,如果省略第二个值,则浏览器认为与第一个值相等。
<div id="t17" style="height: 50px;">
<div>Q</div>
<div>R</div>
</div>
<!--
Q R
-->
<style>
#t17{
display: grid;
grid-template-columns: repeat(2,30px);
place-content: center space-around;
}
</style>
grid-auto-columns grid-auto-rows
有时候,一些项目的指定位置,在现有网格的外部。比如网格只有3
列,但是某一个项目指定在第5
行。这时,浏览器会自动生成多余的网格,以便放置项目。grid-auto-columns
属性和grid-auto-rows
属性用来设置,浏览器自动创建的多余网格的列宽和行高。它们的写法与grid-template-columns
和grid-template-rows
完全相同。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。
<div id="t18">
<div style="grid-row-start: 2;grid-column-start: 2;">S</div>
</div>
<!--
S
-->
<style>
#t18{
display: grid;
grid-template-columns: repeat(1,30px);
grid-template-rows: repeat(1,30px);
grid-auto-rows: 100px;
grid-auto-columns: 100px;
}
</style>
项目属性
grid-column-start grid-column-end
grid-column-start
属性指定左边框所在的垂直网格线,grid-column-end
属性指定右边框所在的垂直网格线。
<div class="gridBox">
<div style="grid-row-start: 2;grid-column-start: 2;">T</div>
</div>
<!--
T
-->
<style>
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
grid-row-start grid-row-end
grid-row-start
属性指定上边框所在的水平网格线,grid-row-end
属性指定下边框所在的水平网格线。
<div class="gridBox">
<div style="grid-row-start: 2;">U</div>
</div>
<!--
U
-->
<style>
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
还可以给轴线命名来指定位置。
<div class="gridBox" style="">
<div style="grid-column-start: c2;grid-row-start: r2;">V</div>
</div>
<!--
V
-->
<style>
.gridBox{
display: grid;
grid-template-columns:[c1] 30px [c2] 30px [c3]; /* 指定列并为轴线命名 */
grid-template-rows:[r1] 30px [r2] 30px [r3]; /* 指定行并为轴线命名 */
}
</style>
grid-column grid-row
grid-column
属性是grid-column-start
和grid-column-end
的合并简写形式,grid-row
属性是grid-row-start
属性和grid-row-end
的合并简写形式。
<div class="gridBox">
<div style="grid-column: 2 / 3;grid-row: 2 / 3;">W</div>
</div>
<!--
W
-->
<style>
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
grid-area
grid-area
属性指定项目放在grid-template-areas
指定的区域,还可用作grid-row-start
、grid-column-start
、grid-row-end
、grid-column-end
的合并简写形式,直接指定项目的位置。
<div class="gridBox" style="grid-template-areas: 'a b' 'c d';">
<div style="grid-area: b;">X</div>
<div style="grid-area: 2 / 2 / 3 / 3;">Y</div>
</div>
<!--
X
Y
-->
<style>
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
justify-self align-self place-self
justify-self
属性设置单元格内容的水平位置,跟justify-items
属性的用法完全一致,但只作用于单个项目,取值为start | end | center | stretch;
。align-self
属性设置单元格内容的垂直位置,跟align-items
属性的用法完全一致,也是只作用于单个项目,取值为start | end | center | stretch;
。
stretch
默认值:拉伸,占满单元格的整个宽度。start
:对齐单元格的起始边缘。end
:对齐单元格的结束边缘。center
:单元格内部居中。
place-self
属性是align-self
属性和justify-self
属性的合并简写形式。
<div class="gridBox">
<div style="place-self: center end;">Z</div>
</div>
<!--
Z
-->
<style>
.gridBox{
display: grid;
grid-template-columns: repeat(2,30px);
grid-template-rows: repeat(2,30px);
}
</style>
多列布局
CSS3
可以将文本内容设计成像报纸一样的多列布局。
column-count
: 指定元素应该被分割的列数。column-fill
: 指定如何填充列。column-gap
: 指定列与列之间的间隙。column-rule
: 所有column-rule-*
属性的简写。column-rule-color
: 指定两列间边框的颜色。column-rule-style
: 指定两列间边框的样式。column-rule-width
: 指定两列间边框的厚度。column-span
: 指定元素要跨越多少列。column-width
: 指定列的宽度。columns
: 设置column-width
和column-count
的简写。
<div id="t11">多列布局示例</div>
<style>
#t11{
height: 100px;
width: 100px;
border: 1px solid #eee;
column-count: 3;
column-gap: 20px;
}
</style>
用户界面
CSS3
中增加了一些新的用户界面特性来调整元素尺寸,框尺寸和外边框。
appearance
: 允许使一个元素的外观像一个标准的用户界面元素。box-sizing
: 允许以适应区域而用某种方式定义某些元素。icon
: 为创作者提供了将元素设置为图标等价物的能力。nav-down
: 指定在何处使用箭头向下导航键时进行导航。nav-index
: 指定一个元素的Tab
的顺序。nav-left
: 指定在何处使用左侧的箭头导航键进行导航。nav-right
: 指定在何处使用右侧的箭头导航键进行导航。nav-up
: 指定在何处使用箭头向上导航键时进行导航。outline-offset
: 外轮廓修饰并绘制超出边框的边缘。resize
: 指定一个元素是否是由用户调整大小。
<div id="t12"></div>
<style>
#t12{
height: 100px;
width: 100px;
border: 1px solid #eee;
resize:both;
overflow:auto;
}
</style>
滤镜
CSS3
的filter
属性可支持对于网页进行各种滤镜效果。filter: none | blur() | brightness() | contrast() | drop-shadow() | grayscale() | hue-rotate() | invert() | opacity() | saturate() | sepia() | url();
<div id="t13"></div>
<style>
#t13{
height: 100px;
width: 100px;
border: 1px solid #eee;
filter: blur(3px);
background-color: blue;
}
</style>
选择器
element1~element2
: 选择同级前面有element1
元素的全部element2
元素[attribute^=value]
: 选择attribute
属性中以value
开头的元素[attribute$=value]
: 选择attribute
属性中以value
结尾的元素[attribute*=value]
: 选择attribute
属性中包含value
字符串的元素div:first-child
: 选择属于其父元素的第一个子元素的每个div
元素div:last-child
: 选择属于其父元素最后一个子元素的每个div
元素div:nth-child(n)
: 选择属于其父元素的第n个子元素的每个div
元素div:nth-last-child(n)
: 同上,从这个元素的最后一个子元素开始算div:nth-of-type(n)
: 选择属于其父元素第n个div
元素的每个div
元素div:nth-last-of-type(n)
: 同上,但是从最后一个子元素开始计数div:first-of-type
: 选择属于其父元素的首个div
元素的每个div
元素div:last-of-type
: 选择属于其父元素的最后div
元素的每个div
元素div:only-child
: 选择属于其父元素的唯一子元素的每个div
元素div:only-of-type
: 选择属于其父元素唯一的div
元素的每个div
元素:root
: 选择文档的根元素:empty
: 选择的元素里面没有任何内容:checked
: 匹配被选中的input元素,这个input元素包括radio和checkbox:default
: 匹配默认选中的元素,例如:提交按钮总是表单的默认按钮:disabled
: 匹配禁用的表单元素:enabled
: 匹配没有设置disabled属性的表单元素:valid
: 匹配条件验证正确的表单元素
媒体查询
可以针对不同的媒体类型设置不同的样式规则,可以根据视窗、设备高度与宽度、设备方向、分辨率等进行不同CSS
适配。
<div id="t14"></div>
<style>
@media screen and (min-width:600px){
#t14{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: red;
transition: all .5s;
}
}
@media screen and (max-width:600px) {
#t14{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: yellow;
transition: all .5s;
}
}
</style>
代码示例
<!DOCTYPE html>
<html lang="zh">
<head>
<title>CSS3新特性</title>
<style>
div{
margin: 10px 0;
height: 100px;
width: 100px;
border: 1px solid #eee;
}
#t1{
border-radius: 10px;
background-color: blue;
}
#t2{
box-shadow: 5px 5px 5px #aaa;
}
#t3{
border: 1px solid #eee;
background-image: url(https://blog.touchczy.top/favicon.ico);
background-size:30px 30px;
background-repeat:repeat;
background-origin:content-box;
}
#t4{
background-image: linear-gradient(to right, red , yellow);
}
#t5{
color: #fff;
text-shadow: -1px 3px 5px #333;
}
@font-face{
font-family: ff;
src: url(https://cdn.jsdelivr.net/gh/WindrunnerMax/Yolov3-Train@2d965d2/keras-yolo3/font/FiraMono-Medium.otf);
}
#t6{
font-family:ff;
}
#t7{
transform:rotate(10deg);
}
#t8{
transform:rotateX(10deg);
}
@keyframes animation{
from {background:red;}
to {background:yellow;}
}
#t9{
animation:animation 5s ease infinite alternate;
}
#t10{
background: red;
transition: all .5s;
}
#t10:hover{
background: yellow;
transition: all .5s;
}
#t11{
column-count: 3;
column-gap: 20px;
}
#t12{
resize:both;
overflow:auto;
}
#t13{
filter: blur(3px);
background-color: blue;
}
@media screen and (min-width:600px){
#t14{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: red;
transition: all .5s;
}
}
@media screen and (max-width:600px) {
#t14{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: yellow;
transition: all .5s;
}
}
</style>
</head>
<body>
<div id="t1">圆角</div>
<div id="t2">盒阴影</div>
<div id="t3">背景</div>
<div id="t4">渐变</div>
<div id="t5">文本效果</div>
<div id="t6">FONT</div>
<div id="t7">2D转换</div>
<div id="t8">3D转换</div>
<div id="t9">动画</div>
<div id="t10">过渡</div>
<div id="t11">多列布局示例</div>
<div id="t12">用户界面</div>
<div id="t13">滤镜</div>
<div id="t14">媒体查询</div>
</body>
</html>
CSS常用单位
CSS
的长度单位主要有%
、px
、in
、cm
、ch
、mm
、ex
、pt
、pc
、em
、rem
、vw
、vh
、vmin
、vmax
,按照单位的计算方式大致可以分为绝对长度单位、相对长度单位、百分比单位。
绝对长度单位
px 像素
通常而言,一个CSS
像素代表屏幕设备的一个像素点,但是对于高分辨率屏幕而言一个CSS
像素往往占多个设备像素,也就是说有多个屏幕像素点来表示1px
,1px = 1in / 96
。
<style>
div{
height: 30px;
background-color: blue;
}
#t1{
width: 1px;
}
</style>
<section>
<div id="t1"></div>
</section>
in 英寸
1in = 2.54cm = 96px
。
<style>
div{
height: 30px;
background-color: blue;
}
#t2{
width: 1in;
}
</style>
<section>
<div id="t2"></div>
</section>
cm 厘米
1cm = 10mm = 96px/2.54 ≈ 37.8px
。
<style>
div{
height: 30px;
background-color: blue;
}
#t3{
width: 1cm;
}
</style>
<section>
<div id="t3"></div>
</section>
mm 毫米
1mm = 0.1cm = 3.78px
。
<style>
div{
height: 30px;
background-color: blue;
}
#t4{
width: 1mm;
}
</style>
<section>
<div id="t4"></div>
</section>
pt 磅
1pt = 1/72in ≈ 0.0139in = 1/722.54cm = 1/7296px ≈ 1.33px
。
<style>
div{
height: 30px;
background-color: blue;
}
#t5{
width: 1pt;
}
</style>
<section>
<div id="t5"></div>
</section>
pc 派卡
1pc = 1/6in = 12pt = 1/6*96px = 16px
。
<style>
div{
height: 30px;
background-color: blue;
}
#t6{
width: 1pc;
}
</style>
<section>
<div id="t6"></div>
</section>
相对长度单位
em
em
表示元素的font-size
属性的计算值,如果用于font-size
属性本身,相对于父元素的font-size
,若用于其他属性,相对于本身元素的font-size
,需要注意的是,使用em
可能会出现1.2 * 1.2 = 1.44
的现象,若父元素font-size
属性设置为16px
,下一级元素设置为1.2em
,经计算实际像素为16px * 1.2 = 19.2px
,再下一级元素若继续设置为1.2em
则经计算为16px * 1.2 * 1.2 = 23.04px
,这是因为父级的基准font-size
属性被计算重设为另一个值,在子元素中使用em
时需要根据父元素的font-size
重新计算子元素的em
值。
<style>
div{
height: 30px;
background-color: blue;
}
#t7 > div{
background-color: blue;
font-size: 2em; /* 相对于父元素 2 * 10px = 20px */
width: 5em; /* 相对于元素本身 5 * 20px = 100px */
}
</style>
<section class="except">
<div id="t7">
<div>文字</div>
</div>
<button onclick="emChange()">改变字体大小</button>
</section>
<script type="text/javascript">
function emChange(){
document.getElementById("t7").style["font-size"] = "20px";
}
</script>
<section class="except" style="font-size: 10px;">
<div style="font-size: 2em"> <!-- 2 * 10px = 20px -->
<div>Test</div>
<div style="font-size: 2em"> <!-- 2 * 2 * 10px = 40px -->
<div>Test</div>
</div>
</div>
</section>
rem
rem
单位都是相对于根元素html
的font-size
来决定大小的,根元素的font-size
相当于提供了一个基准,当页面的size
发生变化时,只需要改变font-size
的值,那么以rem
为固定单位的元素的大小也会发生相应的变化。由于所有元素都是以根元素的font-size
为基准进行计算的,也就不存在em
的1.2 * 1.2 = 1.44
现象。rem
不是只对定义字体大小有用,可以使用rem
把整个网格系统或者UI
样式库基于HTML
根元素的字体大小上,这将带来更加可预测的字体大小和比例缩放,实现响应式的布局。
<style>
html{
font-size: 15px;
}
div{
height: 30px;
background-color: blue;
}
#t8 > div{
background-color: blue;
font-size: 2rem; /* 相对于根元素 2 * 15px = 30px */
width: 6rem; /* 相对于根元素 6 * 15px = 90px */
}
</style>
<section class="except">
<div id="t8">
<div>文字</div>
</div>
<button onclick="remChange()">改变字体大小</button>
</section>
<script type="text/javascript">
function remChange(){
document.getElementsByTagName("html")[0].style["font-size"] = "20px";
}
</script>
<section class="except">
<div style="font-size: 2rem"> <!-- 2 * 15px = 30px -->
<div>Test</div>
<div style="font-size: 2rem"> <!-- 2 * 15px = 30px -->
<div>Test</div>
</div>
</div>
</section>
ex
ex
是指所用字体中小写x
的高度,但不同字体x
的高度可能不同,对于很多字体来说1ex ≈ 0.5em
,所以很多浏览器在实际应用中取em
值一半作为ex
值,ex
单位在实际中常用于微调。
<style>
#t9{
font-size: 1ex;
}
</style>
<section class="except">
<div id="t9">文字</div>
<span style="font-size: 1em">文字</span>
</section>
ch
ch
与ex
类似,这一单位代表元素所用字体中0
这一字形的宽度,更准确地说是0
这一字形的预测尺寸,如果无法确定0
字形的大小,则必须假定其宽为0.5em
高为1em
,也就是取em
值的一半作为ch
值。
<style>
#t10{
font-size: 1ch;
}
</style>
<section class="except">
<div id="t10">文字</div>
<span style="font-size: 1em">文字</span>
</section>
百分比单位
%
当度量单位设置为百分比时,即可使浏览器组件宽高随着浏览器的大小相应变化。
- 子元素的
height
或width
中使用百分比,是相对于子元素的直接父元素,width
相对于父元素的width
,height
相对于父元素的height
。 - 子元素的
top
和bottom
如果设置百分比,则相对于直接非static
定位的父元素的高度,同样子元素的left
和right
如果设置百分比,则相对于直接非static
定位父元素的宽度。 - 子元素的
padding
如果设置百分比,不论是垂直方向或者是水平方向,都相对于直接父亲元素的width
,而与父元素的height
无关。 - 子元素的
margin
如果设置成百分比,不论是垂直方向还是水平方向,都相对于直接父元素的width
。 - 设置
border-radius
为百分比,则是相对于自身的宽度,还有translate
、background-size
等都是相对于自身的。
<style>
div{
height: 30px;
background-color: blue;
}
#t11{
width: 50%;
}
</style>
<section>
<div id="t11"></div>
</section>
vh vw vmin vmax
vh
: 相对于视窗的高度,1vh
等于视窗高度的1%
。vw
: 相对于视窗的宽度,1vw
等于视窗宽度的1%
。vmin
:vw
和vh
中的较小值。vmax
:vw
和vh
中的较大值。
<style>
div{
height: 30px;
background-color: blue;
}
#t12{
background-color: #fff;
}
#t12 > div:nth-child(1){
width: 50vh;
}
#t12 > div:nth-child(2){
width: 50vw;
}
#t12 > div:nth-child(3){
width: 50vmax;
}
#t12 > div:nth-child(4){
width: 50vmin;
}
</style>
<section class="">
<div id="t12">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</section>
代码示例
<!DOCTYPE html>
<html lang="zh">
<head>
<title>CSS单位</title>
<style>
html{
font-size: 15px;
}
section {
margin: 10px 0;
}
div{
height: 30px;
background-color: blue;
}
.except div{
height: auto;
background-color: #fff;
}
#t1{
width: 1px;
}
#t2{
width: 1in;
}
#t3{
width: 1cm;
}
#t4{
width: 1mm;
}
#t5{
width: 1pt;
}
#t6{
width: 1pc;
}
#t7{
background-color: #fff;
font-size: 10px;
}
#t7 > div{
background-color: blue;
font-size: 2em; /* 相对于父元素 2 * 10px = 20px */
width: 5em; /* 相对于元素本身 5 * 20px = 100px */
}
#t8 > div{
background-color: blue;
font-size: 2rem; /* 相对于根元素 2 * 15px = 30px */
width: 6rem; /* 相对于根元素 6 * 15px = 90px */
}
#t9{
font-size: 1ex;
}
#t10{
font-size: 1ch;
}
#t11{
width: 50%;
}
#t12{
background-color: #fff;
}
#t12 > div:nth-child(1){
width: 50vh;
}
#t12 > div:nth-child(2){
width: 50vw;
}
#t12 > div:nth-child(3){
width: 50vmax;
}
#t12 > div:nth-child(4){
width: 50vmin;
}
</style>
</head>
<body>
<section>
<div id="t1"></div>
</section>
<section>
<div id="t2"></div>
</section>
<section>
<div id="t3"></div>
</section>
<section>
<div id="t4"></div>
</section>
<section>
<div id="t5"></div>
</section>
<section>
<div id="t6"></div>
</section>
<section class="except">
<div id="t7">
<div>文字</div>
</div>
<button onclick="emChange()">改变字体大小</button>
</section>
<section class="except" style="font-size: 10px;">
<div style="font-size: 2em"> <!-- 2 * 10px = 20px -->
<div>Test</div>
<div style="font-size: 2em"> <!-- 2 * 2 * 10px = 40px -->
<div>Test</div>
</div>
</div>
</section>
<section class="except">
<div id="t8">
<div>文字</div>
</div>
<button onclick="remChange()">改变字体大小</button>
</section>
<section class="except">
<div style="font-size: 2rem"> <!-- 2 * 15px = 30px -->
<div>Test</div>
<div style="font-size: 2rem"> <!-- 2 * 15px = 30px -->
<div>Test</div>
</div>
</div>
</section>
<section class="except">
<div id="t9">文字</div>
<span style="font-size: 1em">文字</span>
</section>
<section class="except">
<div id="t10">文字</div>
<span style="font-size: 1em">文字</span>
</section>
<section>
<div id="t11"></div>
</section>
<section class="">
<div id="t12">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</section>
</body>
<script type="text/javascript">
function emChange(){
document.getElementById("t7").style["font-size"] = "20px";
}
function remChange(){
document.getElementsByTagName("html")[0].style["font-size"] = "20px";
}
</script>
</html>
display的值及作用
display
属性可以设置元素的内部和外部显示类型,元素的外部显示类型将决定该元素在流式布局中的表现,例如块级或内联元素,元素的内部显示类型可以控制其子元素的布局,例如grid
或flex
。目前所有浏览器都支持display
属性,但是对于属性值的兼容性仍需注意。
外部显示
这些值指定了元素的外部显示类型,实际上就是其在流式布局中的角色,即在流式布局中的表现。
display: none
display: none;
是CSS1
规范,无兼容性问题,该属性值表示此元素不会被显示,依照词义是真正隐藏元素,使用这个属性,被隐藏的元素不占据任何空间,用户交互操作例如点击事件都不会生效,读屏软件也不会读到元素的内容,这个元素的任何子元素也会同时被隐藏。当使用该属性将元素从显示状态切换为隐藏状态时,元素不占据原本的空间,会触发浏览器的重绘与回流。为这个属性添加过渡动画是无效的,他的任何不同状态值之间的切换总是会立即生效。这种方式产生的效果就像元素完全不存在,但在DOM
中依然可以访问到这个元素,也可以通过DOM
来操作它。
display: block
display: block;
是CSS1
规范,无兼容性问题,该属性值表示此元素将显示为块级元素,此元素前后会带有换行符,元素独占一行,封闭后自动换行,默认宽度为100%
,可以指定宽度和高度,内外边距对于四个方向有效。
display: inline
display: inline;
是CSS1
规范,无兼容性问题,该属性值表示此元素会被显示为内联元素,元素会生成一个或多个内联元素框,这些框不会在自身之前或之后产生换行符,在正常流中,如果有空间,则下一个元素将在同一行上,元素排在一行,封闭后不会自动换行,不能指定高度与宽度,可以使用line-height
来指定高度,外边距对于水平方向有效,垂直方向无效,内边距对于水平方向正常有效,垂直方向只有效果,对其他元素无任何影响。
display: inline-block
display: inline-block;
是CSS2
规范,无兼容性问题,该属性值表示此元素将显示为内联块元素,该元素生成一个块元素框,该框将随周围的内容一起流动,就好像它是单个内联框一样,与被替换的元素非常相似,它等效于内联流根inline flow-root
,可以指定宽度和高度,内外边距对于四个方向有效元素排在一行,但是在回车后会有空白缝隙。
display: run-in
display: run-in;
是CSS2
规范,绝大部分浏览器都不兼容,目前这是个实验性属性值,不应该用作生产环境,该属性值表示此元素会根据上下文决定对象是内联对象还是块级对象,如果它后一个元素是block
那么它会变成inline
并和后一个元素并排,如果它后一个元素是inline
那么它会变成block
。
内部显示
这些关键字指定了元素的内部显示类型,它们定义了该元素内部内容的布局方式,需要假定该元素为非替换元素。
display: flow-root
display: flow-root;
是CSS3
规范,兼容性一般,该属性值表示此元素会生成一个块元素盒子,该元素盒子可建立一个新的块格式化上下文BFC
,定义格式化根所在的位置。
display: table
display: table;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为块级表格来显示,类似<table>
,表格前后带有换行符。
display: flex
display: flex;
是CSS3
规范,目前主流浏览器都已支持,是布局的首选方案,该属性值表示此元素会作为弹性盒子显示,在外部表现为block
,内部作为弹性盒子使用,弹性布局可以为盒状模型提供最大的灵活性。在兼容移动端浏览器的方案上,有可能需要使用display:-webkit-box;
,也就是内核前缀-box
,同样都是弹性盒子,由于各阶段草案命名的原因,其命名从box
更改为flex
,flex
是新的规范属性,此外flex
并不能完全替代box
,使用这两种方式在实际布局中会存在差异。
display: grid
display: grid;
是CSS3
规范,目前主流浏览器都已支持,该属性值表示将元素分为一个个网格,然后利用这些网格组合做出各种各样的布局。Grid
布局与Flex
布局有一定的相似性,都可以指定容器内部多个成员的位置。不同之处在于,Flex
布局是轴线布局,只能指定成员针对轴线的位置,可以看作是一维布局。Grid
布局则是将容器划分成行和列,产生单元格,然后指定成员所在的单元格,可以看作是二维布局。
display: inline-table
display: inline-table;
是CSS2
规范,兼容性良好,该属性值与display: table;
在元素内部表现相同,在元素外部显示表现为inline
。
display: inline-flex
display: inline-flex;
是CSS3
规范,目前主流浏览器都已支持,该属性值与display: flex;
在元素内部表现相同,在元素外部显示表现为inline
。
display: inline-grid
display: inline-grid;
是CSS3
规范,目前主流浏览器都已支持,该属性值与display: grid;
在元素内部表现相同,在元素外部显示表现为inline
。
display: list-item
display: list-item;
是CSS1
规范,无兼容性问题,该属性值表示将元素的外部显示类型变为block
盒模型,并将内部显示类型变为多个list-item inline
盒模型。
内部表现
table
布局模型有着相对复杂的内部结构,因此它们的子元素可能扮演着不同的角色,这一类关键字就是用来定义这些内部显示类型,并且只有在这些特定的布局模型中才有意义。
display: table-row-group
display: table-row-group;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为一个或多个行的分组来显示,类似于<tbody>
。
display: table-header-group
display: table-header-group;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为一个或多个行的分组来显示,类似于<thead>
。
display: table-footer-group
display: table-footer-group;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为一个或多个行的分组来显示,类似于<tfoot>
。
display: table-row
display: table-row;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为一个表格行显示,类似于<tr>
。
display: table-column-group
display: table-column-group;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为一个或多个列的分组来显示,类似于<colgroup>
。
display: table-column
display: table-column;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为一个单元格列显示,类似于<col>
。
display: table-cell
display: table-cell;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为一个表格单元格显示,类似于<td>
和<th>
。
display: table-caption
display: table-caption;
是CSS2
规范,兼容性良好,该属性值表示此元素会作为一个表格标题显示,类似于<caption>
。
Position定位
CSS
中position
属性是比较常用的元素定位方案,position
常用的取值有static
、relative
、absolute
、fixed
、sticky
、inherit
。
static
static
属性是HTML
元素的默认值,即没有定位,遵循正常的文档流对象,对于top
、bottom
、left
、right
、z-index
属性的设置都被忽略。
文档流,指的是盒子元素排版布局过程中,元素会自动从左往右,从上往下的流式排列。
文本流,指的是文字元素排版布局过程中,元素会自动从左往右,从上往下的流式排列。
脱离文档流,也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位。
<div class="t1">static</div>
<style>
div{
border: 1px solid #eee;
}
.t1{
position: static;
}
</style>
relative
relative
是相对定位,元素的位置是相对其原本位置进行偏移,其不脱离文档流,对于top
、bottom
、left
、right
、z-index
属性的设置有效,设置偏移属性后会移动相对定位元素,但它原本所占的空间不会改变,相对定位元素经常被用来作为绝对定位元素的容器块。
<div class="t2">relative</div>
<div>对比查看效果 元素原本占据空间没有变化 但relative会有偏移</div>
<style>
div{
border: 1px solid #eee;
}
.t2{
position: relative;
bottom: -10px;
}
</style>
absolute
absolute
是绝对定位,元素的位置相对于最近的已定位父元素,如果元素没有已定位的父元素,那么它的位置相对于<html lang="zh">
,通常的使用方案是在外层嵌套一层relative
相对定位元素作为父元素,再设置绝对定位元素的偏移将会相对于外层的relative
元素进行偏移,绝对定位完全脱离文档流与文本流,不占据文档空间,对于top
、bottom
、left
、right
、z-index
属性的设置有效。
<div class="t3">
<div class="t4">absolute</div>
</div>
<style>
div{
border: 1px solid #eee;
}
.t3{
height: 300px;
position: relative;
}
.t4{
position: absolute;
top: 100px;
}
</style>
fixed
fixed
是固定定位,元素的位置相对于浏览器窗口是固定位置,即使是窗口滚动元素也不会移动,注意在<iframe>
中的元素使用fixed
是相对于<iframe>
进行定位的,<iframe>
类似于在页面中创建了一个新的浏览器窗口,固定定位完全脱离文档流与文本流,不占据文档空间,对于top
、bottom
、left
、right
、z-index
属性的设置有效。
<div class="t5">fixed</div>
<style>
div{
border: 1px solid #eee;
}
.t5{
position: fixed;
top: 300px;
}
</style>
sticky
sticky
是粘性定位,元素的位置是基于用户的滚动位置来定位,粘性定位的元素是依赖于用户的滚动,在position: relative
与position: fixed
定位之间切换,在页面显示时sticky
的表现类似于position: relative
,而当页面滚动超出目标区域时sticky
的表现类似于position: fixed
,它会固定在目标位置,元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位,这个特定阈值指的是top
、right
、bottom
、left
其中之一,必须通过指定top
、right
、bottom
、left
四个阈值其中之一,才可使粘性定位生效,否则其行为与相对定位相同。
<div class="t6">sticky</div>
<style>
div{
border: 1px solid #eee;
}
.t6{
position: sticky;
top: 0;
}
</style>
inherit
inherit
是通过继承父元素的position
值来进行定位。
<div class="t7">
<div class="t8">inherit</div>
</div>
<style>
div{
border: 1px solid #eee;
}
.t7{
position: relative;
}
.t8{
position: inherit;
bottom: -10px;
}
</style>
代码示例
<!DOCTYPE html>
<html lang="zh">
<head>
<title>position</title>
<style>
div{
border: 1px solid #eee;
margin: 5px 0;
}
.t1{
position: static;
}
.t2{
position: relative;
bottom: -10px;
}
.t3{
height: 300px;
position: relative;
}
.t4{
position: absolute;
top: 100px;
}
.t5{
position: fixed;
top: 300px;
}
.t6{
position: sticky;
top: 0;
}
.t7{
position: relative;
}
.t8{
position: inherit;
bottom: -10px;
}
</style>
</head>
<body>
<div class="t1">static</div>
<div class="t2">relative</div>
<div>对比查看效果 元素原本占据空间没有变化 但relative会有偏移</div>
<div class="t3">
<div class="t4">absolute</div>
</div>
<div class="t5">fixed</div>
<div class="t6">sticky</div>
<div class="t7">
<div class="t8">inherit</div>
</div>
<div style="height: 1000px">让浏览器出现滚动条</div>
</body>
</html>
Flex布局
Flex
布局也称弹性布局,可以为盒状模型提供最大的灵活性,是布局的首选方案,现已得到所有现代浏览器的支持。
基础
通过指定display: flex
来标识一个弹性布局盒子,称为FLEX
容器,容器内部的盒子就成为FLEX
容器的成员,容器默认两根轴线,水平的主轴与垂直的交叉轴,主轴的开始位置叫做main start
,结束位置叫做main end
;交叉轴的开始位置叫做cross start
,结束位置叫做cross end
,容器成员默认按照主轴排列。
容器属性
flex-direction
flex-direction
属性决定主轴的方向,取值为row | row-reverse | column | column-reverse
。
row
默认值:主轴为水平方向,起点在左端。row-reverse
:主轴为水平方向,起点在右端,容器成员顺序与row
顺序相反。column
:主轴为垂直方向,起点在上沿。column-reverse
:主轴为垂直方向,起点在下沿,容器成员顺序与column
顺序相反。
<div id="t1">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<!--
3
2
1
-->
<style>
#t1{
display: flex;
flex-direction: column-reverse;
}
</style>
flex-wrap
flex-wrap
属性决定当轴线方向放不下成员时,是否换行,取值为nowrap | wrap | wrap-reverse
。
nowrap
默认:不换行,当空间不足时,会按轴线方向成员大小比例缩小的成员。wrap
:距离不够时换行,新起一行排列。wrap-reverse
:距离不够时换行,新起的一行在上方。
<div id="t2" style="width: 20px;">
<div>4</div>
<div>5</div>
<div>6</div>
</div>
<!--
45
6
-->
<style>
#t2{
display: flex;
flex-wrap: wrap;
}
</style>
flex-flow
flex-flow
属性是flex-direction
属性和flex-wrap
属性的简写形式,默认row nowrap
。
<div id="t3" style="width: 20px;">
<div>7</div>
<div>8</div>
<div>9</div>
</div>
<!--
87
9
-->
<style>
#t3{
display: flex;
flex-flow: row-reverse wrap;
}
</style>
justify-content
justify-content
属性定义了成员在主轴上的对齐方式,可以很容易地实现多种布局,取值为flex-start | flex-end | center | space-between | space-around
。
flex-start
默认值:左对齐。flex-end
:右对齐。center
: 居中对齐。space-between
:两端对齐,成员之间的间隔都相等。space-around
:每个成员两侧的间隔相等,成员之间的间隔比成员与边框的间隔大一倍。
<div id="t4">
<div>a</div>
<div>b</div>
<div>c</div>
</div>
<!-- abc[水平居中] -->
<style>
#t4{
display: flex;
justify-content: center;
}
</style>
align-items
align-items
属性定义成员在交叉轴上如何对齐,取值为flex-start | flex-end | center | baseline | stretch
。
stretch
默认值:如果成员未设置高度或设为auto
,将占满整个容器的高度。flex-start
:交叉轴的起点对齐。flex-end
:交叉轴的终点对齐。center
:交叉轴的中点对齐。baseline
: 成员的第一行文字的基线对齐。
<div id="t5" style="height: 50px;">
<div>d</div>
<div>e</div>
<div>f</div>
</div>
<!-- def[垂直居中] -->
<style>
#t5{
display: flex;
align-items: center;
}
</style>
align-content
align-content
属性定义了多根轴线的对齐方式。如果成员只有一根轴线,该属性不起作用,取值为flex-start | flex-end | center | space-between | space-around | stretch
。
stretch
默认值:轴线占满整个交叉轴。flex-start
:与交叉轴的起点对齐。flex-end
:与交叉轴的终点对齐。center
:与交叉轴的中点对齐。space-between
:与交叉轴两端对齐,轴线之间的间隔平均分布。space-around
:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
<div id="t6" style="height: 50px;width: 20px;">
<div>g</div>
<div>h</div>
<div>i</div>
</div>
<!--
g
hi
[交叉轴space-between]
-->
<style>
#t6{
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
</style>
成员属性
order
order
属性定义成员的排列顺序,数值越小,排列越靠前,默认为0
。
<div class="flexBox">
<div style="order: 3;">j</div>
<div style="order: 1;">k</div>
<div style="order: 2;">l</div>
</div>
<!-- klj -->
<style>
.flexBox{
display: flex;
}
</style>
flex-grow
flex-grow
属性定义成员的放大比例,默认为0
。
<div class="flexBox">
<div style="flex-grow: 1;">m</div>
<div style="flex-grow: 2;">n</div>
<div style="flex-grow: 3;">o</div>
</div>
<!-- m n o -->
<style>
.flexBox{
display: flex;
}
</style>
flex-shrink
flex-shrink
属性定义了成员的缩小比例,默认为1
,即如果空间不足,该成员将缩小。
<div class="flexBox" style="width: 100px;">
<div style="flex-shrink: 1;width: 100px;">p</div>
<div style="flex-shrink: 2;width: 100px;">q</div>
<div style="flex-shrink: 3;width: 100px;">r</div>
</div>
<!-- p q r -->
<style>
.flexBox{
display: flex;
}
</style>
flex-basis
flex-basis
属性定义了在分配多余空间之前,成员占据的主轴空间main size
,浏览器根据这个属性,计算主轴是否有多余空间,它的默认值为auto
,即成员的本来大小。
<div class="flexBox">
<div>s</div>
<div style="flex-basis: 40px;">t</div>
<div>u</div>
</div>
<!-- s t u -->
<style>
.flexBox{
display: flex;
}
</style>
flex
flex
属性是flex-grow
, flex-shrink
和flex-basis
的简写,默认值0 1 auto
。后两个属性可选。
<div class="flexBox">
<div style="flex: 1;">v</div>
<div style="flex: 1;">w</div>
<div style="flex: 1;">x</div>
</div>
<!-- v w x -->
<style>
.flexBox{
display: flex;
}
</style>
align-self
align-self
属性允许单个成员有与其他成员不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
<div class="flexBox" style="height: 50px;">
<div>y</div>
<div style="align-self: center;">z</div>
<div>0</div>
</div>
<!-- y z 0 -->
<style>
.flexBox{
display: flex;
}
</style>
代码示例
<!DOCTYPE html>
<html lang="zh">
<head>
<title>FLEX布局</title>
</head>
<body>
<div id="t1">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<!--
3
2
2
-->
<div id="t2" style="width: 20px;">
<div>4</div>
<div>5</div>
<div>6</div>
</div>
<!--
45
6
-->
<div id="t3" style="width: 20px;">
<div>7</div>
<div>8</div>
<div>9</div>
</div>
<!--
87
9
-->
<div id="t4">
<div>a</div>
<div>b</div>
<div>c</div>
</div>
<!-- abc[水平居中] -->
<div id="t5" style="height: 50px;">
<div>d</div>
<div>e</div>
<div>f</div>
</div>
<!-- def[垂直居中] -->
<div id="t6" style="height: 50px;width: 20px;">
<div>g</div>
<div>h</div>
<div>i</div>
</div>
<!--
g
hi
[交叉轴space-between]
-->
<div class="flexBox">
<div style="order: 3;">j</div>
<div style="order: 1;">k</div>
<div style="order: 2;">l</div>
</div>
<!-- klj -->
<div class="flexBox">
<div style="flex-grow: 1;">m</div>
<div style="flex-grow: 2;">n</div>
<div style="flex-grow: 3;">o</div>
</div>
<!-- m n o -->
<div class="flexBox" style="width: 100px;">
<div style="flex-shrink: 1;width: 100px;">p</div>
<div style="flex-shrink: 2;width: 100px;">q</div>
<div style="flex-shrink: 3;width: 100px;">r</div>
</div>
<!-- p q r -->
<div class="flexBox">
<div>s</div>
<div style="flex-basis: 40px;">t</div>
<div>u</div>
</div>
<!-- s t u -->
<div class="flexBox" style="height: 50px;">
<div>y</div>
<div style="align-self: center;">z</div>
<div>0</div>
</div>
<!-- y z 0 -->
</body>
<style>
#t1{
display: flex;
flex-direction: column-reverse;
}
#t2{
display: flex;
flex-wrap: wrap;
}
#t3{
display: flex;
flex-flow: row-reverse wrap;
}
#t4{
display: flex;
justify-content: center;
}
#t5{
display: flex;
align-items: center;
}
#t6{
display: flex;
flex-wrap: wrap;
align-content: space-between;
}
.flexBox{
display: flex;
}
</style>
</html>
Float浮动
CSS
中float
属性会使元素浮动,使元素向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。
实例
- 元素的水平方向浮动,意味着元素只能左右移动而不能上下移动。
- 使用
float
意味着使用块布局,其会在display
非块级元素情况下修改display
值的计算值。 - 一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。
- 浮动元素会脱离文档流但不会脱离文本流,当浮动时其不会影响周围的盒子模型,但是文字会环绕在浮动元素周围,可以认为文档流与文字流是分层结构而浮动元素盒子与文字元素处于同一层。
- 文档流,指的是盒子元素排版布局过程中,元素会自动从左往右,从上往下的流式排列。
- 文本流,指的是文字元素排版布局过程中,元素会自动从左往右,从上往下的流式排列。
- 脱离文档流,也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位。
<!DOCTYPE html>
<html lang="zh">
<head>
<title>Float</title>
<style>
body > div{
border: 1px solid #eee;
padding: 5px 0;
margin: 5px 0;
}
.t1{
margin: 0 5px;
float: left;
background-color: #EEE;
}
</style>
</head>
<body>
<div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div style="height: 10px;background-color: blue;"></div>
</div>
</body>
</html>
文字环绕效果
可以认为文档流与文字流是分层结构而浮动元素盒子与文字元素处于同一层,当元素浮动时,其脱离文档流不脱离文本流,所以浮动元素的渲染与文字的渲染是一并渲染的,浮动元素会将文字元素挤开,呈现文字环绕浮动元素的效果。
<!DOCTYPE html>
<html lang="zh">
<head>
<title>Float</title>
<style>
body > div{
border: 1px solid #eee;
padding: 5px 0;
margin: 5px 0;
}
.t1{
margin: 0 5px;
float: left;
background-color: #EEE;
height: 100px;
width: 100px;
}
</style>
</head>
<body>
<div>
<div class="t1">Float</div>
<div>123</div>
<div>123</div>
<div>123</div>
<div>123</div>
<div>123</div>
<div>123</div>
<div>123</div>
</div>
</body>
</html>
虽然float
最初的设计就是用来实现文字环绕效果的,在某些使用float
的布局下若是不想触发文字环绕效果,可以通过触发BFC
来避免文字环绕。
<!DOCTYPE html>
<html lang="zh">
<head>
<title>Float</title>
<style>
body > div{
border: 1px solid #eee;
padding: 5px 0;
margin: 5px 0;
}
.t1{
margin: 0 5px;
float: left;
background-color: #EEE;
height: 100px;
width: 100px;
}
</style>
</head>
<body>
<div>
<div class="t1">Float</div>
<div style="overflow: auto;">
<div>123</div>
<div>123</div>
<div>123</div>
<div>123</div>
<div>123</div>
<div>123</div>
<div>123</div>
</div>
</div>
</body>
</html>
清除浮动
使用浮动可能会导致一些负面影响,由于脱离文档流,无法撑起父元素导致背景以及边框无法正常显示、与其他元素重叠、下层浮动依旧会在上层浮动元素的基础上进行浮动等问题,此时就需要清除浮动。
使用clear属性
通过CSS
的clear: both;
清除浮动。
<!DOCTYPE html>
<html lang="zh">
<head>
<title>Float</title>
<style>
.container{
border: 1px solid #eee;
padding: 5px 0;
margin: 5px 0;
}
.t1{
margin: 0 5px;
float: left;
background-color: #EEE;
height: 100px;
width: 100px;
}
.clear{
clear: both;
}
</style>
</head>
<body>
<div class="container">
<div class="t1">Float</div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div style="height: 10px;background-color: blue;"></div>
<!-- 此处不清除浮动会产生负面效果 -->
</div>
<div class="container">
<div class="t1">Float</div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div style="height: 10px;background-color: blue;"></div>
<!-- 清除浮动 -->
<div class="clear"></div>
</div>
<!-- 若是在此处清除浮动也是可以的 但是会无法撑起容器高度 -->
<div class="container">
<div class="t1">Float</div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div style="height: 10px;background-color: blue;"></div>
<!-- 清除浮动 -->
<div class="clear"></div>
</div>
</body>
</html>
配合::after与clear属性
通过使用伪元素::after
配合clear
属性进行浮动清除。
<!DOCTYPE html>
<html lang="zh">
<head>
<title>Float</title>
<style>
.container{
border: 1px solid #eee;
padding: 5px 0;
margin: 5px 0;
}
.t1{
margin: 0 5px;
float: left;
background-color: #EEE;
height: 100px;
width: 100px;
}
.container::after{
clear: both;
content:"";
display: block;
}
</style>
</head>
<body>
<div class="container">
<div class="t1">Float</div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div style="height: 10px;background-color: blue;"></div>
</div>
<div class="container">
<div class="t1">Float</div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div style="height: 10px;background-color: blue;"></div>
</div>
</body>
</html>
触发BFC
触发浮动容器的BFC
来清除浮动。
<!DOCTYPE html>
<html lang="zh">
<head>
<title>Float</title>
<style>
.container{
border: 1px solid #eee;
padding: 5px 0;
margin: 5px 0;
overflow: auto; /* 触发BFC */
}
/* BFC 块级格式化上下文 https://github.com/WindrunnerMax/EveryDay/blob/master/CSS/%E5%9D%97%E7%BA%A7%E6%A0%BC%E5%BC%8F%E5%8C%96%E4%B8%8A%E4%B8%8B%E6%96%87.md */
.t1{
margin: 0 5px;
float: left;
background-color: #EEE;
height: 100px;
width: 100px;
}
</style>
</head>
<body>
<div class="container">
<div class="t1">Float</div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div style="height: 10px;background-color: blue;"></div>
</div>
<div class="container">
<div class="t1">Float</div>
<div class="t1">Float</div>
<div class="t1">Float</div>
<div style="height: 10px;background-color: blue;"></div>
</div>
</body>
</html>
Table布局
<table>
最常用的也是最正确的使用方法是制作表格,由于其对占据的空间有着划分的作用,便可以使用<table>
来布局。
实例
实现一个简单的布局,将表格的border
、cellpadding
、cellspacing
全部设置为0
,表格的边框和间距就不占有页面空间,它只起到划分空间的作用,如果布局复杂,可以在单元格中再嵌套表格,单元格中的元素或者嵌套的表格用align
和valign
设置对齐方式。要注意的是,在HTML5
标准中,<table>
的align
、bgcolor
、cellpadding
、cellspacing
、frame
、rules
、summary
、width
属性皆已不再支持,由CSS
设置相关属性来呈现效果。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="utf-8">
<title>TABLE布局</title>
</head>
<body>
<table style="width: 100%;">
<tr>
<td style="width: 200px;">导航栏</td>
<td>内容</th>
</tr>
</table>
</body>
</html>
问题
使用<table>
来布局绝对不是一个好的解决方案,对于布局方案首选Flex
布局,稍微复杂的布局可以选择Grid
布局方案,<table>
本身是为呈现表格化的数据而设计的,如果使用<table>
来呈现数据表格是完全没有问题的。
<table>
要比其它html
标记占更多的字节,代码的复杂度会大大提升。<table>
会阻塞浏览器渲染引擎的渲染顺序,<table>
是整体载入后才开始显示的,没有加载完毕前,<table>
为一片空白,而<div>
等标签可以逐行渲染,一边加载一边显示。<table>
经常需要多个关口,因为<table>
可以影响在它们之前已经进入的DOM
元素的显示的元素。假设因为表格最后一个单元格的内容过宽而导致纵列大小完全改变,这会造成浏览器的回流从而引发渲染性能问题。<table>
里显示图片时有可能需要你把单个、有逻辑性的图片切成多个图,这个主要看需求,<table>
中进行单元格合并操作也是可行的方案。<table>
会影响其单元格内部的某些布局属性的生效。<table>
的各种属性逐渐不受支持,需要使用CSS
控制显示相应效果。<table>
的语义是数据表格,使用<table>
来布局不利于SEO
。- 若布局较为复杂,则可能造成多层
<table>
嵌套,代码嵌套过多表现的过于复杂。
display
倘若需要类似于表格的布局,可以使用display: table;
来呈现,display
的table
属性值只是声明了某些元素在浏览器中的样式,其并不包含语义,他的属性基本能够对应<table>
系列标签,并且还能将缺少的表格元素会被浏览器以匿名方式创建,CSS2.1
规范中写道:CSS2.1
表格模型中的元素,可能不会全部包含在除HTML
之外的文档语言中。这时,那些“丢失”的元素会被模拟出来,从而使得表格模型能够正常工作。所有的表格元素将会自动在自身周围生成所需的匿名table
对象,使其符合table/inline-table
、table-row
、table-cell
的三层嵌套关系。
table
类似<table>
:此元素会作为块级表格来显示,表格前后带有换行符。inline-table
类似<table>
:此元素会作为内联表格来显示,表格前后没有换行符。table-header-group
类似<thead>
:此元素会作为一个或多个行的分组来显示。table-footer-group
类似<tfoot>
:此元素会作为一个或多个行的分组来显示。table-row
类似<tr>
:此元素会作为一个表格行显示。table-row-group
类似<tbody>
:此元素会作为一个或多个行的分组来显示。table-column
类似<col>
:此元素会作为一个单元格列显示。table-column-group
类似<colgroup>
:此元素会作为一个或多个列的分组来显示。table-cell
类似<td>
和<th>
:此元素会作为一个表格单元格显示。table-caption
类似<caption>
:此元素会作为一个表格标题显示。
响应式布局的实现
响应式布局指的是同一页面在不同屏幕尺寸或者在不同的设备下有不同的布局,能够在大屏设备以及小屏设备获得更好的浏览体验,简单来说就是页面适应终端而无需为每个终端制作单独的页面。
媒体查询
通过使用CSS
媒体查询来实现响应式布局,针对不同的媒体类型设置不同的样式规则,可以根据视窗、设备高度与宽度、设备方向、分辨率等进行不同CSS
适配。
使用link链接
<!--<link rel="stylesheet" media="mediatype and|not|only (media feature)" href="example.css">-->
<link rel="stylesheet" href="example.css" media="all and (max-width:600px)"/>
直接在CSS中使用
<!--
@media mediatype and|not|only (media feature){
/* css样式 */
}
-->
<div id="t1"></div>
<style>
@media screen and (min-width:600px){
#t1{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: red;
transition: all .5s;
}
}
@media screen and (max-width:600px) {
#t1{
height: 100px;
width: 100px;
border: 1px solid #eee;
background: yellow;
transition: all .5s;
}
}
</style>
使用@import导入
/* @import url("example.css") mediatype and|not|only (media feature); */
@import url("example.css") all and (max-width:600px);
媒体类型
all
: 用于所有设备。print
: 用于打印机和打印预览。screen
: 用于电脑屏幕,平板电脑,智能手机等。speech
: 应用于屏幕阅读器等发声设备。
逻辑操作符
and
: 表示且,当所有的条件满足的时候返回true
。not
: 是用来排除某种制定的媒体类型。only
: 用来指定某种特定的媒体类型,可以用来排除不支持媒体查询的浏览器。,
: 逗号用于将多个媒体查询合并为一个规则,逗号分隔效果等同于or
逻辑操作符。
媒体功能
aspect-ratio
: 定义输出设备中的页面可见区域宽度与高度的比率。color
: 定义输出设备每一组彩色原件的个数。如果不是彩色设备,则值等于0
。color-index
: 定义在输出设备的彩色查询表中的条目数,如果没有使用彩色查询表,则值等于0
。device-aspect-ratio
: 定义输出设备的屏幕可见宽度与高度的比率。device-height
: 定义输出设备的屏幕可见高度。device-width
: 定义输出设备的屏幕可见宽度。grid
: 用来查询输出设备是否使用栅格或点阵。height
: 定义输出设备中的页面可见区域高度。max-aspect-ratio
: 定义输出设备的屏幕可见宽度与高度的最大比率。max-color
: 定义输出设备每一组彩色原件的最大个数。max-color-index
: 定义在输出设备的彩色查询表中的最大条目数。max-device-aspect-ratio
: 定义输出设备的屏幕可见宽度与高度的最大比率。max-device-height
: 定义输出设备的屏幕可见的最大高度。max-device-width
: 定义输出设备的屏幕最大可见宽度。max-height
: 定义输出设备中的页面最大可见区域高度。max-monochrome
: 定义在一个单色框架缓冲区中每像素包含的最大单色原件个数。max-resolution
: 定义设备的最大分辨率。max-width
: 定义输出设备中的页面最大可见区域宽度。min-aspect-ratio
: 定义输出设备中的页面可见区域宽度与高度的最小比率。min-color
: 定义输出设备每一组彩色原件的最小个数。min-color-index
: 定义在输出设备的彩色查询表中的最小条目数。min-device-aspect-ratio
: 定义输出设备的屏幕可见宽度与高度的最小比率。min-device-width
: 定义输出设备的屏幕最小可见宽度。min-device-height
: 定义输出设备的屏幕的最小可见高度。min-height
: 定义输出设备中的页面最小可见区域高度。min-monochrome
: 定义在一个单色框架缓冲区中每像素包含的最小单色原件个数min-resolution
: 定义设备的最小分辨率。min-width
: 定义输出设备中的页面最小可见区域宽度。monochrome
: 定义在一个单色框架缓冲区中每像素包含的单色原件个数。如果不是单色设备,则值等于0
。orientation
: 定义输出设备中的页面可见区域高度是否大于或等于宽度。resolution
: 定义设备的分辨率。scan
: 定义电视类设备的扫描工序。width
: 定义输出设备中的页面可见区域宽度。
单位
百分比单位
当度量单位设置为百分比时,即可使浏览器组件宽高随着浏览器的大小相应变化。
- 子元素的
height
或width
中使用百分比,是相对于子元素的直接父元素,width
相对于父元素的width
,height
相对于父元素的height
。 - 子元素的
top
和bottom
如果设置百分比,则相对于直接非static
定位的父元素的高度,同样子元素的left
和right
如果设置百分比,则相对于直接非static
定位父元素的宽度。 - 子元素的
padding
如果设置百分比,不论是垂直方向或者是水平方向,都相对于直接父亲元素的width
,而与父元素的height
无关。 - 子元素的
margin
如果设置成百分比,不论是垂直方向还是水平方向,都相对于直接父元素的width
。 - 设置
border-radius
为百分比,则是相对于自身的宽度,还有translate
、background-size
等都是相对于自身的。
em单位
em
是相对长度单位,相对于当前对象内文本的字体尺寸,若未设置则相对于浏览器默认字体尺寸16px
,em
是会继承父元素的字体的尺寸,使用时需要重新计算子元素的em
值避免1.2*1.2=1.44
的现象,使用em
可以使元素根据字体大小的动态调整来制作响应式布局。
rem单位
rem
单位都是相对于根元素html
的font-size
来决定大小的,根元素的font-size
相当于提供了一个基准,当页面的size
发生变化时,只需要改变font-size
的值,那么以rem
为固定单位的元素的大小也会发生相应的变化。因此,如果通过rem
来实现响应式的布局,只需要根据视图容器的大小,动态的改变根元素的font-size
即可。
vh vw vmin vmax
vh
: 相对于视窗的高度,1vh
等于视窗高度的1%
。vw
: 相对于视窗的宽度,1vw
等于视窗宽度的1%
。vmin
:vw
和vh
中的较小值。vmax
:vw
和vh
中的较大值。
缩放比例
通过动态地控制网页视图的缩放比例来制作响应式布局。
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0" />
自适应布局
自适应布局一般是通过检测User-Agent
来判断当前访问的设备是PC
端还是平板或者是手机,或者是通过检测窗口分辨率而请求服务器,从而服务端重定向或者返回不同的页面,需要开发多个页面来适应不同的设备,通常自适应布局与响应式布局并不是单独使用的,可以通过开发一套PC
端页面与一套移动端页面来实现自适应布局,而两套页面都实现对于不同范围分辨率的响应式布局,可以避免过大的CSS
样式表又可以获得较好的浏览体验,