javascript - 如何在表盘上一一涂色

标签 javascript jquery html css

我制作了小米时钟作为练习,但有一个问题,我无法制作彩色表盘。 我想在表盘上一个一个散布白色,它和三 Angular 形一起在表盘后面减少不透明度。

这是我想要实现的 IMG :- image of my clock

视频:- https://vimeo.com/262815342

Codepen

var clock = "";

for(var i = 0; i < 360; i++){
	clock += "<div id='dials'><div id='cutline'></div></div>";
}
//clock += "<div id='circle'></div>";
clock += "<div id='dot'></div>";
clock += "<div id='mline'></div>";
clock += "<div id='hline'></div>";
clock += "<div id='tringleM'><div id='tringle'></div><div class='shadow'></div></div>";

document.getElementById('container').innerHTML = clock;

for (var i = 1; i <= 360; i++) {
	document.querySelector('#dials:nth-child('+i+')').style.transform = "rotate("+ (i-1) +"deg)";
}

/* Real Time Clock */
var hour, min, lol, lol1, lol2, second;

second = moment().second() * 6;

setInterval( function(){ 
//var min = moment().minutes()
//console.log("min:-"+min);
hour = moment().hours();
//console.log("hour:-"+hour);
//var time = moment();
//console.log(time);
min = moment().minutes() * 6;
//console.log(min);
hour = moment().hours() % 12 / 12 * 360 + (min / 12);
//console.log(hour);
lol = document.getElementById('mline').style.transform = "rotate("+ ( 180 + min ) + "deg)";
//console.log(lol);
lol1 = document.getElementById('hline').style.transform = "rotate("+ ( 180 + hour ) + "deg)";
//console.log(lol1);

}, 1000);


setInterval(function(){
	second++;
	lol2 = document.getElementById('tringleM').style.transform = "rotate("+ (180 + second ) + "deg)";
}, (60/360)*1000);
body{
  background-color: white;
}
#container{
  position: relative;
  width: 420px;
  height: 420px;
  padding: 10px;
  background-color: #4682B4;
  transform: scale(1.44);
  transform-origin: 0 0;
}
#dials{
  position: absolute;
  top: 40px;
  left: 50%;
  width: 1px;
  height: 180px;
  transform-origin: bottom center;
}
#cutline{
  background-color: white;
  width: 1px;
  height: 20px;
  opacity: 0.5;
}
#img{
  position: absolute;
  top: 15px;
  left: 20px;
  width: 600px;
}
#circle{
  width: 300px;
  height: 300px;
  border-radius: 50%;
  position: absolute;
  top: calc(50% - 150px);
  left: calc(50% - 150px);
  border: 1px solid white;
}
#dot{
  width: 10px;
  height: 10px;
  border-radius: 50%;
  position: absolute;
  margin: -10px;
  left: 50%;
  top: 50%;
  border: 5px solid white;
  background: #4682B4;
  z-index: 1001;
}
#mline, #hline{
  position: absolute;
  top: calc(50% - 1px);
  left: calc(50% - 1px);
  width: 2px;
  height: 140px;
  background-color: white;
  transform-origin: top center;
  transform: rotate(180deg);
}
#hline{
  height: 70px;
  opacity: 0.6;
}
#tringle{
  width: 0;
  height: 0;
  position: absolute;
  top: 100%;
  border-left: 8px solid transparent;
  border-right: 8px solid transparent;
  border-top: 8px solid white;
}
/*.shadow{
  height: 20px;
  width: 50px;
  position: absolute;
  bottom: -40%;
  left: calc(50% - 25px);
  transform-origin: top center;
  transform: rotate(180deg);
  background: red;
}*/
#tringleM{
  width: 20px;
  height: 140px;
  position: absolute;
  top: 50%;
  left: calc(50% - 10px);
  transform-origin: top center;
  transform: rotate(180deg);
  transition: all 1s;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"></script>
<div id="container"></div>
<img id="img" src="/image/t7EkM.png">

最佳答案

这是一个想法,通过添加/删除一个会增加不透明度的类:

更新

编辑代码以使用 span 而不是 div 这样我就可以毫无问题地轻松使用 nth-of-type (如 nth-child 由于其他元素而无法正常工作)

var clock = "";

for(var i = 0; i < 360; i++){
	clock += "<span id='dials'><div id='cutline'></div></span>";
}
//clock += "<div id='circle'></div>";
clock += "<div id='dot'></div>";
clock += "<div id='mline'></div>";
clock += "<div id='hline'></div>";
clock += "<div id='tringleM'><div id='tringle'></div><div class='shadow'></div></div>";

