一. 基础概念
1.1 什么是CSS
层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。
1.2 语法
选择器 {
color: blue;
font-size: 12p;
}
1.3 选择器
根据规则选取页面中的dom元素, 包含以下选择器分类:
.class |
.intro |
选择所有class=“intro”的元素 |
1 |
#id |
#firstname |
选择所有id=“firstname”的元素 |
1 |
* |
* |
选择所有元素 |
2 |
element |
p |
选择所有元素 |
1 |
element,element |
div,p |
选择所有元素和元素 |
1 |
element element |
div p |
选择元素内的所有元素 |
1 |
element>element |
div>p |
选择所有父级是元素的元素 |
2 |
element+element |
div+p |
选择所有紧接着元素之后的元素 |
2 |
[attribute] |
[target] |
选择所有带有target属性元素 |
2 |
[attribute=value] |
[target=-blank] |
选择所有使用target=“-blank”的元素 |
2 |
[attribute~=value] |
[title~=flower] |
选择标题属性包含单词”flower”的所有元素 |
2 |
[attribute |
=language] |
[lang |
=en] |
:link |
a:link |
选择所有未访问链接 |
1 |
:visited |
a:visited |
选择所有访问过的链接 |
1 |
:active |
a:active |
选择活动链接 |
1 |
:hover |
a:hover |
选择鼠标在链接上面时 |
1 |
:focus |
input:focus |
选择具有焦点的输入元素 |
2 |
:first-letter |
p:first-letter |
选择每一个元素的第一个字母 |
1 |
:first-line |
p:first-line |
选择每一个元素的第一行 |
1 |
:first-child |
p:first-child |
指定只有当元素是其父级的第一个子级的样式。 |
2 |
:before |
p:before |
在每个元素之前插入内容 |
2 |
:after |
p:after |
在每个元素之后插入内容 |
2 |
:lang(language) |
p:lang(it) |
选择一个lang属性的起始值=“it”的所有元素 |
2 |
element1~element2 |
p~ul |
选择p元素之后的每一个ul元素 |
3 |
[attribute^=value] |
a[src^=“https”] |
选择每一个src属性的值以”https”开头的元素 |
3 |
[attribute$=value] |
a[src$=“.pdf”] |
选择每一个src属性的值以”.pdf”结尾的元素 |
3 |
[attribute*=value] |
a[src*=“axihe”] |
选择每一个src属性的值包含子字符串”axihe”的元素 |
3 |
:first-of-type |
p:first-of-type |
选择每个p元素是其父级的第一个p元素 |
3 |
:last-of-type |
p:last-of-type |
选择每个p元素是其父级的最后一个p元素 |
3 |
:only-of-type |
p:only-of-type |
选择每个p元素是其父级的唯一p元素 |
3 |
:only-child |
p:only-child |
选择每个p元素是其父级的唯一子元素 |
3 |
:nth-child(n) |
p:nth-child(2) |
选择每个p元素是其父级的第二个子元素 |
3 |
:nth-last-child(n) |
p:nth-last-child(2) |
选择每个p元素的是其父级的第二个子元素,从最后一个子项计数 |
3 |
:nth-of-type(n) |
p:nth-of-type(2) |
选择每个p元素是其父级的第二个p元素 |
3 |
:nth-last-of-type(n) |
p:nth-last-of-type(2) |
选择每个p元素的是其父级的第二个p元素,从最后一个子项计数 |
3 |
:last-child |
p:last-child |
选择每个p元素是其父级的最后一个子级。 |
3 |
:root |
:root |
选择文档的根元素 |
3 |
:empty |
p:empty |
选择每个没有任何子级的p元素(包括文本节点) |
3 |
:target |
#news:target |
选择当前活动的#news元素(包含该锚名称的点击的URL) |
3 |
:enabled |
input:enabled |
选择每一个已启用的输入元素 |
3 |
:disabled |
input:disabled |
选择每一个禁用的输入元素 |
3 |
:checked |
input:checked |
选择每个选中的输入元素 |
3 |
:not(selector) |
:not§ |
选择每个并非p元素的元素 |
3 |
::selection |
::selection |
匹配元素中被用户选中或处于高亮状态的部分 |
3 |
:out-of-range |
:out-of-range |
匹配值在指定区间之外的input元素 |
3 |
:in-range |
:in-range |
匹配值在指定区间之内的input元素 |
3 |
:read-write |
:read-write |
用于匹配可读及可写的元素 |
3 |
:read-only |
:read-only |
用于匹配设置 “readonly”(只读) 属性的元素 |
3 |
:optional |
:optional |
用于匹配可选的输入元素 |
3 |
:required |
:required |
用于匹配设置了 “required” 属性的元素 |
3 |
:valid |
:valid |
用于匹配输入值为合法的元素 |
3 |
:invalid |
:invalid |
用于匹配输入值为非法的元素 |
3 |
1.4 插入样式表的方法
插入样式表的方法有三种:
- 外部样式表(External style sheet)
- 内部样式表(Internal style sheet)
- 内联样式(Inline style)
1.5 样式优先级
内联样式)Inline style > (内部样式)Internal style sheet >(外部样式)External style sheet > 浏览器默认样式
优先级逐级增加的选择器列表:
- 通用选择器(*)
- 元素(类型)选择器
- 类选择器
- 属性选择器
- 伪类
- ID 选择器
- 内联样式
经验法则:
-
Always 要优化考虑使用样式规则的优先级来解决问题而不是
!important
-
Only 只在需要覆盖全站或外部 css(例如引用的 ExtJs 或者 YUI )的特定页面中使用
!important
-
Never 永远不要在全站范围的 css 上使用
!important
-
Never 永远不要在你的插件中使用
!important
权重的计算
<html>
<head>
<style type="text/css">
#redP p {
/* 权值 = 100+1=101 */
color:#F00; /* 红色 */
}
#redP .red em {
/* 权值 = 100+10+1=111 */
color:#00F; /* 蓝色 */
}
#redP p span em {
/* 权值 = 100+1+1+1=103 */
color:#FF0;/*黄色*/
}
</style>
</head>
<body>
<div id="redP">
<p class="red">red
<span><em>em red</em></span>
</p>
<p>red</p>
</div>
</body>
</html>
二. 常用属性
2.1 background
background的值的顺序是background-color,background-image,background-repeat,background-attachment,background-position,background-size。
如果用background-size,一定要用/分隔
定义背景效果
2.2 文本属性
2.3 字体Font
2.3.1 CSS字形
Scans-serif: 无衬线
Serif: 有称线
-
通用字体系列 - 拥有相似外观的字体系统组合(如 “Serif” 或 “Monospace”)
-
特定字体系列 - 一个特定的字体系列(如 “Times” 或 “Courier”)
Serif |
Times New Roman Georgia |
Serif字体中字符在行的末端拥有额外的装饰 |
Sans-serif |
Arial Verdana |
"Sans"是指无 - 这些字体在末端没有额外的装饰 |
Monospace |
Courier New Lucida Console |
所有的等宽字符具有相同的宽度 |
2.3.2 字体系列
font-family 属性设置文本的字体系列。
font-family 属性应该设置几个字体名称作为一种"后备"机制,如果浏览器不支持第一种字体,他将尝试下一种字体。
注意: 如果字体系列的名称超过一个字,它必须用引号,如Font Family:“宋体”
p{font-family:"Times New Roman", Times, serif;}
2.3.3 字体样式
- 正常(normal) - 正常显示文本
- 斜体(italic) - 以斜体字显示的文字
- 倾斜的文字(oblique) - 文字向一边倾斜(和斜体非常类似,但不太支持)
2.3.4 字体大小
绝对大小:
- 设置一个指定大小的文本
- 不允许用户在所有浏览器中改变文本大小
- 确定了输出的物理尺寸时绝对大小很有用
相对大小:
- 相对于周围的元素来设置大小
- 允许用户在浏览器中改变文字大小
2.4 边框 (Border) 和 轮廓 (Outline)
2.5 动画属性
2.6 内边距
2.7 链接样式
- a:link - 正常,未访问过的链接
- a:visited - 用户已访问过的链接
- a:hover - 当用户鼠标放在链接上时
- a:active - 链接被点击的那一刻
顺序规则:
- a:hover 必须跟在 a:link 和 a:visited后面
- a:active 必须跟在 a:hover后面
a:link {color:#000000;} /* 未访问链接*/
a:visited {color:#00FF00;} /* 已访问链接 */
a:hover {color:#FF00FF;} /* 鼠标移动到链接上 */
a:active {color:#0000FF;} /* 鼠标点击时 */
2.8 列表样式(ul)
CSS列表属性作用如下:
- 设置不同的列表项标记为有序列表
- 设置不同的列表项标记为无序列表
- 设置列表项标记为图像
在HTML中,有两种类型的列表:
- 无序列表 - 列表项标记用特殊图形(如小黑点、小方框等)
- 有序列表 - 列表项的标记有数字或字母
使用CSS,可以列出进一步的样式,并可用图像作列表项标记。
2.8.1 作为列表项标记的图像
ul {
list-style: disc inside url(http://img5.imgtn.bdimg.com/it/u=2916716554,654971401&fm=26&gp=0.jpg);
}
2.8.2 所有的CSS列表属性
list-style |
简写属性。用于把所有用于列表的属性设置于一个声明中 |
list-style-image |
将图象设置为列表项标志。 |
list-style-position |
设置列表中列表项标志的位置。 |
list-style-type |
设置列表项标志的类型。 |
2.9 CSS Table(表格)
2.9.1 表格边框
table, th, td {
border: 1px solid black;
}
2.9.2 折叠边框
border-collapse 属性设置表格的边框是否被折叠成一个单一的边框或隔开:
table{
border-collapse:collapse;
}
table,th, td{
border: 1px solid black;
}
2.9.3 表格宽度和高度
table
{
width:100%;
}
th
{
height:50px;
}
2.9.4 表格文字对齐
表格中的文本对齐和垂直对齐属性。
text-align属性设置水平对齐方式,向左,右,或中心:
td {
text-align:right;
}
垂直对齐属性设置垂直对齐,比如顶部,底部或中间:
td {
height:50px;
vertical-align:bottom;
}
2.9.5 表格填充
td {
padding:15px;
}
2.9.6 表格颜色
table, td, th
{
border:1px solid green;
}
th
{
background-color:green;
color:white;
}
2.10 CSS 盒子模型
在HTML中的每个element(元素)都可以看作一个矩形的盒子,矩形从内到外依次由元素的内容(content)、内边距(padding)、边框(border)、外边距(margin)组成。
在CSS的布局中,元素的矩形被称为"Box Model",即盒子模型。在浏览器渲染页面时,盒子模型决定了元素的大小和位置。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hnrCsB3E-1604913788979)(https://a.axihe.com/img/css/box-model.gif)]
-
Margin(外边距) - 清除边框外的区域,外边距是透明的。
-
Border(边框) - 围绕在内边距和内容外的边框。
-
Padding(内边距) - 清除内容周围的区域,内边距是透明的。
-
Content(内容) - 盒子的内容,显示文本和图像。
2.10.1 元素的宽度和高度
CSS 框模型 (Box Model) 规定了元素框处理元素内容、内边距、边框 和 外边距 的方式。
元素框的最内部分是实际的内容,直接包围内容的是内边距。内边距呈现了元素的背景。内边距的边缘是边框。边框以外是外边距,外边距默认是透明的,因此不会遮挡其后的任何元素。
2.10.2 浏览器的兼容性问题
内边距、边框和外边距都是可选的,默认值是零。但是,许多元素将由用户代理样式表设置外边距和内边距。可以通过将元素的 margin 和 padding 设置为零来覆盖这些浏览器样式。这可以分别进行,也可以使用通用选择器对所有元素进行设置:
* {
margin: 0;
padding: 0;
}
建议不要给元素添加具有指定宽度的内边距,而是尝试将内边距或外边距添加到元素的父元素和子元素。
在 CSS 中,width 和 height 指的是内容区域的宽度和高度。增加内边距、边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸。
假设框的每个边上有 10 个像素的外边距和 5 个像素的内边距。如果希望这个元素框达到 100 个像素,就需要将内容的宽度设置为 70 像素,请看下图:
#box {
width: 70px;
margin: 10px;
padding: 5px;
}
2.10.3 获取DOM元素宽高的属性
在DOM中,获取元素高宽有以下属性:clientWidth/clientHeight、offsetWidth/offsetHeight、scrollWidth/scrollHeight
clientWidth、clientHeight:
说明:包含内边距、内容区域的宽度、高度;若含有滚动条,将会减去滚动条的宽度、高度。
公式:
element.clientWidth = padding-left + width + padding-right
element.clientHeight = padding-top + height + padding-bottom
offsetWidth、offsetHeight:
说明:包含了边框、内边距、内容区域以及滚动条等范围的宽度、高度。
公式:
element.offsetWidth = border-left + padding-left + width + padding-right + border-right
element.offsetHeight = border-top + padding-top + height + padding-bottom + border-bottom
scrollWidth、scrollHeight
说明:与clientWidth、clientHeight类似(包含内边距、内容区域,但不包括滚动条),不同的是scrollWidth、scrollHeight与元素的overflow样式属性息息相关:
当块级元素的内容超出元素大小时,其内容会根据overflow设定的值出现滚动条或内容溢出,scrollWidth、scrollHeight包含了这些不可见的内容区域。
2.10.4 box-sizing
属性值 |
属性含义 |
Content-box |
说明:表示CSS中的width和height属性的值只会应用到元素的内容区域。将采用标准模式****解析计算,也是默认模式 |
Border-box |
表示元素的边框和内边距的范围包含在CSS中的width、height内。将采用怪异模式进行计算 |
注意: 两种盒子模型都不将margin计算在内
2.10.5 jQuery中元素宽度(高度)
$(element).width():获取元素content(内容)区域的宽度。若元素的含有 box-sizing: border-box ,会减去相应的padding、boder。
$(element).innerWidth():获取元素 content区域 + padding 的宽度。
$(element).outerWidth():获取元素 content区域 + padding + boder 的宽度。
$(element).outerWidth(true):获取元素 content区域 + padding + boder + margin 的宽度。
2.11 CSS margin(外边距)
margin |
简写属性。在一个声明中设置所有外边距属性。 |
margin-bottom |
设置元素的下外边距。 |
margin-left |
设置元素的左外边距。 |
margin-right |
设置元素的右外边距。 |
margin-top |
设置元素的上外边距。 |
2.11.1 CSS 外边距合并
外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。
合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。
尽管看上去有些奇怪,但是外边距甚至可以与自身发生合并。
假设有一个空元素,它有外边距,但是没有边框或填充。在这种情况下,上外边距与下外边距就碰到了一起,它们会发生合并:
如果这个外边距遇到另一个元素的外边距,它还会发生合并:
这就是一系列的段落元素占用空间非常小的原因,因为它们的所有外边距都合并到一起,形成了一个小的外边距。外边距合并初看上去可能有点奇怪,但是实际上,它是有意义的。以由几个段落组成的典型文本页面为例。第一个段落上面的空间等于段落的上外边距。如果没有外边距合并,后续所有段落之间的外边距都将是相邻上外边距和下外边距的和。这意味着段落之间的空间是页面顶部的两倍。如果发生外边距合并,段落之间的上外边距和下外边距就合并在一起,这样各处的距离就一致了。
只有普通文档流中块框的垂直外边距才会发生外边距合并。行内框、浮动框或绝对定位之间的外边距不会合并。
2.11.2 BFC
**Box:**CSS渲染的时候是以Box作为渲染的基本单位。Box的类型由元素的类型和display属性决定,box的类型分为block-level box 和inline-level box(不包括css3的时候)。不同类型的box参与不同类型的formatting context布局。
所谓的 Formatting context(格式化上下文), 它是 W3C CSS2.1 规范中的一个概念。
它是页面中的一块渲染区域,并且有一套渲染规则.
它决定了其子元素将如何定位,以及和其他元素的关系和相互作用。
而 Block Formatting Contexts (BFC,块级格式化上下文),就是 一个块级元素 的渲染显示规则。通俗一点讲,可以把 BFC 理解为一个封闭的大箱子,,容器里面的子元素不会影响到外面的元素,反之也如此。
1 内部的盒子会在垂直方向,一个个地放置;
2 BFC是页面上的一个隔离的独立容器;
3 属于同一个BFC的 两个相邻Box的 上下margin会发生重叠 ;
4 计算BFC的高度时,浮动元素也参与计算
5 每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此;
6 BFC的区域不会与float重叠;
那么如何触发 BFC呢?只要元素满足下面任一条件即可触发 BFC 特性:
- 根元素
- float属性不为none
- position为absolute或fixed
- display为inline-block, table-cell, table-caption, flex, inline-flex
- overflow不为visible
2.11.3 BFC的特性及应用
- 同一个 BFC下外边距 会发生折叠
<head>
.p {
width:200px;
height:50px;
margin:50px 0;
background-color:red;
}
</head>
<body>
<div class="p"></div>
<div class="p"></div>
</body>
盒子垂直方向的距离由margin决定,
属于 同一个BFC的 + 两个相邻Box的 + 上下margin 会发生重叠
上文的例子 之所以发生外边距折叠,是因为他们 同属于 body这个根元素, 所以我们需要让 它们 不属于同一个BFC,就能避免外边距折叠:
<div class="p"></div>
<div class="wrap">
<div class="p"></div>
</div>
wrap {
overflow:hidden;
.p {
width:200px;
height:50px;
margin:50px 0;
background-color:red;
}
-
BFC可以包含浮动的元素(清除浮动)
<div style="border: 1px solid #000;">
<div style="width: 50px; height: 50px; background: #eee;
float: left;">
</div>
</div>
外层的div会无法包含 内部浮动的div,效果见下图:
但如果我们 触发外部容器的BFC,根据BFC规范中的第4条:计算BFC的高度时,浮动元素也参与计算,那么外部div容器就可以包裹着浮动元素,所以只要把代码修改如下:
<div style="border: 1px solid #000;overflow: hidden">
<div style="width: 100px;height: 100px;background: #eee;float: left;"></div>
</div>
就可以完成以下效果:
-
BFC可以阻止元素被浮动元素覆盖
<div class="aside"></div>
<div class="main"></div>
div {
width:300px;
}
.aside {
width: 100px;
height: 150px;
float: left;
background: black;
}
.main {
height:200px;
background-color:red;
}
之所以是这样,是因为上文的 规则5: 每个元素的左边,与包含的盒子的左边相接触,即使存在浮动也是如此;
所以要想改变效果,使其互补干扰,就得利用规则6 :BFC的区域不会与float重叠,
让 `` 也能触发BFC的性质,即:
.main {
overflow:hidden;
height:200px;
background-color:red;
}
通过这种方法,就能 用来实现 两列的自适应布局。
2.13.4 IFC
Inline Formatting Contexts,也就是“内联格式化上下文”。
符合以下任一条件即会生成一个IFC
形成条件非常简单,需要注意的是当IFC中有块级元素插入时,会产生两个匿名块将父元素分割开来,产生两个IFC,这里不做过多介绍。
IFC布局规则
- 子元素水平方向横向排列,并且垂直方向起点为元素顶部。
- 子元素只会计算横向样式空间,【padding、border、margin】,垂直方向样式空间不会被计算,【padding、border、margin】。
- 在垂直方向上,子元素会以不同形式来对齐(vertical-align)
- 能把在一行上的框都完全包含进去的一个矩形区域,被称为该行的行框(line box)。行框的宽度是由包含块(containing box)和与其中的浮动来决定。
- IFC中的“line box”一般左右边贴紧其包含块,但float元素会优先排列。
- IFC中的“line box”高度由 CSS 行高计算规则来确定,同个IFC下的多个line box高度可能会不同。
- 当 inline-level boxes的总宽度少于包含它们的line box时,其水平渲染规则由 text-align 属性值来决定。
- 当一个“inline box”超过父元素的宽度时,它会被分割成多个boxes,这些 oxes 分布在多个“line box”中。如果子元素未设置强制换行的情况下,“inline box”将不可被分割,将会溢出父元素。
2.12 CSS padding(填充)
padding |
使用简写属性设置在一个声明中的所有填充属性 |
padding-bottom |
设置元素的底部填充 |
padding-left |
设置元素的左部填充 |
padding-right |
设置元素的右部填充 |
padding-top |
设置元素的顶部填充 |
2.13 CSS 尺寸 (Dimension)
height |
设置元素的高度。 |
line-height |
设置行高。 |
max-height |
设置元素的最大高度。 |
max-width |
设置元素的最大宽度。 |
min-height |
设置元素的最小高度。 |
min-width |
设置元素的最小宽度。 |
width |
设置元素的宽度。 |
2.14 CSS Display(显示) 与 Visibility(可见性)
隐藏一个元素可以通过把display属性设置为”none”,或把visibility属性设置为”hidden”。但是请注意,这两种方法会产生不同的结果。
visibility:hidden可以隐藏某个元素,但隐藏的元素仍需占用与未隐藏之前一样的空间。也就是说,该元素虽然被隐藏了,但仍然会影响布局。
2.15 CSS里常见的块级元素和行内元素
根据CSS规范的规定,每一个网页元素都有一个display属性,用于确定该元素的类型,每一个元素都有默认的display属性值,比如div元素,它的默认display属性值为“block”,成为“块级”元素(block-level);而span元素的默认display属性值为“inline”,称为“行内”元素。
div这样的块级元素,就会自动占据一定矩形空间,可以通过设置高度、宽度、内外边距等属性,来调整的这个矩形的样子;与之相反,像“span”“a”这样的行内元素,则没有自己的独立空间,它是依附于其他块级元素存在的,因此,对行内元素设置高度、宽度、内外边距等属性,都是无效的。
内联元素(行内元素)内联元素(inline element)
- a - 锚点
- abbr - 缩写
- acronym - 首字
- b - 粗体(不推荐)
- bdo - bidi override
- big - 大字体
- br - 换行
- cite - 引用
- code - 计算机代码(在引用源码的时候需要)
- dfn - 定义字段
- em - 强调
- font - 字体设定(不推荐)
- i - 斜体
- img - 图片
- input - 输入框
- kbd - 定义键盘文本
- label - 表格标签
- q - 短引用
- s - 中划线(不推荐)
- samp - 定义范例计算机代码
- select - 项目选择
- small - 小字体文本
- span - 常用内联容器,定义文本内区块
- strike - 中划线
- strong - 粗体强调
- sub - 下标
- sup - 上标
- textarea - 多行文本输入框
- tt - 电传文本
- u - 下划线
- var - 定义变量
块元素(block element)
- address - 地址
- blockquote - 块引用
- center - 举中对齐块
- dir - 目录列表
- div - 常用块级容易,也是css layout的主要标签
- dl - 定义列表
- fieldset - form控制组
- form - 交互表单
- h1 - 大标题
- h2 - 副标题
- h3 - 3级标题
- h4 - 4级标题
- h5 - 5级标题
- h6 - 6级标题
- hr - 水平分隔线
- isindex - input prompt
- menu - 菜单列表
- noframes - frames可选内容,(对于不支持frame的浏览器显示此区块内容
- noscript - )可选脚本内容(对于不支持script的浏览器显示此内容)
- ol - 排序表单
- p - 段落
- pre - 格式化文本
- table - 表格
- ul - 非排序列表
可变元素
可变元素为根据上下文语境决定该元素为块元素或者内联元素。
- applet - java applet
- button - 按钮
- del - 删除文本
- iframe - inline frame
- ins - 插入的文本
- map - 图片区块(map)
- object - object对象
- script - 客户端脚本
2.16 CSS Position(定位)
2.16.1 定位类型
position 属性的五个值:
-
static HTML 元素的默认值,即没有定位,遵循正常的文档流对象。
静态定位的元素不会受到 top, bottom, left, right影响。
-
relative 相对定位元素的定位是相对其正常位置。
h2.pos_left
{
position:relative;
left:-20px;
}
h2.pos_right
{
position:relative;
left:20px;
}
-
fixed 元素的位置相对于浏览器窗口是固定位置。即使窗口是滚动的它也不会移动: Fixed 定位在 IE7 和 IE8 下需要描述 !DOCTYPE 才能支持。Fixed定位使元素的位置与文档流无关,因此不占据空间。Fixed定位的元素和其他元素重叠。
-
absolute 设置为绝对定位的元素框从文档流完全删除,并相对于其包含块定位,包含块可能是文档中的另一个元素或者是初始包含块。元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样。元素定位后生成一个块级框,而不论原来它在正常流中生成何种类型的框。
-
sticky 粘性定位 依赖于用户的滚动,在 position:relative 与 position:fixed 定位之间切换。
它的行为就像 position:relative; 而当页面滚动超出目标区域时,它的表现就像 position:fixed;,它会固定在目标位置。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./test.css">
</head>
<body>
<header>header</header>
<nav>
<ul>
<li>nav-item1</li>
<li>nav-item2</li>
<li>nav-item3</li>
<li>nav-item4</li>
<li>nav-item5</li>
</ul>
</nav>
<main>
main content
</main>
</body>
</html>
header {
border-bottom: 1px dashed #555;
text-align: center;
}
nav {
position: sticky;
top: 20px;
}
ul {
list-style: disc;
}
ul li {
display: inline-block;
background-color: antiquewhite;
}
main {
height: 800px;
background-color: aqua;
}
元素可以使用的顶部top,底部bottom,左侧left和右侧right属性定位。然而,这些属性无法工作,除非是先设定position属性。他们也有不同的工作方式,这取决于定位方法。
2.16.2 z-index
元素的定位与文档流无关,所以它们可以覆盖页面上的其它元素
z-index属性指定了一个元素的堆叠顺序(哪个元素应该放在前面,或后面)
一个元素可以有正数或负数的堆叠顺序
img {
position:absolute;
left:0px;
top:0px;
z-index:-1;
}
2.16.3 所有的CSS定位属性
bottom |
定义了定位元素下外边距 边界与其包含块下边界之间的偏移。 |
autolength % inherit |
2 |
clip |
剪辑一个绝对定位的元素 |
shape autoinherit |
2 |
cursor |
显示光标移动到指定的类型 |
url auto crosshair default pointer move e-resize ne-resize nw-resize n-resize se-resize sw-resize s-resize w-resize text wait help |
2 |
left |
定义了定位元素左外边距边界 与其包含块左边界之间的偏移。 |
auto length % inherit |
2 |
overflow |
设置当元素的内容溢出 其区域时发生的事情。 |
auto hidden scroll visible inherit |
2 |
overflow-y |
指定如何处理顶部/底部 边缘的内容溢出元素的内容区域 |
auto hidden scroll visible no-display no-content |
2 |
overflow-x |
指定如何处理右边/左边 边缘的内容溢出元素的内容区域 |
auto hidden scroll visible no-display no-content |
2 |
position |
指定元素的定位类型 |
absolute fixed relative static inherit |
2 |
right |
定义了定位元素右外边距边界 与其包含块右边界之间的偏移。 |
auto length % inherit |
2 |
top |
定义了一个定位元素的上外边距 边界与其包含块上边界之间的偏移。 |
auto length % inherit |
2 |
z-index |
设置元素的堆叠顺序 |
number auto inherit |
2 |
2.17 CSS Overflow
CSS overflow 属性用于控制内容溢出元素框时显示的方式。
overflow属性有以下值:
visible |
默认值。内容不会被修剪,会呈现在元素框之外。 |
hidden |
内容会被修剪,并且其余内容是不可见的。 |
scroll |
内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。 |
auto |
如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。 |
inherit |
规定应该从父元素继承 overflow 属性的值。 |
**注意:**overflow 属性只工作于指定高度的块元素上。
2.18 CSS Float(浮动)
浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。
由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。
float语法:
float : none | left |right
参数值:
none : 对象不浮动
left : 对象浮在左边
right : 对象浮在右边
一个例子
<div class="divcss5">
<div class="divcss5_left">布局靠左浮动</div>
<div class="divcss5_right">布局靠右浮动</div>
<div class="clear"></div><!-- html注释:清除float产生浮动 -->
</div>
.divcss5{ width:400px;padding:10px;border:1px solid #F00}
.divcss5_left{ float:left;width:150px;border:1px solid #00F;height:50px}
.divcss5_right{ float:right;width:150px;border:1px solid #00F;height:50px}
.clear{ clear:both}
2.18.1 清除浮动的方法(最常用的4种)
- 额外标签法(在最后一个浮动标签后,新加一个标签,给其设置clear:both;)(不推荐)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
.fahter{
width: 400px;
border: 1px solid deeppink;
}
.big{
width: 200px;
height: 200px;
background: darkorange;
float: left;
}
.small{
width: 120px;
height: 120px;
background: darkmagenta;
float: left;
}
.footer{
width: 900px;
height: 100px;
background: darkslateblue;
}
.clear{
clear:both;
}
</style>
</head>
<body>
<div class="fahter">
<div class="big">big</div>
<div class="small">small</div>
<div class="clear">额外标签法</div>
</div>
<div class="footer"></div>
</body>
</html>
优点:通俗易懂,方便
缺点:添加无意义标签,语义化差
不建议使用。
- 父级添加overflow属性(父元素添加overflow:hidden)(不推荐)
通过触发BFC方式,实现清除浮动
.fahter{
width: 400px;
border: 1px solid deeppink;
overflow: hidden;
}
优点:代码简洁
缺点:内容增多的时候容易造成不会自动换行导致内容被隐藏掉,无法显示要溢出的元素
不推荐使用
- 使用after伪元素清除浮动(推荐使用)
.clearfix:after{/*伪元素是行内元素 正常浏览器清除浮动方法*/
content: "";
display: block;
height: 0;
clear:both;
visibility: hidden;
}
.clearfix{
*zoom: 1;/*ie6清除浮动的方式 *号只有IE6-IE7执行,其他浏览器不执行*/
}
<body>
<div class="fahter clearfix">
<div class="big">big</div>
<div class="small">small</div>
<!--<div class="clear">额外标签法</div>-->
</div>
<div class="footer"></div>
</body>
优点:符合闭合浮动思想,结构语义化正确
缺点:ie6-7不支持伪元素:after,使用zoom:1触发hasLayout.
推荐使用
-
使用before和after双伪元素清除浮动
.clearfix:after,.clearfix:before{
content: "";
display: table;
}
.clearfix:after{
clear: both;
}
.clearfix{
*zoom: 1;
}
<div class="fahter clearfix">
<div class="big">big</div>
<div class="small">small</div>
</div>
<div class="footer"></div>
优点:代码更简洁
缺点:用zoom:1触发hasLayout.
推荐使用
2.19 CSS 居中
-
text-align:center方式
<div class="center">
<span class="center_text">
123
</span>
</div>
center{
text-align:center;
}
center_text{
display:inline-block;
width:500px
}
这种方式可以水平居中块级元素中的行内元素,如inline,inline-block;
但是如果用来居中块级元素中的块级元素时,如div中的div,一旦内层的div有自己的宽度,这种方法就会失效。只能让里面div的文字等内容居中,而div仍然是左对齐的。
-
margin:0 auto方式
<div class="center">
<span class="center_text">
我是块级元素,我是块级元素,我给自己设了display:block
</span>
</div>
center_text{
display:block;
width:500px;
margin:0 auto;
}
这种对齐方式要求内部元素(.content_text)是块级元素,并且不能脱离文档流(如设置position:absolute),否则无效。
-
脱离文档流的居中方式。
这种通常应用在自定义弹框当中,把背景层设置成透明灰色,内容居中显示在最前面。
<div class="mask">
<div class="content"><br> 我是要居中的板块
</div>
</div>
.mask{
display: block;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #000;
filter: alpha(opacity=30);
-ms-filter: "alpha(opacity=30)";
opacity: .3;
z-index: 10000;
}
.center{
display: block;
position: fixed;
_position: absolute;
top: 50%;
left: 50%;
width: 666px;
height:400px;
margin-left: -333px;
margin-top: -200px;
z-index: 10001;
box-shadow: 2px 2px 4px #A0A0A0, -2px -2px 4px #A0A0A0;
background-color: #fff;
}
这种居中方式,把内部div设置宽高之后,再设置top、left各为50%,设置完之后,这里是按照左端居中的,接着我们使用负边距的方式调整,将margin-top设置为负的高度的一半,margin-left设置为负的宽度的一半,就可以居中了。
这种方式还有一种居中方法就是设置margin:-(内部div高度的一半) auto;这用就不用设置left的值了。
-
display:table-cell
display:table-cell配合width,text-align:center,vertical-align:middle让大小不固定元素垂直居中,这个方式将要对其的元素设置成为一个td,
float、``absolute等属性都会影响它的实现,不响应margin属性;
<div>
<span>hello</span>
</div>
</body>
div {
display: table;
width: 300px;
height: 200px;
text-align: center;
background-color: aqua;
}
div span {
display: table-cell;
vertical-align: middle;
}
-
垂直居中
行内元素的垂直居中把height和line-height的值设置成一样的即可。
<div class="center">
<span class="center_text">
我是要居中的内容
</span>
</div>
center {
height:40px;
line-heigth: 40px;
}
-
使用css3的translate水平垂直居中元素
<div class="center">
<div class="center_text">
我是要居中的内容
</div>
</div>
.center {
position: relative;
height: 500px;
}
.center_text{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 300px;
height: 600px;
}
这种方式将脱离文档流的元素,设置top:50%,left:50%,然后使用transform来向左向上偏移半个内元素的宽和高。
-
使用css3计算的方式居中元素calc
<div class="center">
<div class="center_text">
我是要居中的内容
</div>
</div>
.center {
position: relative;
height: 300px;
width: 1000px;
border: 1px solid #ccc;
}
.center_text{
position: absolute;
top: calc(50% - 50px);
left: calc(50% - 150px);
width: 300px;
height: 100px;
border: 1px solid #000;
}
2.20 CSS 伪类
CSS伪类是用来添加一些选择器的特殊效果。
语法
selector:pseudo-class {property:value;}
CSS类也可以使用伪类:
selector.class:pseudo-class {property:value;}
2.20.1 anchor伪类
在支持 CSS 的浏览器中,链接的不同状态都可以以不同的方式显示
a:link {color:#FF0000;} /* 未访问的链接 */
a:visited {color:#00FF00;} /* 已访问的链接 */
a:hover {color:#FF00FF;} /* 鼠标划过链接 */
a:active {color:#0000FF;} /* 已选中的链接 */
注意: 在CSS定义中,a:hover 必须被置于 a:link 和 a:visited 之后,才是有效的。
注意: 在 CSS 定义中,a:active 必须被置于 a:hover 之后,才是有效的。
**注意:**伪类的名称不区分大小写。
2.20.2 伪类和CSS类
伪类可以与 CSS 类配合使用:
a.red:visited {color:#FF0000;}
<a class="red" href="css-syntax.html">CSS 语法</a>
2.20.3 CSS :first-child 伪类
您可以使用 :first-child 伪类来选择父元素的第一个子元素。
注意:在IE8的之前版本必须声明<!DOCTYPE> ,这样 :first-child 才能生效。
匹配第一个 <p> 元素
在下面的例子中,选择器匹配作为任何元素的第一个子元素的
元素:
p:first-child{
color:blue;
}
匹配所有 <p> 元素中的第一个 <i> 元素
在下面的例子中,选择相匹配的所有
元素的第一个 元素:
p > i:first-child {
color:blue;
}
匹配所有作为第一个子元素的 <p> 元素中的所有 <i> 元素
在下面的例子中,选择器匹配所有作为元素的第一个子元素的
元素中的所有 元素:
p:first-child i {
color:blue;
}
CSS - :lang 伪类
:lang 伪类使你有能力为不同的语言定义特殊的规则
注意:IE8必须声明 <!DOCTYPE>才能支持;lang伪类。
在下面的例子中,:lang 类为属性值为 no 的q元素定义引号的类型:
q:lang(no) {quotes: "~" "~";}
所有CSS伪类/元素
:checked |
input:checked |
选择所有选中的表单元素 |
:disabled |
input:disabled |
选择所有禁用的表单元素 |
:empty |
p:empty |
选择所有没有子元素的p元素 |
:enabled |
input:enabled |
选择所有启用的表单元素 |
:first-of-type |
p:first-of-type |
选择的每个 p 元素是其父元素的第一个 p 元素 |
:in-range |
input:in-range |
选择元素指定范围内的值 |
:invalid |
input:invalid |
选择所有无效的元素 |
:last-child |
p:last-child |
选择所有p元素的最后一个子元素 |
:last-of-type |
p:last-of-type |
选择每个p元素是其母元素的最后一个p元素 |
:not(selector) |
:not§ |
选择所有p以外的元素 |
:nth-child(n) |
p:nth-child(2) |
选择所有 p 元素的父元素的第二个子元素 |
:nth-last-child(n) |
p:nth-last-child(2) |
选择所有p元素倒数的第二个子元素 |
:nth-last-of-type(n) |
p:nth-last-of-type(2) |
选择所有p元素倒数的第二个为p的子元素 |
:nth-of-type(n) |
p:nth-of-type(2) |
选择所有p元素第二个为p的子元素 |
:only-of-type |
p:only-of-type |
选择所有仅有一个子元素为p的元素 |
:only-child |
p:only-child |
选择所有仅有一个子元素的p元素 |
:optional |
input:optional |
选择没有”required”的元素属性 |
:out-of-range |
input:out-of-range |
选择指定范围以外的值的元素属性 |
:read-only |
input:read-only |
选择只读属性的元素属性 |
:read-write |
input:read-write |
选择没有只读属性的元素属性 |
:required |
input:required |
选择有”required”属性指定的元素属性 |
:root |
root |
选择文档的根元素 |
:target |
#news:target |
选择当前活动#news元素(点击URL包含锚的名字) |
:valid |
input:valid |
选择所有有效值的属性 |
:link |
a:link |
选择所有未访问链接 |
:visited |
a:visited |
选择所有访问过的链接 |
:active |
a:active |
选择正在活动链接 |
:hover |
a:hover |
把鼠标放在链接上的状态 |
:focus |
input:focus |
选择元素输入后具有焦点 |
:first-letter |
p:first-letter |
选择每个元素的第一个字母 |
:first-line |
p:first-line |
选择每个元素的第一行 |
:first-child |
p:first-child |
选择器匹配属于任意元素的第一个子元素的元素 |
:before |
p:before |
在每个元素之前插入内容 |
:after |
p:after |
在每个元素之后插入内容 |
:lang(language) |
p:lang(it) |
为元素的lang属性选择一个开始值 |
2.21 CSS 伪元素
CSS伪元素是用来添加一些选择器的特殊效果。
伪元素的语法:
selector:pseudo-element {property:value;}
CSS类也可以使用伪元素:
selector.class:pseudo-element {property:value;}
:first-line 伪元素
“first-line” 伪元素用于向文本的首行设置特殊样式。
在下面的例子中,浏览器会根据 “first-line” 伪元素中的样式对 p 元素的第一行文本进行格式化:
p:first-line { color:#ff0000; font-variant:small-caps;}
注意:“first-line” 伪元素只能用于块级元素。
注意: 下面的属性可应用于 “first-line” 伪元素:
- font properties
- color properties
- background properties
- word-spacing
- letter-spacing
- text-decoration
- vertical-align
- text-transform
- line-height
- clear
:first-letter 伪元素
“first-letter” 伪元素用于向文本的首字母设置特殊样式:
p:first-letter { color:#ff0000; font-size:xx-large;}
注意: “first-letter” 伪元素只能用于块级元素。
注意: 下面的属性可应用于 “first-letter” 伪元素:
- font properties
- color properties
- background properties
- margin properties
- padding properties
- border properties
- text-decoration
- vertical-align (only if “float” is “none”)
- text-transform
- line-height
- float
- clear
伪元素和CSS类
伪元素可以结合CSS类:
p.article:first-letter {color:#ff0000;}<p class="article">文章段落</p>
上面的例子会使所有 class 为 article 的段落的首字母变为红色。
多个伪元素
可以结合多个伪元素来使用。
在下面的例子中,段落的第一个字母将显示为红色,其字体大小为 xx-large。第一行中的其余文本将为蓝色,并以小型大写字母显示。
段落中的其余文本将以默认字体大小和颜色来显示:
p:first-letter{
color:#ff0000;
font-size:xx-large;
}
p:first-line {
color:#0000ff;
font-variant:small-caps;
}
CSS - :before 伪元素
“:before” 伪元素可以在元素的内容前面插入新内容。
下面的例子在每个
元素前面插入一幅图片:
h1:before {
content:url(smiley.gif);
}
CSS - :after 伪元素
“:after” 伪元素可以在元素的内容之后插入新内容。
下面的例子在每个
元素后面插入一幅图片:
h1:after {
content:url(smiley.gif);
}
所有CSS伪类/元素
选择器 |
示例 |
示例说明 |
:link |
a:link |
选择所有未访问链接 |
:visited |
a:visited |
选择所有访问过的链接 |
:active |
a:active |
选择正在活动链接 |
:hover |
a:hover |
把鼠标放在链接上的状态 |
:focus |
input:focus |
选择元素输入后具有焦点 |
:first-letter |
p:first-letter |
选择每个元素的第一个字母 |
:first-line |
p:first-line |
选择每个元素的第一行 |
:first-child |
p:first-child |
选择器匹配属于任意元素的第一个子元素的 <]p> 元素 |
:before |
p:before |
在每个元素之前插入内容 |
:after |
p:after |
在每个元素之后插入内容 |
:lang(language) |
p:lang(it) |
为元素的lang属性选择一个开始值 |
2.22 CSS 导航栏
作为标准的HTML基础一个导航栏是必须的
。在我们的例子中我们将建立一个标准的HTML列表导航栏。
导航条基本上是一个链接列表,所以使用
<ul>
<li><a href="#home">主页</a></li>
<li><a href="#news">新闻</a></li>
<li><a href="#contact">联系</a></li>
<li><a href="#about">关于</a></li>
</ul>
现在,让我们从列表中删除边距和填充:
ul {
list-style-type: none;
margin: 0;
padding: 0;
}
例子解析:
- list-style-type:none - 移除列表前小标志。一个导航栏并不需要列表标记
- 移除浏览器的默认设置将边距和填充设置为0
上面的例子中的代码是垂直和水平导航栏使用的标准代码。
2.22.1 垂直导航栏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./test.css">
</head>
<body>
<ul class="vertical">
<li><a href="#">技术01</a></li>
<li><a href="#">技术02</a></li>
<li><a href="#">技术03</a></li>
<li><a href="#">技术04</a></li>
<li><a href="#">技术05</a></li>
<li><a href="#">技术06</a></li>
<li><a href="#">技术07</a></li>
<li><a href="#">技术08</a></li>
<li><a href="#">技术09</a></li>
<li><a href="#">技术10</a></li>
<li><a href="#">技术11</a></li>
<li><a href="#">技术12</a></li>
<li><a href="#">技术13</a></li>
<li><a href="#">技术14</a></li>
<li><a href="#">技术15</a></li>
<li><a href="#">技术16</a></li>
<li><a href="#">技术17</a></li>
<li><a href="#">技术18</a></li>
<li><a href="#">技术19</a></li>
<li><a href="#">技术20</a></li>
</ul>
</body>
</html>
* {
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
overflow: hidden;
}
ul.vertical {
list-style-type: none;
margin: 0;
padding: 0;
width: 25%;
height: 100%;
overflow: auto;
background-color: #f1f1f1;
}
ul.vertical li a {
display: block;
color: #000;
padding: 8px 16px;
text-decoration: none;
text-align: center;
}
ul.vertical li {
border-bottom: 1px solid #555;
}
ul.vertical li:last-child {
border-bottom: none;
}
ul.vertical li a:hover {
background-color: #555;
color: #fff;
}
.active {
background-color: #4CAF50;
}
2.22.2 水平导航栏
有两种方法创建横向导航栏。使用**内联(inline)或浮动(float)**的列表项。
这两种方法都很好,但如果你想导航链接具有相同的大小,你必须使用浮动的方法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
html,
body {
height: 100%;
overflow: auto;
}
ul {
list-style-type: none;
margin: 0;
padding: 0;
background-color: #333;
overflow: hidden;
width: 100%;
position: fixed;
top: 0;
}
ul li {
float: left;
border-right: 1px solid #bbb;
}
ul li:last-child {
border-right: none;
}
ul li a {
display: block;
height: 60px;
box-sizing: border-box;
padding: 0 16px;
line-height: 60px;
color: white;
text-decoration: none;
}
.content {
height: 2000px;
background-color: #bbb;
margin-top: 60px;
}
.active {
background-color: #4caf54;
}
</style>
</head>
<body>
<ul>
<li><a href="#">导航项01</a></li>
<li><a href="#">导航项02</a></li>
<li><a href="#">导航项03</a></li>
<li><a href="#">导航项04</a></li>
<li style="float: right;"><a class="active" href="#">导航项05</a></li>
</ul>
<div class="content">
content
</div>
</body>
</html>
2.23 CSS 下拉菜单
使用 CSS 创建一个鼠标移动上去后显示下拉菜单的效果。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.dropdown {
position: relative;
display: inline-block;
}
.dropdown .dropdown-content {
visibility: collapse;
position: absolute;
background-color: #f9f9f9;
width: 100%;
box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, .2);
text-align: center;
z-index: 1;
}
.dropdown:hover .dropdown-content {
visibility: visible;
}
.dropdown .dropdown-content ul {
list-style-type: none;
padding: 0;
margin: 0;
}
.dropdown .dropdown-content ul li {
cursor: pointer;
}
.dropdown .dropdown-content ul li:hover {
color: blue;
text-decoration: underline;
}
</style>
<script>
document.addEventListener('DOMContentLoaded', () => {
var lis = document.getElementsByTagName('li')
for (const li of lis) {
li.addEventListener('click', () => {
alert(li.textContent)
})
}
})
</script>
</head>
<body>
<div class="dropdown">
<button>悬浮我</button>
<div class="dropdown-content">
<ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
</ul>
</div>
</div>
</body>
</html>
2.24 CSS 提示工具(Tooltip)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
padding: 60px;
}
div {
margin: 20px;
}
/* Tooltip 容器 */
.tooltip {
position: relative;
display: inline-block;
border-bottom: 1px dotted black; /* 悬停元素上显示点线 */
}
/* Tooltip 文本 */
.tooltip .tooltiptext {
visibility: hidden;
width: 120px;
background-color: black;
color: #fff;
text-align: center;
padding: 5px 0;
border-radius: 6px;
/* 定位 */
position: absolute;
z-index: 1;
}
/* 鼠标移动上去后显示提示框 */
.tooltip:hover .tooltiptext {
visibility: visible;
}
.tooltip.right .tooltiptext {
top: -5px;
left: 105%;
}
.tooltip.left .tooltiptext {
top: -5px;
right: 105%;
}
.tooltip.top .tooltiptext {
width: 120px;
bottom: 100%;
left: 50%;
margin-left: -60px; /* 使用一半宽度 (120/2 = 60) 来居中提示工具 */
}
.tooltip.bottom .tooltiptext {
width: 120px;
top: 100%;
left: 50%;
margin-left: -60px; /* 使用一半宽度 (120/2 = 60) 来居中提示工具 */
}
/* 顶部提示框/底部箭头 */
.tooltip.top .tooltiptext::after {
content: " ";
position: absolute;
top: 100%; /* 提示工具底部 */
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: black transparent transparent transparent;
}
/* 底部提示框/顶部箭头 */
.tooltip.bottom .tooltiptext::after {
content: " ";
position: absolute;
bottom: 100%; /* 提示工具头部 */
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent black transparent;
}
/* 右侧提示框/左侧箭头 */
.tooltip.right .tooltiptext::after {
content: " ";
position: absolute;
right: 100%;
top: 50%;
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent black transparent transparent;
}
/* 左侧提示框/右侧箭头 */
.tooltip.left .tooltiptext::after {
content: " ";
position: absolute;
top: 50%;
left: 100%; /* 提示工具右侧 */
margin-top: -5px;
border-width: 5px;
border-style: solid;
border-color: transparent transparent transparent black;
}
.tooltip .tooltiptext {
opacity: 0;
transition: opacity 1s;
}
.tooltip:hover .tooltiptext {
opacity: 1;
}
</style>
</head>
<body>
<div class="tooltip top">顶部提示框
<span class="tooltiptext">提示文本</span>
</div>
<div class="tooltip bottom">底部提示框
<span class="tooltiptext">提示文本</span>
</div>
<div class="tooltip right">右侧提示框
<span class="tooltiptext">提示文本</span>
</div>
<div class="tooltip left">左侧提示框
<span class="tooltiptext">提示文本</span>
</div>
</body>
</html>
2.25 CSS 图像透明/不透明
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
img {
opacity: 0.5;
filter: alpha(opacity=50); /*for ie8 and earlier*/
border-radius: 5px;
transition: ease opacity 1s;
}
img:hover {
opacity: 1;
filter: alpha(opacity=100); /*for ie8 and earlier*/
}
</style>
</head>
<body>
<figure>
<figcaption>
<h1>带有透明效果的图片</h1>
</figcaption>
<img src="https://dss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3252521864,872614242&fm=26&gp=0.jpg" alt="">
</figure>
</body>
</html>
2.26 CSS 精灵图/雪碧图
精灵图/雪碧图就是图像拼合也就是单个图像的集合。有许多图像的网页可能需要很长的时间来加载和生成多个服务器的请求。使用图像拼合会降低服务器的请求数量,并节省带宽。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#navlist {
position: relative;
}
#navlist li {
margin: 0;
padding: 0;
list-style: none;
display: inline-block;
height: 44px;
line-height: 44px;
text-align: center;
cursor: pointer;
}
#navlist a {
height: 44px;
width: 46px;
display: block;
}
ul > li:nth-child(1) {
background: url('./img_navsprites.gif') 0 0;
}
ul > li:nth-child(1):hover {
background: url('img_navsprites_hover.gif') 0 -45px;
}
ul > li:nth-child(2) {
background:url('img_navsprites.gif') -47px 0;
}
</style>
</head>
<body>
<nav id="navlist">
<ul>
<li>
<a>1</a>
</li>
<li>
<a>2</a>
</li>
<li>
<a>3</a>
</li>
<li>
<a>4</a>
</li>
</ul>
</nav>
</body>
</html>
2.27 CSS 媒体类型@media 规则
在下面的例子告诉我们浏览器屏幕上显示一个 14 像素的 Verdana 字体样式。但是如果页面打印,将是 10 个像素的 Times 字体。请注意,font-weight 在屏幕上和纸上设置为粗体:
@media screen
{
p.test {font-family:verdana,sans-serif;font-size:14px;}
}
@media print
{
p.test {font-family:times,serif;font-size:10px;}
}
@media screen,print
{
p.test {font-weight:bold;}
}
其他媒体类型
all |
用于所有的媒体设备。 |
aural |
用于语音和音频合成器。 |
braille |
用于盲人用点字法触觉回馈设备。 |
embossed |
用于分页的盲人用点字法打印机。 |
handheld |
用于小的手持的设备。 |
print |
用于打印机。 |
projection |
用于方案展示,比如幻灯片。 |
screen |
用于电脑显示器。 |
tty |
用于使用固定密度字母栅格的媒体,比如电传打字机和终端。 |
tv |
用于电视机类型的设备。 |
三. CSS3新增特性总结
1.CSS3简介
CSS3是CSS(层叠样式表)技术的升级版本,于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案,主要包括盒子模型、列表模块、超链接方式、语言模块、背景和边框、文字特效、多栏布局等模块
2.过渡
过渡,是我在项目里面用得最多的一个特性了!也相信是很多人用得最多的一个例子!我平常使用就是想让一些交互效果(主要是hover动画),变得生动一些,不会显得那么生硬!好了,下面进入正文!
引用菜鸟教程的说法:CSS3 过渡是元素从一种样式逐渐改变为另一种的效果。要实现这一点,必须规定两项内容:指定要添加效果的CSS属性指定效果的持续时间。
2-1语法
transition: CSS属性,花费时间,效果曲线(默认ease),延迟时间(默认0)复制代码
栗子1
/*宽度从原始值到制定值的一个过渡,运动曲线ease,运动时间0.5秒,0.2秒后执行过渡*/
transition:width,.5s,ease,.2s复制代码
栗子2
/*所有属性从原始值到制定值的一个过渡,运动曲线ease,运动时间0.5秒*/
transition:all,.5s
复制代码
上面栗子是简写模式,也可以分开写各个属性(这个在下面就不再重复了)
transition-property: width;
transition-duration: 1s;
transition-timing-function: linear;
transition-delay: 2s;
复制代码
实例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 文本颜色过渡 */
p {
transition-property: color;
transition-delay: 0ms;
transition-timing-function: cubic-bezier(0.075, 0.82, 0.165, 1);
transition-duration: 1s;
}
p:hover {
color: aqua;
}
</style>
<style>
/* 导航栏下拉菜单过滤 */
ul {
list-style: none;
margin: 0;
padding: 0;
}
.demo-ui > li {
float: left;
background-color: antiquewhite;
text-align: center;
position: relative;
cursor: pointer;
min-width: 120px;
}
.demo-ui > li:hover >ul {
transform: scaleY(1);
}
.demo-ui > li > ul {
position: absolute;
transition: all .5s;
transform-origin: 0 0;
transform: scaleY(0);
}
.demo-ui > li > ul > li {
display: block;
padding: 12px 16px;
background-color: #fff;
border-color: #000;
border-width: 1px;
border-style: dashed;
}
</style>
</head>
<body>
<section>
<h1>文本颜色过渡效果</h1>
<p>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Et dignissimos tempore fugiat natus ipsa
voluptatibus, repellendus similique. Quisquam iste, ut animi recusandae illum vero fugiat molestiae
voluptatem magnam culpa tenetur.Deserunt, dolorum. Facere non et consectetur modi maiores, mollitia,
molestias excepturi architecto tenetur laborum quae obcaecati? Placeat ratione, ipsa possimus voluptatum
quam sed maiores exercitationem, eius fugit sit sint voluptatem.
</p>
</section>
<section>
<h1>下拉菜单过渡效果</h1>
<ul class="demo-ui">
<li>
nav1
<ul>
<li>child-nav1</li>
<li>child-nav2</li>
<li>child-nav3</li>
</ul>
</li>
<li>
nav2
<ul>
<li>child-nav1</li>
<li>child-nav2</li>
<li>child-nav3</li>
</ul>
</li>
<li>
nav3
<ul>
<li>child-nav1</li>
<li>child-nav2</li>
<li>child-nav3</li>
</ul>
</li>
</ul>
</section>
</body>
</html>
3.动画
动画这个平常用的也很多,主要是做一个预设的动画。和一些页面交互的动画效果,结果和过渡应该一样,让页面不会那么生硬!
3-1.语法
animation:动画名称,一个周期花费时间,运动曲线(默认ease),动画延迟(默认0),播放次数(默认1),是否反向播放动画(默认normal),是否暂停动画(默认running)复制代码
栗子1
/*执行一次logo2-line动画,运动时间2秒,运动曲线为 linear*/
animation: logo2-line 2s linear;复制代码
栗子2
/*2秒后开始执行一次logo2-line动画,运动时间2秒,运动曲线为 linear*/
animation: logo2-line 2s linear 2s;复制代码
栗子3
/*无限执行logo2-line动画,每次运动时间2秒,运动曲线为 linear,并且执行反向动画*/
animation: logo2-line 2s linear alternate infinite;复制代码
还有一个重要属性
animation-fill-mode : none | forwards | backwards | both;
/*none:不改变默认行为。
forwards :当动画完成后,保持最后一个属性值(在最后一个关键帧中定义)。
backwards:在 animation-delay 所指定的一段时间内,在动画显示之前,应用开始属性值(在第一个关键帧中定义)。
both:向前和向后填充模式都被应用。 */ 复制代码
3-2.logo展示动画
这个是我用公司logo写的动画,没那么精细
代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="reset.css">
</head>
<style>
.logo-box{
width: 600px;
margin: 100px auto;
font-size: 0;
position: relative;
}
.logo-box div{
display: inline-block;
}
.logo-box .logo-text{
margin-left: 10px;
}
.logo-box .logo1{
animation: logo1 1s ease-in 2s;
animation-fill-mode:backwards;
}
.logo-box .logo-text{
animation: logoText 1s ease-in 3s;
animation-fill-mode:backwards;
}
.logo-box .logo2{
position: absolute;
top: 20px;
left: 20px;
animation: logo2-middle 2s ease-in;
}
.logo-box .logo2 img{
animation: logo2-line 2s linear;
}
@keyframes logo1 {
0%{
transform:rotate(180deg);
opacity: 0;
}
100%{
transform:rotate(0deg);
opacity: 1;
}
}
@keyframes logoText {
0%{
transform:translateX(30px);
opacity: 0;
}
100%{
transform:translateX(0);
opacity: 1;
}
}
@keyframes logo2-line {
0% { transform: translateX(200px)}
25% { transform: translateX(150px)}
50% { transform: translateX(100px)}
75% { transform: translateX(50px)}
100% { transform: translateX(0); }
}
@keyframes logo2-middle {
0% { transform: translateY(0); }
25% { transform: translateY(-100px); }
50% { transform: translateY(0); }
75% { transform: translateY(-50px); }
100% { transform: translateY(0); }
}
</style>
<body>
<div class="logo-box">
<div class="logo1"><img src="logo1.jpg"/></div>
<div class="logo2"><img src="logo2.jpg"/></div>
<div class="logo-text"><img src="logo3.jpg"/></div>
</div>
<div class="wraper"><div class="item"></div></div>
</body>
</html>
下面让大家看一个专业级别的
代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<style>
body {
font-family: Arial,"Helvetica Neue",Helvetica,sans-serif;
overflow: hidden;
background: #fff;
}
.center {
margin: 80px auto;
}
.so {
display: block;
width: 500px;
height: 156px;
background: #ffffff;
}
.so .inner {
width: 500px;
height: 156px;
position: absolute;
}
.so .inner * {
position: absolute;
animation-iteration-count: infinite;
animation-duration: 3.5s;
}
.so .inner .name {
position: absolute;
font-size: 54px;
left: 130px;
top: 95px;
}
.so .inner .name .b {
font-weight: bold;
}
.so .inner .stack-box {
top: 100px;
width: 115px;
height: 56px;
}
.so .inner .box {
width: 115px;
height: 56px;
left: 0px;
}
.so .inner .box div {
background: #BCBBBB;
}
.so .inner .box .bottom {
bottom: 0px;
left: 0px;
width: 115px;
height: 12px;
}
.so .inner .box .left {
bottom: 11px;
left: 0px;
width: 12px;
height: 34px;
}
.so .inner .box .right {
bottom: 11px;
left: 103px;
width: 12px;
height: 34px;
}
.so .inner .box .top {
top: 0px;
left: 0px;
width: 0;
height: 12px;
}
.so .inner .stack {
left: 22px;
top: 22px;
}
.so .inner .stack .inner-item {
background: #F48024;
width: 71px;
height: 12px;
}
.so .inner .stack .item {
transition: transform 0.3s;
width: 291px;
}
.so .inner .stack div:nth-child(1) {
transform: rotate(0deg);
}
.so .inner .stack div:nth-child(2) {
transform: rotate(12deg);
}
.so .inner .stack div:nth-child(3) {
transform: rotate(24deg);
}
.so .inner .stack div:nth-child(4) {
transform: rotate(36deg);
}
.so .inner .stack div:nth-child(5) {
transform: rotate(48deg);
}
.so .inner .box {
animation-name: box;
}
.so .inner .box .top {
animation-name: box-top;
}
.so .inner .box .left {
animation-name: box-left;
}
.so .inner .box .right {
animation-name: box-right;
}
.so .inner .box .bottom {
animation-name: box-bottom;
}
.so .inner .stack-box {
animation-name: stack-box;
}
.so .inner .stack {
animation-name: stack;
}
.so .inner .stack .inner-item {
animation-name: stack-items;
}
.so .inner .stack .item:nth-child(1) {
animation-name: stack-item-1;
}
.so .inner .stack .item:nth-child(2) {
animation-name: stack-item-2;
}
.so .inner .stack .item:nth-child(3) {
animation-name: stack-item-3;
}
.so .inner .stack .item:nth-child(4) {
animation-name: stack-item-4;
}
.so .inner .stack .item:nth-child(5) {
animation-name: stack-item-5;
}
@keyframes stack {
0% {
left: 22px;
}
15% {
left: 22px;
}
30% {
left: 52px;
}
50% {
left: 52px;
}
80% {
left: 22px;
}
}
@keyframes stack-item-1 {
0% {
transform: rotate(12deg * 0);
}
10% {
transform: rotate(0deg);
}
50% {
transform: rotate(0deg);
}
54% {
transform: rotate(0deg);
}
92% {
transform: rotate(12deg * 0);
}
}
@keyframes stack-item-2 {
0% {
transform: rotate(12deg * 1);
}
10% {
transform: rotate(0deg);
}
50% {
transform: rotate(0deg);
}
54% {
transform: rotate(0deg);
}
92% {
transform: rotate(12deg * 1);
}
}
@keyframes stack-item-3 {
0% {
transform: rotate(12deg * 2);
}
10% {
transform: rotate(0deg);
}
50% {
transform: rotate(0deg);
}
54% {
transform: rotate(0deg);
}
92% {
transform: rotate(12deg * 2);
}
}
@keyframes stack-item-4 {
0% {
transform: rotate(12deg * 3);
}
10% {
transform: rotate(0deg);
}
50% {
transform: rotate(0deg);
}
54% {
transform: rotate(0deg);
}
92% {
transform: rotate(12deg * 3);
}
}
@keyframes stack-item-5 {
0% {
transform: rotate(12deg * 4);
}
10% {
transform: rotate(0deg);
}
50% {
transform: rotate(0deg);
}
54% {
transform: rotate(0deg);
}
92% {
transform: rotate(12deg * 4);
}
}
@keyframes stack-items {
0% {
width: 71px;
}
15% {
width: 71px;
}
30% {
width: 12px;
}
50% {
width: 12px;
}
80% {
width: 71px;
}
}
@keyframes box {
0% {
left: 0;
}
15% {
left: 0;
}
30% {
left: 30px;
}
50% {
left: 30px;
}
80% {
left: 0;
}
}
@keyframes box-top {
0% {
width: 0;
}
6% {
width: 0;
}
15% {
width: 115px;
}
30% {
width: 56px;
}
50% {
width: 56px;
}
59% {
width: 0;
}
}
@keyframes box-bottom {
0% {
width: 115px;
}
15% {
width: 115px;
}
30% {
width: 56px;
}
50% {
width: 56px;
}
80% {
width: 115px;
}
}
@keyframes box-right {
15% {
left: 103px;
}
30% {
left: 44px;
}
50% {
left: 44px;
}
80% {
left: 103px;
}
}
@keyframes stack-box {
0% {
transform: rotate(0deg);
}
30% {
transform: rotate(0deg);
}
40% {
transform: rotate(135deg);
}
50% {
transform: rotate(135deg);
}
83% {
transform: rotate(360deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
<body>
<div class="so center">
<div class="inner">
<div class="stack-box">
<div class="stack">
<div class="item">
<div class="inner-item"></div>
</div>
<div class="item">
<div class="inner-item"></div>
</div>
<div class="item">
<div class="inner-item"></div>
</div>
<div class="item">
<div class="inner-item"></div>
</div>
<div class="item">
<div class="inner-item"></div>
</div>
</div>
<div class="box">
<div class="bottom"></div>
<div class="left"></div>
<div class="right"></div>
<div class="top"></div>
</div>
</div>
<div class="name">
stack<span class="b">overflow</span>
</div>
</div>
</div>
</body>
</html>
3-3.loading效果
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.loading-box {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
overflow: hidden;
background-color: #ddd;
}
.loading-box .loading-dot {
height: 12px;
width: 12px;
opacity: 0;
border-radius: 50%;
background: #666;
background-color: #4b9cdb;
display: inline-block;
margin: 0 10px;
animation-name: loading;
animation-duration: 4s;
animation-iteration-count: infinite;
animation-timing-function: ease;
transform: translateX(-300px);
}
.loading-box .loading-dot:nth-child(1) {
animation-delay: .8s;
}
.loading-box .loading-dot:nth-child(2) {
animation-delay: .7s;
}
.loading-box .loading-dot:nth-child(3) {
animation-delay: .6s;
}
.loading-box .loading-dot:nth-child(4) {
animation-delay: .5s;
}
.loading-box .loading-dot:nth-child(5) {
animation-delay: .4s;
}
.loading-box .loading-dot:nth-child(6) {
animation-delay: .3s;
}
.loading-box .loading-dot:nth-child(7) {
animation-delay: .2s;
}
.loading-box .loading-dot:nth-child(8) {
animation-delay: .1s;
}
@keyframes loading {
40% {
transform: translateX(0);
opacity: .8;
}
100% {
transform: translateX(300px);
opacity: 0;
}
}
</style>
</head>
<body>
<div class="loading-box">
<div class="loading-dot"></div>
<div class="loading-dot"></div>
<div class="loading-dot"></div>
<div class="loading-dot"></div>
<div class="loading-dot"></div>
<div class="loading-dot"></div>
<div class="loading-dot"></div>
<div class="loading-dot"></div>
</div>
</body>
</html>
css3-loading
3-4.音乐震动条
代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>纯CSS3模拟跳动的音符效果</title>
<style>
*{margin:0;padding:0;list-style: none;}
body{background-color: #efefef;}
.demo-music {
position: absolute;
width: 100%;
height: 200px;
top: 120px;
zoom: 1.5;
}
.demo-music .music {
width: 80px;
height: 50px;
top: 50%;
left: 50%;
-webkit-transform: translate(-40px, -25px);
transform: translate(-40px, -25px);
position: absolute;
}
.demo-music #waves {
width: 80px;
height: 50px;
position: absolute;
top: 12px;
left: 12px;
}
.demo-music #waves li {
position: relative;
float: left;
height: 100%;
width: 12%;
overflow: hidden;
margin-right: 1px;
}
.demo-music #waves li span {
position: absolute;
bottom: 0;
display: block;
height: 100%;
width: 100px;
background: #09f;
}
.demo-music #waves .li1 span {
animation: waves 0.8s linear 0s infinite alternate;
-webkit-animation: waves 0.8s linear 0s infinite alternate;
}
.demo-music #waves .li2 span {
animation: waves 0.9s linear 0s infinite alternate;
-webkit-animation: waves 0.9s linear 0s infinite alternate;
}
.demo-music #waves .li3 span {
animation: waves 1s linear 0s infinite alternate;
-webkit-animation: waves 1s linear 0s infinite alternate;
}
.demo-music #waves .li4 span {
animation: waves 0.8s linear 0s infinite alternate;
-webkit-animation: waves 0.8s linear 0s infinite alternate;
}
.demo-music #waves .li5 span {
animation: waves 0.7s linear 0s infinite alternate;
-webkit-animation: waves 0.7s linear 0s infinite alternate;
}
.demo-music #waves .li6 span {
animation: waves 0.8s linear 0s infinite alternate;
-webkit-animation: waves 0.8s linear 0s infinite alternate;
}
@-webkit-keyframes waves {
10% {
height: 20%;
}
20% {
height: 60%;
}
40% {
height: 40%;
}
50% {
height: 100%;
}
100% {
height: 50%;
}
}
@keyframes waves {
10% {
height: 20%;
}
20% {
height: 60%;
}
40% {
height: 40%;
}
50% {
height: 100%;
}
100% {
height: 50%;
}
}
</style>
</head>
<body>
<div class="demo-music">
<div class="music">
<ul id="waves" class="movement">
<li class="li1"><span class="ani-li"></span></li>
<li class="li2"><span class="ani-li"></span></li>
<li class="li3"><span class="ani-li"></span></li>
<li class="li4"><span class="ani-li"></span></li>
<li class="li5"><span class="ani-li"></span></li>
<li class="li6"><span class="ani-li"></span></li>
</ul>
<div class="music-state"></div>
</div>
</div>
</body>
</html>
4.形状转换
这一部分,分2d转换和3d转换。
rotate判断:
正向轴对着眼睛,顺时针则旋转角度为正,逆时针则旋转角度为负。
或者用左手法则也行:伸出左手,大拇指指向正轴方向,四个手指的指向即是旋转正向,但务必记住是左手!
注:rotate后三维坐标轴也会跟着改变
旋转的动画效果
http://www.100sucai.com/demos.php?id=1551760986
4-1.语法
transform:适用于2D或3D转换的元素
transform-origin:转换元素的位置(围绕那个点进行转换)。默认(x,y,z):(50%,50%,0)
4-2.实例
transform:rotate(30deg); 旋转30弧度
transform:translate(30px,30px); 平移x: 30px ,y: 30px
transform:scale(.8); 缩放0.8倍
transform: skew(10deg,10deg); 倾斜x轴方向: 10弧度, y方向10弧度
transform:rotateX(180deg); 沿x方向旋转180弧度
transform:rotateY(180deg); 沿y轴方向旋转180弧度
transform:rotate3d(10,10,10,90deg); 使元素在这三个纬度中移动,也可以分开写,如:translateX(length),translateY(length), translateZ(length)。注意z轴的值只能为px
画一个立方体
<!DOCTYPE html>
<html>
<head>
<style>
.main{
height: 500px;
width: 500px;
position: absolute;
left: 50%;
top: 50%;
border:0px solid black;
transform: translate(-50%,-50%) rotateX(45deg) rotateY(45deg);
transform-style: preserve-3d;
}
.main div{
position: absolute;
left: 50%;
top: 50%;
height: 250px;
width: 250px;
display: flex;
justify-content: center;
align-items: center;
font-size: 60px;
font-weight: bold;
}
.main:hover{
transform: translate(-50%,-50%) rotateX(145deg) rotateY(45deg) rotateZ(105deg);
transition: all 5s;
}
.face1{
background-color: pink;
transform:translate(-50%,-50%) translateY(-125px) rotateX(90deg);
}
.face2{
background-color: red;
transform:translate(-50%,-50%) translateX(-125px) rotateY(90deg);
}
.face3{
background-color: blue;
transform:translate(-50%,-50%) translateZ(-125px);
}
.face4{
background-color: yellow;
transform:translate(-50%,-50%) translateY(125px) rotateX(90deg);
}
.face5{
background-color: green;
transform:translate(-50%,-50%) translateX(125px) rotateY(90deg);
}
.face6{
background-color: orange;
transform:translate(-50%,-50%) translateZ(125px);
}
</style>
</head>
<body>
<div class="main">
<div class="face1">1</div>
<div class="face2">2</div>
<div class="face3">3</div>
<div class="face4">4</div>
<div class="face5">5</div>
<div class="face6">6</div>
</div>
</body>
</html>
上述效果更复杂的例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#ul {
width: 200px;
height: 200px;
margin: 100px auto;
position: relative;
transform-style: preserve-3d;
-webkit-
}
#ul li {
width: 200px;
height: 200px;
position: absolute;
text-align: center;
line-height: 200px;
font-size: 80px;
font-weight: bold;
color: #fff;
}
li:nth-child(1) {
background: rgba(255, 0, 0, 1);
-webkit-transform: rotateX(90deg) translateZ(100px);
}
li:nth-child(2) {
background: rgba(0, 255, 255, 1);
-webkit-transform: rotateX(270deg) translateZ(100px);
}
li:nth-child(3) {
background: rgba(255, 0, 255, 1);
-webkit-transform: rotateY(90deg) translateZ(100px);
}
li:nth-child(4) {
background: rgba(0, 255, 0, 1);
-webkit-transform: rotateY(270deg) translateZ(100px);
}
li:nth-child(5) {
background: rgba(200, 200, 0, 1);
-webkit-transform: translateZ(-100px);
}
li:nth-child(6) {
background: rgba(0, 0, 255, 1);
-webkit-transform: translateZ(100px);
}
.button {
width: 200px;
margin: 20px auto;
position: relative;
}
input {
width: 50px;
height: 30px;
position: absolute;
cursor: pointer;
}
input:nth-child(1) {
left: 100px;
top: 0;
}
input:nth-child(2) {
left: 200px;
top: 50px;
}
input:nth-child(3) {
left: 0px;
top: 50px;
}
input:nth-child(4) {
left: 100px;
top: 100px;
}
input:nth-child(5) {
left: 100px;
top: 50px;
}
@keyframes run {
0% {
-webkit-transform: rotateX(0deg) rotateY(0deg);
}
100% {
-webkit-transform: rotateX(360deg) rotateY(360deg);
}
}
</style>
</head>
<body>
<ul id="ul">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
</ul>
<div class="button">
<input type="button" value="上">
<input type="button" value="右">
<input type="button" value="左">
<input type="button" value="下">
<input type="button" value="重置">
</div>
<script>
var ul = document.getElementById('ul');
var inputs = document.getElementsByTagName('input');
var x = 0, y = 0;
function run() {
ul.style.webkitTransition = '-webkit-transform 3s linear';
if (inputs[0] == this) {
x += 90;
}
if (inputs[1] == this) {
y += 90;
}
if (inputs[2] == this) {
y -= 90;
}
if (inputs[3] == this) {
x -= 90;
}
if (inputs[4] == this) {
x = 0;
y = 0;
ul.style.webkitTransition = '-webkit-transform 0.1s linear';
}
ul.style.webkitTransform = "rotateX(" + x + "deg) rotateY(" + y + "deg)"; //变换效果(沿X轴和Y轴旋转)
}
for (var i = 0; i < inputs.length; i++) {
inputs[i].onclick = run;
}
document.addEventListener('keydown', function (e) {
ul.style.webkitTransition = '-webkit-transform 3s linear';
switch (e.keyCode) {
case 37: y -= 90; //左箭头
break;
case 38: x += 90; //上箭头
break;
case 39: y += 90; //下箭头
break;
case 40: x -= 90; //右箭头
break;
case 13: x = 0; y = 0; //回车 (当回车时,迅速转回初始状态)
ul.style.webkitTransition = '-webkit-transform 0.1s linear';
break;
}
ul.style.webkitTransform = "rotateX(" + x + "deg) rotateY(" + y + "deg)"; //变换效果(沿X轴和Y轴旋转)
}, false);
</script>
</body>
</html>
4.3 三维透视距离perspective属性
perspective 属性定义 3D 元素距视图的距离,以像素计。该属性允许您改变 3D 元素查看 3D 元素的视图。
当为元素定义 perspective 属性时,其子元素会获得透视效果,而不是元素本身。
perspective CSS属性确定了z=0平面与用户之间的距离,以便为3d定位的元素提供一些透视图。每个带有z>0的三维元素变得更大;每个z<0的3d元素变得更小。效果的强度由该属性的值决定。
**注释:**perspective 属性只影响 3D 转换元素。
**提示:**请与 perspective-origin 属性一同使用该属性,这样您就能够改变 3D 元素的底部位置。
perspective: number|none;
值 |
描述 |
number |
元素距离视图的距离,以像素计。 |
none |
默认值。与 0 相同。不设置透视。 |
5.选择器
css3提供的选择器可以让我们的开发,更加方便!
参见1.3节或者https://www.w3school.com.cn/cssref/css_selectors.asp
6.阴影
以前没有css3的时候,或者需要兼容低版本浏览器的时候,阴影只能用图片实现,但是现在不需要,css3就提供了!
6-1.语法
box-shadow: 水平阴影的位置 垂直阴影的位置 模糊距离 阴影的大小 阴影的颜色 阴影开始方向(默认是从里往外,设置inset就是从外往里);
6-1.栗子
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
div
{
width:300px;
height:100px;
background:#09f;
box-shadow: 10px 10px 5px #888888;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
7.边框
7-1.边框图片
7-1-1.语法
border-image 属性是一个简写属性,用于设置以下属性:
- border-image-source
- border-image-slice
- border-image-width
- border-image-outset
- border-image-repeat
border-image-source |
用在边框的图片的路径。 |
|
border-image-slice |
图片边框向内偏移。 |
|
border-image-width |
图片边框的宽度。 |
|
border-image-outset |
边框图像区域超出边框的量。 |
|
border-image-repeat |
图像边框是否应平铺(repeated)、铺满(rounded)或拉伸(stretched)。 |
|
/* source | slice */
border-image: linear-gradient(red, blue) 27;
/* source | slice | repeat */
border-image: url("/images/border.png") 27 space;
/* source | slice | width */
border-image: linear-gradient(red, blue) 27 / 35px;
/* source | slice | width | outset | repeat */
border-image: url("/images/border.png") 27 23 / 50px 30px / 1rem round space;
7-1-2.栗子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
width: 200px;
height: 200px;
border: 15px solid transparent;
border-image: url(https://www.runoob.com/images/border.png) 27 round;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
7-2.边框圆角
7-2-1.语法
border-radius: n1,n2,n3,n4;
border-radius: n1,n2,n3,n4/n1,n2,n3,n4;
/*n1-n4四个值的顺序是:左上角,右上角,右下角,左下角。*/
复制代码
7-2-2.栗子
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
div
{
border:2px solid #a1a1a1;
padding:10px 40px;
background:#dddddd;
text-align:center;
width:300px;
border-radius:25px 0 25px 0;
}
</style>
</head>
<body>
<div>border-radius</div>
</body>
</html>
8.背景
这一块主要讲css3提供背景的三个属性
background-clip
background-clip CSS属性设置元素的背景是否扩展到其边框框、填充框或内容框之下。
border-box
背景延伸到边界的外部边缘(但在z顺序中是在边界下面)。
padding-box
背景延伸到填充的外部边缘。边界下面没有背景。
Content-box
背景是在内容框内绘制的。
text
背景是在前景文本中绘制的。
background-origin
background-origin CSS属性设置背景的原点:从边框开始,在边框内,或在填充内
border-box
背景位置相对于边框框。
padding-box
背景位置相对于填充框。
content-box
背景位置相对于内容框。
background-size
background-size CSS属性设置元素背景图像的大小。图像可以保留其自然大小、拉伸或约束以适应可用空间。
contain
在不裁剪或拉伸图像的情况下,使图像尽可能大。
cover
在不拉伸图像的情况下,将图像缩放到尽可能大的尺寸。如果图像的比例与元素不同,它会被垂直或水平裁剪,这样就不会留下空白。
auto
将背景图像按相应的方向缩放,以保持其固有比例。
将相应维度中的图像拉伸到指定的长度。不允许有负值。
< percentage>百分比
将相应尺寸的图像拉伸到背景定位区域的指定百分比。背景定位区域由background-origin的值(默认情况下,填充框)决定。但是,如果背景的background-attachment值是固定的,那么定位区域就是整个视口。不允许有负值。
多张背景图
栗子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#box {
width: 600px;
height: 600px;
border: 15px solid rgba(0,0,0,.3);
padding: 20px;
background: top / contain no-repeat url(https://dss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3252521864,872614242&fm=26&gp=0.jpg),
bottom / contain no-repeat url(https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=2853553659,1775735885&fm=26&gp=0.jpg);
}
</style>
</head>
<body>
<div id="box">
</div>
</body>
</html>
9.倒影box-reflect
比如我们要实现下述效果
在早前要实现这样的效果我们都必须借助于类似于Photoshop这样的制作图软件来实现,然后通过引入一张image。那么除了图片,我们有没有别的方法能实现呢?值得庆幸的是,到目前为之,CSS3有一个属性box-reflect
可以实现。那么今天我们要给大家介绍的就是这个属性的应用。
9.1 语法
box-reflect:none | <direction> <offset>? <mask-box-image>?
由于此属性并不是W3C标准属性,在具体使用之时,还是需要添加浏览器的私有属性,根据浏览器的兼容性,使用box-reflect
时需要添加-webkit
和前缀:
-webkit-box-reflect:none | <direction> <offset>? <mask-box-image>?
box-reflect:none | <direction> <offset>? <mask-box-image>?
可惜的是在Firefox下并不支持这个属性,不过值得庆幸的是,在Firefox下可以通过-moz-element()
来模拟实现
其主要包括以下几个属性值:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)