最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用JavaScript實現一個炫酷的羅盤時鐘

 更新時間:2024年02月18日 14:48:58   作者:葉落風塵  
在探究前端動畫時,想到之前在鎖屏壁紙看到的羅盤時鐘,看著很是炫酷,于是說干就干,下面就跟隨小編一起來學習一下如何使用JS實現一個炫酷的羅盤時鐘效果吧

前言

在探究前端動畫時。想到之前在鎖屏壁紙看到的羅盤時鐘,看著很是炫酷,于是說干就干,一起來研究下怎么用簡單的方法實現這個炫酷的效果。 需要源碼的小伙伴可到文章結尾直接復制使用。

先上效果圖:

實現思路

(1)首先我們需要定義一系列的月、日、時、分、秒的數組,用來展示羅盤不同圓環(huán)上的數字

var monthText = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"];
		var dayText = ["一日", "二日", "三日", "四日", "五日", "六日", "七日", "八日", "九日", "十日", "十一日", "十二日", "十三日", "十四日", "十五日", "十六日"
			, "十七日", "十八日", "十九日", "二十日", "二十一日", "二十二日", "二十三日", "二十四日", "二十五日", "二十六日", "二十七日", "二十八日", "二十九日", "三十日", "三十一日"];
var weekText = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
var hourText = ["零時", "一時", "二時", "三時", "四時", "五時", "六時", "七時", "八時",
			"九時", "十時", "十一時", "十二時", "十三時", "十四時", "十五時", "十六時", "十七時", "十八時", "十九時", "二十時", "二十一時", "二十二時", "二十三時"];

....

(2)通過循遍歷使用將這些數據生成dom節(jié)點放到html中

(3)通過setInterval循環(huán)運行,實時計算改變時分秒位置

開始實現

(1)定義基礎dom結構

<body>
    <div id="clock"></div>
</body>

(2)循環(huán)遍歷已定義的月、日、時、分、秒數組,通過document.createElement在clock下創(chuàng)建節(jié)點,并將創(chuàng)建的節(jié)點保存到textSet中,方便后面直接修改該dom的樣式。

//循環(huán)遍歷初始化數據
function init() {
    clock = document.getElementById('clock');
    for (var i = 0; i < textSet.length; i++) {
        for (var j = 0; j < textSet[i][0].length; j++) {
            var temp = createLabel(textSet[i][0][j]);
            clock.appendChild(temp);
            textSet[i][1].push(temp);
        }
    }
    clock.style.transform = "rotate(90deg)";
}

//創(chuàng)建子節(jié)點
function createLabel(text) {
        var div = document.createElement('div');
        div.classList.add('label');
        div.innerText = text;
        return div;
}

(3)計算每一層每一個節(jié)點的位置,首先獲取當前時間,為了保證當前時間始終處于平行位置,所以需要計算其他值相對于當前位置的偏移角度,以及他們相對的X、Y的位置。計算每一層圓半徑的長度,通過Math.sinMath.cos,以及獲取頁面寬和高定位到圓中心點就能得到每一個點的絕對位置。具體可以查看下面代碼解析。

function runTime() {
    //獲取當前時間
    var now = new Date();
    var month = now.getMonth();
    var day = now.getDate();
    var week = now.getDay();
    var hour = now.getHours();
    var minute = now.getMinutes();
    var seconds = now.getSeconds();
    var nowValue = [month, day - 1, week, hour, minute, seconds];
    initStyle();

    //當前年月日時高亮
    for (var i = 0; i < nowValue.length; i++) {
            var num = nowValue[i];
            textSet[i][1][num].style.color = '#fff';
    }
    //計算圓中心位置
    var widthMid = document.body.clientWidth / 2;
    var heightMid = document.body.clientHeight / 2;
    for (var i = 0; i < textSet.length; i++) {
        for (var j = 0; j < textSet[i][0].length; j++) {
            //計算每一層的圓半徑
            var r = (i + 1) * 35 + 50 * i;
            //計算旋轉角度
            var deg = 360 / textSet[i][1].length * (j - nowValue[i]);
            //計算絕對位置
            var x = r * Math.sin(deg * Math.PI / 180) + widthMid;
            var y = heightMid - r * Math.cos(deg * Math.PI / 180);
            //改變每一個節(jié)點的位置
            var temp = textSet[i][1][j];
            temp.style.transform = 'rotate(' + (-90 + deg) + 'deg)';
            temp.style.left = x + 'px';
            temp.style.top = y + 'px';
        }
    }
}

//還原所有的默認樣式
function initStyle() {
    var label = document.getElementsByClassName('label');
    for (var i = 0; i < label.length; i++) {
        label[i].style.color = '#4d4d4d';
    }
}

(4)定義每一個節(jié)點的基本樣式,為了實現時間變化時有旋轉效果,增加transition: left 1s, top 1s;的過度動畫