document.getElementById('container').innerHTML = clock;

for (var i = 1; i <= 360; i++) {
	document.querySelector('#dials:nth-child('+i+')').style.transform = "rotate("+ (i-1) +"deg)";
}

/* Real Time Clock */
var hour, min, lol, lol1, lol2, second;

second = moment().second() * 6;

setInterval( function(){ 
//var min = moment().minutes()
//console.log("min:-"+min);
hour = moment().hours();
//console.log("hour:-"+hour);
//var time = moment();
//console.log(time);
min = moment().minutes() * 6;
//console.log(min);
hour = moment().hours() % 12 / 12 * 360 + (min / 12);
//console.log(hour);
lol = document.getElementById('mline').style.transform = "rotate("+ ( 180 + min ) + "deg)";
//console.log(lol);
lol1 = document.getElementById('hline').style.transform = "rotate("+ ( 180 + hour ) + "deg)";
//console.log(lol1);


}, 1000);


setInterval(function(){
	second++;
	lol2 = document.getElementById('tringleM').style.transform = "rotate("+ (180 + second ) + "deg)";
  document.querySelector('#container span:nth-of-type('+((second-5)%360 +1)+') #cutline').classList.add('one');
  document.querySelector('#container span:nth-of-type('+((second -30 + 360)%360 +1)+') #cutline').classList.remove('one');
  
}, (60/360)*1000);
body{
  background-color: white;
}
#container{
  position: relative;
  width: 420px;
  height: 420px;
  padding: 10px;
  background-color: #4682B4;
  transform: scale(1.44);
  transform-origin: 0 0;
}
#dials{
  position: absolute;
  top: 40px;
  left: 50%;
  width: 1px;
  height: 180px;
  transform-origin: bottom center;
}
#cutline{
  background-color: white;
  width: 1px;
  height: 20px;
  opacity: 0.5;
  transition:1s;
}
#cutline.one {
  opacity:1;
  transition:0s;
}
#img{
  position: absolute;
  top: 15px;
  left: 20px;
  width: 600px;
}
#circle{
  width: 300px;
  height: 300px;
  border-radius: 50%;
  position: absolute;
  top: calc(50% - 150px);
  left: calc(50% - 150px);
  border: 1px solid white;
}
#dot{
  width: 10px;
  height: 10px;
  border-radius: 50%;
  position: absolute;
  margin: -10px;
  left: 50%;
  top: 50%;
  border: 5px solid white;
  background: #4682B4;
  z-index: 1001;
}
#mline, #hline{
  position: absolute;
  top: calc(50% - 1px);
  left: calc(50% - 1px);
  width: 2px;
  height: 140px;
  background-color: white;
  transform-origin: top center;
  transform: rotate(180deg);
}
#hline{
  height: 70px;
  opacity: 0.6;
}
#tringle{
  width: 0;
  height: 0;
  position: absolute;
  top: 100%;
  border-left: 8px solid transparent;
  border-right: 8px solid transparent;
  border-top: 8px solid white;
}
/*.shadow{
  height: 20px;
  width: 50px;
  position: absolute;
  bottom: -40%;
  left: calc(50% - 25px);
  transform-origin: top center;
  transform: rotate(180deg);
  background: red;
}*/
#tringleM{
  width: 20px;
  height: 140px;
  position: absolute;
  top: 50%;
  left: calc(50% - 10px);
  transform-origin: top center;
  transform: rotate(180deg);
  transition: all 1s;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.0/moment.min.js"></script>
<div id="container"></div>
<img id="img" src="/image/t7EkM.png">

关于javascript - 如何在表盘上一一涂色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49612176/

相关文章:

javascript - 谷歌地图对象的 JSON.stringify

JavaScript:在单击单个按钮时显示多个 Div

javascript - 通过 JQuery AJAX/javascript 发送表单数据

javascript - 全局onBlur/onFocus

javascript - 下一个上一个图标在 Owl Carousel 2 中不起作用

html - 如何居中让四张图片彼此居中(Bootstrap)

javascript - Django + 服务 worker : "a redirected response was used for a request whose redirect mode is not follow" error

javascript - 如何禁止点击链接也调用与其父容器 Hook 的 JavaScript 事件?

html - 如何让我的html网站的背景横跨整个页面的宽度?

HTML div 不包装 <i> 标签