transition

是 transition-property,transition-duration,transition-timing-function 和 transition-delay 的一个简写属性。

transition-property: 指定应用过渡属性的名称
transition-duration: 属性以秒或毫秒为单位指定过渡动画所需的时间
transition-timing-function: 用来描述这个中间值是怎样计算的
transition-delay: 规定了在过渡效果开始作用之前需要等待的时间。


让一个红盒子过渡变成蓝盒子
<!DOCTYPE HTML>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>无标题文档</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background: red;
            /* 谁做过渡给谁加 */
            transition: 1s;   
        }

        div:hover {
            width: 200px;
            height: 200px;
            background: blue;
        }
    </style>
</head>

<body>
    <div></div>
</body>

</html>
<!DOCTYPE HTML>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>无标题文档</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background: red;

            /* 宽变化,持续时间为1s;高变化,持续时间为2s ;这两个变化同时开始,只是持续的时间不同*/
            transition: width 1s, height 2s;
        }

        div:hover {
            width: 200px;
            height: 200px;
            background: blue;
        }
    </style>
</head>

<body>
    <div></div>
</body>

</html>
<!DOCTYPE HTML>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>无标题文档</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background: red;

            /* 先让宽变化,持续时间为1s;1s之后再让高变化,持续时间为2s */
            transition: 1s width, 2s 1s height;
        }

        div:hover {
            width: 200px;
            height: 200px;
            background: blue;
        }
    </style>
</head>

<body>
    <div></div>
</body>

</html>

3D图片切换

本来有一张动图,上传不上来,大家就看下面这张图脑补一下动起来的样子吧😜
点击按钮之后,会像下面这样一块一块按顺序转到对应的图片
在这里插入图片描述


案例需要准备元素大致如下所示:
y轴正方向应该是向下的,画错啦,哈哈哈哈哈🙈
在这里插入图片描述
首先来看一下body里面的代码:

<body>
	<div class="box">
		<!-- 上面的图片特效部分 -->
		<ul class="picList" id="pic">

		</ul>
		<!-- 下面的四个按钮 -->
		<ol id="btn">
			<li class="active">1</li>
			<li>2</li>
			<li>3</li>
			<li>4</li>
		</ol>
	</div>
</body>

接着设置一下body、ul、ol、box的样式

<style id="css">
		body,
		ul,
		ol {
			/* 清楚内外边距 */
			margin: 0;
			padding: 0;
			
			list-style: none;
		}

		.box {
			width: 800px;
			margin: 50px auto;
		}
</style>

有关图片样式的css代码:

<style id="css">
		.picList {
			width: 800px;
			height: 360px;
			/* 加透视 */
			-webkit-perspective: 800px;
		}

		.picList li {
			width: 25px;
			height: 360px;
			float: left;
			/* 设置为相对定位 */
			position: relative;
			/* 使被转换的子元素保留其 3D 转换 */
			-webkit-transform-style: preserve-3d;
			/* 沿z轴负方向移动180pxs,就是让li的大小变小了些 */
			-webkit-transform: translateZ(-180px);
		}

        /*设置上下前后的属性,加了绝对定位保证a的位置可以随着父元素位置的变化来变化;*/
		.picList a {
			width: 100%;
			height: 360px;
			position: absolute;
			left: 0;
			top: 0;
		}

		/* 左右面 */
		.picList span {
			width: 360px;
			height: 360px;
			background: rgb(88, 88, 88);
			position: absolute;
			top: 0;
		}
</style>

设置立方体的各个面
在这里插入图片描述