.label {
    position: absolute;
    display: inline-block;
    color: #4d4d4d;
    text-align: center;
    padding: 0 5px;
    font-family: "Microsoft YaHei";
    font-size: 19px;
    font-weight: bolder;
    transition: left 1s, top 1s;
    transform-origin: 0% 0%
}

完整代碼

附上全部代碼,有需要的小伙伴可直接復制使用:

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>羅盤時鐘</title>
	<style type="text/css">
		* {
			margin: 0;
			padding: 0
		}

		html,
		body {
			width: 100%;
			height: 100%;
			background-color: black;
			overflow: hidden
		}

		#clock {
			position: relative;
			width: 100%;
			height: 100%;
			background: black
		}

		.label {
			position: absolute;
			display: inline-block;
			color: #4d4d4d;
			text-align: center;
			padding: 0 5px;
			font-family: "Microsoft YaHei";
			font-size: 19px;
			font-weight: bolder;
			transition: left 1s, top 1s;
			transform-origin: 0% 0%
		}
	</style>
	<script type="text/javascript">
		var monthText = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"];
		var dayText = ["一日", "二日", "三日", "四日", "五日", "六日", "七日", "八日", "九日", "十日", "十一日", "十二日", "十三日", "十四日", "十五日", "十六日"
			, "十七日", "十八日", "十九日", "二十日", "二十一日", "二十二日", "二十三日", "二十四日", "二十五日", "二十六日", "二十七日", "二十八日", "二十九日", "三十日", "三十一日"];
		var weekText = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
		var hourText = ["零時", "一時", "二時", "三時", "四時", "五時", "六時", "七時", "八時",
			"九時", "十時", "十一時", "十二時", "十三時", "十四時", "十五時", "十六時", "十七時", "十八時", "十九時", "二十時", "二十一時", "二十二時", "二十三時"];
		var minuteText = ["零分", "一分", "二分", "三分", "四分", "五分", "六分", "七分", "八分", "九分", "十分", "十一分", "十二分", "十三分", "十四分", "十五分", "十六分", "十七分", "十八分",
			"十九分", "二十分", "二十一分", "二十二分", "二十三分", "二十四分", "二十五分", "二十六分", "二十七分", "二十八分", "二十九分", "三十分", "三十一分", "三十二分", "三十三分",
			"三十四分", "三十五分", "三十六分", "三十七分", "三十八分", "三十九分", "四十分", "四十一分", "四十二分", "四十三分", "四十四分", "四十五分", "四十六分", "四十七分",
			"四十八分", "四十九分", "五十分", "五十一分", "五十二分", "五十三分", "五十四分", "五十五分", "五十六分", "五十七分", "五十八分", "五十九分"];
		var secondsText = ["零秒", "一秒", "二秒", "三秒", "四秒", "五秒", "六秒", "七秒", "八秒", "九秒", "十秒", "十一秒", "十二秒", "十三秒", "十四秒", "十五秒", "十六秒",
			"十七秒", "十八秒", "十九秒", "二十秒", "二十一秒", "二十二秒", "二十三秒", "二十四秒", "二十五秒", "二十六秒", "二十七秒", "二十八秒", "二十九秒", "三十秒", "三十一秒",
			"三十二秒", "三十三秒", "三十四秒", "三十五秒", "三十六秒", "三十七秒", "三十八秒", "三十九秒", "四十秒", "四十一秒", "四十二秒", "四十三秒", "四十四秒", "四十五秒",
			"四十六秒", "四十七秒", "四十八秒", "四十九秒", "五十秒", "五十一秒", "五十二秒", "五十三秒", "五十四秒", "五十五秒", "五十六秒", "五十七秒", "五十八秒", "五十九秒"];
		var clock;
		var monthList = [];
		var dayList = [];
		var weekList = [];
		var hourList = [];
		var minuteList = [];
		var secondsList = [];

		var textSet = [[monthText, monthList], [dayText, dayList], [weekText, weekList], [hourText, hourList], [minuteText, minuteList], [secondsText, secondsList]];

		var labelX = [];
		var labelY = [];
		window.onload = function () {
			init();
			setInterval(function () { runTime(); }, 500);
		}

		function init() {
			clock = document.getElementById('clock');
			for (var i = 0; i < textSet.length; i++) {
				for (var j = 0; j < textSet[i][0].length; j++) {
					var temp = createLabel(textSet[i][0][j]);
					clock.appendChild(temp);
					textSet[i][1].push(temp);
				}
			}
			console.log(textSet)

			clock.style.transform = "rotate(90deg)";
		}

		function createLabel(text) {
			var div = document.createElement('div');
			div.classList.add('label');
			div.innerText = text;
			return div;
		}

		function runTime() {
			var now = new Date();
			var month = now.getMonth();
			var day = now.getDate();
			var week = now.getDay();
			var hour = now.getHours();
			var minute = now.getMinutes();
			var seconds = now.getSeconds();
			var nowValue = [month, day - 1, week, hour, minute, seconds];
			initStyle();

			//當前年月日時高亮
			for (var i = 0; i < nowValue.length; i++) {
				var num = nowValue[i];
				textSet[i][1][num].style.color = '#fff';
			}


			var widthMid = document.body.clientWidth / 2;
			var heightMid = document.body.clientHeight / 2;
			for (var i = 0; i < textSet.length; i++) {
				for (var j = 0; j < textSet[i][0].length; j++) {
					var r = (i + 1) * 35 + 50 * i;
					var deg = 360 / textSet[i][1].length * (j - nowValue[i]);
					var x = r * Math.sin(deg * Math.PI / 180) + widthMid;
					var y = heightMid - r * Math.cos(deg * Math.PI / 180);
					var temp = textSet[i][1][j];
					temp.style.transform = 'rotate(' + (-90 + deg) + 'deg)';
					temp.style.left = x + 'px';
					temp.style.top = y + 'px';
				}
			}
		}

		function initStyle() {
			var label = document.getElementsByClassName('label');
			for (var i = 0; i < label.length; i++) {
				label[i].style.color = '#4d4d4d';
			}
		}
	</script>

	<title> </title>


