旋转、跳跃
效果:

思路:
不想分析了,能用就行
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="shortcout icon" href="#" />
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
.wrap {
position: relative;
margin: 20px;
width: 300px;
height: 300px;
border-radius: 50%;
background-color: antiquewhite;
transform: rotate(-10deg);
transition: transform 0.25s linear;
}
.common {
list-style-type: none;
position: absolute;
top: 0;
left: 50%;
width: 50px;
height: 50px;
transform-origin: 0 150px;
}
.common .image {
width: 50px;
height: 50px;
border-radius: 50%;
}
</style>
<body>
<ul class="wrap">
<li class="common" onclick="rotateImg(0)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(1)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(2)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(3)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(4)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(5)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(6)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(7)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(8)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(9)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(10)"><div class="image"></div></li>
<li class="common" onclick="rotateImg(11)"><div class="image"></div></li>
</ul>
<script>
let wrap = document.getElementsByClassName('wrap')[0];
let common = document.getElementsByClassName('common');
let image = document.getElementsByClassName('image');
let bgc = ["#ad6598","#c27c88","#4f383e","#de7897","#681752","#61649f","#66a9c9","#cdd1d3","#83a78d","#e4bf11","#f8e0b0","#cf7543"]
Array.prototype.forEach.call(image, (ele, index) => {
ele.style.background = `${bgc[index]}`;
});
Array.prototype.forEach.call(common, (ele, index) => {
let rotateAngle = index * 30;
ele.style.transform = 'rotate(' + rotateAngle + 'deg)';
ele.childNodes[0].style.transform = 'rotate(' + (-rotateAngle + 10) + 'deg)';
});
let currentIndex = 0;
let inial = 10; //旋转初始角度
function rotateImg(index) {
if (index == currentIndex) return;
let currentRoate = index * 30;
let gap = 360 - currentRoate - 10;
currentIndex = index;
wrap.style.transform = 'rotate(' + gap + 'deg)';
Array.prototype.forEach.call(image, function (ele, i) {
ele.style.transform = 'rotate(' + (360 - gap - i * 30) + 'deg)';
});
}
let startx, starty, endx, endy;
//滑动
wrap.addEventListener('touchstart', (e) => {
startx = e.touches[0].pageX;
starty = e.touches[0].pageY;
});
wrap.addEventListener('touchend', (e) => {
endx = e.changedTouches[0].pageX;
endy = e.changedTouches[0].pageY;
//判断滑动
let dx = startx - endx;
let dy = starty - endy;
if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {
return;
}
let nextIndex = 0;
//判断旋转方向
let angle = (Math.atan2(dy, dx) * 180) / Math.PI;
if (angle >= -45 && angle < 45) {
//右滑动
nextIndex=(currentIndex+1)%12;
}else if((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)){
//左滑动
nextIndex=(currentIndex-1)%12;
}
rotateImg(nextIndex);
});
</script>
</body>
</html>

浙公网安备 33010602011771号