<style id="css">
		/* nth-of-type 是对指定类型进行排序选择 */
		/* 下面的样式是加在前、下、后、上四个面的 */
		/*对于最前面的面来说,直接让红色的图片沿着Z轴向前移动180px即可*/
		.picList li a:nth-of-type(1) {
			background: url(img/0067GSTNgy1fzwjk8ek7ej312p0tzdj3.jpg) no-repeat;
			background-size: 800px auto;

			-webkit-transform: translateZ(180px);
		}
		
		/*对于下面的面来说,先让红色的图片沿着X轴旋转270度才可以变到下面图片的样子,旋转好之后,沿着Y轴正向移动180px即可*/
		.picList li a:nth-of-type(2) {
			background: url(img/0067GSTNgy1fzwjk8gt09j312w0u0gqv.jpg) no-repeat;
			background-size: 800px auto;

			-webkit-transform: translateY(180px) rotateX(270deg);
		}
		
	    /*对于后面的面来说,先让红色的图片沿着X轴旋转180度才可以变到下面图片的样子,旋转好之后,沿着Z轴负向移动180px即可*/
		.picList li a:nth-of-type(3) {
			background: url(img/0067GSTNgy1fzwjk8j0r7j312m0tz779.jpg) no-repeat;
			background-size: 800px auto;
			-webkit-transform: translateZ(-180px) rotateX(180deg);
		}
		/*对于上面的面来说,先让红色的图片沿着X轴旋转90度才可以变到下面图片的样子,旋转好之后,沿着Y轴负向移动180px即可*/
		.picList li a:nth-of-type(4) {
			background: url(img/0067GSTNgy1fzwjk8xlcbj312s0u07ac.jpg) no-repeat;
			background-size: 800px auto;

			-webkit-transform: translateY(-180px) rotateX(90deg);
		}

		/* 下面的样式是加在左右两个面的 */
		/* 当设置了left为0之后就是让360 * 360的span盒子的左沿紧贴li的左面,接着设置旋转的轴为左轴,先让span盒子沿y轴旋转90度,再向前移动180px就可以啦*/
		.picList li span:nth-of-type(1) {
			left: 0;
			-webkit-transform-origin: left;
			/*如果有移动或者其它样式,必须先写移动 */
			-webkit-transform: translateZ(180px) rotateY(90deg);


		}
		
		/*这个和上面是一样的道理*/
		.picList li span:nth-of-type(2) {
			right: 0;
			-webkit-transform-origin: right;
			-webkit-transform: translateZ(180px) rotateY(-90deg);

		}
</style>

有关按钮的css代码:

<style id="css">
		#btn {
			padding: 50px;
			height: 30px;
		}

		/* 每个按钮的css样式 */
		#btn li {
			width: 30px;
			height: 30px;
			background: #000;
			color: #fff;
			font: bold 16px/30px Arial;
			text-align: center;
			float: left;
			margin: 0 10px;
			border-radius: 50%;
		}

		/* 点击之后的背景变为橙色 */
		#btn .active {
			background: #f60;
		}
</style>

最后咱们写一下JavaScript代码:

	<script>
		window.onload = function () {
			var oPic = document.getElementById("pic");  //获取上面图片的元素
			var oCss = document.getElementById("css");  //css样式的id就是css
			//获取每个按钮元素
			var aBtn = document.getElementById("btn").getElementsByTagName("li"); 

			// 旋转过程中每个条的宽度
			var iLiW = 25;
			// 图片可以分成多少个这样的条
			var iLength = oPic.clientWidth / iLiW;
			var aLi = [];
			var sHtml = "";
			var sCss = "";
			var iZindex = 0;
			var iNow = 0;


			for (var i = 0; i < iLength; i++) {
				i > iLength / 2 ? iZindex-- : iZindex++;
				//当元素之间重叠的时候, z-index 较大的元素会覆盖较小的元素在上层进行
				sCss += ".picList li:nth-of-type(" + (i + 1) + "){z-index:" + iZindex + ";}\
				         .picList li:nth-of-type(" + (i + 1) + ") a{background-position:-" + i * iLiW + "px 0px;}"  //设置每个条所显示背景的位置
			}
			//加入到css代码中
			oCss.innerHTML += sCss;

			//循环iLength次
			for (var i = 0; i < iLength; i++) {
				//四个链接就是上下前后  两个span就是两个侧面
				sHtml += '<li><a href="#"></a><a href="#"></a><a href="#"></a><a href="#"></a><span></span><span></span></li>';
			}
			oPic.innerHTML = sHtml;

			//获取每个li
			aLi = oPic.getElementsByTagName("li");

			//给按钮添加点击事件
			for (var i = 0; i < aBtn.length; i++) {
				//传入的a是当前点击的按钮下标
				aBtn[i].onclick = (function (a) {
					return function () {
						//清除上一次的黄色按钮样式
						aBtn[iNow].className = "";

						for (var i = 0; i < aLi.length; i++) {
							//过渡
							aLi[i].style.transition = Math.abs(a - iNow) * 0.5 + "s " + i * 80 + "ms all ease";
							//translate的目的就是让图片变小一点
							aLi[i].style.WebkitTransform = "translateZ(-180px) rotateX(-" + a * 90 + "deg)";
						}

						//把当前点击的按钮下标给iNow
						iNow = a;
						//修改类名,变为黄色
						aBtn[iNow].className = "active";
					};
				})(i);
			}
		}
	</script>

