純js時鐘特效詳細代碼分析實例教程

来源:https://www.cnblogs.com/jiangweiping/archive/2020/04/21/12747905.html
-Advertisement-
Play Games

電子時鐘是web常見效果,在學習js的過程中,自己製作一個電子時間,有利於加深對date對象和定時器的理解。本教程共寫有三種時鐘效果,一是純文字的時鐘;二是圖片背景的時鐘,效果比純文字時鐘好看很多;三是時間改變時,數字圖片會產生滾動效果的時間。由簡入深詳細講解js時鐘的製作步驟。 ...


電子時鐘是網上常見的功能,在學習date對象和定時器功能時,來完成一個電子時鐘的製作是不錯的選擇。學習本教程之前,讀者需要具備html和css技能,同時需要有簡單的javascript基礎。

先準備一個html元素,用來放置時鐘。新建一個div元素,它的id命名為clock,如下所示:

<div id="clock" class="clock_con"></div><!--基礎時鐘元素-->

本實例電子時鐘的格式設定為 (yyyy-MM-dd hh:mm:ss) ,用js來組合一個簡單的時鐘字元串放到clock元素中。

本實例把時鐘功能封裝到函數中,所以先創建一個creatClock函數,在creatClock中再來編寫具體代碼。

建議在完成某一個前端功能時,應先分析功能的具體操作。再根據具體操作把實現功能的方法分成多個步驟,接下來一個步驟一個步驟去完成它。來看一下用js組合這樣一串字元,需要哪些步驟:

1 調用date對象,獲取電腦的本地時間
  1.1 調用date對象
  1.2 獲取當前年份
  1.3 獲取當前月份,月份是從0開始計數,所以需要加1才是正確的月份
  1.4 獲取當前日期
  1.5 獲取當前小時
  1.6 獲取分鐘
  1.7 獲取秒數
2. 格式化獲取到的時間數據
  2.1 單數字前添加字元串0,用以符合時鐘格式
  2.2 組合時間數據為字元串
3. 在clock元素中實時顯示時間
  3.1 獲取clock元素
  3.2 修改clock元素中的時間
  3.3 使用定時器實時更新時間

具體代碼如下:

function fnCreatClock(){
  //聲明時間相關變數
  var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;

  //1 獲取電腦本地時間
  function fnGetDate(){ 
    //1.1 調用date對象
    dLocal = new Date();
    //1.2 獲取當前年份
    nYear = dLocal.getFullYear(); 
    //1.3 獲取當前月份,月份是從0開始計數,所以需要加1才是正確的月份
    nMonth = dLocal.getMonth() + 1; 
    //1.4 獲取當前日期
    nDate = dLocal.getDate(); 
    //1.5 獲取當前小時
    nHours = dLocal.getHours(); 
    //1.6 獲取分鐘
    nMinutes = dLocal.getMinutes(); 
    //1.7 獲取秒數
    nSeconds = dLocal.getSeconds(); 
  }

  //2.1 封裝一個函數,用於把單數字前添加字元串0,例如1改為01
  function fnToDouble(num){  
    //聲明一個返回結果
    var sResult = ''; 
    if(num<10){
      //判斷數字小於10則是單數字,需要在前面添加字元串0
      sResult = '0' + num;
    }else{
      //數字為10以上轉換為字元串
      sResult = '' + num;
    }
    //返回格式化後的字元串
    return sResult; 
  }

  function fnFormatDate(){
    //2.2 組合時間數據為字元串。本實例主要針對初學者,所以這裡用的是最簡單的格式化方式,即把所有數據用+號相連
    return nYear + '-' + fnToDouble(nMonth) + '-' + fnToDouble(nDate) +
           ' ' + fnToDouble(nHours) + ':' + fnToDouble(nMinutes) + ':' + fnToDouble(nSeconds);
  }

  //3.1 獲取clock元素
  var eClock = document.getElementById('clock'); 
  //獲取時間 
  fnGetDate();
  //3.2 修改clock元素中的時間
  eClock.innerHTML = fnFormatDate(); 

  //使用定時器實時更新時間
  setInterval(function(){ 
    //3.3 每秒更新時間
    fnGetDate();  
    //3.3 修改clock元素中的時間
    eClock.innerHTML = fnFormatDate(); 
  },1000); 
}
fnCreatClock();

