js和css分別實現元素曲線運動


純js實現原理:

通過函數表達式來完成對應的移動,函數表達式能夠得到曲線圖都能完成。

比如 y=sin(x)就是典型的曲線函數。

轉換關系y:函數Y軸對應的就是我們的top      Y==top

轉換關系x:函數X軸對應的就是我們的left      X==left

示例:(由於是js,順帶畫了運動軌跡)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js元素弧線運動</title>
    <style>
        .box{
            width: 1000px;
            height: 500px;
            background-color:#369;
            position:relative;
        }
        .box>span{
            display: block;
            width: 10px;
            height: 10px;
            background-color:#963;
            position:absolute;
            top:230px
        }
        .box>.zz{
            width: 3px;
            height: 3px;
            background-color:red;
            position:absolute;
        }
    </style>
</head>
<body>
<div class="box">
    <span></span>
</div>
 
<script>
    (function(){
        var boxDom = document.querySelector('.box');
		var spanDom = document.querySelector('.box>span');
        setInterval(function(){//定時器
            var nDom = document.createElement('span');
            nDom.classList.add('zz');//運動軌跡
            var left = spanDom.offsetLeft;
            var top = spanDom.offsetTop;
            left += 1;
            top = Math.sin(left/25)*100 + 230;//由於sinx是在正負1大小變化的我們這里放大了X和Y
            spanDom.style.left = left+'px';
            spanDom.style.top = top+'px';
            nDom.style.left = left+'px';
            nDom.style.top = top+'px';
            boxDom.appendChild(nDom);//添加運動軌跡
        },50)
    })()
</script>
</body>
</html>

  結果圖:

 

純css實現原理:

通過animation動畫屬性加上貝塞爾曲線來控制元素xy運動軌跡即可完成,具體運動軌跡通過貝塞爾曲線函數控制。

animation應該都用過,這里主要說一下貝塞爾曲線。

cubic-bezier稱為三次貝塞爾曲線,主要是生成速度曲線的函數。

其實大家也用過,平時的ease-in,ease-out,linear等都是通過貝塞爾曲線分裝好的函數

示例:(示例通過控制父容器和子元素,賦予了子元素X和Y的運動速度,達到曲線移動效果)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js元素弧線運動</title>
    <style>
		.cont{
			width: 400px;
            height: 400px;
            border: 2px solid #ff8800;
		}
		/* 父容器軌跡 */ 
        .box{
            width: 30px;
            height: 30px;
            background-color:#369;
			/* animation: aa 2s ease-in forwards;*/
			animation: aa 2s cubic-bezier(0.42,0,1,1) forwards;
        }
		/* 子元素軌跡 */ 
        .box>span{
            display: block;
            width: 30px;
            height: 30px;
            background-color:#963;
			/* animation: bb 2s ease-out forwards;*/
			animation: bb 2s cubic-bezier(0,0,0.58,1) forwards;
        }
		@keyframes aa {
            to{transform: translateX(370px)}
        }
        @keyframes bb {
            to{transform: translateY(370px)}
        }
    </style>
</head>
<body>
<div class="cont">
	<div class="box">
		<span></span>
	</div>
</div>
<script>
</script>
</body>
</html>

  效果圖:圖示藍色塊為父容器,只有一個運動狀態,棕色塊有兩個方向運動狀態。

 

js+css混合實現方法就多種多樣了,暫不討論了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM