阴影: 通过合理添加阴影可以使平面网页内容显示出立体的效果
1、 box-shadow:盒子阴影
(1) 阴影在x轴方向的偏移, 正右负左
(2) 阴影在y轴方向的偏移, 正下负上
(3) 阴影的模糊度, 数值越大, 阴影越模糊
(4) 阴影的范围, 数值越大, 阴影越大
(5) 阴影颜色
(6) 阴影位置, 默认outset盒子外阴影, inset盒子内阴影
2、 text-shadow:文字阴影
(1) 阴影x轴偏移
(2) 阴影y轴偏移
(3) 阴影模糊度
(4) 阴影颜色
文字阴影不能像盒子阴影一样叠加阴影。
可以通过渐变为标签设置一定梯度变化的背景色
渐变色只能给标签的background-image样式赋值。
1、线性渐变: -webkit-linear-gradient
1) 线性的角度或方向, 默认从上到下渐变
(1) left / right / top / bottom 设置渐变的开始方向
(2) 角度的设置, 单位deg, 0deg在3点钟方向, 正角度逆时针旋转, 负角度顺时针旋转。
2) 渐变的颜色和阶段, 如果不设置阶段, 各个自动平分
2、径向渐变, 以圆心向四周沿着半径方向渐变:-webkit-radial-gradient
(1) 设置圆的类型, 默认椭圆, 可以设置circle
(2) 设置颜色及阶段
倒影:通过-webkit-box-reflect 来为标签设置倒影
(1) 设置倒影方向
above: 倒影出现在标签的上方
below: 倒影出现在标签的下方
left: 倒影出现在标签的左方
right: 倒影出现在标签的右方
(2) 设置倒影距离
(3) 设置蒙版图片, 可以设置渐变
倒影目前只在 Chrome 和 Safari 浏览器生效
过渡动画效果: 将标签的样式变化以连续平滑的方式显示, 类似于动画。
1)transition-property: 设置过渡需要表现表现的样式属性,通常使用 all 来设置所有样式变化都用过渡显示。
2)transition-duration: 设置过渡的持续时间。
3)transition-delay: 设置过渡效果的延迟时间。
4)transition-timing-function: 设置过渡的速度曲线。
过渡效果,可以简写,用空格可空开过渡样式的各个值,不分先后,当存在两个时间时,第一个为过渡持续时间,第二个为过渡延迟时间。
可以设置的值:
(1)ease: 先快后慢
(2)ease-in: 加速
(3)ease-out: 减速
(4)ease-in-out: 先加速后减速
(5)linear: 匀速
1、2d变换:
通过 transform 来为标签设置变换
1) 平移变换 translate
translateX():设置标签沿着x轴移动的距离
translateY():设置标签沿着y轴移动的距离
translate():设置标签沿着xy轴的移动距离,第一个值表示x轴平移,第二个值表示y轴平移
x轴水平向右为正方向,y轴向下为正方向
平移会保留标签原本位置,相对自身原本位置平移
2) 旋转变换 rotate
默认旋转点在标签的正中心,正角度使标签沿着顺时针旋转,负角度使标签沿着逆时针旋转。
0deg方向是12点方向。
旋转点又是标签变换的坐标系原点
3)缩放变换 scale
scaleX()、scaleY()、scale()
缩放变换,放大缩小的是标签坐标系的比例,例如,放大2倍,坐标系中1px就变成了2px;注意,一旦坐标系比例发生变化,会影响其他变换,例如:平移变换100px在2倍坐标系下,就会平移200px。
transform-origin 设置标签变换参照点位置:
(1)left/right/top/bottom/center来设置特殊位置
(2)通过具体像素精确设置位置
第一个值表示x轴方向对参照点位置的设置
第二个值表示y轴方向对参照点位置的设置
允许变换参照点设置在标签之外
注意,一旦为标签更改变换参照点,那么变换参照点的基准就变成了标签左上角为原点。
2d的变换总结:
(1)默认变换参照点在标签的正中心,x轴为穿过参照点水平轴,向右为正,y轴是穿过参照点竖直轴,向下为正。
(2)平移、旋转、缩放都会改变标签坐标系的状态。
(3)变换都是参照标签初始位置进行变换。
2、3D变换
设置3d变换 :
设置视距:
(1)和2d变换相似,只是在2d变换平面的基础上,多出了一条,垂直于标签平面并默认向外为正的z轴。
(2)3d变换需要为变换标签的父标签设置变换类型为3d,相当于在该标签下生成了一块3d空间。
(3)3d变换下,只有平移和旋转变换,没有缩放。
(4)3d变换中, 可以通过改变标签变换参照点位置来改变XYZ轴的位置
1、 animation动画,配合@keyframes来为标签设置关键帧动画
animation属性值:
1)animation-name:动画名称,用于为动画绑定关键帧
@keyframes后面的名称
2)animation-duration:动画播放时间
s为单位,时间为0无动画过程
3)animation-delay:动画延迟时间
s为单位,时间为0无延迟
4)animation-timing-function:动画缓动效果
可以设置的值:
(1)ease
(2)ease-in
(3)ease-out
(4)ease-in-out
(5)linear
5)animation-direction:设置动画方向
alternate,当播放次数大于一,返向播放
6)animation-iteration-count:设置动画播放次数
infinite,无限播放
7)animation-fill-mode:设置动画结束位置
默认 backwards,回到初始位置
forwards,停在结束位置
注意: animation同样存在简写,将样式值以空格隔开,不区分先后,两个时间同时出现,第一个为播放时间,第二个为延迟时间。
一些css3样式只在部分浏览器生效, 可以通过添加兼容前缀的形式来对部分低版本浏览器兼容
例如: transition: all 1s linear
-webkit-transition: all 1s linear
-moz-transition: all 1s linear
-o-transition: all 1s linear
-ms-transition: all 1s linear
兼容问题:
-webkit-chrome、safari
-moz- firefox
-o- opera
-ms-ie
nimation、transition、transform、gradient等css3样式都应添加前缀进行多类型多版本浏览器兼容。
animation动画除了可以实现补间动画外,还可以完成逐帧动画。
在animation的属性中,有个属性 animation-timing-function 一共具有如下这些值
CSS
贝塞尔缓动就是完成补间动画的,比如流畅的缩放、位置移动等动画。
但是逐帧动画没有补间效果的,它不是电脑根据初始和结束状态的差异自动生成中间的过渡帧,而是每一帧都是关键帧,需要自己定义每一帧的状态。
比如像下面这样的图,就只能通过逐帧动画来实现运动效果↓
这几个属性值就是用来处理逐帧动画的:
CSS
steps(number,position) ,有两个参数。
number表示动画的段数。关键帧的数量=段数+1。
position这个比较难理解,有两个值:end和start。end是默认值。
先看一个效果。
两个小球,从0px运动到400px,分为了4个动画步骤,有5个关键帧。第一个是start模式,第二个是end模式。
发现start模式是时间一开始,直接进入第二个关键帧状态,然后顺利顺利走完全程。
end模式有点傻,时间一开始,从第一个关键帧开始跑,结果时间结束了,才走完第四个关键帧,没有完成全部路程就over了。
所以start和end的名字和它所表示的含义刚好相反。
比如执行次数或者填充模式。
为上面的小球加上infinite,可以看出start模式第二次开始的运动都是从第二个关键帧开始的。
加上forwards模式则变得不一样了,forwards是向前的单词意思,但是表示的则是保留动画最后的运动状态,意思和功能也是相反的。
第二个end模式的小球终于有机会走完全程了。
所以,当为end模式设置了forwards的时候要小心,因为它其实多走了一步。
1、这头熊的原始素材一共有8个步骤。
所以使用 steps(8,end) 是最好的方式,因为如果使用 steps(8,start) ,则第一帧不能执行,最后一帧会闪白,图片消失。
因为要一直运动,所以需要加上infinite,当执行完最后一张图的时候,再返回到第一张图,形成一个连贯的完步。
通过背景图片的 background-position 的改变,形成熊的运动。
CSS
可以打开codepen编辑器,把运动时间设置更大一点,可以看到慢动作,一帧一帧是如何显示的。
2、这个logo一共有24张图片
但是logo只运动一次,并且停在结束状态,根据end模式的特征,如果加上forwards的话,会多运动一步。
所以,这里是 steps(23,end) ,为什么是23步,而不是24步,因为forwards模式对它的影响。要想最后一步还要看到图片,那么背景图片的挪动就要少挪动一个图片的宽度。图片整个宽度4800px,每一张图200px的宽高。所以背景图片只需要往左边挪动-4600px即可。
CSS
通过上面的案例可以看出,对象的运动效果由逐帧绘制的图片的间距所影响。间距一样,则速度一样。利用steps不能去改变现成的图片帧与帧之间的速度。
但是利用 step-end 或者 step-start 却是可以的。
3、 step-end 的特别用处
其实 step-end 等价于 steps(1,end) , step-start 等价于 steps(1,start) 。
只有一个步骤的逐帧动画,却可以利用好时间的改变和距离的改变做出速度不同的效果来。
熊从左边快速奔跑出来,一共跑了六步,一步比一步速度放慢。然后在原地踏步。
首先这是一个逐帧动画,但是要实现不同的速度,又没有办法改变原来素材图片与图片之间的距离,所以要使用另外的办法。
第一个完步时间间隔小,left的值间隔大,相当于速度快。背景图片往左移动一张,left的值往右改变一次,熊实现往前奔跑。
CSS
第二个完步的时间间隔稍微大点,left的间隔小了一点,速度变慢了一些。依次类推,速度逐渐放缓。第二个完步又从第一帧开始。
CSS
所以说利用step-end还是可以做出速度不一样的逐帧动画的。
在线制作雪碧图: https://www.toptal.com/developers/css/sprite-generator
<!DOCTYPE html>
<html>
<head>
<meta charset="utf8">
<style>
:root {
--border-anim-size: 10em
--border-anim-width: calc(var(--border-anim-size) / 20)
--border-anim-width-double: calc(var(--border-anim-width)*2)
--border-anim-duration: 5s
--border-anim-border-color: gray
--border-anim-hover-color: LightCoral
}
body {
display: flex
}
.border-anim {
width: var(--border-anim-size)
height: var(--border-anim-size)
position: relative
border: 1px solid var(--border-anim-border-color)
}
.border-anim::before, .border-anim::after {
content: ''
position: absolute
border: var(--border-anim-width) solid var(--border-anim-border-color)
/* 让边框在内容区域内绘制 */
box-sizing: border-box
transition: background-color 1s
}
.border-anim::before {
animation: anim-border-run calc(var(--border-anim-duration) * 2) linear infinite
}
.border-anim::after {
animation: anim-border-run calc(var(--border-anim-duration) * 2) calc(var(--border-anim-duration) / -1) linear infinite
}
.border-anim:hover::before, .border-anim:hover::after {
background-color: var(--border-anim-hover-color)
}
.border-anim-content {
width: calc(100% - var(--border-anim-width-double))
height: calc(100% - var(--border-anim-width-double))
margin: var(--border-anim-width)
border: 1px solid var(--border-anim-border-color)
}
@keyframes anim-border-run {
/* 这里将动画分成了4步;也可以改为2步,这时before和after用的就要是两套keyframes了 */
from, to {
width: var(--border-anim-width-double)
height: 100%
top: 0
left: 0
}
25% {
width: 100%
height: var(--border-anim-width-double)
top: calc(100% - var(--border-anim-width-double))
left: 0
}
50% {
width: var(--border-anim-width-double)
height: 100%
top: 0
left: calc(100% - var(--border-anim-width-double))
}
75% {
width: 100%
height: var(--border-anim-width-double)
top: 0%
left: 0%
}
/* 需要设置临界效果,否则会渐变 */
from, to, 24.9% {
border-left-color: var(--border-anim-border-color)
border-top-color: transparent
border-right-color: transparent
border-bottom-color: var(--border-anim-border-color)
}
25%, 49.9% {
border-left-color: transparent
border-top-color: transparent
border-right-color: var(--border-anim-border-color)
border-bottom-color: var(--border-anim-border-color)
}
50%, 74.9% {
border-left-color: transparent
border-top-color: var(--border-anim-border-color)
border-right-color: var(--border-anim-border-color)
border-bottom-color: transparent
}
75%, 99.9% {
border-left-color: var(--border-anim-border-color)
border-top-color: var(--border-anim-border-color)
border-right-color: transparent
border-bottom-color: transparent
}
}
</style>
<style>
.border-anim2 {
width: var(--border-anim-size)
height: var(--border-anim-size)
position: relative
border: 1px solid var(--border-anim-border-color)
}
.border-anim2-edge {
position: absolute
/* 必须把其他边框置0,否则有默认值存在 */
border: 0px solid var(--border-anim-border-color)
box-sizing: border-box
}
/*
注意:CSS中不能前向选择,而只能后向选择!
因为如果CSS支持了父选择器,那就必须要页面所有子元素加载完毕才能渲染HTML文档,
因为所谓“父选择器”,就是后代元素影响祖先元素,如果后代元素还没加载处理,如何影响祖先元素的样式?
于是,网页渲染呈现速度就会大大减慢,浏览器会出现长时间的白板。
*/
/* 波浪号和加号都是选择其后的元素,区别是加号只取一个,波浪取所有
.border-anim-content:hover ~ .border-anim2-edge { */
.border-anim2:hover >.border-anim2-edge {
background-color: var(--border-anim-hover-color)
}
.border-anim2-left {
width: var(--border-anim-width-double)
height: 100%
left: 0
border-left-width: var(--border-anim-width)
animation: anim2-border-run-left var(--border-anim-duration) calc(var(--border-anim-duration) / -2) linear infinite
}
.border-anim2-top {
height: var(--border-anim-width-double)
width: 100%
top: 0
border-top-width: var(--border-anim-width)
animation: anim2-border-run-top var(--border-anim-duration) linear infinite
}
.border-anim2-right {
width: var(--border-anim-width-double)
height: 100%
right: 0
border-right-width: var(--border-anim-width)
animation: anim2-border-run-right var(--border-anim-duration) calc(var(--border-anim-duration) / -2) linear infinite
}
.border-anim2-bottom {
height: var(--border-anim-width-double)
width: 100%
bottom: 0
border-bottom-width: var(--border-anim-width)
animation: anim2-border-run-bottom var(--border-anim-duration) linear infinite
}
@keyframes anim2-border-run-left {
from, to {
height: 0
}
50% {
height: 100%
}
from, to, 49.9% {
top: 0
bottom: auto
}
50%, 99.9% {
top: auto
bottom: 0
}
}
@keyframes anim2-border-run-top {
from, to {
width: 0
}
50% {
width: 100%
}
from, to, 49.9% {
left: auto
right: 0
}
50%, 99.9% {
left: 0
right: auto
}
}
@keyframes anim2-border-run-right {
from, to {
height: 0
}
50% {
height: 100%
}
from, to, 49.9% {
top: auto
bottom: 0
}
50%, 99.9% {
top: 0
bottom: auto
}
}
@keyframes anim2-border-run-bottom {
from, to {
width: 0
}
50% {
width: 100%
}
from, to, 49.9% {
left: 0
right: auto
}
50%, 99.9% {
left: auto
right: 0
}
}
</style>
<style>
.border-anim3 {
width: var(--border-anim-size)
height: var(--border-anim-size)
position: relative
border: 1px solid var(--border-anim-border-color)
box-sizing: border-box
}
.border-anim3::before, .border-anim3::after {
content: ''
position: absolute
width: 100%
height: 100%
top: 0
left: 0
}
.border-anim3::before {
box-shadow: 0 0 0 var(--border-anim-width) var(--border-anim-border-color) inset
animation: anim3-border-run calc(var(--border-anim-duration) * 2) calc(var(--border-anim-duration) / -1) linear infinite
}
.border-anim3::after {
box-shadow: 0 0 0 var(--border-anim-width) var(--border-anim-border-color) inset
animation: anim3-border-run calc(var(--border-anim-duration) * 2) linear infinite
}
.border-anim3:hover::before, .border-anim3:hover::after {
/* 如果只在hover的时候设置transition,那么进入有效,但是退出无效(即退出时不会有缓动) */
transition: background-color 1s
background-color: var(--border-anim-hover-color)
}
@keyframes anim3-border-run {
/*
clip通过对元素进行剪切来控制元素的可显示区域(clip的区域显示,其他隐藏)
clip属性只能在元素设置了“position:absolute”或者“position:fixed”属性起作用
shape函数声明:rect(top right bottom left)
rect()和<top>和<bottom>指定偏移量是从元素盒子顶部边缘算起;<left>和<right>指定的偏移量是从元素盒子左边边缘算起(包括边框)。
如果<right>和<bottom>设置为auto时,他们就相当于元素的宽度(这个宽度包括元素的border、padding和width),或者简单的理解为100%
注意:1.值不能设置为百分比。 2.在动画设置过程里不能使用auto,使用auto没有动画效果(因此建议使用SCSS或者LESS之类的预处理器)
*/
/*
clip动画有3种方案,但是都有点小瑕疵(在线条粗的时候明显,线条细的情况下完全看不出来)
(1)使用如下的1和9作为边界,当拐弯的时候,尾部多余的边界会跟着动
(2)将下面的1和9替换为0和10,当拐弯的时候,线条宽度会变为0
(3)在每个状态后面一步立即重置它,但是会出现抖动
*/
from, to {
clip: rect(0, 1em, 10em, 0)
}
1% {
clip: rect(1em, 1em, 10em, 0)
}
25% {
clip: rect(9em, 10em, 10em, 0)
}
25.1% {
clip: rect(9em, 10em, 10em, 1em)
}
50% {
clip: rect(0, 10em, 10em, 9em)
}
50.1% {
clip: rect(0, 10em, 9em, 9em)
}
75% {
clip: rect(0, 10em, 1em, 0)
}
75.1% {
clip: rect(0, 9em, 1em, 0)
}
}
</style>
</head>
<body>
<section>
<h1>(1)通过两矩形的移动来制作动画</h1>
<div class="border-anim">
<div class="border-anim-content"></div>
</div>
</section>
<section>
<h1>(2)通过四个边框的长度来控制动画</h1>
<div class="border-anim2">
<div class="border-anim-content"></div>
<div class="border-anim2-edge border-anim2-left"></div>
<div class="border-anim2-edge border-anim2-top"></div>
<div class="border-anim2-edge border-anim2-right"></div>
<div class="border-anim2-edge border-anim2-bottom"></div>
</div>
</section>
<section>
<h1>(3)通过clip的裁剪来显示动画</h1>
<div class="border-anim3">
<div class="border-anim-content"></div>
</div>
<section>
</body>
</html>
对web开发技术感兴趣的同学,欢迎私信我加群,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效率学习路线和教程与您免费分享,同时每天更新视频资料。
最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