JavaScript仿IOS Clock

JavaScript仿IOS Clock

參考

原文JavaScript仿Clock IOS時鐘

描述

用JavaScript模仿IOS上Clock時鐘

效果

IOS Clock

項目分析

  1. 時鐘,首先得獲取本地時間
  2. 時鐘有3個指針敛腌,通過添加動畫的方式讓它圍繞中心點旋轉
  3. 通過獲取到的hour/minute/second值分別計算時針/分針/秒針的角度值

HTML & CSS

布局

<div class="box">
    <article class="clock">
        <div class="hours-container">
            <div class="hours"></div>
        </div>
        <div class="minutes-container">
            <div class="minutes"></div>
        </div>
        <div class="seconds-container">
            <div class="seconds"></div>
        </div>
    </article>
</div>
  1. .box是為了布局的方便
  2. 每個指針都需要一個*.container容器

添加背景樣式

html {
    /* font-size必須大于等于12刨晴,否則不生效*/
    font-size: 12px; 
}

html, body {
    margin: 0px;
    padding: 0px;
}

.box {
    width: 35rem;
    height: 38rem;
    background: rgb(205, 205, 205);
    border-radius: 1rem;
    margin: 5% auto;
    display: flex;
    justify-content: center;
    align-items: center;
}

.clock {
  width: 30rem;
  height: 30rem;
  background: #fff url('./images/ios_clock.svg') no-repeat center;
  background-size: 88%;
  border-radius: 50%;
  position: relative;
}
Background
  1. 設置.box的width和height铆遭,建議用rem單位,這樣手機上效果也很好
  2. .box采用Flex布局沿猜,并且.clock在水平和垂直方向上都居中枚荣,具體Flex布局后面章再介紹
  3. Clock的背景使用了一張圖片,具體見最后的項目地址

添加中心軸

.clock:after {
  /* content是必須的啼肩,不然偽元素不會顯示 */
  content: '';
  width: 1.5rem;
  height: 1.5rem;
  background: #000;
  border-radius: 50%;
  position: absolute;
  top: 50%;
  left: 50%;
  /* 向坐上移動自身的50% */
  transform: translate(-50%, -50%); 
  z-index: 10;
}
Central Axis
  1. 使用CSS3中的偽元素為時鐘添加實心小圓點橄妆,指針都圍繞這個點轉
  2. content: '';是必須的,不然偽元素無法顯示
  3. 相對定位祈坠,top: 50%; left: 50%; 無法是小圓點在正中心害碾,使用transform: translate(-50%, -50%)向左上方移動自身寬高的一半
  4. z-index: 10;為了使小圓點在視圖的最上層,遮擋指針交叉的地方

指針容器

.hours-container, .minutes-container, .seconds-container {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}
  1. 添加指針容器后赦拘,暫時并無效果
  2. 指針的轉動慌随,實際是通過動態(tài)調整指針容器的角度實現(xiàn)的
  3. 添加指針容器后,可以添加指針的樣式了

添加指針

.hours {
  width: 3%;
  height: 20%;
  background: #000;
  position: absolute;
  top: 30%;
  left: 48.5%;
}

.minutes {
  width: 2%;
  height: 37%;
  background: #000;
  position: absolute;
  top: 13%;
  left: 49%;
}

.seconds {
  width: 1%;
  height: 40%;
  background: #f00;
  position: absolute;
  top: 20%;
  left: 49.5%;
  z-index: 8;
}
Hand
  1. 分別添加時針躺同、分針阁猜、秒針
  2. 時針較粗,分針次之笋籽,秒針最細蹦漠,采用3%、2%车海、1%遞減笛园,可以自己調整
  3. %是相對于各自的*.container容器元素的
  4. 時針top: 30%; height: 20%; 兩者相加正好為50%,即下邊緣與中心軸重合侍芝,分針同理
  5. 時針width: 3%; left: 48.5%; width/2 + left == 50%研铆,分針、秒針同理
  6. 秒針top: 20%; height: 40%; top + height == 60%州叠,秒針下邊緣超過中心軸棵红,超出10%

動畫

定義動畫規(guī)則

@keyframes rotate {
  100% {
    transform: rotateZ(360deg);
  }
}

采用@keyframes規(guī)則定義一個動畫,動畫名稱為rotate咧栗,這個動畫的元素會沿著Z軸旋轉360°

定時器

.hours-container {
  animation: rotate 36s infinite linear;
}

.minutes-container {
  animation: rotate 18s infinite steps(60);
}

.seconds-container {
  animation: rotate 3s infinite steps(60);
}
Animation
  1. 為了演示的方便逆甜,固定的事件并未按真實的時間來設置虱肄。時針是12小時(43200秒)、分針是60分鐘(3600秒)交煞,秒針是60秒咏窿。
  2. 為了有咔嚓咔嚓的跳動,秒針素征、分針采用steps(60)集嵌,每步60°
  3. 由于CSS的時間是有一定誤差的,所以不能直接采用1. 中的值
  4. 請刪除或注釋定義動畫規(guī)則定時器中的CSS代碼

