深入淺出 Javascript30 快速導(dǎo)覽:Day 2:CSS + JS Clock

做了兩天了炕柔,簡(jiǎn)單的談一下感受嘉汰,這個(gè)項(xiàng)目雖然推出了好幾年了(2016),前端圈發(fā)生了天翻地覆的變化唱逢,隨著三大框架的流行, jQuery和原生JS 開發(fā)在國(guó)內(nèi)逐漸失去主流地位谷饿,但是萬變不離其宗惶我。原生JS至關(guān)重要。因?yàn)镴S是這一切的基礎(chǔ)博投,就像高樓大廈的地基一樣绸贡,你總不能直接就開始四樓五樓吧,那是不現(xiàn)實(shí)的毅哗。

簡(jiǎn)介:JavaScript30Wes Bos 推出的一個(gè) 30 天挑戰(zhàn)听怕。項(xiàng)目免費(fèi)提供了 30 個(gè)視頻教程、30 個(gè)挑戰(zhàn)的起始文檔和 30 個(gè)挑戰(zhàn)解決方案源代碼虑绵。目的是幫助人們用純 JavaScript 來寫東西尿瞭,不借助框架和庫(kù),也不使用編譯器和引用〕峋Γ現(xiàn)在你看到的是這系列指南的第 2 篇声搁。完整指南在 GitHub,喜歡請(qǐng) Star 哦?(?*)

實(shí)現(xiàn)效果

[圖片上傳失敗...(image-5d82d1-1632934898764)]

文檔中已經(jīng)給出了 HTML 結(jié)構(gòu)捕发,表盤內(nèi)有三個(gè) div 對(duì)應(yīng)三個(gè)指針疏旨。只需要添加一些 CSS 效果,然后用 JavaScript 動(dòng)態(tài)更新指針的狀態(tài)即可

關(guān)鍵要點(diǎn)

  1. 表盤上指針的樣式:旋轉(zhuǎn)的效果
  2. 獲取實(shí)時(shí)的時(shí)間
  3. 每一秒改變一次指針狀態(tài)

涉及到的特性:

  • transform: rotate()
  • transition
  • setInterval(callback, time)
  • setTimeout
  • new Date()
  • Date().getSeconds()
  • Date().getMinutes()
  • Date().getHours()
    Window.requestAnimationFrame()

過程指南

CSS 部分

在原作者的基礎(chǔ)上稍稍改進(jìn)了一下 增加了三個(gè)偽元素 指針旋轉(zhuǎn)軸與表盤中心重合

 .second-hand::after {
            position: absolute;
            content: '';
            display: block;
            width: 5px;
            height: 50%;
            background-color: red;
            left: 50%;
            bottom: 50%;
            transform: translate(-50%, 0);
        }
        
        .min-hand::after {
            position: absolute;
            content: '';
            display: block;
            width: 10px;
            height: 40%;
            background-color: white;
            left: 50%;
            bottom: 50%;
            transform: translate(-50%, 0);
        }
        
        .hour-hand::after {
            position: absolute;
            content: '';
            display: block;
            width: 15px;
            height: 20%;
            background-color: white;
            left: 50%;
            bottom: 50%;
            transform: translate(-50%, 0);
        }

用偽元素 增加一個(gè)表盤的中心點(diǎn)

 .clock-face:after {
            content: '';
            display: block;
            width: 30px;
            height: 30px;
            border-radius: 100%;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            background: white;
        }

JS部分

  1. 利用定時(shí)器自動(dòng)更新時(shí)間 有三種方式實(shí)現(xiàn)這種方法

    • 定時(shí)器 setInterval 可以每隔一段固定的時(shí)間將操作放入執(zhí)行隊(duì)列扎酷,利用這個(gè)特性檐涝,加入頁(yè)面后每秒更新一次時(shí)間,以實(shí)現(xiàn)秒針轉(zhuǎn)動(dòng)的效果。
     setInterval(setDate, 1000);
     // setDate 為每 1000 毫秒觸發(fā)的 function
    
    • 定時(shí)器 setTimeout 設(shè)定延時(shí) 執(zhí)行一次 配合回調(diào)函數(shù) 形式 谁榜,加入頁(yè)面后每秒更新一次時(shí)間幅聘,以實(shí)現(xiàn)秒針轉(zhuǎn)動(dòng)的效果。
