實(shí)現(xiàn)一個(gè)炫酷的時(shí)間輪盤(pán) | 原生篇

前言

看見(jiàn)美好的事物,還是會(huì)很喜歡曲梗!今天在設(shè)置手機(jī)壁紙時(shí)赞警,看見(jiàn)有個(gè)炫酷的時(shí)間輪盤(pán),覺(jué)得挺好看的虏两。于是想自己來(lái)實(shí)現(xiàn)一下

1.jpg

分析和準(zhǔn)備

由于只是一個(gè)小demo愧旦,就直接選擇用原生js來(lái)實(shí)現(xiàn)了,建立目錄結(jié)構(gòu)如下

image.png

css文件中定罢,可做一些簡(jiǎn)單的初始化樣式笤虫,為了方便我就直接引入reset.css:

/* http://meyerweb.com/eric/tools/css/reset/ 
   v2.0 | 20110126
   License: none (public domain)
*/

html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed, 
figure, figcaption, footer, header, hgroup, 
menu, nav, output, ruby, section, summary,
time, mark, audio, video {
    margin: 0;
    padding: 0;
    border: 0;
    font-size: 100%;
    font: inherit;
    vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure, 
footer, header, hgroup, menu, nav, section {
    display: block;
}
body {
    line-height: 1;
}
ol, ul {
    list-style: none;
}
blockquote, q {
    quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
    content: '';
    content: none;
}
table {
    border-collapse: collapse;
    border-spacing: 0;
}

index.html中引入demo.css和demo.js并添加div元素:

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

JS部分

1. 首先聲明幾個(gè)數(shù)組

聲明幾個(gè)數(shù)組:monthText、dayText祖凫、weekText琼蚯、hourText 、minuteText蝙场、secondsText凌停, 分別各自文本,對(duì)應(yīng)月售滤、日罚拟、星期、時(shí)完箩、分赐俗、秒。主要是為了方便一會(huì)生成DOM

var monthText = ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"];
var dayText = ["一號(hào)", "二號(hào)", "三號(hào)", "四號(hào)", "五號(hào)", "六號(hào)", "七號(hào)", "八號(hào)", "九號(hào)", "十號(hào)", "十一號(hào)", "十二號(hào)", "十三號(hào)", "十四號(hào)", "十五號(hào)", "十六號(hào)", "十七號(hào)", "十八號(hào)", "十九號(hào)", "二十號(hào)", "二十一號(hào)", "二十二號(hào)", "二十三號(hào)", "二十四號(hào)", "二十五號(hào)", "二十六號(hào)", "二十七號(hào)", "二十八號(hào)", "二十九號(hào)", "三十號(hào)", "三十一號(hào)"];
var weekText = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
var hourText = ["零點(diǎn)", "一點(diǎn)", "兩點(diǎn)", "三點(diǎn)", "四點(diǎn)", "五點(diǎn)", "六點(diǎn)", "七點(diǎn)", "八點(diǎn)", "九點(diǎn)", "十點(diǎn)", "十一點(diǎn)", "十二點(diǎn)", "十三點(diǎn)", "十四點(diǎn)", "十五點(diǎn)", "十六點(diǎn)", "十七點(diǎn)", "十八點(diǎn)", "十九點(diǎn)", "二十點(diǎn)", "二十一點(diǎn)", "二十二點(diǎn)", "二十三點(diǎn)"];
var minuteText = ["一分", "二分", "三分", "四分", "五分", "六分", "七分", "八分", "九分", "十分","十一分", "十二分", "十三分", "十四分", "十五分", "十六分", "十七分", "十八分", "十九分", "二十分","二十一分", "二十二分", "二十三分", "二十四分", "二十五分", "二十六分", "二十七分", "二十八分", "二十九分", "三十分", "三十一分", "三十二分", "三十三分", "三十四分", "三十五分", "三十六分", "三十七分", "三十八分", "三十九分", "四十分","四十一分", "四十二分", "四十三分", "四十四分", "四十五分", "四十六分", "四十七分", "四十八分", "四十九分", "五十分","五十一分", "五十二分", "五十三分", "五十四分", "五十五分", "五十六分", "五十七分", "五十八分", "五十九分", "六十分"];
var secondsText = ["一秒", "二秒", "三秒", "四秒", "五秒", "六秒", "七秒", "八秒", "九秒", "十秒","十一秒", "十二秒", "十三秒", "十四秒", "十五秒", "十六秒", "十七秒", "十八秒", "十九秒", "二十秒","二十一秒", "二十二秒", "二十三秒", "二十四秒", "二十五秒", "二十六秒", "二十七秒", "二十八秒", "二十九秒", "三十秒", "三十一秒", "三十二秒", "三十三秒", "三十四秒", "三十五秒", "三十六秒", "三十七秒", "三十八秒", "三十九秒", "四十秒", "四十一秒", "四十二秒", "四十三秒", "四十四秒", "四十五秒", "四十六秒", "四十七秒", "四十八秒", "四十九秒", "五十秒","五十一秒", "五十二秒", "五十三秒", "五十四秒", "五十五秒", "五十六秒", "五十七秒", "五十八秒", "五十九秒", "六十秒"];

2.聲明對(duì)應(yīng)空數(shù)組

為了操作DOM弊知,將DOM分類(lèi)存放阻逮。如月份相關(guān)的DOM放在monthList中,星期相關(guān)的DOM就放在weekList秩彤,依次類(lèi)推

var monthList = [];
var dayList = [];
var weekList = [];
var hourList = [];
var minuteList = [];
var secondsList = [];

3.聲明一個(gè)二維數(shù)組

二維數(shù)組主要用于存放文字內(nèi)容和頁(yè)面顯示標(biāo)簽

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

4.初始化

定義一個(gè)初始化函數(shù)init叔扼,該函數(shù)主要用于生成標(biāo)簽元素,并將對(duì)應(yīng)的文本填入同時(shí)添加class為'label'漫雷,然后將生成的標(biāo)簽存放在各自的list中瓜富,最后在頁(yè)面加載后調(diào)用init。

function init() {
    clock = document.getElementById('clock');
    // 生成標(biāo)簽 存放文字展示
    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);
        }
    }
}
// 創(chuàng)建標(biāo)簽并將文字填充標(biāo)簽內(nèi) 接收參數(shù)為文字內(nèi)容  
function createLabel(text) {
    var div = document.createElement('div');
    div.classList.add('label');
    div.innerText = text;
    return div;
}
window.onload = function () {
    init();
}