完整代码:

<!DOCTYPE HTML>
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>无标题文档</title>
	<style id="css">
		body,
		ul,
		ol {
			/* 清楚内外边距 */
			margin: 0;
			padding: 0;
			
			list-style: none;
		}

		.box {
			width: 800px;
			margin: 50px auto;
		}

		/* ———————————————————————————有关图片样式的css代码————————————————————————————————————— */

		.picList {
			width: 800px;
			height: 360px;
			/* 加透视 */
			-webkit-perspective: 800px;
		}

		.picList li {
			width: 25px;
			height: 360px;
			float: left;
			position: relative;
			/* 使被转换的子元素保留其 3D 转换: */
			-webkit-transform-style: preserve-3d;
			/* 沿z轴负方向移动180pxs */
			-webkit-transform: translateZ(-180px);
		}


		.picList a {
			width: 100%;
			height: 360px;
			position: absolute;
			left: 0;
			top: 0;
		}

		/* 是前后面 */
		.picList span {
			width: 360px;
			height: 360px;
			background: rgb(88, 88, 88);
			position: absolute;
			top: 0;
		}

		/* nth-of-type 是对指定类型进行排序选择 */
		/* 下面的样式是加在前、下、后、上四个面的 */
		.picList li a:nth-of-type(1) {
			background: url(img/0067GSTNgy1fzwjk8ek7ej312p0tzdj3.jpg) no-repeat;
			background-size: 800px auto;

			-webkit-transform: translateZ(180px);
		}

		.picList li a:nth-of-type(2) {
			background: url(img/0067GSTNgy1fzwjk8gt09j312w0u0gqv.jpg) no-repeat;
			background-size: 800px auto;

			-webkit-transform: translateY(180px) rotateX(270deg);
		}

		.picList li a:nth-of-type(3) {
			background: url(img/0067GSTNgy1fzwjk8j0r7j312m0tz779.jpg) no-repeat;
			background-size: 800px auto;
			-webkit-transform: translateZ(-180px) rotateX(180deg);
		}

		.picList li a:nth-of-type(4) {
			background: url(img/0067GSTNgy1fzwjk8xlcbj312s0u07ac.jpg) no-repeat;
			background-size: 800px auto;

			-webkit-transform: translateY(-180px) rotateX(90deg);
		}

		/* 下面的样式是加在左右两个面的 */
		.picList li span:nth-of-type(1) {
			left: 0;
			-webkit-transform-origin: left;
			/*如果有移动或者其它样式,必须先写移动 */
			-webkit-transform: translateZ(180px) rotateY(90deg);


		}

		.picList li span:nth-of-type(2) {
			right: 0;
			-webkit-transform-origin: right;
			-webkit-transform: translateZ(180px) rotateY(-90deg);

		}

		/* ———————————————————————————有关按钮的css代码————————————————————————————————————— */

		#btn {
			padding: 50px;
			height: 30px;
		}

		/* 每个按钮的css样式 */
		#btn li {
			width: 30px;
			height: 30px;
			background: #000;
			color: #fff;
			font: bold 16px/30px Arial;
			text-align: center;
			float: left;
			margin: 0 10px;
			border-radius: 50%;
		}

		/* 点击之后的css变为橙色 */
		#btn .active {
			background: #f60;
		}
	</style>
	<script>
		window.onload = function () {
			var oPic = document.getElementById("pic");
			var oCss = document.getElementById("css");  //css的id就是css
			var aBtn = document.getElementById("btn").getElementsByTagName("li");

			// 旋转过程中每个条的宽度
			var iLiW = 25;
			// 图片可以分成多少个这样的条
			var iLength = oPic.clientWidth / iLiW;
			var aLi = [];
			var sHtml = "";
			var sCss = "";
			var iZindex = 0;
			var iNow = 0;


			for (var i = 0; i < iLength; i++) {
				i > iLength / 2 ? iZindex-- : iZindex++;
				//当元素之间重叠的时候, z-index 较大的元素会覆盖较小的元素在上层进行
				sCss += ".picList li:nth-of-type(" + (i + 1) + "){z-index:" + iZindex + ";}\
				         .picList li:nth-of-type(" + (i + 1) + ") a{background-position:-" + i * iLiW + "px 0px;}"  //设置每个条所显示背景的位置
			}
			oCss.innerHTML += sCss;

			//循环iLength次
			for (var i = 0; i < iLength; i++) {
				//四个链接、两个span
				//四个链接就是上下前后  两个span就是两个侧面
				sHtml += '<li><a href="#"></a><a href="#"></a><a href="#"></a><a href="#"></a><span></span><span></span></li>';
			}
			oPic.innerHTML = sHtml;

			//就是上面添加的那一堆
			aLi = oPic.getElementsByTagName("li");

			//添加下面按钮的点击事件
			for (var i = 0; i < aBtn.length; i++) {
				aBtn[i].onclick = (function (a) {
					return function () {
						//清除之前的类名
						aBtn[iNow].className = "";

						for (var i = 0; i < aLi.length; i++) {
							//过渡
							aLi[i].style.transition = Math.abs(a - iNow) * 0.5 + "s " + i * 80 + "ms all ease";
							//translate的目的就是让图片变小一点
							aLi[i].style.WebkitTransform = "translateZ(-180px) rotateX(-" + a * 90 + "deg)";
						}

						//把当前点击的给iNow
						iNow = a;
						//修改类名
						aBtn[iNow].className = "active";
					};
				})(i);
			}
		}
	</script>
