好看的JQ时钟界面

<style>
@import url("https://fonts.googleapis.com/css?family=Roboto+Mono:300,500");
body {
  width: 100vw;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  background: #333;
  transition: 0.4s;
  font-family: "Roboto Mono", monospace;
  font-weight: 300;
}

.clock {
  position: relative;
  display: flex;
  flex-flow: column wrap;
  width: 280px;
  height: 100px;
}

.block {
  width: calc(100% / 12);
  height: 20%;
  color: #474747;
  transition: 0.4s;
}
.block:not(:nth-child(n + 16)):nth-child(n + 11), .block:not(:nth-child(n + 46)):nth-child(n + 41) {
  margin-right: 10px;
}
.block:not(:nth-child(n + 31)):nth-child(n + 26) {
  margin-right: 20px;
}
.block:before {
  content: attr(data-num);
  position: relative;
  display: block;
  font-size: 16px;
  width: 100%;
  height: 100%;
  line-height: 20px;
  text-align: center;
}
.block:nth-child(-n + 10):before {
  content: "0" attr(data-num);
}
.block.active:before {
  color: whitesmoke;
  font-weight: 500;
}
.block.second:before {
  color: #FF8300;
}

.divider {
  position: absolute;
  width: 2px;
  background-color: whitesmoke;
  height: 60%;
  top: 20%;
  left: calc(50% + 19px);
}

body.light-theme {
  background: #e6e6e6;
}
body.light-theme .block {
  outline: 1px solid #dfdfdf;
  color: #acacac;
}
body.light-theme .block.active:before {
  color: #333;
}
body.light-theme .block.second {
  background: #d4d4d4;
}
body.light-theme .block.second:before {
  color: #333;
}
body.light-theme .divider {
  background: #333;
}

.switch-theme {
  position: absolute;
  bottom: 40px;
  right: 40px;
  color: grey;
}

.switch {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 34px;
  margin-left: 30px;
}
.switch input {
  display: none;
}

.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: #ccc;
  transition: 0.4s;
  border-radius: 34px;
}
.slider:before {
  position: absolute;
  content: "";
  height: 26px;
  width: 26px;
  left: 4px;
  bottom: 4px;
  background-color: white;
  transition: 0.4s;
  border-radius: 50%;
}

input:checked + .slider {
  background-color: #333;
}

input:focus + .slider {
  box-shadow: 0 0 1px #2196F3;
}

input:checked + .slider:before {
  -webkit-transform: translateX(26px);
          transform: translateX(26px);
}
</style>
<body>
<div class="series-menu"></div>
<div class="clock">
  <div class="block" data-num="0"></div>
  <div class="block" data-num="1"></div>
  <div class="block" data-num="2"></div>
  <div class="block" data-num="3"></div>
  <div class="block" data-num="4"></div>
  <div class="block" data-num="5"></div>
  <div class="block" data-num="6"></div>
  <div class="block" data-num="7"></div>
  <div class="block" data-num="8"></div>
  <div class="block" data-num="9"></div>
  <div class="block" data-num="10"></div>
  <div class="block" data-num="11"></div>
  <div class="block" data-num="12"></div>
  <div class="block" data-num="13"></div>
  <div class="block" data-num="14"></div>
  <div class="block" data-num="15"></div>
  <div class="block" data-num="16"></div>
  <div class="block" data-num="17"></div>
  <div class="block" data-num="18"></div>
  <div class="block" data-num="19"></div>
  <div class="block" data-num="20"></div>
  <div class="block" data-num="21"></div>
  <div class="block" data-num="22"></div>
  <div class="block" data-num="23"></div>
  <div class="block" data-num="24"></div>
  <div class="block" data-num="25"></div>
  <div class="block" data-num="26"></div>
  <div class="block" data-num="27"></div>
  <div class="block" data-num="28"></div>
  <div class="block" data-num="29"></div>
  <div class="block" data-num="30"></div>
  <div class="block" data-num="31"></div>
  <div class="block" data-num="32"></div>
  <div class="block" data-num="33"></div>
  <div class="block" data-num="34"></div>
  <div class="block" data-num="35"></div>
  <div class="block" data-num="36"></div>
  <div class="block" data-num="37"></div>
  <div class="block" data-num="38"></div>
  <div class="block" data-num="39"></div>
  <div class="block" data-num="40"></div>
  <div class="block" data-num="41"></div>
  <div class="block" data-num="42"></div>
  <div class="block" data-num="43"></div>
  <div class="block" data-num="44"></div>
  <div class="block" data-num="45"></div>
  <div class="block" data-num="46"></div>
  <div class="block" data-num="47"></div>
  <div class="block" data-num="48"></div>
  <div class="block" data-num="49"></div>
  <div class="block" data-num="50"></div>
  <div class="block" data-num="51"></div>
  <div class="block" data-num="52"></div>
  <div class="block" data-num="53"></div>
  <div class="block" data-num="54"></div>
  <div class="block" data-num="55"></div>
  <div class="block" data-num="56"></div>
  <div class="block" data-num="57"></div>
  <div class="block" data-num="58"></div>
  <div class="block" data-num="59"></div>
  <div class="divider"></div>
</div>
<div class="switch-theme">
  <p>Change theme</p>
  <label class="switch">
    <input type="checkbox" onchange="changeTheme(event)"/><span class="slider"></span>
  </label>
</div>
</body>
<script>
const numbers = [
	[1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1], // 0
	[1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1], // 1
	[1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1], // 2
	[1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1], // 3
	[1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1], // 4
	[1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1], // 5
	[1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1], // 6
	[1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0], // 7
	[1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1], // 8
	[1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1]  // 9
];

const blocks = [];
const digits = Array.from(document.querySelectorAll('.block'));

for (let i = 0; i < 4; i++) {
	blocks.push(digits.slice( i * 15, i * 15 + 15 ));
}

const setNum = (block, num) => {
	let n = numbers[num];
	for (let i = 0; i < block.length; i++) {
		 block[i].classList[ n[i] === 1 ?  'add' : 'remove']('active');
	}
};

const time = {
	s: '',
	m: '',
	h: '',
	p: null
};

// time loop
const animator = () => {
	let d = new Date(),
		 h = d.getHours().toString(),
		 m = d.getMinutes().toString(),
		 s = d.getSeconds().toString();
	
	s = s.length === 1 ? '0' + s : s;
	m = m.length === 1 ? '0' + m : m;
	h = h.length === 1 ? '0' + h : h;
	
	if (s !== time.s) {
		for (let i = 0; i < digits.length; i++) {
			let d = digits[i];
			if (i === +s) {
				d.classList.add('second');
				if (time.p !== null)
					digits[time.p].classList.remove('second');
				time.p = i;
				time.s = s;
			}
		}
	}
	
	if (m !== time.m) {
		setNum(blocks[2], m[0]);
		setNum(blocks[3], m[1]);
		time.m = m;
	}
	
	if (h !== time.h) {
		setNum(blocks[0], h[0]);
		setNum(blocks[1], h[1]);
		time.h = h;
	}
 	window.requestAnimationFrame(animator)
}

// init
window.requestAnimationFrame(animator)

// toggle button

const body = document.querySelector('body');
changeTheme = ev => {
	body.classList.toggle('light-theme');
};</script>

</body>
</html>

代码虽然简单,但配色各方面还是有不少值得我们学习的!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值