</head>

<body>
	<div id="clock"></div>
</body>

</html>

總結

通過上面一頓操作,短短幾行代碼實現了這個炫酷的方法,在涉及定位每個節(jié)點位置的時候,不得不再去復習下初中數學知識sin和cos的用法

到此這篇關于使用JavaScript實現一個炫酷的羅盤時鐘的文章就介紹到這了,更多相關JavaScript羅盤時鐘內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Javascript數組與字典用法分析

    Javascript數組與字典用法分析

    這篇文章主要介紹了Javascript數組與字典用法,以實例形式較為詳細的分析了Array作為數組與字典的不同用法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-12-12
  • Firefox下無法正常顯示年份的解決方法

    Firefox下無法正常顯示年份的解決方法

    在用Firefox上一些網站會看到這樣的顯示108年1月26日,而IE顯示為2008年1月26日原因是javascrīpt的兼容性問題
    2014-09-09
  • 原生JS實現彈幕效果的簡單操作指南

    原生JS實現彈幕效果的簡單操作指南

    這篇文章主要給大家介紹了關于原生JS實現彈幕效果的簡單操作指南,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 基于百度地圖實現產品銷售的單位位置查看功能設計與實現

    基于百度地圖實現產品銷售的單位位置查看功能設計與實現

    這篇文章主要介紹了基于百度地圖實現產品銷售的單位位置查看功能設計與實現的相關資料,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • 用原生JS實現簡單的多選框功能

    用原生JS實現簡單的多選框功能

    這篇文章主要介紹了用原生JS實現簡單的多選框功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • require.js配合插件text.js實現最簡單的單頁應用程序

    require.js配合插件text.js實現最簡單的單頁應用程序

    這篇文章主要介紹了require.js配合插件text.js實現最簡單的單頁應用程序,需要的朋友可以參考下
    2016-07-07
  • Javascript Worker子線程代碼實例

    Javascript Worker子線程代碼實例

    這篇文章主要介紹了Javascript Worker子線程代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • JavaScript之Array常見的方法詳解

    JavaScript之Array常見的方法詳解

    這篇文章主要為大家介紹了JavaScript之Array常見的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助V
    2021-11-11
  • 提升JS編程效率的19個實用技巧分享

    提升JS編程效率的19個實用技巧分享

    在實際工作中,開發(fā)者常面臨一些需巧妙編程解決的挑戰(zhàn),有時幾行代碼就能迎刃而解,本文整理了一系列實用代碼片段,助您輕松處理URL、DOM操作、事件處理等常見問題,希望對大家有所幫助
    2023-11-11
  • javascript 常用方法總結

    javascript 常用方法總結

    javascript 常用方法 ,比較不錯大家可以參考下。
    2009-06-06

最新評論

蕲春县| 岳池县| 读书| 如皋市| 潜江市| 鲁山县| 阿坝县| 攀枝花市| 五大连池市| 三原县| 峨山| 江西省| 抚远县| 化州市| 如东县| 马边| 英吉沙县| 秦安县| 新密市| 安徽省| 赤城县| 如东县| 嘉峪关市| 宜阳县| 水富县| 平果县| 即墨市| 河曲县| 新巴尔虎右旗| 德令哈市| 沈丘县| 屏边| 仙游县| 咸阳市| 讷河市| 化州市| 永靖县| 阿荣旗| 扶绥县| 大埔区| 宁晋县|