API 每小时数据的响应式 JavaScript 轮播
从现在开始,努力学习吧!本文《API 每小时数据的响应式 JavaScript 轮播》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!
我差点把一个不完整的解决方案误认为是一个已完成的解决方案,然后继续研究我的天气应用程序的其他部分!在制作应该显示 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 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)
注意结果中一些有趣的东西:
索引为 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 monday = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']; const tuesday = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; let hours = monday; let currenthour = 5; function cycledays(currenthour) { let currentindex = currenthour for (let i = 0; i < 10; i++) { console.log(`index is ${currentindex} and monday is ${hours[currentindex]} and i is ${i}`) if(currentindex === 0){ hours = tuesday console.log(`index is ${currentindex} and tuesday is ${hours[currentindex]}`) } currentindex = (currentindex + 1) % 10 } //for } cycledays(currenthour)
我的代码快完成了。在这里,我犯的唯一错误是记录 ‘星期一’ 而不是 ‘星期二’。虽然这些值来自 ‘tuesday’ 数组,但由于编写 console.log 语句的方式错误,它一直显示 ‘monday’。我想,将两个和两个放在一起并进行图片记录与实际将值放入 html 元素中是相当困难的。这是使用三元运算符的一些改进(是的,我再次切换了数组的元素!):
const monday = ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']; const tuesday = ['apple', 'orange', 'banana', 'pineapple', 'grapes', 'cherries', 'strawberries', 'mangoes', 'blueberries', 'pears']; let hours = monday; let currenthour = 9; function cycledays(currenthour) { let currentindex = currenthour for (let i = 0; i < 14; i++) { hours === monday ? console.log(`day: monday, elements: ${hours[currentindex]}`) : console.log(`day: tuesday, elements: ${hours[currentindex]}`) currentindex = (currentindex + 1) % 10 if(currentindex === 0 && hours === monday){ hours = tuesday } } //for } cycledays(currenthour);
最后,我可以为从 api 检索的 3 天数据构建代码,这是精炼版本:
function createhours(days){ if (!days || days.length === 0) { console.error("days array is undefined or empty"); return; // prevent further execution if data is missing } const btnnext = document.queryselector('.next'); const btnprev = document.queryselector('.previous'); const hourcontainer = document.queryselector('.tfour_hours'); const currenthour = new date().gethours() function gethoursforday(index) { return days[index].hour; } let dayindex = 0; let hours = gethoursforday(dayindex); let index = currenthour; let displayhours = []; for (let i = 0; i < 12; i++) { // console.log(hours) // console.log(`index: ${index}`) let hourdata = hours[index]; let hournum = index < 10 ? `0${index}` : index; if (index === 0) { displayhours.push(``); } else { displayhours.push(`![]()
${hourdata.temp_c}°c
`); } index = (index + 1) % 24; if(index === 0 && dayindex === 0){ dayindex = 1; hours = gethoursforday(dayindex) } } //for loop displayhours = displayhours.join(''); hourcontainer.innerhtml = displayhours; … };${hournum}
![]()
${hourdata.temp_c}°c
创建动态 html 元素
我们来谈谈生成 12 个 div。我无法想象如何获取父 div 两侧的按钮,而 12 小时就漂浮在它们之间。如果我要在与按钮相同的父级中生成 12 个 div,则按钮元素将需要与 12 个 div 不同的对齐设置。
只有让他们拥有自己的容器才有意义。我花了一段时间才弄清楚这一点——实际上我不得不睡觉。然后第二天,我输入 .btn-container 并点击 tab,从那里开始,一切都点击了。我在 john smilga 的教程中看到了每个分组的项目以及它们自己的容器位于父容器内,直到我开始设计 24 小时容器时我才知道为什么需要这样的分组。这真是一个“陷阱时刻”。
现在又出现了一个困扰了好几天的问题。我在教程中设计的滑块并不像这些 div 那样具有挑战性。在教程中,有一个简单的翻译值,但现在我有很多问题。在较小的屏幕上,div 粘在一起,开始看起来像意大利面条。
而且,当我使用一个简单的translatex属性时,这意味着当我“猜测”像素时,div完全向左平移后留下了很多空间。这意味着他们平移的宽度超过了它们的总宽度。我需要找到一个合适的值来确保 div 完全停止在末尾而不留下额外的空间。找了好久,发现一个博客,提供了各种解决方案。
有很多解决方案。其中一些使用了模运算符,这让我想起了在“for 循环”中切换日期时应用的循环数组逻辑。这里有很多评论使用了 math.min 和 math.max。这基本上会使容器平移,直到到达其长度的末端。出色的!那么没有更多的空白了吗? 没那么快...
与这些示例不同的一点是我的容器最初会显示 3 或 4 个 div。所以,当offset为0时,父容器中已经有一定的长度了。
他们通过添加数字 1 来显示图像。因此,他们的轮播会根据数组中图像的索引号向前滑动 1 张图像。例如,如果容器中有 10 个图像,我们向 currentimage 变量添加 1 个图像,则 math.min 计算出的值将为“1”。然后,当我们添加另一个“1”时,当前图像将是 2,并且 math.min 的值将是 2,因为 2 mod 10 是 2。这个特定的示例将改变滑块的游戏我正在努力做。这是引起我注意的代码:
const imageData = [ 'image1.png', 'img2.png', 'img3.png', ... ]; let currentImage = 0; ____ const handleImageChange = (imageShift) => { currentImage = Math.max( 0, Math.min( imageData.length - 1, (currentImage + imageShift) % imageData.length ) ); } ____ const firstImage = () => handleImageChange(-imageData.length); const prevImage = () => handleImageChange(-1); const nextImage = () => handleImageChange(1); const lastImage = () => handleImageChange(imageData.length);
在评论中发现 richard kichenama 解决方案的巧妙之处在于使用 math.max 来确保值不会低于 0,并使用 math.min 来计算平移值,直到达到最大长度图像数组。
现在,我该如何解决空白问题?我必须考虑所有子 div 的边距,并将它们加在一起以获得子 div 的整个长度。然后,一旦到达最后一个子项,滑块就应该停止移动。这意味着总宽度是所有子项宽度加上边距的总和。
但是,我遇到了另一个问题:一些 div 已经显示在容器中,这让我再次陷入困境。幸运的是,我的一个朋友救了我。与他们讨论问题后,我的理解如下:
我无法考虑子 div 的整个长度。剩下的空白区域几乎与容器的长度一样多。解决方案是从子容器的总长度(包括边距)中减去父容器的长度。这一调整有助于解决空白问题——唷!
一些代码示例有一个类似于“计数器”的变量。它充当翻译属性的“计数器”。当这个变量增加时,翻译属性增加等等。我将下一个和上一个按钮的 math.min 和 math.max 属性分开。这样更有帮助,也更容易。
在我引用的示例中,代码使用数组的长度来确定滑动距离,但是,根据我之前与朋友的讨论,我需要考虑空白,所以我必须减去容器。这样,我确保了我的 div 只能移动特定的量,避免了末尾的额外空间。
另外,感谢 john smilga 的教程,我学会了如何获取项目的宽度、高度、顶部属性。应用正确的值是一项艰巨的任务,找出某些值是字符串并且需要将其转换为数字也是一项艰巨的任务。我在谷歌上轻松找到了这一点,并被介绍给‘parsefloat’。
我还发现了另一个有用的资源,它教我如何在大屏幕上仅显示三个 div,在小屏幕上显示两个 div。诀窍是将容器宽度的 100% 除以 3(对于小屏幕则为 2)并减去边距。这允许大小相同的 div 完美地适合容器(太聪明了!)。最后,要查看最终的功能,请访问我的github。这是我的存储库的链接。
用于调整大小的窗口事件侦听器对于解决容器中的对齐问题至关重要。它通过重置调整大小时的偏移量解决了“无样式内容的 flash”(fouc) 问题。我必须感谢我的朋友帮助我了解如何计算 maxoffset——这真的改变了游戏规则。
最后,向所有经验丰富的开发人员大声喊叫:您分享的每句话都会对这个领域的新手有所帮助。因此,请继续发布您这边的信息,因为我们正在另一边等待渴望了解。谢谢你!
本篇关于《API 每小时数据的响应式 JavaScript 轮播》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

- 上一篇
- 如何在 Java 中声明 transient 函数?

- 下一篇
- Golang 框架与其他 Web 开发框架的对比:优势与局限性
-
- 文章 · 前端 | 10分钟前 | JavaScript 时间复杂度 计数排序 整数排序 空间复杂度
- JavaScript计数排序实现方法及详细教程
- 201浏览 收藏
-
- 文章 · 前端 | 13分钟前 |
- JavaScript中Map与Set的区别深度解析
- 247浏览 收藏
-
- 文章 · 前端 | 27分钟前 |
- body:first-child选择器意外选中元素的原因及解决方案
- 371浏览 收藏
-
- 文章 · 前端 | 32分钟前 |
- JavaScript中ShadowDOM使用技巧及方法
- 246浏览 收藏
-
- 文章 · 前端 | 38分钟前 |
- JavaScript如何将数据存入LocalStorage
- 278浏览 收藏
-
- 文章 · 前端 | 39分钟前 | 模块化编程 import ES6模块 CommonJS模块 export
- JavaScript模块化编程的实现技巧
- 476浏览 收藏
-
- 文章 · 前端 | 47分钟前 | 兼容性 用户体验 requestFullscreen exitFullscreen fullscreenchange
- JavaScript全屏功能终极实现攻略
- 168浏览 收藏
-
- 文章 · 前端 | 53分钟前 | JavaScript 模块化 扩展性 策略模式 折扣策略
- JavaScript策略模式实战攻略与代码示例
- 293浏览 收藏
-
- 文章 · 前端 | 57分钟前 | JavaScript 插入排序 希尔排序 不稳定 增量序列
- JavaScript希尔排序代码及攻略详解
- 184浏览 收藏
-
- 文章 · 前端 | 1小时前 | drop dragstart dragover DataTransfer 视觉反馈
- JavaScript拖放功能实现技巧与教程
- 171浏览 收藏
-
- 文章 · 前端 | 1小时前 |
- WebWorkers如何提升JavaScript性能?
- 171浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 24次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 38次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 38次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 50次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 41次使用
-
- 优化用户界面体验的秘密武器:CSS开发项目经验大揭秘
- 2023-11-03 501浏览
-
- 使用微信小程序实现图片轮播特效
- 2023-11-21 501浏览
-
- 解析sessionStorage的存储能力与限制
- 2024-01-11 501浏览
-
- 探索冒泡活动对于团队合作的推动力
- 2024-01-13 501浏览
-
- UI设计中为何选择绝对定位的智慧之道
- 2024-02-03 501浏览