首页 web前端 js教程 API 每小时数据的响应式 JavaScript 轮播

API 每小时数据的响应式 JavaScript 轮播

Oct 21, 2024 pm 02:42 PM

Responsive JavaScript Carousel for API Hourly Data

我差点把一个不完整的解决方案误认为是一个已完成的解决方案,然后继续研究我的天气应用程序的其他部分!在制作应该显示 12 小时天气的轮播时,我想添加一项功能,该功能将有助于在当天结束时获取第二天的时间。然而,轮播并没有过渡到第二天,而是不断循环回到当天的开始时间,我错误地认为任务已经完成。哎呀!

最初的挑战

我考虑过两个“for 循环”,但我不认为“j”打印整个“i”长度的所有元素是正确的。我在网上找到了很多关于“圆形数组”中模数运算符的使用的博客,但我不知道这对我的情况有什么帮助。我需要循环当前一天的时间,然后在时间重置为零后切换到第二天。发生了很多事情,我需要使其更加简洁,并将所有内容都放在一个函数中。艰难的!

认识不完整的解决方案和错误

我在网上发现了一些非常酷的东西,它可能会解决我的一个大问题。它帮助我了解模数运算符如何适用于圆形数组。这是网站上的示例:

const daysOfWeek = [
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday",
];
// Function to cycle through the days of the week
function cycleDays(index) {
  return daysOfWeek[index % daysOfWeek.length];
}
// Let's cycle through the days:
for (let i = 0; i < 10; i++) {
  console.log(`Day ${i + 1}: ${cycleDays(i)}`);
}
登录后复制
登录后复制
登录后复制
登录后复制

结果如下:
第一天:星期一
第 2 天:星期二
...

我想要的是,它不应该返回到 daysOfWeek 数组,并从 'Monday' 开始,而是应该转到一个完全不同的数组。因此,我将代码带到代码编辑器中并进行了一些更改。首先,我创建了一个名为 ‘currentIndex’ 的变量,并将模数运算存储在其中。然后我将其记录到控制台。 6点后重置并再次变为零。

但是,我将错误的变量记录到控制台。因为,如果我这样编写 if 条件: if(currentIndex === 0),它实际上会在循环开始时移向新数组。所以,现在我改为记录“索引”,终于找到了答案!为了测试新代码,我为 ‘months’ 创建了一个新数组,然后尝试进行切换。但我又犯了一个错误——让我告诉你:

const daysOfWeek = [
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday",
];
const months = [
  'Jan',
  'Feb',
  'March'
];
// Function to cycle through the days of the week
function cycleDays(index) {
  let currentIndex = index % daysOfWeek.length
  console.log(index)
 if(index === 7){
   return months[currentIndex]
 } else {
     return daysOfWeek[currentIndex];
 }
}
// Let's cycle through the days:
for (let i = 0; i < 10; i++) {
  console.log(`Day ${i + 1}: ${cycleDays(i)}`);
}
登录后复制
登录后复制

记录“Jan”后,它切换回原始数组。错误是严格的相等检查,我应该使用‘大于或等于’来代替。当我插入它时,它成功切换到新阵列!

现在,我希望循环从当前小时开始并继续而不停止,并使用标记在数组之间切换。该标记将是模运算符而不是数组的长度。我还可以使用数组的长度,在本例中为 24,但我现在坚持使用硬编码值 24。

当前索引 = (当前索引 1) % 9

这条线允许我在循环期间从第一天切换到第二天而不停止它。这是另一个试验(我更新了数组以类似于 API 结果):

const daysOfWeek = [
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday",
];
// Function to cycle through the days of the week
function cycleDays(index) {
  return daysOfWeek[index % daysOfWeek.length];
}
// Let's cycle through the days:
for (let i = 0; i < 10; i++) {
  console.log(`Day ${i + 1}: ${cycleDays(i)}`);
}
登录后复制
登录后复制
登录后复制
登录后复制

注意结果中一些有趣的东西:

索引为 5,星期一为 6,i 为 0
索引是 6,星期一是 7,i 是 1
索引是 7,星期一是 8,i 是 2
索引是 8,星期一是 9,i 是 3
索引是 9,星期一是 10,i 是 4
索引为 0,星期一为 1,i 为 5
索引为 0,周二为 11
索引是 1,星期一是 12,i 是 6
索引是 2,星期一是 13,i 是 7
索引是 3,星期一是 14,i 是 8
索引是 4,星期一是 Ø15,i 是 9

这里的问题是循环从一开始就运行一次,当它达到条件(if(currentIndex === 0))时,它会切换数组。但是,当 currentIndex = 0(即 10 % 10 = 0)时,在执行 if 条件之前会访问 hours[currentIndex]。这就是为什么即使在切换之后您也会看到 dayOne 的值(例如“一”)。