5.為label添加樣式

簡(jiǎn)單添加一下css樣式

html,body{
    width:100%;
    height:100%;
    background-color: #000;
    overflow: hidden;
}
body #clock {
    position: relative;
    width: 100%;
    height: 100%;
    background: black;
}
body #clock .label{
    display:inline-block;
    color:#4d4d4d;
    text-align: center;
    padding:0 5px;
    font-size:19px;
    transition:left 1s,top 1s;
    transform-origin: 0% 0%;
}

6.接著降盹,添加一個(gè)定時(shí)器

這個(gè)定時(shí)器用于每隔一定時(shí)間更新頁(yè)面時(shí)間与柑,如:

window.onload = function () {
    ...
    // 每隔100ms獲得 當(dāng)前時(shí)間 更新頁(yè)面時(shí)間顯示
    setInterval(function () {
        runTime();
    }, 100);    
}

這里用到一個(gè)runTime函數(shù),這個(gè)函數(shù)主要作用是:

  • 獲取當(dāng)前的時(shí)間
  • 設(shè)置初始化樣式,并設(shè)置當(dāng)前時(shí)間的樣式
  • 變成圓(確定圓心和各元素的位置)
function runTime() {
    // 利用時(shí)間對(duì)象獲得 當(dāng)前 時(shí)間
    var now = new Date();
    // 獲得月 日期 小時(shí) 分鐘 秒鐘
    var month = now.getMonth();
    var day = now.getDate();
    var week = now.getDay();
    var hour = now.getHours();
    var minute = now.getMinutes();
    var seconds = now.getSeconds();
    // 初始化時(shí)間顏色 同時(shí)將走過(guò)時(shí)間設(shè)置為灰色
    initStyle();
    // 設(shè)置當(dāng)前時(shí)間為白色
    // 將當(dāng)前時(shí)間月份存放在數(shù)組中
    var nowValue = [month, day - 1, week, hour, minute, seconds];
    for (var i = 0; i < nowValue.length; i++) {
        var num = nowValue[i];
        textSet[i][1][num].style.color = '#fff';
    }

    // 變成圓形
    if (isCircle) {
        // 確定圓心
        var widthMid = document.body.clientWidth / 2;
        var heightMid = document.body.clientHeight / 2;
        // 將每一個(gè)dom元素確定到圓的位置
        for (var i = 0; i < textSet.length; i++) {
            for (var j = 0; j < textSet[i][0].length; j++) {
                // 加算出每一個(gè)元素的位置  x y 坐標(biāo)
                // 每一個(gè)圓的半徑與時(shí)分秒的位置有關(guān)
                var r = (i + 1) * 35 + 50 * i;
                // 計(jì)算每一個(gè)平均的角度  再將每一個(gè)單位對(duì)齊 然后轉(zhuǎn)化成弧度
                var deg = 360 / textSet[i][1].length * (j - nowValue[i]) ;
                // 計(jì)算出每一個(gè)dom元素的坐標(biāo)
                var x = r * Math.sin(deg * Math.PI / 180) + widthMid;
                var y = heightMid - r*Math.cos(deg * Math.PI / 180);
                // 設(shè)置樣式
                var temp =  textSet[i][1][j];
                temp.style.transform = 'rotate(' + (-90 + deg ) + 'deg)';
                temp.style.left = x + 'px';
                temp.style.top = y + 'px';
            }
        }
    }
}