此時的效果如圖所示:

 

現在做出來的時鐘看起來感覺有點簡陋,也可以嘗試把數字換成圖片,這樣所呈現效果就會好很多。這裡暫時忽略日期部分,只為時間部分添加圖片效果,還是先看一下需要哪些html元素,代碼如下:

<div id="imgClock" class="clock_container"><!--圖片時鐘元素-->
  <div id="imgHours" class="img_box">
    <span class="img_0"></span>
    <span class="img_0"></span>
  </div>
  <div class="img_point"></div>
  <div id="imgMinutes" class="img_box">
    <span class="img_0"></span>
    <span class="img_0"></span>
  </div>
  <div class="img_point"></div>
  <div id="imgSeconds" class="img_box">
    <span class="img_0"></span>
    <span class="img_0"></span>
  </div>
</div>

還需要準備0-9共10張圖片,可以自己製作類似效果的數字圖片。css代碼可以自己根據需要編寫,也可以複製以下代碼使用:

  .clock_container{
    margin-top:60px;
    font-size:0;
    text-align:center;
  }
  .clock_container div{
    display:inline-block;
  }
  .clock_container .img_box span{
    display:inline-block;
    width:80px;
    height:100px;
    margin:0 2px;
    border-radius:8px;
    background-color:#77a6b6;
  }
  .clock_container .img_0{
    background:url(img/img_0.png) no-repeat;
  }
  .clock_container .img_1{
    background:url(img/img_1.png) no-repeat;
  }
  .clock_container .img_2{
    background:url(img/img_2.png) no-repeat;
  }
  .clock_container .img_3{
    background:url(img/img_3.png) no-repeat;
  }
  .clock_container .img_4{
    background:url(img/img_4.png) no-repeat;
  }
  .clock_container .img_5{
    background:url(img/img_5.png) no-repeat;
  }
  .clock_container .img_6{
    background:url(img/img_6.png) no-repeat;
  }
  .clock_container .img_7{
    background:url(img/img_7.png) no-repeat;
  }
  .clock_container .img_8{
    background:url(img/img_8.png) no-repeat;
  }
  .clock_container .img_9{
    background:url(img/img_9.png) no-repeat;
  }
  .clock_container .img_point{
    width:60px;
    height:100px;
    background:url(img/img_point.png) no-repeat center;
  }

按照慣例,完成功能前先整理步驟。這裡再多添加一個步驟,在imgClock元素中來完成圖片美化後的時鐘效果,步驟如下:

4. 在imgClock元素中,用圖片作為背景實時修改時間
  4.1 分別獲取時(imgHours)、分(imgMinutes)、秒(imgSeconds)元素
  4.2 根據時間修改時、分、秒元素的class,用來改變背景樣式
  4.3 使用定時器更新元素背景

修改後的代碼如下:

