每天学一个jquery插件- 做时间选择2

每天学个jquery插件- 做时间选择2

做时间选择2

就着昨天的想法来,算是实现关键动作的功能了,因为没自己计算中间的算数,完全是按照现有规则试了几次把中间的计算混过去了,啊哈,最有意思的还是又搞懂几个css的妙用,啊哈

效果如下
在这里插入图片描述

代码部分

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>做时间选择</title>
		<script src="js/jquery-3.4.1.min.js"></script>
		<script src="js/zsjxz.js"></script>
		<link href="css/zsjxz.css" type="text/css" rel="stylesheet" />
		<style>
			*{
     
     
				margin: 0px;
				padding: 0px;
				user-select: none;
			}
			.box{
     
     
				border: 1px solid lightgray;
				width: 200px;
				height: 200px;
				margin: 20px;
				position: relative;
				display: flex;
				justify-content: center;
				align-items: center;
			}
			.container{
     
     
				position: absolute;
				width: 100%;
				height: 25px;
				pointer-events: none;
			}
			.item{
     
     
				position: absolute;
				height: 100%;
				right: 0px;
				width: 25px;
				border-radius: 50%;
				background-color: lightgray;
				display: flex;
				justify-content: center;
				align-items: center;
				font-size: 12px;
				position: absolute;
				pointer-events: all;
			}
			.container.small{
     
     
				width:70%;
			}
			#main{
     
     
				margin: 100px;
			}
			#head{
     
     
				position: absolute;
				border: 1px solid lightgray;
				width: 100%;
				height: 50px;
				top: -50px;
				display: flex;
			}
			.bold{
     
     
				font-weight: bold;
				display: flex;
				justify-content: center;
				align-items: center;
			}
			#theh,#them{
     
     
				flex: 2;
			}
			#theh:hover,#them:hover{
     
     
				background-color:lightgray;
				cursor: pointer;
			}
			#thepoint{
     
     
				flex: 1;
			}
			.item{
     
     
				cursor: pointer;
				z-index: 999;
			}
			.item:hover{
     
     
				background-color: gray;
				color: white;
			}
			.stopclick{
     
     
				pointer-events: none;
			}
		</style>
	</head>
	<body>
		<!-- 一个画小时圆盘一个画分钟的 -->
		<div class="box" id="hh"></div>
		<div class="box" id="mm"></div>
		<div class="box" id="main">
			<div id="head">
				<div id="theh" class="bold">00</div>
				<div id="thepoint" class="bold">:</div>
				<div id="them" class="bold">00</div>
			</div>
		</div>
	</body>
</html>
<script>
	$(function(){
     
     
		var $theh = $("#theh");
		var $them = $("#them");
		var $main = $("#main")
		//点击那个盘就往对应dom里面渲染啥盘
		$theh.click(function(){
     
     
			$main.attr("data-type",'hh')
			drawh($main)
		})
		$them.click(function(){
     
     
			$main.attr("data-type",'mm')
			drawm($main)
		})
		//时钟盘点了那个按钮就把对应时间改了
		$main.on('click','.item',function(){
     
     
			var tt = $(this).text();
			var type = $main.attr("data-type")
			if(type=="hh"){
     
     
				$theh.text(tt)
			}else{
     
     
				$them.text(tt)
			}
		})
		//时钟盘同样,但是分为点击和拖动,点击的直接在上面实现了,这里实现拖拽
		$main.mousedown(function(){
     
     
			this.flag = true;
		}).mouseup(function(){
     
     
			this.flag=false;
			$main.find(".item").removeClass('stopclick');
		}).mousemove(function(e){
     
     
			var type = $main.attr("data-type");
			if(this.flag&&type=="mm"){
     
     
				//假如符合条件就开始获取鼠标的移动的offset,但是在此之前屏蔽掉item的干扰
				$main.find(".item").addClass('stopclick');
				var x = e.offsetY;
				var y = e.offsetX;
				//因为一开始就知道这个容器的高宽各200不是嘛,所以中心点自然就是100,100
				//然后开始计算角度,校对一个比例,就能算出当前是哪个刻度了,以00为零度,顺时针给转起来,tan计算起来只有±180,所以这里要做一个判断的
				var temp = Math.atan2((y-100),(x-100))/0.017453292;
				temp = temp<0?360-Math.abs(temp):temp;
				temp = (360-temp+180)%360;
				temp = parseInt(temp.toFixed(0));
				var result = parseInt((60/360)*temp)
				$them.text(result);
			}else{
     
     
				$main.find(".item").removeClass('stopclick');
			}
		})
		
		var $hh = $("#hh");
		var $mm = $("#mm");
		//画时钟盘
		const c1 = 360/12;
		const c2 = 360/13
		drawh($hh)
		function drawh($dom){
     
     
			$dom.find(".container").remove();
			for(var i = 0;i<25;i++){
     
     
				if(i<12){
     
     
					var $container = $("<div class='container small'></div>");
					var $item = $("<div class='item'>"+i+"</div>");
					$item.appendTo($container)
					$container.appendTo($dom)
					$container.css("transform","rotate("+(c1*(i-3))+"deg)")
					$item.css("transform","rotate("+(-c1*(i-3))+"deg)")
				}else{
     
     
					var $container = $("<div class='container'></div>");
					var $item = $("<div class='item'>"+i+"</div>");
					$item.appendTo($container)
					$container.appendTo($dom)
					$container.css("transform","rotate("+(c2*(i-3))+"deg)")
					$item.css("transform","rotate("+(-c2*(i-3))+"deg)")
				}
			}
		}
		drawm($mm)
		//画分钟盘,秒盘同理
		function drawm($dom){
     
     
			$dom.find(".container").remove();
			for(var i = 0;i<60;i++){
     
     
				if(i%5==0){
     
     
					var index= i.toString().length<=1?"0"+i.toString():i.toString();
					var $container = $("<div class='container'></div>");
					$container.appendTo($dom)
					var $item = $("<div class='item'>"+index+"</div>");
					$item.appendTo($container);
					$container.css("transform","rotate("+(c1*((i/5)-3))+"deg)")
					$item.css("transform","rotate("+(-c1*((i/5)-3))+"deg)")
				}
			}
		}
	})
</script>

思路如下

  • 就着昨天渲染表盘的动作继续,这里面有几个点昨天没想清楚,今天又弄明白一点,因为我需要点击的item是放在辅助容器的container里面的,因为是用了旋转,并且会覆盖住,让items无法被点击
  • 这就很烦,我之前倒是通过确定旋转的起点,把一根柱子中心旋转变成一条边的中心旋转甩一圈,这样子就不会覆盖住前面一个的容器了,但是我的内容只转了一个周期还好,但是假如像这个表中的小时选择,我转了两圈,那咋办,总会被盖住
  • 所以后面想到了pointer-event:none这个属性,直接让这个容器不能触发任何事件,把它变成一个无情的布局工具就行了,然后给里面的item又给回all,这样子就能点击了!
  • 然后就是在做分钟的拖拽根据角度的变化这里,两个点是可以计算出一个正切值的,所以我用上次记下来的公式直接计算了结果,然后东拼西凑,把一开始的±180变成了输出结果为0-360的角度,并且把角度和表盘的对上了,这样子就可以直接计算出对应角度下的分钟的刻度值了,具体看代码
  • 完事,碎觉~

猜你喜欢

转载自blog.csdn.net/weixin_44142582/article/details/114682901
今日推荐