function timeoutHandler() {
                setClock(); //執(zhí)行 函數(shù) 
                setTimeout(timeoutHandler, 1000)
            }
 setTimeout(timeoutHandler, 1000)
function animationHandler() {
                setClock();
                window.requestAnimationFrame(animationHandler)
            }
  window.requestAnimationFrame(animationHandler)
  1. 獲取三個(gè)指針對(duì)應(yīng)的 HTML 元素窃植,留待后續(xù)操作
            const second = document.querySelector('.second-hand'); //秒針 
            const min = document.querySelector('.min-hand'); //分表 
            const hour = document.querySelector('.hour-hand'); //時(shí)針 
  1. 編寫 setClock 方法
    1. 創(chuàng)建 Date 對(duì)象

    2. 獲取當(dāng)前時(shí)間的小時(shí)帝蒿、分鐘、秒

    3. 利用此刻的數(shù)據(jù)撕瞧,計(jì)算每個(gè)指針對(duì)應(yīng)的角度

      let secondDeg = data.getSeconds() * 6 //(360/60)
      

      以秒針為例陵叽,由于此頁(yè)面初始狀態(tài)中秒針為垂直的,所以零點(diǎn)時(shí)(時(shí)間起始位置)應(yīng)用到元素上的 rotate 旋轉(zhuǎn)角度值應(yīng)該為 6°丛版。秒針轉(zhuǎn)一圈為 60s巩掺,所以每一秒對(duì)應(yīng)表盤上的角度值即為 (...s / 60s) 。

      Wes Bos 給出的解決方案中页畦,時(shí)針是和秒針一樣每一小時(shí)跳動(dòng)一次胖替,若要模擬更加真實(shí)的時(shí)鐘,要使時(shí)針在一小時(shí)內(nèi)緩慢的移動(dòng)到下一個(gè)時(shí)間點(diǎn)豫缨。所以可以利用上分鐘独令,計(jì)算每一分鐘對(duì)時(shí)針的角度影響,將加到時(shí)針角度上即可好芭。

      let minDeg = data.getMinutes() * 6 + data.getSeconds() * 6 / 60 //(360/60)
              let hourDeg = data.getHours() * 30 + data.getMinutes() * 30 / 60 //(360/12)
      
    4. 將角度值賦值給 HTML 元素的 style 中的 transform 屬性

  //動(dòng)態(tài)改變樣式 表盤時(shí)針旋轉(zhuǎn)的角度 
                second.style.transform = `rotate(${secondDeg}deg)`
                min.style.transform = `rotate(${minDeg}deg)`
                hour.style.transform = `rotate(${hourDeg}deg)`
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末燃箭,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舍败,更是在濱河造成了極大的恐慌招狸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻薯,死亡現(xiàn)場(chǎng)離奇詭異裙戏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)厕诡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門累榜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灵嫌,你說我怎么就攤上這事壹罚。” “怎么了寿羞?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵猖凛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我稠曼,道長(zhǎng)形病,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任霞幅,我火速辦了婚禮漠吻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘司恳。我一直安慰自己途乃,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布扔傅。 她就那樣靜靜地躺著耍共,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猎塞。 梳的紋絲不亂的頭發(fā)上试读,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音荠耽,去河邊找鬼钩骇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铝量,可吹牛的內(nèi)容都是我干的倘屹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼慢叨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼纽匙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拍谐,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤烛缔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赠尾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體力穗,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年气嫁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了当窗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寸宵,死狀恐怖崖面,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梯影,我是刑警寧澤巫员,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站甲棍,受9級(jí)特大地震影響简识,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一七扰、第九天 我趴在偏房一處隱蔽的房頂上張望奢赂。 院中可真熱鬧,春花似錦颈走、人聲如沸膳灶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轧钓。三九已至,卻和暖如春锐膜,著一層夾襖步出監(jiān)牢的瞬間毕箍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工道盏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霉晕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓捞奕,卻偏偏與公主長(zhǎng)得像牺堰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颅围,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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