function fnCreatClock(){
  //聲明時間相關變數
  var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;

  //1 獲取電腦本地時間
  function fnGetDate(){ 
    //1.1 調用date對象
    dLocal = new Date();
    //1.2 獲取當前年份
    nYear = dLocal.getFullYear(); 
    //1.3 獲取當前月份,月份是從0開始計數,所以需要加1才是正確的月份
    nMonth = dLocal.getMonth() + 1; 
    //1.4 獲取當前日期
    nDate = dLocal.getDate(); 
    //1.5 獲取當前小時
    nHours = dLocal.getHours(); 
    //1.6 獲取分鐘
    nMinutes = dLocal.getMinutes(); 
    //1.7 獲取秒數
    nSeconds = dLocal.getSeconds(); 
  }

  //2.1 封裝一個函數,用於把單數字前添加字元串0,例如1改為01
  function fnToDouble(num){  
    //聲明一個返回結果
    var sResult = ''; 
    if(num<10){
      //判斷數字小於10則是單數字,需要在前面添加字元串0
      sResult = '0' + num;
    }else{
      //數字為10以上轉換為字元串
      sResult = '' + num;
    }
    //返回格式化後的字元串
    return sResult; 
  }
  
  //獲取時間 
  fnGetDate();
  
  //4.1 獲取圖片背景的小時元素
  var eImgHours = document.getElementById('imgHours');
  //獲取小時的第一個元素
  var eHours1 = eImgHours.getElementsByTagName('span')[0]; 
  //獲取小時的第二個元素 
  var eHours2 = eImgHours.getElementsByTagName('span')[1];  
  //4.1 獲取圖片背景的分鐘元素
  var eImgMinutes = document.getElementById('imgMinutes');
  //獲取分鐘的第一個元素
  var eMinutes1 = eImgMinutes.getElementsByTagName('span')[0]; 
  //獲取分鐘的第二個元素 
  var eMinutes2 = eImgMinutes.getElementsByTagName('span')[1];  
  //4.1 獲取圖片背景的秒元素
  var eImgSeconds = document.getElementById('imgSeconds');  
  //獲取秒的第一個元素
  var eSeconds1 = eImgSeconds.getElementsByTagName('span')[0];
  //獲取秒的第二個元素  
  var eSeconds2 = eImgSeconds.getElementsByTagName('span')[1];  

  // 4.2 根據時間修改時、分、秒元素的class,用來改變背景樣式
  function fnChangeImgBg(){ 
    eHours1.className = 'img_' + fnGetImgNum(nHours,0);
    eHours2.className = 'img_' + fnGetImgNum(nHours,1);
    eMinutes1.className = 'img_' + fnGetImgNum(nMinutes,0);
    eMinutes2.className = 'img_' + fnGetImgNum(nMinutes,1);
    eSeconds1.className = 'img_' + fnGetImgNum(nSeconds,0);
    eSeconds2.className = 'img_' + fnGetImgNum(nSeconds,1);
  }

  //此函數用來計算根據當前時間的數字
  function fnGetImgNum(num,bit){ 
    //聲明一個返回結果
    var nResult = 0;
    //判斷是個位還是十位,0代表十位,1代表個位  
    if(bit===0){  
      //使用Math.floor可以向下取整,即不管是0.1還是0.9,都是取整數0。此方法用來獲取時間的十位
      nResult = Math.floor(num/10);
    }else{
      //通過fnToDouble函數把時間格式化雙字元串,再取後面一個字元獲取個位,前面的+號用於轉換為數字
      nResult = +fnToDouble(num).slice(1);
    }
    return nResult;
  }
  fnChangeImgBg();

  //使用定時器實時更新時間
  setInterval(function(){ 
    //3.3 每秒更新時間
    fnGetDate();  
    fnChangeImgBg();  //4.3 使用定時器更新元素背景
  },1000); 
}
fnCreatClock();

此時的效果比單獨的文字還是會增色不少,如圖所示:

 

 

我想要求效果再漂亮一點,讓圖片不是很突兀的改變,而是有一個滾動的動畫。要實現這樣的效果,圖片需要改成一張0-9的豎形排列圖,每個數字的高度要和時鐘元素高度一致。再通過修改元素背景圖片的位置,即可產生滾動的動畫效果。

此效果需要的html元素如下所示:

<div id="animationClock" class="clock_container"><!--動畫時鐘元素-->
  <div id="animationHours" class="animation_box">
    <span></span>
    <span></span>
  </div>
  <div class="img_point"></div>
  <div id="animationMinutes" class="animation_box">
    <span></span>
    <span></span>
  </div>
  <div class="img_point"></div>
  <div id="animationSeconds" class="animation_box">
    <span></span>
    <span></span>
  </div>