</head>

<body>
	<div class="box">
		<!-- 上面的图片特效部分 -->
		<ul class="picList" id="pic">

		</ul>
		<!-- 下面的四个按钮 -->
		<ol id="btn">
			<li class="active">1</li>
			<li>2</li>
			<li>3</li>
			<li>4</li>
		</ol>
	</div>
</body>

</html>

———————————————下面是transition第三个参数的应用——————————————

<!DOCTYPE HTML>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>无标题文档</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background: red;
            /* ease的速度是慢快慢 */
            transition: 3s all ease;
        }

        div:hover {
            width: 800px; 
        }
    </style>
</head>

<body>
    <div></div>
</body>

</html>

—————————————————————————————
5.html
在这里插入图片描述

<!DOCTYPE HTML>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>无标题文档</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background: red;
            /* cubic-bezier() 函数定义了一个贝塞尔曲线(Cubic Bezier) */
            /* cubic-bezier(P1x, P1y, P2x, P2y) */
            transition: 5s all cubic-bezier(0.040, 0.065, 0.185, 1.650);
        }

        div:hover {
            width: 800px;
        }
    </style>
</head>

<body>
    <div></div>
</body>

</html>

—————————————————————————————
在这里插入图片描述

在这里插入图片描述

<!DOCTYPE HTML>
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>无标题文档</title>
	<style>
		.box {
			width: 100px;
			height: 100px;
			border: 2px solid #000;
			padding: 150px;
			-webkit-transform-style: preserve-3d;
			-webkit-perspective: 200px;
		}

		.box div {
			height: 100px;
			background: red;
			transition: 1s all;
		}

		.box:hover div {
			-webkit-transform: rotateX(50deg);
		}
	</style>
</head>

<body>
	<div class="box">
		<div></div>
	</div>
</body>

</html>

—————————————————————————————
在这里插入图片描述
在这里插入图片描述

<!DOCTYPE HTML>
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>无标题文档</title>
	<style>
		.box {
			width: 100px;
			height: 100px;
			border: 2px solid #000;
			padding: 150px;
			-webkit-transform-style: preserve-3d;
			-webkit-perspective: 200px;
		}

		.box div {
			height: 100px;
			background: red;
			transition: 1s all;
		}

		.box:hover div {
			-webkit-transform: rotateY(50deg);
		}
	</style>