這里還用到自定義函數(shù)initStyle,該函數(shù)主要作用是將所有l(wèi)abel標(biāo)簽初始為灰色价捧,如下

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

7.修改position

修改position,在變成圓形之前先修改定位

window.onload = function () {
    ....
    changePosition();
}
function changePosition() {
    for (let i = 0; i < textSet.length; i++) {
        for (let j = 0; j < textSet[i][1].length; j++) {
            // 先獲得原來(lái)的位置  再修改position 設(shè)置left top 
            let tempX = textSet[i][1][j].offsetLeft + "px";
            let tempY = textSet[i][1][j].offsetTop + "px";
            setTimeout(function () {
                textSet[i][1][j].style.position = "absolute";
                textSet[i][1][j].style.left = tempX;
                textSet[i][1][j].style.top = tempY;
            }, 50);
        }
    }
}

8.最后變成圓形

window.onload = function () {
    ....
    setTimeout(function () {
        changeCircle();
    }, 2000);
}
function changeCircle() {
    isCircle = true;
    clock.style.transform = "rotate(90deg)";
}

經(jīng)過(guò)以上的大致步驟丑念,最終結(jié)果就顯示出來(lái)了,如圖

image.png

總結(jié)

  1. demo為考慮性能問(wèn)題结蟋,有待優(yōu)化
  2. 具體代碼可以查看:https://github.com/jCodeLife/running-plan/tree/master/clock
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脯倚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子椎眯,更是在濱河造成了極大的恐慌挠将,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件编整,死亡現(xiàn)場(chǎng)離奇詭異舔稀,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)掌测,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)内贮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人汞斧,你說(shuō)我怎么就攤上這事夜郁。” “怎么了粘勒?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵竞端,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我庙睡,道長(zhǎng)事富,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任乘陪,我火速辦了婚禮统台,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘啡邑。我一直安慰自己贱勃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布谤逼。 她就那樣靜靜地躺著贵扰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪流部。 梳的紋絲不亂的頭發(fā)上戚绕,一...
    開(kāi)封第一講書(shū)人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音贵涵,去河邊找鬼列肢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宾茂,可吹牛的內(nèi)容都是我干的瓷马。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼跨晴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼欧聘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起端盆,我...
    開(kāi)封第一講書(shū)人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怀骤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后焕妙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蒋伦,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年焚鹊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痕届。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡末患,死狀恐怖研叫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情璧针,我是刑警寧澤嚷炉,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站探橱,受9級(jí)特大地震影響申屹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜走搁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一独柑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧私植,春花似錦忌栅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贫悄,卻和暖如春瑞驱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窄坦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工唤反, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凳寺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓彤侍,卻偏偏與公主長(zhǎng)得像肠缨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盏阶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5晒奕? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,445評(píng)論 1 45
  • 前端開(kāi)發(fā)面試題 面試題目: 根據(jù)你的等級(jí)和職位的變化名斟,入門(mén)級(jí)到專(zhuān)家級(jí)脑慧,廣度和深度都會(huì)有所增加。 題目類(lèi)型: 理論知...
    怡寶丶閱讀 2,572評(píng)論 0 7
  • 前端開(kāi)發(fā)面試題 <a name='preface'>前言</a> 只看問(wèn)題點(diǎn)這里 看全部問(wèn)題和答案點(diǎn)這里 本文由我...
    自you是敏感詞閱讀 756評(píng)論 0 3
  • <a name='html'>HTML</a> Doctype作用砰盐?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別? (1)闷袒、<...
    clark124閱讀 3,460評(píng)論 1 19
  • 今天青石的票圈出鏡率最高的,莫過(guò)于張藝謀的新片終于定檔了池摧。 一張滿(mǎn)溢著水墨風(fēng)的海報(bào)一次次的出現(xiàn)在票圈里焦除,也就是老謀...
    青石電影閱讀 10,313評(píng)論 1 2