要解决此问题,需要在 currentIndex 变为 0 后立即检查 if 条件,以便在记录之前发生数组切换:

console.log(索引为 ${currentIndex},星期一为 ${hours[currentIndex]},i 为 ${i})...

通过改变条件的位置,可以确保切换在正确的时间发生,而不会先访问错误的数组。

const daysOfWeek = [
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday",
];
const months = [
  'Jan',
  'Feb',
  'March'
];
// Function to cycle through the days of the week
function cycleDays(index) {
  let currentIndex = index % daysOfWeek.length
  console.log(index)
 if(index === 7){
   return months[currentIndex]
 } else {
     return daysOfWeek[currentIndex];
 }
}
// Let's cycle through the days:
for (let i = 0; i < 10; i++) {
  console.log(`Day ${i + 1}: ${cycleDays(i)}`);
}
登录后复制
登录后复制

我的代码快完成了。在这里,我犯的唯一错误是记录 ‘星期一’ 而不是 ‘星期二’。虽然这些值来自 ‘Tuesday’ 数组,但由于编写 console.log 语句的方式错误,它一直显示 ‘Monday’。我想,将两个和两个放在一起并进行图片记录与实际将值放入 html 元素中是相当困难的。这是使用三元运算符的一些改进(是的,我再次切换了数组的元素!):

const dayOne = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten'];
const dayTwo = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
let hours = dayOne;
let currentHour = 5;
function cycleDays(currentHour) {
  let currentIndex = currentHour
  for (let i = 0; i < 10; i++) {
    console.log(`index is ${currentIndex} and dayOne is ${hours[currentIndex]}`)
    if(currentIndex === 0){
      hours = dayTwo
    console.log(`index is ${currentIndex} and dayTwo is ${hours[currentIndex]}`)
    } 
  currentIndex = (currentIndex + 1) % 9

} 
}
cycleDays(currentHour)

登录后复制

最后,我可以为从 api 检索的 3 天数据构建代码,这是精炼版本:

const daysOfWeek = [
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday",
];
// Function to cycle through the days of the week
function cycleDays(index) {
  return daysOfWeek[index % daysOfWeek.length];
}
// Let's cycle through the days:
for (let i = 0; i < 10; i++) {
  console.log(`Day ${i + 1}: ${cycleDays(i)}`);
}
登录后复制
登录后复制
登录后复制
登录后复制

创建动态 HTML 元素

我们来谈谈生成 12 个 div。我无法想象如何获取父 div 两侧的按钮,而 12 小时就漂浮在它们之间。如果我要在与按钮相同的父级中生成 12 个 div,则按钮元素将需要与 12 个 div 不同的对齐设置。

只有让他们拥有自己的容器才有意义。我花了一段时间才弄清楚这一点——实际上我不得不睡觉。然后第二天,我输入 .btn-container 并点击 Tab,从那里开始,一切都点击了。我在 John Smilga 的教程中看到了每个分组的项目以及它们自己的容器位于父容器内,直到我开始设计 24 小时容器时我才知道为什么需要这样的分组。这真是一个“陷阱时刻”。

现在又出现了一个困扰了好几天的问题。我在教程中设计的滑块并不像这些 div 那样具有挑战性。在教程中,有一个简单的翻译值,但现在我有很多问题。在较小的屏幕上,div 粘在一起,开始看起来像意大利面条。

而且,当我使用一个简单的translateX属性时,这意味着当我“猜测”像素时,div完全向左平移后留下了很多空间。这意味着他们平移的宽度超过了它们的总宽度。我需要找到一个合适的值来确保 div 完全停止在末尾而不留下额外的空间。找了好久,发现一个博客,提供了各种解决方案。

有很多解决方案。其中一些使用了模运算符,这让我想起了在“for 循环”中切换日期时应用的循环数组逻辑。这里有很多评论使用了 Math.minMath.max。这基本上会使容器平移,直到到达其长度的末端。出色的!那么没有更多的空白了吗? 没那么快...

与这些示例不同的一点是我的容器最初会显示 3 或 4 个 div。所以,当offset为0时,父容器中已经有一定的长度了。

他们通过添加数字 1 来显示图像。因此,他们的轮播会根据数组中图像的索引号向前滑动 1 张图像。例如,如果容器中有 10 个图像,我们向 currentImage 变量添加 1 个图像,则 Math.min 计算出的值将为“1”。然后,当我们添加另一个“1”时,当前图像将是 2,并且 Math.min 的值将是 2,因为 2 mod 10 是 2。这个特定的示例将改变滑块的游戏我正在努力做。这是引起我注意的代码:

const daysOfWeek = [
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
  "Sunday",
];
// Function to cycle through the days of the week
function cycleDays(index) {
  return daysOfWeek[index % daysOfWeek.length];
}
// Let's cycle through the days:
for (let i = 0; i < 10; i++) {
  console.log(`Day ${i + 1}: ${cycleDays(i)}`);
}
登录后复制
登录后复制
登录后复制
登录后复制

