您的网站或应用程序需要数字时钟吗?在这篇博客文章中,我们将向您展示如何使用JavaScript创建自定义数字时钟,您可以根据自己的喜好进行配置。
我们将引导您完成代码,让您了解这一切是如何工作的,然后就如何使用新时钟给出一些想法。因此,无论您是在寻找一种快速简便的方法,将数字时钟纳入您的下一个项目,还是只想了解更多关于JavaScript编程的信息,请继续阅读!
1.为数字时钟创建HTML。
<section id="clockContainer" class="clockContainer-theme-day"> <div id="clockTime" class="clockTime-theme-day">N/a</div> </section>
2.为时钟控制面板创建HTML,您可以在其中设置时间格式(12小时或24小时)、主题(亮、暗或自动)和面部方向(垂直或水平)。
<button id="btnAdjustOpen" type="button" class="btn btn-link"> <span class="glyphicon glyphicon-cog" aria-hidden="true"></span> Adjustments </button> <section id="adjustmentContainer" class="adjustment-theme-day"> <button id="btnAdjustClose" type="button" class="btn btn-danger" style="float:right;">Close</button> <br><br> <h3>Time Format</h3> <div id="btnGroupTimeFormat" class="btn-group btn-group-toggle" data-toggle="buttons"> <label class="btn btn-secondary active"> <input type="radio" name="options" id="option1" autocomplete="off"> 12 Hour </label> <label class="btn btn-secondary"> <input type="radio" name="options" id="option2" autocomplete="off"> 24 Hour </label> </div> <br><br> <h3>Theme</h3> <div id="btnGroupTheme" class="btn-group btn-group-toggle" data-toggle="buttons"> <label class="btn btn-secondary active"> <input type="radio" name="options" id="option1" autocomplete="off"> Day </label> <label class="btn btn-secondary"> <input type="radio" name="options" id="option2" autocomplete="off"> Night </label> <label class="btn btn-secondary"> <input type="radio" name="options" id="option3" autocomplete="off"> Auto </label> </div> <br><br> <h3>Face Orientation</h3> <div id="btnGroupOrientation" class="btn-group btn-group-toggle" data-toggle="buttons"> <label class="btn btn-secondary active"> <input type="radio" name="options" id="option1" autocomplete="off"> Horizontal </label> <label class="btn btn-secondary"> <input type="radio" name="options" id="option2" autocomplete="off"> Verticle </label> </div> </section>
3.数字时钟的主要CSS样式。
#clockContainer { width: fit-content; margin: 0 auto; margin-top: 8.5rem; padding: 3rem; border-radius: 80px; } #clockTime { font-size: 12rem; font-weight: 900; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } /* The button to open the adjustment container */ #btnAdjustOpen{ position: fixed; top: 0; right: 0; margin: 16px; } /* The adjustment container */ #adjustmentContainer { display: inline-block; position: fixed; width: 18rem; height: 100vh; margin-right: -18rem; padding: 16px; right: 0; top: 0; color: #fff; }
4.白天/晚上主题的CSS样式。
/* Day theme colors */ .body-theme-day { background-color: rgb(240, 240, 240); } .clockContainer-theme-day { box-shadow: 25px 25px 25px #FFFFFF, -25px -25px 25px #dbdbdb; } .clockTime-theme-day { color: #000; } .adjustment-theme-day { background-color: rgb(29, 29, 29); box-shadow: 0px -1rem 15px rgb(29, 29, 29); } /* Night theme colors */ .body-theme-night { background-color: rgb(29, 29, 29); } .clockContainer-theme-night { box-shadow: 25px 25px 25px #0a0a0a, -25px -25px 25px #242424; } .clockTime-theme-night { color: rgb(175, 175, 175); } .adjustment-theme-night { background-color: rgb(240, 240, 240); } .adjustment-theme-night > h3 { color: #000; }
5.通过将主题CSS类添加到body标记来设置初始主题。
<body class="body-theme-day"> ... </body> <!-- OR --> <body class="body-theme-night"> ... </body>
6.在文档中加载必要的jQuery库。
<script src="/path/to/cdn/jquery.min.js"></script>
7.数字时钟的主要功能。
// Provides a simple clock with built-in DOM manipulation // Set the time of the clock function updateClockTick() { var $clockComponent = $("#clockTime"); var mDate = new Date(); var hour = mDate.getHours(); var minute = mDate.getMinutes(); var second = mDate.getSeconds(); // Adjustments made by script.adjustment.js // By default it is military time // if (currentClockSetting == ADJUSTMENT_CLOCK_USE_12_HOUR) { if (hour > 12) { hour -= 12; } } // Adjustments made by script.adjustment.js // apply a <br> to create a horitonztal or verticle clock face if (currentOrientationSetting == ADJUSTMENT_ORIENTATION_HORIZONTAL) { // Remove padding by clock when horizontal $clockComponent.parent().css("marginTop", ""); $clockComponent.text(zeroPad(hour) + ":" + zeroPad(minute)); } else if (currentOrientationSetting == ADJUSTMENT_ORIENTATION_VERTICAL) { // Add padding by clock when vertical $clockComponent.parent().css("marginTop", "1.5rem"); $clockComponent.html(zeroPad(hour) + "<br>" + zeroPad(minute)); } } // Thanks for the slice idea https://stackoverflow.com/questions/18889548/javascript-change-gethours-to-2-digit // Add leading zeros to numbers, // returns a string function zeroPad(num) { return ("0" + num).slice(-2); }
8.以下脚本负责根据用户的喜好动态调整页面内容
// This script is responsible for adjusting the page content dynamically // based on what the user prefered const ADJUSTMENT_CLOCK_USE_12_HOUR = 0; const ADJUSTMENT_CLOCK_USE_24_HOUR = 1; var currentClockSetting = 0; const THEME_DAY = 0; const THEME_NIGHT = 1; const THEME_AUTO = 2; var currentThemeSetting = 0; var watchTheme = window.matchMedia("(prefers-color-scheme: dark)"); const ADJUSTMENT_ORIENTATION_HORIZONTAL = 0; const ADJUSTMENT_ORIENTATION_VERTICAL = 1; var currentOrientationSetting = ADJUSTMENT_ORIENTATION_HORIZONTAL; // Initiator of this script function pageIsReady() { // Buttons var $btnAdjust = $("#btnAdjustOpen"); var $btnAdjustClose = $("#btnAdjustClose"); var $adjustContainer = $("#adjustmentContainer"); $btnAdjust.click(function() { // Show the adjustment pane & hide this button $btnAdjust.hide(); $adjustContainer.animate({ right: "18rem" }, 200, "swing"); }); $btnAdjustClose.click(function() { // Hide the adjustment pane & show this button $btnAdjust.show(); $adjustContainer.animate({ right: 0 }, 200, "swing"); }); // Add click listeners to each radio input. And when clicked, // update the corresponding option with an int value based // on the button index. (Taking a look at the UI will help) var $inputGroupTime = $("#btnGroupTimeFormat > label > input"); // For each option in the radio group $inputGroupTime.each(function(index, e) { // Add a click listener. Set the // adjustment value equal to // the index // TODO: Kind of makes the CONST variable useless // in a sort of way var thisElement = $(e); $(e).click(function() { currentClockSetting = index; // Remove the css highlight on any of the elements $inputGroupTime.parent().removeClass("active"); // Highlight this element thisElement.parent().addClass("active"); }); }); // Find the radio group var $inputGroupTheme = $("#btnGroupTheme > label > input"); // For each option in the radio group $inputGroupTheme.each(function(index, e) { // Add a click listener. Set the // adjustment value equal to // the index // TODO: Kind of makes the CONST variable useless // in a sort of way var thisElement = $(e); $(e).click(function() { if (currentThemeSetting != index) { currentThemeSetting = index; // Remove the css highlight on any of the elements $inputGroupTheme.parent().removeClass("active"); // Highlight this element thisElement.parent().addClass("active"); // Updates the UI to a dark or light theme themeOptions(index); } }); }); // Find the radio group var $inputGroupOrientation = $("#btnGroupOrientation > label > input"); // For each option in the radio group $inputGroupOrientation.each(function(index, e) { // Add a click listener. Set the // adjustment value equal to // the index // TODO: Kind of makes the CONST variable useless // in a sort of way var thisElement = $(e); $(e).click(function() { currentOrientationSetting = index; // Remove the css highlight on any of the elements $inputGroupOrientation.parent().removeClass("active"); // Highlight this element thisElement.parent().addClass("active"); }); }); } function themeOptions(selectedIndex){ if (selectedIndex == THEME_DAY) { watchTheme.removeEventListener("change", windowThemeChanged); applyTheme("day"); } else if (selectedIndex == THEME_NIGHT) { watchTheme.removeEventListener("change", windowThemeChanged); applyTheme("night"); } else if (selectedIndex == THEME_AUTO) { // Register an event listener. // Call an event when the host system's theme changes windowThemeChanged(watchTheme); watchTheme.addEventListener("change", windowThemeChanged); } } // Called when the host system theme is changed function windowThemeChanged(e){ const newTheme = e.matches ? "dark" : "light"; if (newTheme == "dark") { applyTheme("night"); } else if (newTheme == "light") { applyTheme("day"); } } // Applies a "day" or "night" theme to the website // based on the input string function applyTheme(themeString){ // Grab all the elements that require changing // remove the classes and then add the classes with the specified // "day" or "night" string $("body").removeClass().addClass("body-theme-" + themeString); $("#clockContainer").removeClass().addClass("clockContainer-theme-" + themeString); $("#clockTime").removeClass().addClass("clockTime-theme-" + themeString); $("#adjustmentContainer").removeClass().addClass("adjustment-theme-" + themeString); }
9.启用数字时钟。
$(document).ready(function() { // Once this script is loaded, call the other clock // script that the DOM can be manipulated pageIsReady(); // Create a repeatable ticker object which calls upon // other objects var interval = setInterval(function() { // Call tick function updateClockTick(); }, 1000); });