一个非常炫酷的滑动调节效果,去领克4S店的收获!

371 阅读1分钟

简单说两句

成都最近的天气一直飘雨,周末陪朋友去火车南站领克4S看车,我看车一般会注重车的音箱效果(领克用的infi的高级货),一上去就打开收音机,职业习惯又冒出来了,这个车机的切换效果是我见过非常有趣的。回来的路上一直在想这个咋做的呢?手啊,就一直洋洋,终于经过几个小时的折腾,终于做出一个差不多了,供大家学习参考!!!

大家先看效果

直接上代码(小伙伴可以直接拷出来运行!)

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style>
		body {
			overflow: hidden;
		}
		*,
		*:before,
		*:after {
			box-sizing: border-box;
			margin: 0;
			padding: 0;
			border: 0;
			font: inherit;
			vertical-align: baseline;
		}
		.ruller {
			position: absolute;
			width: 1082px;
			top: 100px;
			display: flex;
			justify-content: space-between;
			padding: 0 1px;
			;
			left: 50%;
			transform: translateX(-50%);
		}
		.time-cursor {
			position: absolute;
			z-index: 2;
			top: -29px;
			left: -22px;
			width: 48px;
			height: 48px;
			background-image: linear-gradient(-180deg, #FFFFFF 3%, #DBD6D0 100%);
			border-radius: 50%;
			cursor: grab;
			color: red
		}
		.time-cursor:before {
			content: "";
			position: absolute;
			top: 53px;
			left: 23px;
			display: block;
			width: 1px;
			height: 50px;
			background-color: #F64E4D;
		}
		.time-cursor input {
			pointer-events: none;
			position: relative;
			z-index: 1;
			width: 48px;
			height: 48px;
			color: currentColor;
			font-weight: 600;
			background-color: transparent;
			border-radius: 50%;
			text-align: center;
			font-size: 15px;
			transform: translateZ(0);
		}
		.line {
			width: 1px;
			height: 12px;
			background-color: currentColor;

		}
		.line:not(:last-child) {
			margin-right: 3px;
		}

		.line:nth-child(9n+2) {
			height: 20px;
		}

		.line:nth-child(90n+2) {
			height: 32px;
		}
	</style>
</head>

<body>
	<div class="ruller">
		<div class="time-cursor color-red" style="transform: translateY(0px) translateX(403.11px) translateZ(0px);">
			<input value="1">
		</div>
	</div>
</body>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
<script>
	let $ = selector => document.querySelector.call(document, selector)
	var cache = document.createDocumentFragment();
	var lineArr = [],//所有线的数组
		drapping = false,
		initTranx = 50;//初始化input显示的值

	var $ruller = $(".ruller"), $timeCursor = $(".time-cursor"), $input = $(".time-cursor input")
	// 初始化标尺
	for (var i = 0; i <= 270; i++) {
		var div = document.createElement("div");
		div.classList.add("line");
		lineArr.push(div);//添加到缓存数组
		cache.appendChild(div)
	}
	$ruller.appendChild(cache)

	// 获取标尺的左边距离 和 宽度 。
	var { left, width } = $ruller.getBoundingClientRect();
	var { width: widthCursor } = $timeCursor.getBoundingClientRect();
	//初始化滑动
	$timeCursor.setAttribute("style", `transform:translate3d(${initTranx * 4}px,0px,0px)`)
	setLines(lineArr, initTranx)
	$input.value = initTranx
	//设置默认线的偏移
	function setLines(lineArr, initTranx) { // 线的数组,初始化

		var index = Math.min(~~(initTranx), 270); //当前的索引
		let step = 0; // 计步器 ,
		//从 当前的 索引的前12个开始,到当前索引的后12个, 比如从 38 - 62 区间 
		for (let i = index - 12, len = Math.min(index + 12, 270); i <= len; i++) {
			var tranYY = (Math.sin(step) * 24).toFixed(3);
			if (lineArr[i]) {
				lineArr[i].setAttribute("style", `transform:translate3d(0px,${tranYY}px,0px)`)
			}
			step += 0.1308 // 3.14/24 就是把PI分为 24 分 
		}
	}

	$timeCursor.addEventListener("mousedown", function (event) {
		event.preventDefault();
		var offsetX = event.offsetX; //鼠标距离当前节点的左偏移
		var cursor = this;
		this.style.cursor = "grabbing"

		let move = _.throttle(function (event) {
			event.preventDefault();
			event.stopPropagation()
			if (drapping) return
			drapping = true
			var delta = event.clientX - left - (offsetX - widthCursor / 2); //中心点距离左边的偏移量
			var deltaW = Math.max(0, Math.min(width, delta))
			cursor.setAttribute("style", `transform:translate3d(${deltaW}px,0px,0px)`)
			var index = Math.max(0, Math.min(~~(delta / 4), 270));
			let step = 0;
			for (let i = -12; i <= 270; i++) {
				if (i >= index - 12 && i <= Math.min(index + 12, 270)) {
					var tranYY = (Math.sin(step) * 24).toFixed(3);
					if (lineArr[i]) {
						lineArr[i].setAttribute("style", `transform:translate3d(0,${tranYY}px,0)`)
					}
					step += 0.1308
				} else {
					if (i > 0 && lineArr[i].getAttribute("style") != 'transform:translate3d(0,0,0)') {
						lineArr[i].setAttribute("style", `transform:translate3d(0,0,0)`)
					}

				}
			}
			drapping = false
			$input.value = index
		}, 0, { leading: false })
		document.addEventListener("mousemove", move, false)
		document.addEventListener("mouseup", function () {
			drapping = false
			$timeCursor.style.cursor = "grab"
			document.removeEventListener("mousemove", move, false)
		}, false)

	}, false)

</script>

</html>
 

我把代码运行的效果给大家贴出来!

20230715_171645.gif

这个案例对于正在学习DOM操作的小伙伴是一个非常棒的练习项目!!!