3D旋转卡片
添加立体感
transform
- translate
- translate():带有两个参数,分别代表:X轴和Y轴,第二个参数不写,则默认为0;
- translateX():向X轴平移,正值向右,负值向左;
- translateY():向Y平移,正值向下,负值向上;
- translateZ():向Z轴平移,元素和屏幕之间的距离,越近translateZ值越大,越远,Z值越小;
- translate3d():同时设置X,Y,Z三个方向的移动距离,三个参数必须填写;
- rotate:正数表示顺时针旋转,负数表示逆时针旋转;
- rotate:旋转元素,配合属性transform-orgin:设置旋转点,默认为绕中心点旋转(center,center);或设置像素值,0px,0px为左上角;
- rotateX()
- rotateY()
- rotateZ()
- rotate3D():共带有4个参数,前三个是指X,Y,Z的坐标,设置了一条主轴的方向,重要的是相互之间的比值,第四个参数为度数,表明绕这个主轴旋转多少角度;
- scale
- scale():带有两个参数,第一个为X,第二个为Y
- scaleX():改变的是元素的刻度,>1放大,<1,缩小;
- scaleY():默认值为1;元素的宽高不变;
- scaleZ()
- scale3d():带有3个参数,表示X,Y,Z;
- 如果连续写了两个缩放,scale(0.5,0.5)scale(3,3)则计算二者乘积,放大1.5倍;
- skew
- skew:带有两个参数,两个参数同时操作;
- skewX():倾斜该元素,元素被倾斜,但是高度不变,则Y轴被拉伸,本身尺寸不改变,变的是轴的刻度;
- skewY():倾斜元素,宽度不变;
perspective:xxx px;
- 模拟人的视角,数字代表人眼与屏幕的距离;
- 数值越小,表示离屏幕越近,元素表现的越大,数值越大,元素表现的就越小 近大远小
- 添加了空间感,则看起来是在进行旋转,否则类似于伸缩;
- 当perspective与translateZ联合使用时,实际看到的是元素在屏幕上的投影,当屏幕位置固定时,translateZ表示元素与屏幕之间的距离,
- translateZ为正:当距离越大时,在屏幕上投影越大;
- translateZ为负:元素在屏幕后方,当距离越大,屏幕上投影越小;
- 该属性设置在父元素上
- perspective-origin:指人眼视角的位置,默认为center,center,则看向父元素中心
- 也可使用像素,百分比,top bottom left right 设置视角;
transition
设置属性变换的过渡效果;设置变换的方式,速度,时间,类型等;
- transition:后面带四个参数,分别为 property,duration,timing-function delay;例如: transition: width 1s linear 1s
- transition-property:表明监控的属性,默认值为none,all为监视所有变化属性,可以单独设置,也可多个设置,多个设置时属性名之间使用逗号分隔;
- transition-duration:设置过渡需要的时间,默认值为0,可设置秒数:1s等;
- transition-timing-function :设置过渡动画的类型
- linear:匀速过渡,等同于贝塞尔曲线(0.0,0.0,1.0,1.0)
- ease:平滑过渡,等同于贝塞尔曲线(0.25, 0.1, 0.25, 1.0) (默认值)
- ease-in:由慢到快,等同于贝塞尔曲线(0.42, 0, 1.0, 1.0)
- ease-out:由快到慢,等同于贝塞尔曲线(0, 0, 0.58, 1.0)
- ease-in-out:由慢到快到慢,等同于贝塞尔曲线(0.42, 0, 0.58, 1.0)
- cubic-bezier:自定义贝塞尔曲线,设置四个参数后,控制台点击图标可以进行调整;
- step-start:等同于steps(1,start),第一个参数指定动画分几个步骤完成;
- step-end:等同于steps(1,end),第二个参数为忽略,如果为start就忽略第一个,end忽略最后一步;
- transition-delay:表明动画的延时,类似于setTimeOut;默认值为0;
animation
给元素设置动画,animation要配合@keyframes一起使用;
- animation:第一个参数为@keyframes的名称,第二个参数为动画的时间,第三个参数为动画的执行动作,后面也有循环次数,方向等;从第三个参数起可以互换顺序;
- animation-name:设置要添加的动画是那一组@keyframes名称;
- animation-duration:设置完成动画需要的时间;
- animation-timing-function:设置完成动画的运动效果;
- animation-delay:设置动画的延迟时间;
- animation-iteration-count:设置动画循环的时间,默认为1,只运动一次,infinite:无限循环
- animation-direction:设置@keyframes中关键帧的播放顺序,默认为0%~100%;
- normal:默认值,正常方向
- reverse:1000%~0%,反向播放
- alternate:先从正向执行,后续从反向执行,进行持续的交替运动,此时设置动画循环次数必须大于2;
- alternate-reverse
- animation-play-state:可以设置动画的暂停,和运动的属性,设置伪元素动画,例如在hover中添加暂停属性;默认值为running,运动;paused:暂停;
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>3D旋转卡片</title>
<link rel="stylesheet" href="day_2.css">
</head>
<body>
<div class="card">
<!-- 正面卡片-->
<div class="front">
<p>你好</p>
</div>
<!-- 背面卡片-->
<div class="back">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
</div>
</div>
</body>
</html>
css
*{
margin: 0;
padding: 0;
}
body{
/*弹性布局,页面元素垂直水平居中*/
display:flex;
justify-content: center;
align-items: center;
/*页面始终占浏览器总高*/
height: 100vh;
background-image:linear-gradient(200deg,#78f,#f78);
/*动画看起来硬生生的,没有任何立体感,所以需要添加这个属性来增加卡片旋转的立体感,值越小,立体感越明显*/
/*立体感:近大远小,属性的意思为设置视距*/
perspective:500px;
}
.card{
position: relative;
width: 300px;
height: 450px;
border-radius:30px;
cursor:pointer;
background-color: #fff;
box-shadow: 1px 1px 20px rgba(0,0,0,0.1);
/*父元素加3D盒子属性*/
transform-style:preserve-3d;
animation:rotate_reverse 1.2s cubic-bezier(0.66,-0.47,0.33,1.5) forwards;
}
.card:hover{
/*动画,名称,时长,第三个属性是贝塞尔曲线,可以自定义动画的运动轨迹,让动画的运动轨迹有很多中可能*/
/*第四个属性是动画完成时的状态,一般动画完成后就回到了0%的状态,默认值是backwards,但是当我们设置为forwards的时候,当动画运行到100%时候就会停下来,不会再回到0%*/
animation:rotate 1.2s cubic-bezier(0.66,-0.47,0.33,1.5) forwards;
}
.front,.back{
/*弹性布局,元素垂直排列*/
display:flex;
flex-direction:column;
/*垂直排列情况下,子元素水平居中*/
align-items: center;
justify-content:space-around;
/*子元素是绝对定位,父元素需要相对定位*/
position:absolute;
top:0;
left:0;
/*1em:16px*/
font-size:1.3em;
border-radius:30px;
background-color:#fff;
width: 100%;
height: 100%;
}
.back{
/*背面卡片到后面去*/
/*但是仅仅设置这个只是绕Y轴旋转了,因为父元素的盒子是一个2D盒子,需先变成3D盒子*/
transform:rotateY(180deg);
}
/*定义翻转动画*/
@keyframes rotate{
0%{
transform:rotateY(0);
}
100%{
transform:rotateY(180deg);
}
}
@keyframes rotate_reverse{
0%{
transform:rotateY(180deg);
}
100%{
transform:rotateY(0);
}
}