</div>

在css裡面給每一個元素加上同一個背景圖片,需要加上transition過渡樣式用來產生動畫效果,如下所示:

.clock_container .animation_box span{
  display:inline-block;
  width:80px;
  height:100px;
  margin:0 2px;
  border-radius:8px;
  background-color:#77a6b6;
  background-image:url(img/img_all.png);
  background-repeat:no-repeat;
  transition:.2s;
}

再隨著時間改變給每一個時間元素修改背景圖片的位置,即修改background-repeat-y的樣式即可。按照慣例,還是先列步驟:

5. 在animationClock元素中,滾動動畫顯示時鐘的實時變化
  5.1 分別獲取時(imgHours)、分(imgMinutes)、秒(imgSeconds)元素
  5.2 根據時間修改時、分、秒元素的背景圖片位置
  5.3 使用定時器更新元素背景圖片位置

修改後的代碼如下:

function fnCreatClock(){
  //聲明時間相關變數
  var dLocal,nYear,nMonth,nDate,nHours,nMinutes,nSeconds;

  //1 獲取電腦本地時間
  function fnGetDate(){ 
    //1.1 調用date對象
    dLocal = new Date();
    //1.2 獲取當前年份
    nYear = dLocal.getFullYear(); 
    //1.3 獲取當前月份,月份是從0開始計數,所以需要加1才是正確的月份
    nMonth = dLocal.getMonth() + 1; 
    //1.4 獲取當前日期
    nDate = dLocal.getDate(); 
    //1.5 獲取當前小時
    nHours = dLocal.getHours(); 
    //1.6 獲取分鐘
    nMinutes = dLocal.getMinutes(); 
    //1.7 獲取秒數
    nSeconds = dLocal.getSeconds(); 
  }

  //2.1 封裝一個函數,用於把單數字前添加字元串0,例如1改為01
  function fnToDouble(num){  
    //聲明一個返回結果
    var sResult = ''; 
    if(num<10){
      //判斷數字小於10則是單數字,需要在前面添加字元串0
      sResult = '0' + num;
    }else{
      //數字為10以上轉換為字元串
      sResult = '' + num;
    }
    //返回格式化後的字元串
    return sResult; 
  }

   //獲取時間 
  fnGetDate();
  
  //此函數用來計算根據當前時間的數字
  function fnGetImgNum(num,bit){ 
    //聲明一個返回結果
    var nResult = 0;
    //判斷是個位還是十位,0代表十位,1代表個位  
    if(bit===0){  
      //使用Math.floor可以向下取整,即不管是0.1還是0.9,都是取整數0。此方法用來獲取時間的十位
      nResult = Math.floor(num/10);
    }else{
      //通過fnToDouble函數把時間格式化雙字元串,再取後面一個字元獲取個位,前面的+號用於轉換為數字
      nResult = +fnToDouble(num).slice(1);
    }
    return nResult;
  }

  //5.1 獲取動畫時鐘的小時元素
  var eAnimationHours = document.getElementById('animationHours');  
  //獲取小時的第一個元素
  var eHours3 = eAnimationHours.getElementsByTagName('span')[0];
  //獲取小時的第二個元素  
  var eHours4 = eAnimationHours.getElementsByTagName('span')[1];  
  //5.1 獲取動畫時鐘的分鐘元素
  var eAnimationMinutes = document.getElementById('animationMinutes');
  //獲取分鐘的第一個元素  
  var eMinutes3 = eAnimationMinutes.getElementsByTagName('span')[0];
  //獲取分鐘的第二個元素  
  var eMinutes4 = eAnimationMinutes.getElementsByTagName('span')[1];  
  //5.1 獲取動畫時鐘的秒元素
  var eAnimationSeconds = document.getElementById('animationSeconds');
  //獲取秒的第一個元素  
  var eSeconds3 = eAnimationSeconds.getElementsByTagName('span')[0];
  //獲取秒的第二個元素  
  var eSeconds4 = eAnimationSeconds.getElementsByTagName('span')[1];  

  // 5.2 根據時間修改時、分、秒元素的背景圖片位置
  function fnAnimationBg(){
    eHours3.style.backgroundPositionY = -fnGetImgNum(nHours,0) * 100 + 'px';
    eHours4.style.backgroundPositionY = -fnGetImgNum(nHours,1) * 100 + 'px';
    eMinutes3.style.backgroundPositionY = -fnGetImgNum(nMinutes,0) * 100 + 'px';
    eMinutes4.style.backgroundPositionY = -fnGetImgNum(nMinutes,1) * 100 + 'px';
    eSeconds3.style.backgroundPositionY = -fnGetImgNum(nSeconds,0) * 100 + 'px';
    eSeconds4.style.backgroundPositionY = -fnGetImgNum(nSeconds,1) * 100 + 'px';
  }
  fnAnimationBg();

  //使用定時器實時更新時間
  setInterval(function(){ 
    //3.3 每秒更新時間
    fnGetDate();  
    //5.3 使用定時器更新元素背景圖片位置
    fnAnimationBg();
  },1000); 
}
fnCreatClock();

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL安裝 1.先去官網下載安裝包 官網: http://www.mysql.com 要下載社區版(community) 選對系統,選對你要的安裝包版本 點擊後就可以下載mysql了 2.下載完壓縮包之後解壓,並把解壓後的文件放到自己要放的文件夾中(最好不要出現中文目錄), 找到該文件夾下的bi ...
  • Redis介紹: Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value資料庫。 Redis 與其他 key - value 緩存產品有以下三個特點: Redis支持數據的持久化RDB和AOF,可以將記憶體中的數據保存在磁碟中,重啟的時候可以再次載入進行使用。 Redis不僅僅 ...
  • MySQL Structured Query Language SQL簡介 SQL (Structured Query Language) 是具有數據操 縱和數據定義等多種功能的資料庫語言,這種語言具有交互性特點,能為用戶提供極大的便利,資料庫管理系統應充分利用SQL語言提高電腦應用系統的工作質量 ...
  • 當Redis客戶端出現請求超時的時候,需要檢查該時間點是否有慢查詢,從而分析出由於慢查詢導致的命令級聯阻塞。 ...
  • 引子 關於Django2版本連接MySQL發生的問題以及修改源碼的解決方法參考下麵這篇文章: Django與MySQL的交互 但是,上面這種修改源碼的方法在生產環境中使用的話會有很多問題。 本文為大家詳細講解如何在不修改Django源碼的情況下解決這個問題。 Django中的源碼解析 我們來看一下我 ...
  • 前言 前幾天有讀者找到我,說想要一套全面的Mysql面試題,今天陳某特地為她寫了一篇。 文章的目錄如下: Mysql面試題 什麼是SQL? 結構化查詢語言(Structured Query Language)簡稱SQL,是一種資料庫查詢語言。 作用:用於存取數據、查詢、更新和管理關係資料庫系統。 什 ...
  • 寫在前面 書籍介紹:本書由架構師撰寫,包含ReactNative框架底層原理,以及與iOS、Android混合開發案例,精選了大量實例代碼,方便讀者快速學習。主要內容分為兩大部分,第1部分“入門”包括第1~9章,介紹ReactNative框架的基本原理與使用方法;第2部分“進階”包括第10~15章, ...
  • git安裝: 去官網下載,傻瓜式安裝即可 安裝完成後在cmd里搜索git bash並打開 針對所有倉庫配置這台機器的用戶名和郵箱 git config --global user.name "cyy" git config --global user.email "郵箱" git config -l ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...