在评论中发现 Richard Kichenama 解决方案的巧妙之处在于使用 Math.max 来确保值不会低于 0,并使用 Math.min 来计算平移值,直到达到最大长度图像数组。

现在,我该如何解决空白问题?我必须考虑所有子 div 的边距,并将它们加在一起以获得子 div 的整个长度。然后,一旦到达最后一个子项,滑块就应该停止移动。这意味着总宽度是所有子项宽度加上边距的总和。

但是,我遇到了另一个问题:一些 div 已经显示在容器中,这让我再次陷入困境。幸运的是,我的一个朋友救了我。与他们讨论问题后,我的理解是:

我无法考虑子 div 的整个长度。剩下的空白区域几乎与容器的长度一样多。解决方案是从子容器的总长度(包括边距)中减去父容器的长度。这一调整有助于解决空白问题——唷!

一些代码示例有一个类似于“计数器”的变量。它充当翻译属性的“计数器”。当这个变量增加时,翻译属性增加等等。我将下一个和上一个按钮的 Math.minMath.max 属性分开。这样更有帮助,也更容易。

在我引用的示例中,代码使用数组的长度来确定滑动距离,但是,根据我之前与朋友的讨论,我需要考虑空白,所以我必须减去容器。这样,我确保了我的 div 只能移动特定的量,避免了末尾的额外空间。

另外,感谢 john smilga 的教程,我学会了如何获取项目的宽度、高度、顶部属性。应用正确的值是一项艰巨的任务,找出某些值是字符串并且需要将其转换为数字也是一项艰巨的任务。我在谷歌上轻松找到了这一点,并被介绍给‘parseFloat’

我还发现了另一个有用的资源,它教我如何在大屏幕上仅显示三个 div,在小屏幕上显示两个 div。诀窍是将容器宽度的 100% 除以 3(对于小屏幕则除以 2)并减去边距。这允许大小相同的 div 完美地适合容器(太聪明了!)。最后,要查看最终的功能,请访问我的GitHub。这是我的存储库的链接。

用于调整大小的窗口事件侦听器对于解决容器中的对齐问题至关重要。它通过重置调整大小时的偏移量解决了“无样式内容的 Flash”(FOUC) 问题。我必须感谢我的朋友帮助我了解如何计算 maxOffset——这真的改变了游戏规则。

最后,向所有经验丰富的开发人员大声喊叫:您分享的每句话都会对这个领域的新手有所帮助。因此,请继续发布您这边的信息,因为我们正在另一边等待渴望了解。谢谢你!

以上是API 每小时数据的响应式 JavaScript 轮播的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1673
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
Python vs. JavaScript:学习曲线和易用性 Python vs. JavaScript:学习曲线和易用性 Apr 16, 2025 am 12:12 AM

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

JavaScript和Web:核心功能和用例 JavaScript和Web:核心功能和用例 Apr 18, 2025 am 12:19 AM

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

JavaScript在行动中:现实世界中的示例和项目 JavaScript在行动中:现实世界中的示例和项目 Apr 19, 2025 am 12:13 AM

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

了解JavaScript引擎:实施详细信息 了解JavaScript引擎:实施详细信息 Apr 17, 2025 am 12:05 AM

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python vs. JavaScript:社区,图书馆和资源 Python vs. JavaScript:社区,图书馆和资源 Apr 15, 2025 am 12:16 AM

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

Python vs. JavaScript:开发环境和工具 Python vs. JavaScript:开发环境和工具 Apr 26, 2025 am 12:09 AM

Python和JavaScript在开发环境上的选择都很重要。1)Python的开发环境包括PyCharm、JupyterNotebook和Anaconda,适合数据科学和快速原型开发。2)JavaScript的开发环境包括Node.js、VSCode和Webpack,适用于前端和后端开发。根据项目需求选择合适的工具可以提高开发效率和项目成功率。

C/C在JavaScript口译员和编译器中的作用 C/C在JavaScript口译员和编译器中的作用 Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。 1)C 用于解析JavaScript源码并生成抽象语法树。 2)C 负责生成和执行字节码。 3)C 实现JIT编译器,在运行时优化和编译热点代码,显着提高JavaScript的执行效率。

Python vs. JavaScript:比较用例和应用程序 Python vs. JavaScript:比较用例和应用程序 Apr 21, 2025 am 12:01 AM

Python更适合数据科学和自动化,JavaScript更适合前端和全栈开发。1.Python在数据科学和机器学习中表现出色,使用NumPy、Pandas等库进行数据处理和建模。2.Python在自动化和脚本编写方面简洁高效。3.JavaScript在前端开发中不可或缺,用于构建动态网页和单页面应用。4.JavaScript通过Node.js在后端开发中发挥作用,支持全栈开发。

See all articles