【问题标题】:Every 48 hours toggle between three classList每 48 小时在三个 classList 之间切换
【发布时间】:2021-06-04 06:38:36
【问题描述】:

我希望全年建立一个持续的计时器。我希望每 48 小时激活一次 span 的 ID。

我有一个 24 小时的时间表来更改字母。代码在当前时间循环,并根据我的 else 进行检查,以切换哪个字母的样式应为 .active。

如何将此计时器修改为 48 小时长并显示字母 A 48 小时然后切换到 B 并停留 48 小时然后切换到 C 48 小时然后返回到 A?感谢您的任何建议!

忘了说这会从早上 8 点开始,一直持续到早上 8 点,持续 48 小时。

const today = new Date();
const hourNow = today.getHours()
const letterA = document.querySelector('#A');
const letterB = document.querySelector('#B');
const letterC = document.querySelector('#C');
const allLetters = document.querySelectorAll("span");

if (hourNow > 18) {
  letterA.classList.toggle('active');
} else if (hourNow > 12) {
  letterB.classList.toggle('active');
} else if (hourNow > 0) {
  letterC.classList.toggle('active');
} else {
  allLetters.forEach(letter => {
    letter.removeAttribute('class');
  })
}

【问题讨论】:

  • 您需要使用时间戳。
  • 是的@pavel 是正确的使用Date.now() 代替

标签: javascript


【解决方案1】:

这是使用倒计时到未来日期的一种方法:

const today = new Date();
const now = today.getTime();
const letterA = document.querySelector('#A');
const letterB = document.querySelector('#B');
const letterC = document.querySelector('#C');

// Set countdown til 8am at the end of the year 9999 (or whenever)
const countDownDate = new Date("December 31, " + 9999 + " 07:00:00").getTime();

// Find the distance between now an the countdown date
const timeLeft = countDownDate - now;

// Time calculation for days left
const daysLeft = Math.floor(timeLeft / (1000 * 60 * 60 * 24));

// A, B, C
const numberOfSpans = 3;

// if we wanted to change every day, we'd need:
// (daysLeft % numberOfSpans)

// since we want to change every 2 days, we'll need:
const daysLeftOver = (daysLeft % (numberOfSpans * 2));

// remove all active classes
if (letterA.classList.contains("active")) {
  letterA.classList.remove("active");
}
if (letterB.classList.contains("active")) {
  letterB.classList.remove("active");
}
if (letterC.classList.contains("active")) {
  letterC.classList.remove("active");
}

// Add active class to whichever box

// 0,1
if (daysLeftOver == 0 || daysLeftOver == 1) {
  letterA.classList.toggle('active');
  // 2,3
} else if (daysLeftOver == 2 || daysLeftOver == 3) {
  letterB.classList.toggle('active');
  // 4,5
} else if (daysLeftOver == 4 || daysLeftOver == 5) {
  letterC.classList.toggle('active');
}
span {
  background-color: white;
  position: relative;
  display: inline-block;
  height: 50px;
  width: 50px;
  border: 2px solid #f5f5f5;
}

.active {
  background-color: yellow;
}
<span id="A">A</span>
<span id="B">B</span>
<span id="C">C</span>

【讨论】:

  • 我研究了这段代码并对其进行了测试,我想知道你是否能在早上 8 点帮助我澄清它是如何工作的。例如,我将 9999 年更改为 3999 年,daysLeftOver 从 5 更改为 2,所以这段代码非常有用,非常接近我的需要,但我正在努力弄清楚如何让它从早上 8 点开始工作并每 48 小时运行一次,直到早上 8 点换字母,所以每 6 天是一个周期。
  • @Eric 没问题。在我的示例中,countDownDate 变量设置为将我们倒计时到遥远的未来。我随机选择了 9999 年 12 月 31 日 08:00.00 (8 am)。所以new Date("December 31, " + 9999 + " 08:00:00") 用于返回从今天到明天早上 8 点之间的天数。通过使用带有剩余天数和连续天数的模 (%) 运算符,您希望一件事具有 .active 类(在您的情况下为 2),我们可以获得介于 0 之间的余数和 5.
  • 例如,如果您的未来日期是未来 6 天,那么6 % 6 将返回 0。如果是未来 5 天,5 % 6 将返回 5。而@987654330 @ 将返回 4... 等等等等。在这种情况下,9999 年 12 月 31 日是未来 2,914,115 天(截至今天),2,914,115 % 6 是 5。您选择的日期是未来 722,660 天.而722,660 % 6 是 2。
  • 所以明天余数将是 4,因为 2,914,114 % 6 等于 4。另外,为了让 unix 时间在早上 8 点切换到您,我必须将 08:00:00 更改为 07:00:00 .我在上面的答案中修复了它。
  • 我还修正了最后逻辑中的一个错字。 Here's a pen I made explaining it
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2017-09-27
  • 2016-11-28
  • 2019-02-22
  • 2011-12-28
相关资源
最近更新 更多