純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混合實現方法就多種多樣了,暫不討論了。