</head>

<body>
	<div class="box">
		<div></div>
	</div>
</body>

</html>

—————————————————————————————

在这里插入图片描述
在这里插入图片描述

<!DOCTYPE HTML>
<html>

<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>无标题文档</title>
	<style>
		.box {
			width: 100px;
			height: 100px;
			border: 2px solid #000;
			padding: 150px;
			-webkit-transform-style: preserve-3d;
			-webkit-perspective: 200px;
		}

		.box div {
			height: 100px;
			background: red;
			transition: 1s all;
		}

		.box:hover div {
			-webkit-transform: translateZ(-100px);
		}
	</style>
</head>

<body>
	<div class="box">
		<div></div>
	</div>
</body>

</html>

—————————————————————————————

实现盒子的向下转动
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<!DOCTYPE HTML>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>无标题文档</title>
    <style>
        /* 设置外面的边框 */
        .wrap {
            width: 200px;
            height: 200px;
            padding: 200px;
            border: 1px solid #000;
            /* 加透视 */
            -webkit-perspective: 800px;
        }

        .box {
            width: 200px;
            height: 200px;
            position: relative;
            -webkit-transform-style: preserve-3d;
            transition: 3s all;
        }

        .box div {
            width: 200px;
            height: 200px;
            position: absolute;
            font-size: 100px;
            font-weight: bold;
            line-height: 200px;
            text-align: center;
            color: #fff;
        }
        /* ——————————————————————————————设置六个面的位置———————————————————————————— */
        
        /* 上面 */
        .box div:nth-of-type(1) {
            background: Red;
            /* 设置这个div的下边和box的上边贴住 */
            top: -200px;
            left: 0;
            /* 设置旋转的轴为div下边 */
            -webkit-transform-origin: bottom;
            /* 首先沿X轴正方向旋转90度,再向前移动100px */
            -webkit-transform: translateZ(100px) rotateX(90deg);
        }

        /* 左边 */
        .box div:nth-of-type(2) {
            background: blue;
            /* 设置这个div的右边和box的左边贴住 */
            top: 0px;
            left: -200px;
            /* 设置旋转的轴为div右边 */
            -webkit-transform-origin: right;
            /* 首先沿Y轴反方向旋转90度,再向前移动100px */
            -webkit-transform: translateZ(100px) rotateY(-90deg);
        }

        /* 前面的那个面 */
        .box div:nth-of-type(3) {
            background: yellow;
            top: 0px;
            left: 0;
            /* 直接沿Z轴向前移动100px */
            -webkit-transform: translateZ(100px);
        }

        /* 右边 */
        .box div:nth-of-type(4) {
            background: green;
            /* zhon设置这个div的左边和box的右边贴住 */
            top: 0px;
            left: 200px;
            /* 设置旋转的轴为div左边 */
            -webkit-transform-origin: left;
            /* 首先沿Y轴正方向旋转90度,再向前移动100px */
            -webkit-transform: translateZ(100px) rotateY(90deg);
        }

        /* 下面 */
        .box div:nth-of-type(5) {
            background: pink;
            /* 设置这个div的上边和box的下边贴住 */
            top: 200px;
            left: 0;
            /* 设置旋转的轴为div上边 */
            -webkit-transform-origin: top;
            /* 首先沿x轴反方向旋转90度,再向前移动100px */
            -webkit-transform: translateZ(100px) rotateX(-90deg);
        }

        /* 后面 */
        .box div:nth-of-type(6) {
            background: #f60;
            top: 0px;
            left: 0;
            /* 直接沿着Z轴向后移动100px */
            -webkit-transform: translateZ(-100px);
        }

        /*——————————————————————————————————————————————————————————————————————————*/
        .wrap:hover .box {
            -webkit-transform: rotateX(180deg);
        }
    </style>
</head>

<body>
    <div class="wrap">
        <div class="box">
            <!-- 正方体的六个面 -->
            <div>1</div>
            <div>2</div>
            <div>3</div>
            <div>4</div>
            <div>5</div>
            <div>6</div>
        </div>
    </div>
</body>

</html>
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