時鐘

獲取本地時間御毅,并計算每個指針應該旋轉的角度根欧,并設置

獲取每個指針

const hourHand = document.querySelector('.hours-container');
const minuteHand = document.querySelector('.minutes-container');
const secondHand = document.querySelector('.seconds-container');

實際獲取的是指針的容器

獲取本地時間

const now = new Date();
const hour = now.getHours();
const minute = now.getMinutes();
const second = now.getSeconds();

計算指針角度

在CSS3中角度單位一共有4種:

  • deg (度,一個圓360度)
  • grad (梯度端蛆,一個圓400梯度)
  • turn (轉/圈凤粗,一個圓1圈)
  • rad (弧度,一個圓2π弧度)
const secondDegree = second * 6;
const minuteDegree = minute * 6;
const hourDegree = (hour * 30) + (minute / 2);
  1. 秒針一圈是360°欺税,60秒侈沪,每秒360 / 60 = 6°,所以秒針角度為second * 6
  2. 分針一圈是360°晚凿,60分鐘亭罪,每分鐘360 / 60 = 6°,所以分針角度為minute * 6
  3. 時針一圈是360°歼秽,12小時应役,每小時360 / 12 = 30°,又由于分針轉動時燥筷,時針也會產生微小的移動箩祥,minute * 30° / 60分鐘 = minute / 2,所以時針角度為(hour * 30) + (minute / 2)

設置角度值

hourHand.style.transform = `rotateZ(${hourDegree}deg)`;
minuteHand.style.transform = `rotateZ(${minuteDegree}deg)`;
secondHand.style.transform = `rotateZ(${secondDegree}deg)`;

以上可以根據(jù)本地時間設置時鐘角度肆氓,但想要時鐘實時轉動袍祖,則需要增加setInterval

定時更新

<script>
    function clockWalk() {
        const hourHand = document.querySelector('.hours-container');
        const minuteHand = document.querySelector('.minutes-container');
        const secondHand = document.querySelector('.seconds-container');

        const now = new Date();
        const hour = now.getHours();
        const minute = now.getMinutes();
        const second = now.getSeconds();

        const secondDegree = second * 6;
        const minuteDegree = minute * 6;
        const hourDegree = (hour * 30) + (minute / 2);

        hourHand.style.transform = `rotateZ(${hourDegree}deg)`;
        minuteHand.style.transform = `rotateZ(${minuteDegree}deg)`;
        secondHand.style.transform = `rotateZ(${secondDegree}deg)`;
    }
    setInterval(function() {
        clockWalk();
    }, 1000);
</script>
F12

通過以上動態(tài)圖可知,指針轉動實際是通過轉動*.container對應的div來實現(xiàn)的

這樣谢揪,整個時鐘就完成了

項目地址:碼云/c02954/ios_clock

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蕉陋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拨扶,更是在濱河造成了極大的恐慌凳鬓,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件患民,死亡現(xiàn)場離奇詭異缩举,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門仅孩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來托猩,“玉大人,你說我怎么就攤上這事杠氢≌拘蹋” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵鼻百,是天一觀的道長。 經常有香客問我摆尝,道長温艇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任堕汞,我火速辦了婚禮勺爱,結果婚禮上,老公的妹妹穿的比我還像新娘讯检。我一直安慰自己琐鲁,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布人灼。 她就那樣靜靜地躺著围段,像睡著了一般。 火紅的嫁衣襯著肌膚如雪投放。 梳的紋絲不亂的頭發(fā)上奈泪,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音灸芳,去河邊找鬼涝桅。 笑死,一個胖子當著我的面吹牛烙样,可吹牛的內容都是我干的冯遂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼谒获,長吁一口氣:“原來是場噩夢啊……” “哼蛤肌!你這毒婦竟也來了?” 一聲冷哼從身側響起究反,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寻定,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后精耐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狼速,經...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年卦停,在試婚紗的時候發(fā)現(xiàn)自己被綠了向胡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恼蓬。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖僵芹,靈堂內的尸體忽然破棺而出处硬,到底是詐尸還是另有隱情,我是刑警寧澤拇派,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布荷辕,位于F島的核電站,受9級特大地震影響件豌,放射性物質發(fā)生泄漏疮方。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一茧彤、第九天 我趴在偏房一處隱蔽的房頂上張望骡显。 院中可真熱鬧,春花似錦曾掂、人聲如沸惫谤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溜歪。三九已至,卻和暖如春险污,著一層夾襖步出監(jiān)牢的瞬間痹愚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工蛔糯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拯腮,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓蚁飒,卻偏偏與公主長得像动壤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淮逻,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容