This HTML file sets up a basic structure with a container holding control buttons and a countdown display area.

Implementing countdown logic using JavaScript

Next, we\\'ll add JavaScript to manage the countdown logic. Add the following code to index.js:

window.addEventListener(\\\"load\\\", () => {  const startBtn = document.getElementById(\\'startBtn\\');  const pauseBtn = document.getElementById(\\'pauseBtn\\');  const countdownView = document.getElementsByClassName(\\'countdown\\')[0];  let totalTime = 10;  let timeLeft;  let countDownIntervalID;  let isPaused = false;  pauseBtn.style.display = \\'none\\';});  

In this block of code, we initialize the startBtn, pauseBtn, and countdownView elements by their respective IDs and classes. We also set some initial variables: totalTime, timeLeft, countDownIntervalID, and isPaused. Additionally, we set the pause button to hide initially.

Now, let\\'s add event listeners for the start and pause buttons:

startBtn.addEventListener(\\'click\\', startOrStopTimer);pauseBtn.addEventListener(\\'click\\', pauseOrResumeTimer);

These lines attach click event listeners to the start and pause buttons. The functions startOrStopTimer and pauseOrResumeTimer are defined later to handle the button clicks.

Add the following code to define the startOrStopTimer function:

function startOrStopTimer() {  startBtn.innerHTML = startBtn.innerHTML === \\'Start\\' ? \\'Stop\\' : \\'Start\\';  if (countDownIntervalID === undefined && !isPaused) {    timeLeft = totalTime;    startTimer();    pauseBtn.style.display = \\'inline\\';  } else {    stopTimer();    countdownView.innerHTML = \\'\\';    pauseBtn.style.display = \\'none\\';    isPaused = false;    pauseBtn.innerHTML = \\'Pause\\';  }}

In this function, we toggle the start button text between Start and Stop. If the countdown is not running and not paused, we initialize timeLeft to totalTime and start the timer. Otherwise, we stop the timer and reset the view.

Now, define the startTimer function:

function startTimer() {  countDownIntervalID = setInterval(() => {    countdownView.innerHTML = timeLeft;    if (timeLeft === 0) {      stopTimer();      startBtn.innerHTML = \\'Start\\';      pauseBtn.style.display = \\'none\\';      countdownView.innerHTML = \\'\\';    } else {      timeLeft = timeLeft - 1;    }  }, 1000);}

This function sets an interval to update the countdown every second. If timeLeft reaches zero, we stop the timer, reset the start button text, and hide the pause button.

Next, add the stopTimer function:

function stopTimer() {  if (countDownIntervalID !== undefined) {    clearInterval(countDownIntervalID);    countDownIntervalID = undefined;  }}

This function clears the countdown interval and resets countDownIntervalID. Finally, add the pauseOrResumeTimer function:

function pauseOrResumeTimer() {  isPaused = !isPaused;  pauseBtn.innerHTML = isPaused ? \\'Resume\\' : \\'Pause\\';  if (countDownIntervalID !== undefined) {    stopTimer();  } else {    startTimer();  }}

In this function, we toggle the pause state and button text between Pause and Resume. If the countdown is running, we stop the timer; otherwise, we start it again.

CSS styling

Now, let\\'s style the countdown timer using CSS. Add the following code to styles.css:

body {  background-color: black;  font-family: Arial, sans-serif;  height: 100%;}.container {  display: flex;  flex-direction: column;  justify-content: center;  align-items: center;}.controls {  width: 20%;  margin-top: 10%;  display: flex;  justify-content: space-between;  flex-direction: row;  flex-wrap: wrap;}.countdown-container {  position: relative;  width: 20vw;  height: 20vw;  margin-top: 2%;  border: 0.4em solid #9b51e0;}button {  font-size: 1.5em;  border: none;  padding: 0.3em;  background-color: #9b51e0;  border-radius: 0.4em;  color: white;}.countdown {  position: relative;  width: 100%;  height: 100%;  list-style: none;  padding: 0;  margin: 0;  display: flex;  justify-content: center;  align-items: center;  font-size: 5em;  color: #9b51e0;}

This CSS defines styles for the countdown timer interface. The body background is set to black, and we use Arial as the primary font. The .container class is styled to center its contents and provide spacing between elements. The .controls class styles the buttons for starting and pausing the timer, ensuring they are evenly spaced and responsive. The .countdown-container class defines the size and appearance of the countdown display, including a border and margin.

Go back to your terminal and run the following command to start serving the JavaScript countdown application:

node server.js

Open a new tab in your browser, navigate to http://localhost:3001, and you should see something similar to the following: \\\"How Test out the countdown timer and once you are done, terminate the server application and move to the next step.

Adding a circular progress indicator

To enhance the user experience of our countdown timer, let’s add a circular progress indicator to give the user a visual representation of the time remaining.

First, we need to modify our HTML code to include the circular progress element. In index.html, we add a span element with a class of circular-progress inside the countdown-container div. This span element will be used to create the circular progress indicator:

Next, we need to define the CSS for the circular progress indicator. In styles.css, we add the following code:

.countdown-container {  ...  /* border : 0.4em solid #9b51e0; */}.circular-progress {  width: 20vw;  height: 20vw;  border-radius: 50%;  display: flex;  justify-content: center;  align-items: center;  position: absolute;  transition: 0.5s;  background-color: #13171f;}.circular-progress::before {  width: 18.5vw;  height: 18.5vw;  content: \\\"\\\";  position: absolute;  border-radius: 50%;  background-color: black;}

This code first removes the border from the countdown-container div, then sets the dimensions and shape of the circular progress indicator, as well as its position and background color. We also add a ::before pseudo-element to create the inner circle of the progress indicator.

Now we need to add the JavaScript code to animate the circular progress indicator.

Add the following code in the variables initialization block:

const circularProgressEl = document.getElementsByClassName(\\\"circular-progress\\\")[0];let circularProgress;let circularProgressIntervalID;

This code initializes the circularProgressEl variable to target the circular progress element and creates two new variables, circularProgress and circularProgressIntervalID, that will be used to animate the progress indicator.

Add the following code below the pauseOrResumeTimer() function:

function startCircularProgressAnimation() {  let start = totalTime - timeLeft;  let degreesPerSecond = 360 / totalTime;  let degreesPerInterval = degreesPerSecond / 20;  circularProgress = degreesPerSecond * start;   circularProgressIntervalID = setInterval(() => {    if (Math.round(circularProgress) === 360) {      clearInterval(circularProgressIntervalID);    } else {      circularProgress = circularProgress   degreesPerInterval;      circularProgressEl.style.background = `conic-gradient(#9b51e0 ${circularProgress}deg, #13171f 0deg)`;    }  }, 50);}

This code defines the startCircularProgressAnimation function, which calculates the starting point and degree of rotation for the circular progress indicator, and sets up an interval to animate the progress indicator.

Add the following code below the startCircularProgressAnimation:

function resumeCircularProgressAnimation() {  startCircularProgressAnimation();}function pauseCircularProgressAnimation() {  clearInterval(circularProgressIntervalID);}function stopCircularProgressAnimation() {  clearInterval(circularProgressIntervalID);  circularProgressEl.style.background = `conic-gradient(#9b51e0 0deg, #13171f 0deg)`;}

This code defines the resumeCircularProgressAnimation, pauseCircularProgressAnimation, and stopCircularProgressAnimation functions, which are used to start, pause, and stop the circular progress animation.

Finally, we need to modify the startOrStopTimer and pauseOrResumeTimer functions to start and stop the circular progress animation along with the timer:

function startOrStopTimer() {  // ...  if (countDownIntervalID === undefined && !isPaused) {    // ...    startCircularProgressAnimation();  } else {    // ...    stopCircularProgressAnimation();  }}function pauseOrResumeTimer() {  // ...  if (countDownIntervalID !== undefined) {    stopTimer();    pauseCircularProgressAnimation();  } else {    startTimer();    resumeCircularProgressAnimation();  }}

With these modifications, our countdown timer now includes a circular progress indicator that animates along with the timer.

Return to your terminal and run the following command to start serving the JavaScript countdown application:

node server.js

Go back to the tab in your browser where you visited the http://localhost:3001 URL, refresh the page, and you should see something similar to the following: \\\"How

Implementing a CSS-only countdown timer

In this section, we\\'ll dive into creating a countdown timer that updates every second and is made using only CSS. Our timer will be simple yet functional, featuring start and pause buttons to control its operation.

Creating the application server

Navigate to the css-only-countdown subdirectory, initialize a new node project, and install the express package:

cd ../css-only-countdownnpm init -ynpm install express

Then, return to your text editor, create a file named server.js, and add the following code to it:

const express = require(\\'express\\');const app = express();const port = 3002app.use(express.static(\\'public\\'));app.listen(port, () => {  console.log(`Css-only countdown app server started on port ${port}`);});

The code above creates an express server that will be used to serve the JavaScript countdown application in port 3002.

HTML structure

Still in your text editor, create the following files in the public subdirectory:

Add the following code to the index.html file:

        CSS Countdown Timer  
  • 10
  • 9
  • 8
  • 7
  • 6
  • 5
  • 4
  • 3
  • 2
  • 1

This code sets up the basic structure of our countdown timer. It includes a container div that holds the controls for starting and pausing the timer, as well as the countdown display itself. The controls div contains two checkboxes with labels that will serve as our start and pause buttons. These buttons toggle their respective states using CSS, thanks to the checkbox hack.

The countdown-container div holds an unordered list (ul) of list items (li) representing the countdown numbers from 10 to one. These numbers will be displayed one by one as the timer counts down.

CSS styling

Now, let\\'s style the countdown timer using CSS. Add the following code to styles.css:

body {  background-color: black;  font-family: Arial, sans-serif;  height: 100%;}.container {  display: flex;  flex-direction: column;  justify-content: center;  align-items: center;}.controls {  width: 20%;  margin-top: 10%;  display: flex;  justify-content: space-between;  flex-direction: row;  flex-wrap: wrap;}.countdown-container {  position: relative;  width: 20vw;  height: 20vw;  margin-top: 12%;  border : 0.4em solid #9b51e0;}#startLabel span {  display: none;}label {  cursor: pointer;  font-size: 1.5em;  padding: 0.3em;  background-color: #9b51e0;  border-radius: 0.4em;  color: white;}#startBtn:checked~#startLabel span:nth-child(1) {  display: inline;}#startBtn:not(:checked)~#startLabel span:nth-child(2) {  display: inline;}#startBtn:not(:checked)~#pauseLabel,#pauseBtn {  display: none;}#pauseLabel span {  display: none;}#pauseBtn:checked~#pauseLabel span:nth-child(1) {  display: inline;}#pauseBtn:not(:checked)~#pauseLabel span:nth-child(2) {  display: inline;}.checkbox-wrapper {  display: none;}

In this CSS file, we start by setting some basic styles for the body and container. The body has a black background and uses the Arial font. The container is centered using flexbox and has a margin to push it down from the top of the viewport.

The controls div is styled to be responsive and to ensure that the buttons are spaced out evenly. The countdown-container div is styled with a border, which will later be replaced by the circular progress indicator.

We use the checkbox hack to toggle the visibility of the labels for the start and pause buttons. Depending on whether the checkboxes are checked or not, different spans within the labels are displayed. This allows the labels to show different text (Start or Stop, Pause or Resume) based on the state of the checkboxes.

Now, add the following code to the bottom of the styles.css file:

.countdown {  position: relative;  width: 100%;  height: 100%;  list-style: none;  padding: 0;  margin: 0;  display: flex;  justify-content: center;  align-items: center;  font-size: 5em;  color: #9b51e0;}.countdown li {  position: absolute;  opacity: 0;  transition: opacity 1s linear;}#startBtn:checked~.countdown-container .countdown li:nth-child(1) {  animation-delay: 0s;}#startBtn:checked~.countdown-container .countdown li:nth-child(2) {  animation-delay: 1s;}#startBtn:checked~.countdown-container .countdown li:nth-child(3) {  animation-delay: 2s;}#startBtn:checked~.countdown-container .countdown li:nth-child(4) {  animation-delay: 3s;}#startBtn:checked~.countdown-container .countdown li:nth-child(5) {  animation-delay: 4s;}#startBtn:checked~.countdown-container .countdown li:nth-child(6) {  animation-delay: 5s;}#startBtn:checked~.countdown-container .countdown li:nth-child(7) {  animation-delay: 6s;}#startBtn:checked~.countdown-container .countdown li:nth-child(8) {  animation-delay: 7s;}#startBtn:checked~.countdown-container .countdown li:nth-child(9) {  animation-delay: 8s;}#startBtn:checked~.countdown-container .countdown li:nth-child(10) {  animation-delay: 9s;}@keyframes countdownAnimation {  0%,  10% {    opacity: 1;  }  11%,  100% {    opacity: 0;  }}#startBtn:checked~.countdown-container .countdown li {  animation: countdownAnimation 10s steps(10) forwards;}#pauseBtn:checked~.countdown-container .countdown li {  animation-play-state: paused;}

With this code, we style the countdown list. The countdown class is positioned absolutely within the countdown-container, and its list items are initially hidden with opacity: 0.

We then use keyframes and the animation property to create the countdown effect. The list items are displayed one by one with a delay using the animation-delay property. The countdownAnimation keyframes control the visibility of each list item, making them visible for a short period before hiding them again.

We also pause the animation when the pause button is checked, using the animation-play-state property.

Go back to your terminal and run the following command to start serving the CSS-only countdown application:

node server.js

Open a new tab in your browser, navigate to http://localhost:3002 URL, and you should see something similar to the following: \\\"How Test out the countdown timer and once you are done, terminate the server application and move to the next step.

Adding a circular progress indicator

To make the countdown timer more visually appealing, we can add a circular progress indicator that shows the remaining time. To do this, we will modify the HTML and CSS code as follows:

First, replace the countdown-container div in the index.html file with the following code:

In this code, we add a span element with a class of circular-progress inside the countdown-container div.

Next, add the following code to the styles.css file:

.countdown-container {  ...  /* border : 0.4em solid #9b51e0; */}.circular-progress {  width: 20vw;  height: 20vw;  border-radius: 50%;  display: flex;  justify-content: center;  align-items: center;  position: absolute;  transition: 0.5s;  background: conic-gradient(#9b51e0 var(--angle), #13171f 0deg);}.circular-progress::before {  width: 18.5vw;  height: 18.5vw;  content: \\\"\\\";  position: absolute;  border-radius: 50%;  background-color: black;}@keyframes circularProgressAnimation {  to {    --angle: 360deg;  }}@property --angle {  syntax: \\\"\\\";  initial-value: 0deg;  inherits: false;}#startBtn:checked~.countdown-container .circular-progress {  opacity: 1;  animation: circularProgressAnimation 10s linear;}#pauseBtn:checked~.countdown-container .circular-progress {  animation-play-state: paused;}

In this code, we first remove the border from the countdown-container div, and then add styles for the circular-progress class. The circular progress indicator is a span element that is absolutely positioned within the countdown-container. It uses a conic gradient to create the circular progress effect.

We also define a keyframe animation, circularProgressAnimation, that animates the progress indicator from 0 to 360 degrees over the duration of the countdown. The --angle CSS property is used to control the angle of the gradient.

Finally, we use the checkbox hack to start and pause the circular progress animation along with the countdown numbers. The animation is applied to the circular-progress span when the start button is checked and paused when the pause button is checked.

With these modifications, our countdown timer now includes a circular progress indicator that animates along with the timer.

Go back to your terminal and run the following command to start serving the CSS-only countdown application:

node server.js

Return to the tab in your browser where you visited the http://localhost:3002 URL, refresh the page, and you should see something similar to the following: \\\"How

Using Chrome DevTools to compare timer performance

Now that we have implemented both the CSS-only and JavaScript countdown timers, let\\'s compare their performance using Chrome DevTools.

To get started, open the Chrome browser and navigate to the webpage containing the countdown timers. Right-click anywhere on the page and select Inspect to open Chrome DevTools.

In the DevTools window, click on the Network tab and then refresh both the JavaScript and CSS-only countdown pages. This tab allows you to monitor all network requests made by the page, including HTML, CSS, JavaScript, and other resources: \\\"How

By analyzing the requests, you can determine how many resources are being loaded, their sizes, and the overall impact on page load time:

CSS-only countdown timerJavaScript countdown timer
Number of requests23
Total size4.5 KB4.7 KB
Page load24 ms27 ms

From these results, we can see that the CSS-only countdown timer requires fewer requests and has a slightly smaller total size compared to the JavaScript countdown timer. This leads to a marginally faster page load time for the CSS-only version, making it more efficient in terms of initial loading.

Now, in the DevTools window, navigate to the Performance tab and initiate a recording session by clicking on the Record button. To evaluate the JavaScript countdown timer, click on the Start button located on its respective page and allow the timer to run its course. Once the timer has stopped, cease the recording in the Performance tab.

Do this process for both the JS and CSS-only countdown pages to gather performance data for each implementation. The Performance tab offers a comprehensive analysis of your page\\'s runtime performance, encompassing scripting, rendering, and painting times. By analyzing these metrics, you can pinpoint areas that may require optimization to enhance the performance of your web application:

CSS-only countdown timerJavaScript countdown timer
Scripting2 ms49 ms
Rendering510 ms103 ms
Painting275 ms55 ms

Interpreting these results, we observe that the scripting time for the CSS-only countdown timer is significantly lower than for the JavaScript countdown timer, indicating minimal execution overhead. However, the CSS-only countdown timer has higher rendering and painting times. This is because CSS animations can sometimes require more effort from the browser to render, especially for complex styles or transitions.

In contrast, the JavaScript countdown timer shows higher scripting time due to the logic involved in updating the countdown, but it benefits from lower rendering and painting times. This suggests that while JavaScript adds some overhead in terms of script execution, it can be more efficient in terms of updating the DOM and rendering changes.

Overall, the CSS-only countdown timer is more efficient for scenarios where minimizing script execution time is critical, whereas the JavaScript timer may perform better in cases where rendering and painting times are the primary concern.

Pros and cons of each approach

Having explored both the CSS-only and JavaScript countdown timers, let\\'s weigh their advantages and disadvantages to determine which approach best suits your needs.

CSS-only countdown timer

The CSS-only countdown timer leverages pure CSS to achieve the countdown effect, providing a lightweight and straightforward solution.

Its pros include the following:

Cons to this approach include:

JavaScript countdown timer

The JavaScript countdown timer, on the other hand, uses JavaScript to manage the countdown logic and DOM updates. This approach offers greater control and flexibility.

Pros of this approach include:

Cons include:

The CSS-only timer is lightweight and easy to understand, making it a good choice for simple countdowns with minimal scripting. However, it may struggle with more complex animations and interactive features. On the other hand, the JavaScript timer offers greater control and flexibility, allowing for more dynamic interactions. This comes at the cost of higher scripting overhead and increased complexity.

Ultimately, the choice between the two approaches depends on the specific needs of your project and the trade-offs you are willing to accept.

Conclusion

In this tutorial, we explored two methods for creating a countdown timer: using JavaScript and using only CSS. We started with a basic JavaScript countdown timer, adding functionality and styling to make it user-friendly and visually appealing. Then, we implemented a CSS-only countdown timer, showcasing the power of CSS for creating simple yet effective animations.

Whether you choose the CSS-only approach for its simplicity or the JavaScript approach for its flexibility, you now have the tools and knowledge to implement a countdown timer that suits your project\\'s needs.


Is your frontend hogging your users\\' CPU?

As web frontends get increasingly complex, resource-greedy features demand more and more from the browser. If you’re interested in monitoring and tracking client-side CPU usage, memory usage, and more for all of your users in production, try LogRocket.

\\\"How

LogRocket is like a DVR for web and mobile apps, recording everything that happens in your web app, mobile app, or website. Instead of guessing why problems happen, you can aggregate and report on key frontend performance metrics, replay user sessions along with application state, log network requests, and automatically surface all errors.

Modernize how you debug web and mobile apps — start monitoring for free.

","image":"http://www.luping.net/uploads/20241116/173173428967382b1172c95.gif","datePublished":"2024-11-16T13:35:44+08:00","dateModified":"2024-11-16T13:35:44+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用 CSS 建立倒數計時器

如何使用 CSS 建立倒數計時器

發佈於2024-11-16
瀏覽:708

Written by Carlos Mucuho✏️

Countdown timers are a popular feature on many websites, enhancing functionality for events, sales, and user engagement. While JavaScript is commonly used for dynamic behavior on the web, it is also possible to create a functional and visually appealing countdown timer using only CSS.

In this tutorial, we will explore both approaches, starting with a basic JavaScript countdown timer and then moving on to a CSS-only countdown timer. At the end, we will compare the performance of both approaches using Chrome DevTools and discuss each of their pros and cons.

Creating a basic JavaScript countdown timer

We'll start by creating a simple countdown timer that updates every second. The timer will include a start and pause button to control its operation.

Creating the directory structure

Before we create the JavaScript countdown timer, we need to create a directory to store the applications we will build throughout this tutorial.

Open a terminal window, navigate to a directory suitable for your project, and use the following command to create a directory named countdown-timer:

mkdir countdown-timer

Then, navigate to this directory:

cd countdown-timer

Create two subdirectories named javascript-countdown and css-only-countdown, and inside each subdirectory, create a subdirectory named public:

mkdir javascript-countdown && mkdir javascript-countdown/public
mkdir css-only-countdown && mkdir css-only-countdown/public

Creating the application server

Next, navigate to the javascript-countdown subdirectory, initialize a new node project with default settings, and install the express package:

cd javascript-countdown
npm init -y
npm install express

Open your favorite text editor, create a file named server.js, and add the following code to it:

const express = require('express');
const app = express();
const port = 3001

app.use(express.static('public'));
app.listen(port, () => {
  console.log(`Javascript countdown app server started on port ${port}`);
});

The code above creates an express server that will be used to serve the JavaScript countdown application in port 3001.

HTML structure

Still in your text editor, create the following files in the public subdirectory located inside the javascript-countdown directory:

  • index.html for the HTML code
  • styles.css for the CSS code
  • index.js for the JavaScript code

Add the following code to index.html:



  Javascript Countdown Timer

This HTML file sets up a basic structure with a container holding control buttons and a countdown display area.

Implementing countdown logic using JavaScript

Next, we'll add JavaScript to manage the countdown logic. Add the following code to index.js:

window.addEventListener("load", () => {
  const startBtn = document.getElementById('startBtn');
  const pauseBtn = document.getElementById('pauseBtn');
  const countdownView = document.getElementsByClassName('countdown')[0];

  let totalTime = 10;
  let timeLeft;
  let countDownIntervalID;
  let isPaused = false;

  pauseBtn.style.display = 'none';
});  

In this block of code, we initialize the startBtn, pauseBtn, and countdownView elements by their respective IDs and classes. We also set some initial variables: totalTime, timeLeft, countDownIntervalID, and isPaused. Additionally, we set the pause button to hide initially.

Now, let's add event listeners for the start and pause buttons:

startBtn.addEventListener('click', startOrStopTimer);
pauseBtn.addEventListener('click', pauseOrResumeTimer);

These lines attach click event listeners to the start and pause buttons. The functions startOrStopTimer and pauseOrResumeTimer are defined later to handle the button clicks.

Add the following code to define the startOrStopTimer function:

function startOrStopTimer() {
  startBtn.innerHTML = startBtn.innerHTML === 'Start' ? 'Stop' : 'Start';
  if (countDownIntervalID === undefined && !isPaused) {
    timeLeft = totalTime;
    startTimer();
    pauseBtn.style.display = 'inline';
  } else {
    stopTimer();
    countdownView.innerHTML = '';
    pauseBtn.style.display = 'none';
    isPaused = false;
    pauseBtn.innerHTML = 'Pause';
  }
}

In this function, we toggle the start button text between Start and Stop. If the countdown is not running and not paused, we initialize timeLeft to totalTime and start the timer. Otherwise, we stop the timer and reset the view.

Now, define the startTimer function:

function startTimer() {
  countDownIntervalID = setInterval(() => {
    countdownView.innerHTML = timeLeft;

    if (timeLeft === 0) {
      stopTimer();
      startBtn.innerHTML = 'Start';
      pauseBtn.style.display = 'none';
      countdownView.innerHTML = '';
    } else {
      timeLeft = timeLeft - 1;
    }
  }, 1000);
}

This function sets an interval to update the countdown every second. If timeLeft reaches zero, we stop the timer, reset the start button text, and hide the pause button.

Next, add the stopTimer function:

function stopTimer() {
  if (countDownIntervalID !== undefined) {
    clearInterval(countDownIntervalID);
    countDownIntervalID = undefined;
  }
}

This function clears the countdown interval and resets countDownIntervalID. Finally, add the pauseOrResumeTimer function:

function pauseOrResumeTimer() {
  isPaused = !isPaused;
  pauseBtn.innerHTML = isPaused ? 'Resume' : 'Pause';

  if (countDownIntervalID !== undefined) {
    stopTimer();
  } else {
    startTimer();
  }
}

In this function, we toggle the pause state and button text between Pause and Resume. If the countdown is running, we stop the timer; otherwise, we start it again.

CSS styling

Now, let's style the countdown timer using CSS. Add the following code to styles.css:

body {
  background-color: black;
  font-family: Arial, sans-serif;
  height: 100%;
}

.container {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.controls {
  width: 20%;
  margin-top: 10%;
  display: flex;
  justify-content: space-between;
  flex-direction: row;
  flex-wrap: wrap;
}

.countdown-container {
  position: relative;
  width: 20vw;
  height: 20vw;
  margin-top: 2%;
  border: 0.4em solid #9b51e0;
}

button {
  font-size: 1.5em;
  border: none;
  padding: 0.3em;
  background-color: #9b51e0;
  border-radius: 0.4em;
  color: white;
}

.countdown {
  position: relative;
  width: 100%;
  height: 100%;
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 5em;
  color: #9b51e0;
}

This CSS defines styles for the countdown timer interface. The body background is set to black, and we use Arial as the primary font. The .container class is styled to center its contents and provide spacing between elements. The .controls class styles the buttons for starting and pausing the timer, ensuring they are evenly spaced and responsive. The .countdown-container class defines the size and appearance of the countdown display, including a border and margin.

Go back to your terminal and run the following command to start serving the JavaScript countdown application:

node server.js

Open a new tab in your browser, navigate to http://localhost:3001, and you should see something similar to the following: How to build a countdown timer using CSS Test out the countdown timer and once you are done, terminate the server application and move to the next step.

Adding a circular progress indicator

To enhance the user experience of our countdown timer, let’s add a circular progress indicator to give the user a visual representation of the time remaining.

First, we need to modify our HTML code to include the circular progress element. In index.html, we add a span element with a class of circular-progress inside the countdown-container div. This span element will be used to create the circular progress indicator:

Next, we need to define the CSS for the circular progress indicator. In styles.css, we add the following code:

.countdown-container {
  ...
  /* border : 0.4em solid #9b51e0; */
}
.circular-progress {
  width: 20vw;
  height: 20vw;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
  position: absolute;
  transition: 0.5s;
  background-color: #13171f;
}

.circular-progress::before {
  width: 18.5vw;
  height: 18.5vw;
  content: "";
  position: absolute;
  border-radius: 50%;
  background-color: black;
}

This code first removes the border from the countdown-container div, then sets the dimensions and shape of the circular progress indicator, as well as its position and background color. We also add a ::before pseudo-element to create the inner circle of the progress indicator.

Now we need to add the JavaScript code to animate the circular progress indicator.

Add the following code in the variables initialization block:

const circularProgressEl = document.getElementsByClassName("circular-progress")[0];
let circularProgress;
let circularProgressIntervalID;

This code initializes the circularProgressEl variable to target the circular progress element and creates two new variables, circularProgress and circularProgressIntervalID, that will be used to animate the progress indicator.

Add the following code below the pauseOrResumeTimer() function:

function startCircularProgressAnimation() {
  let start = totalTime - timeLeft;
  let degreesPerSecond = 360 / totalTime;
  let degreesPerInterval = degreesPerSecond / 20;
  circularProgress = degreesPerSecond * start; 

  circularProgressIntervalID = setInterval(() => {
    if (Math.round(circularProgress) === 360) {
      clearInterval(circularProgressIntervalID);
    } else {
      circularProgress = circularProgress   degreesPerInterval;
      circularProgressEl.style.background = `conic-gradient(#9b51e0 ${circularProgress}deg, #13171f 0deg)`;
    }
  }, 50);
}

This code defines the startCircularProgressAnimation function, which calculates the starting point and degree of rotation for the circular progress indicator, and sets up an interval to animate the progress indicator.

Add the following code below the startCircularProgressAnimation:

function resumeCircularProgressAnimation() {
  startCircularProgressAnimation();
}

function pauseCircularProgressAnimation() {
  clearInterval(circularProgressIntervalID);
}

function stopCircularProgressAnimation() {
  clearInterval(circularProgressIntervalID);
  circularProgressEl.style.background = `conic-gradient(#9b51e0 0deg, #13171f 0deg)`;
}

This code defines the resumeCircularProgressAnimation, pauseCircularProgressAnimation, and stopCircularProgressAnimation functions, which are used to start, pause, and stop the circular progress animation.

Finally, we need to modify the startOrStopTimer and pauseOrResumeTimer functions to start and stop the circular progress animation along with the timer:

function startOrStopTimer() {
  // ...
  if (countDownIntervalID === undefined && !isPaused) {
    // ...
    startCircularProgressAnimation();
  } else {
    // ...
    stopCircularProgressAnimation();
  }
}

function pauseOrResumeTimer() {
  // ...
  if (countDownIntervalID !== undefined) {
    stopTimer();
    pauseCircularProgressAnimation();
  } else {
    startTimer();
    resumeCircularProgressAnimation();
  }
}

With these modifications, our countdown timer now includes a circular progress indicator that animates along with the timer.

Return to your terminal and run the following command to start serving the JavaScript countdown application:

node server.js

Go back to the tab in your browser where you visited the http://localhost:3001 URL, refresh the page, and you should see something similar to the following: How to build a countdown timer using CSS

Implementing a CSS-only countdown timer

In this section, we'll dive into creating a countdown timer that updates every second and is made using only CSS. Our timer will be simple yet functional, featuring start and pause buttons to control its operation.

Creating the application server

Navigate to the css-only-countdown subdirectory, initialize a new node project, and install the express package:

cd ../css-only-countdown
npm init -y
npm install express

Then, return to your text editor, create a file named server.js, and add the following code to it:

const express = require('express');
const app = express();
const port = 3002
app.use(express.static('public'));

app.listen(port, () => {
  console.log(`Css-only countdown app server started on port ${port}`);
});

The code above creates an express server that will be used to serve the JavaScript countdown application in port 3002.

HTML structure

Still in your text editor, create the following files in the public subdirectory:

  • index.html for the HTML code
  • styles.css for the CSS code

Add the following code to the index.html file:



  CSS Countdown Timer
  • 10
  • 9
  • 8
  • 7
  • 6
  • 5
  • 4
  • 3
  • 2
  • 1

This code sets up the basic structure of our countdown timer. It includes a container div that holds the controls for starting and pausing the timer, as well as the countdown display itself. The controls div contains two checkboxes with labels that will serve as our start and pause buttons. These buttons toggle their respective states using CSS, thanks to the checkbox hack.

The countdown-container div holds an unordered list (ul) of list items (li) representing the countdown numbers from 10 to one. These numbers will be displayed one by one as the timer counts down.

CSS styling

Now, let's style the countdown timer using CSS. Add the following code to styles.css:

body {
  background-color: black;
  font-family: Arial, sans-serif;
  height: 100%;
}

.container {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}

.controls {
  width: 20%;
  margin-top: 10%;
  display: flex;
  justify-content: space-between;
  flex-direction: row;
  flex-wrap: wrap;
}

.countdown-container {
  position: relative;
  width: 20vw;
  height: 20vw;
  margin-top: 12%;
  border : 0.4em solid #9b51e0;
}

#startLabel span {
  display: none;
}

label {
  cursor: pointer;
  font-size: 1.5em;
  padding: 0.3em;
  background-color: #9b51e0;
  border-radius: 0.4em;
  color: white;
}

#startBtn:checked~#startLabel span:nth-child(1) {
  display: inline;
}

#startBtn:not(:checked)~#startLabel span:nth-child(2) {
  display: inline;
}

#startBtn:not(:checked)~#pauseLabel,
#pauseBtn {
  display: none;
}

#pauseLabel span {
  display: none;
}

#pauseBtn:checked~#pauseLabel span:nth-child(1) {
  display: inline;
}

#pauseBtn:not(:checked)~#pauseLabel span:nth-child(2) {
  display: inline;
}

.checkbox-wrapper {
  display: none;
}

In this CSS file, we start by setting some basic styles for the body and container. The body has a black background and uses the Arial font. The container is centered using flexbox and has a margin to push it down from the top of the viewport.

The controls div is styled to be responsive and to ensure that the buttons are spaced out evenly. The countdown-container div is styled with a border, which will later be replaced by the circular progress indicator.

We use the checkbox hack to toggle the visibility of the labels for the start and pause buttons. Depending on whether the checkboxes are checked or not, different spans within the labels are displayed. This allows the labels to show different text (Start or Stop, Pause or Resume) based on the state of the checkboxes.

Now, add the following code to the bottom of the styles.css file:

.countdown {
  position: relative;
  width: 100%;
  height: 100%;
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 5em;
  color: #9b51e0;
}

.countdown li {
  position: absolute;
  opacity: 0;
  transition: opacity 1s linear;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(1) {
  animation-delay: 0s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(2) {
  animation-delay: 1s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(3) {
  animation-delay: 2s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(4) {
  animation-delay: 3s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(5) {
  animation-delay: 4s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(6) {
  animation-delay: 5s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(7) {
  animation-delay: 6s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(8) {
  animation-delay: 7s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(9) {
  animation-delay: 8s;
}

#startBtn:checked~.countdown-container .countdown li:nth-child(10) {
  animation-delay: 9s;
}

@keyframes countdownAnimation {
  0%,
  10% {
    opacity: 1;
  }
  11%,
  100% {
    opacity: 0;
  }
}

#startBtn:checked~.countdown-container .countdown li {
  animation: countdownAnimation 10s steps(10) forwards;
}

#pauseBtn:checked~.countdown-container .countdown li {
  animation-play-state: paused;
}

With this code, we style the countdown list. The countdown class is positioned absolutely within the countdown-container, and its list items are initially hidden with opacity: 0.

We then use keyframes and the animation property to create the countdown effect. The list items are displayed one by one with a delay using the animation-delay property. The countdownAnimation keyframes control the visibility of each list item, making them visible for a short period before hiding them again.

We also pause the animation when the pause button is checked, using the animation-play-state property.

Go back to your terminal and run the following command to start serving the CSS-only countdown application:

node server.js

Open a new tab in your browser, navigate to http://localhost:3002 URL, and you should see something similar to the following: How to build a countdown timer using CSS Test out the countdown timer and once you are done, terminate the server application and move to the next step.

Adding a circular progress indicator

To make the countdown timer more visually appealing, we can add a circular progress indicator that shows the remaining time. To do this, we will modify the HTML and CSS code as follows:

First, replace the countdown-container div in the index.html file with the following code:

  • 10
  • 9
  • 8
  • 7
  • 6
  • 5
  • 4
  • 3
  • 2
  • 1

In this code, we add a span element with a class of circular-progress inside the countdown-container div.

Next, add the following code to the styles.css file:

.countdown-container {
  ...
  /* border : 0.4em solid #9b51e0; */
}

.circular-progress {
  width: 20vw;
  height: 20vw;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
  position: absolute;
  transition: 0.5s;
  background: conic-gradient(#9b51e0 var(--angle), #13171f 0deg);
}

.circular-progress::before {
  width: 18.5vw;
  height: 18.5vw;
  content: "";
  position: absolute;
  border-radius: 50%;
  background-color: black;
}

@keyframes circularProgressAnimation {
  to {
    --angle: 360deg;
  }
}

@property --angle {
  syntax: "";
  initial-value: 0deg;
  inherits: false;
}

#startBtn:checked~.countdown-container .circular-progress {
  opacity: 1;
  animation: circularProgressAnimation 10s linear;
}

#pauseBtn:checked~.countdown-container .circular-progress {
  animation-play-state: paused;
}

In this code, we first remove the border from the countdown-container div, and then add styles for the circular-progress class. The circular progress indicator is a span element that is absolutely positioned within the countdown-container. It uses a conic gradient to create the circular progress effect.

We also define a keyframe animation, circularProgressAnimation, that animates the progress indicator from 0 to 360 degrees over the duration of the countdown. The --angle CSS property is used to control the angle of the gradient.

Finally, we use the checkbox hack to start and pause the circular progress animation along with the countdown numbers. The animation is applied to the circular-progress span when the start button is checked and paused when the pause button is checked.

With these modifications, our countdown timer now includes a circular progress indicator that animates along with the timer.

Go back to your terminal and run the following command to start serving the CSS-only countdown application:

node server.js

Return to the tab in your browser where you visited the http://localhost:3002 URL, refresh the page, and you should see something similar to the following: How to build a countdown timer using CSS

Using Chrome DevTools to compare timer performance

Now that we have implemented both the CSS-only and JavaScript countdown timers, let's compare their performance using Chrome DevTools.

To get started, open the Chrome browser and navigate to the webpage containing the countdown timers. Right-click anywhere on the page and select Inspect to open Chrome DevTools.

In the DevTools window, click on the Network tab and then refresh both the JavaScript and CSS-only countdown pages. This tab allows you to monitor all network requests made by the page, including HTML, CSS, JavaScript, and other resources: How to build a countdown timer using CSS

By analyzing the requests, you can determine how many resources are being loaded, their sizes, and the overall impact on page load time:

CSS-only countdown timer JavaScript countdown timer
Number of requests 2 3
Total size 4.5 KB 4.7 KB
Page load 24 ms 27 ms

From these results, we can see that the CSS-only countdown timer requires fewer requests and has a slightly smaller total size compared to the JavaScript countdown timer. This leads to a marginally faster page load time for the CSS-only version, making it more efficient in terms of initial loading.

Now, in the DevTools window, navigate to the Performance tab and initiate a recording session by clicking on the Record button. To evaluate the JavaScript countdown timer, click on the Start button located on its respective page and allow the timer to run its course. Once the timer has stopped, cease the recording in the Performance tab.

Do this process for both the JS and CSS-only countdown pages to gather performance data for each implementation. The Performance tab offers a comprehensive analysis of your page's runtime performance, encompassing scripting, rendering, and painting times. By analyzing these metrics, you can pinpoint areas that may require optimization to enhance the performance of your web application:

CSS-only countdown timer JavaScript countdown timer
Scripting 2 ms 49 ms
Rendering 510 ms 103 ms
Painting 275 ms 55 ms

Interpreting these results, we observe that the scripting time for the CSS-only countdown timer is significantly lower than for the JavaScript countdown timer, indicating minimal execution overhead. However, the CSS-only countdown timer has higher rendering and painting times. This is because CSS animations can sometimes require more effort from the browser to render, especially for complex styles or transitions.

In contrast, the JavaScript countdown timer shows higher scripting time due to the logic involved in updating the countdown, but it benefits from lower rendering and painting times. This suggests that while JavaScript adds some overhead in terms of script execution, it can be more efficient in terms of updating the DOM and rendering changes.

Overall, the CSS-only countdown timer is more efficient for scenarios where minimizing script execution time is critical, whereas the JavaScript timer may perform better in cases where rendering and painting times are the primary concern.

Pros and cons of each approach

Having explored both the CSS-only and JavaScript countdown timers, let's weigh their advantages and disadvantages to determine which approach best suits your needs.

CSS-only countdown timer

The CSS-only countdown timer leverages pure CSS to achieve the countdown effect, providing a lightweight and straightforward solution.

Its pros include the following:

  • Minimal scripting overhead: As seen in our performance analysis, the CSS-only timer requires very little scripting, resulting in lower CPU usage for script execution. This can be beneficial for enhancing overall page performance, especially on devices with limited processing power
  • Simplified codebase: By utilizing CSS for animations, the code remains cleaner and more maintainable. This approach reduces the complexity of the implementation and can make it easier for developers to understand and manage the code

Cons to this approach include:

  • Higher rendering and painting times: The CSS-only timer tends to have higher rendering and painting times. This is due to the nature of CSS animations, which can be more demanding on the browser’s rendering engine. This could impact performance on pages with multiple animations or complex layouts
  • Limited interactivity: CSS animations are inherently less flexible than JavaScript. Implementing more interactive features, such as dynamic updates or conditional logic, can be challenging and may require additional JavaScript, partially negating the simplicity advantage

JavaScript countdown timer

The JavaScript countdown timer, on the other hand, uses JavaScript to manage the countdown logic and DOM updates. This approach offers greater control and flexibility.

Pros of this approach include:

  • Enhanced control and flexibility: JavaScript provides fine-grained control over the countdown logic and DOM manipulation. This allows for more complex interactions, conditional behavior, and dynamic updates, making it suitable for more sophisticated applications
  • Efficient rendering and painting: As our performance analysis indicates, the JavaScript timer benefits from lower rendering and painting times. JavaScript can optimize updates to the DOM, resulting in smoother animations and better performance in scenarios involving frequent updates

Cons include:

  • Higher scripting overhead: The primary drawback of the JavaScript countdown timer is the increased scripting time. The JavaScript logic introduces additional CPU overhead, which can impact performance, particularly on devices with lower processing power or on pages with heavy script usage
  • Increased complexity: Implementing a JavaScript countdown timer involves writing and managing more code, which can increase the complexity of the project. This added complexity can make the codebase harder to maintain and debug

The CSS-only timer is lightweight and easy to understand, making it a good choice for simple countdowns with minimal scripting. However, it may struggle with more complex animations and interactive features. On the other hand, the JavaScript timer offers greater control and flexibility, allowing for more dynamic interactions. This comes at the cost of higher scripting overhead and increased complexity.

Ultimately, the choice between the two approaches depends on the specific needs of your project and the trade-offs you are willing to accept.

Conclusion

In this tutorial, we explored two methods for creating a countdown timer: using JavaScript and using only CSS. We started with a basic JavaScript countdown timer, adding functionality and styling to make it user-friendly and visually appealing. Then, we implemented a CSS-only countdown timer, showcasing the power of CSS for creating simple yet effective animations.

Whether you choose the CSS-only approach for its simplicity or the JavaScript approach for its flexibility, you now have the tools and knowledge to implement a countdown timer that suits your project's needs.


Is your frontend hogging your users' CPU?

As web frontends get increasingly complex, resource-greedy features demand more and more from the browser. If you’re interested in monitoring and tracking client-side CPU usage, memory usage, and more for all of your users in production, try LogRocket.

How to build a countdown timer using CSS

LogRocket is like a DVR for web and mobile apps, recording everything that happens in your web app, mobile app, or website. Instead of guessing why problems happen, you can aggregate and report on key frontend performance metrics, replay user sessions along with application state, log network requests, and automatically surface all errors.

Modernize how you debug web and mobile apps — start monitoring for free.

版本聲明 本文轉載於:https://dev.to/logrocket/how-to-build-a-countdown-timer-using-css-27ik?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-16
  • Vite中環境變數的處理
    Vite中環境變數的處理
    在現代 Web 開發中,管理敏感資料(例如 API 金鑰、資料庫憑證以及不同環境的各種配置)至關重要。將這些變數直接儲存在程式碼中可能會帶來安全風險並使部署變得複雜。 Vite,一個現代的前端建構工具,提供了一種透過.env檔案管理環境變數的簡單方法。 什麼是 .env 檔? .env 檔案是一...
    程式設計 發佈於2024-11-16
  • 如何使用 Django REST Framework 高效處理嵌套序列化器中的外鍵分配?
    如何使用 Django REST Framework 高效處理嵌套序列化器中的外鍵分配?
    Django REST Framework 中的嵌套序列化器的外鍵分配Django REST Framework (DRF) 提供了一個管理外鍵關係的便捷方法序列化資料。然而,在嵌套序列化器中獲得所需的行為可能具有挑戰性。 嵌套序列化器中的外鍵分配嵌套序列化器繼承其父序列化器的行為。預設情況下,它們...
    程式設計 發佈於2024-11-16
  • 如何從 CodeIgniter URL 中刪除「index.php」?
    如何從 CodeIgniter URL 中刪除「index.php」?
    CodeIgniter .htaccess 和URL 重寫問題導航CodeIgniter 應用程式通常需要從URL 中刪除“index.php”,以允許使用者造訪具有更清晰語法的頁面。不過,新用戶在這個過程中可能會遇到困難。 刪除“index.php”的關鍵在於修改應用程式設定檔(applicati...
    程式設計 發佈於2024-11-16
  • 您可以在 `` 標籤內嵌套更多的 `` 元素嗎?
    您可以在 `` 標籤內嵌套更多的 `` 元素嗎?
    不常見的 HTML 結構: 可以容納 以外的標籤嗎? 在 HTML 世界中,嵌套標籤可以創建複雜的結構。然而,某些標籤的放置有時會受到限制。以神秘的 標籤為例,許多人認為它只能嵌套 元素。 深入研究:您的詢問源於探索標籤是否有效的願望除了 之外的其他人都可以在 中找到一個家。為了揭開這個概念的...
    程式設計 發佈於2024-11-16
  • 如何使用 XPath 條件選擇 XML 文件中的特定節點?
    如何使用 XPath 條件選擇 XML 文件中的特定節點?
    利用 XPath 條件選擇節點透過 XPath 導覽 XML 文件時,通常需要根據特定條件限制檢索的節點。在此範例中,我們的任務是根據日期屬性選擇性地檢索節點。 以下XPath 表達式從提供的XML 文件中擷取所有 節點:$nodes = $xml->xpath('//xml/events')...
    程式設計 發佈於2024-11-16
  • 為什麼「margin: auto」不能與絕對定位的元素一起使用?
    為什麼「margin: auto」不能與絕對定位的元素一起使用?
    了解絕對定位邊距自動問題當將“position:absolute”應用於具有“margin-left:auto”和“的元素時margin-right: auto”,您可能會注意到邊距似乎沒有效果。此行為不同於“位置:相對”,其中邊距按預期工作。為了理解這種差異,讓我們更深入地研究底層機制。 當一個元...
    程式設計 發佈於2024-11-16
  • Go 如何處理方法中的指標和值接收者?
    Go 如何處理方法中的指標和值接收者?
    Go 指標:接收者和值類型Go 指標:接收者和值類型在Go 中,指針對於理解物件導向程式設計和記憶體管理是必不可少的。在處理指標時,掌握方法中接收器類型之間的差異至關重要。 type Vertex struct { X, Y float64 } func (v *Vertex) Abs() ...
    程式設計 發佈於2024-11-16
  • 如何從 Python 中的字串清單建立多個變數?
    如何從 Python 中的字串清單建立多個變數?
    如何從字串清單建立多個變數? [重複]許多程式場景要求我們同時操作多個物件或變數。一個常見的挑戰是從字串列表建立多個變量,其中每個變數的名稱與列表中的對應元素相符。 在 Python 中,您可以使用字典理解來完成此操作:names = ['apple', 'orange', 'banana'] fr...
    程式設計 發佈於2024-11-16
  • 如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    如何在 PHP 中組合兩個關聯數組,同時保留唯一 ID 並處理重複名稱?
    在 PHP 中組合關聯數組在 PHP 中,將兩個關聯數組組合成一個數組是常見任務。考慮以下請求:問題描述:提供的代碼定義了兩個關聯數組,$array1和$array2。目標是建立一個新陣列 $array3,它合併兩個陣列中的所有鍵值對。 此外,提供的陣列具有唯一的 ID,而名稱可能重疊。要求是建構一...
    程式設計 發佈於2024-11-16
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-16
  • 外鍵可以引用多型關聯中的多個表嗎?
    外鍵可以引用多型關聯中的多個表嗎?
    多態外鍵:一個外鍵可以引用多個表嗎? 關聯式資料庫中外鍵的概念通常涉及指定確切的目標參考列應指向的表。然而,在處理多態關聯時,其中一個表與一組中的多個其他表有關係,就會出現問題:是否可以有一個可以引用這些表中任何一個表的外鍵? 答案:否在MySQL和PostgreSQL中,外鍵約束只能引用單一父表。...
    程式設計 發佈於2024-11-16
  • 如何以字串陣列的形式檢索 TypeScript 介面的鍵?
    如何以字串陣列的形式檢索 TypeScript 介面的鍵?
    以字串陣列的形式存取 Typescript 介面的按鍵簡介在 Typescript 中處理表格資料需要使用介面來定義列結構。為了有效地操作這些結構,通常需要以字串陣列的形式檢索這些介面的屬性名稱。 解決方案使用自訂轉換器自 Typescript 版本 2.4 起,自訂轉換器提供了一種從介面中提取金鑰...
    程式設計 發佈於2024-11-16
  • 如何在JPA中使用複合主鍵實現資料版本控制?
    如何在JPA中使用複合主鍵實現資料版本控制?
    使用JPA 進行複合主鍵處理資料版本控制需要能夠使用不同版本複製實體,因此創建複合主鍵至關重要實體的主鍵。 具有複合主鍵的實體定義In JPA,複合主鍵可以使用@EmbeddedId或@IdClass註解來定義。 使用@EmbeddedId為key,然後在實體中用@EmbeddedId註解:@Ent...
    程式設計 發佈於2024-11-16
  • 如何修復 Anchor CMS 安裝過程中的「未指定輸入檔」錯誤?
    如何修復 Anchor CMS 安裝過程中的「未指定輸入檔」錯誤?
    Anchor CMS 中的「未指定輸入檔案」錯誤故障排除安裝期間Anchor CMS 中的「未指定輸入檔案」錯誤是常見問題。本文旨在為該問題提供全面的解釋和解決方案。 該錯誤是由於伺服器上的 PHP 實作與 CMS 對 URL 處理的期望不符而產生的。通常,當託管提供者使用 PHP 的 CGI 實作...
    程式設計 發佈於2024-11-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3