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

api 每小时数据的响应式 javascript 轮播

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

最初的挑战

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

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

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

const daysofweek = [  "monday",  "tuesday",  "wednesday",  "thursday",  "friday",  "saturday",  "sunday",];// function to cycle through the days of the weekfunction 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 weekfunction 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”后,它切换回原始数组。错误是严格的相等检查,我应该使用‘大于或等于’来代替。当我插入它时,它成功切换到新阵列!

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

立即学习“Java免费学习笔记(深入)”;

当前索引 = (当前索引 + 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,dayone 为 6,i 为 0
索引为 6,dayone 为 7,i 为 1
索引是 7,dayone 是 8,i 是 2
索引是 8,dayone 是 9,i 是 3
索引是 9,dayone 是 10,i 是 4
索引为 0,dayone 为 1,i 为 5
索引为 0,daytwo 为 11
索引为 1,dayone 为 12,i 为 6
索引为 2,dayone 为 13,i 为 7
索引为 3,dayone 为 14,i 为 8
索引为 4,dayone 为 15,i 为 9

这里的问题是,即使将时间从 dayone 切换到 daytwo 后,日志在日志语句中仍然引用 dayone。发生这种情况是因为日志记录语句被硬编码为“dayone”,即使数组已切换到 daytwo。

为了解决这个问题,我们可以为这一天设置另一个标记,并使其在切换数组的同时进行切换。我将把 dayone 和 daytwo 分别切换为“星期一”和“星期二”:

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;let day = 'monday';function cycledays(currenthour) {  let currentindex = currenthour;  for (let i = 0; i < 10; i++) {    console.log(`index is ${currentindex} and ${day} is ${hours[currentindex]} and i is ${i}`);    if (currentindex === 0) {      hours = tuesday;       day = 'tuesday';       console.log(`index is ${currentindex} and ${day} is ${hours[currentindex]}`);    }    currentindex = (currentindex + 1) % 10;  }}cycledays(currenthour);

我的代码快完成了。使此代码有效的两个重要更改是跟踪日期并将模数运算置于 for 循环内。

最后,我可以为从 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(`                    

next day

${hournum}

@@##@@

${hourdata.temp_c}°c

`); } else { displayhours.push(`

${hournum}

@@##@@

${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;…};

创建动态 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 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.minmath.max 属性分开。这样更有帮助,也更容易。

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

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

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

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

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

iconicon

以上就是API 每小时数据的响应式 JavaScript 轮播的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1493467.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 15:42:55
下一篇 2025年12月19日 15:43:01

相关推荐

  • HTML、CSS 和 JavaScript 中的简单侧边栏菜单

    构建一个简单的侧边栏菜单是一个很好的主意,它可以为您的网站添加有价值的功能和令人惊叹的外观。 侧边栏菜单对于客户找到不同项目的方式很有用,而不会让他们觉得自己有太多选择,从而创造了简单性和秩序。 今天,我将分享一个简单的 HTML、CSS 和 JavaScript 源代码来创建一个简单的侧边栏菜单。…

    2025年12月24日
    200
  • 前端代码辅助工具:如何选择最可靠的AI工具?

    前端代码辅助工具:可靠性探讨 对于前端工程师来说,在HTML、CSS和JavaScript开发中借助AI工具是司空见惯的事情。然而,并非所有工具都能提供同等的可靠性。 个性化需求 关于哪个AI工具最可靠,这个问题没有一刀切的答案。每个人的使用习惯和项目需求各不相同。以下是一些影响选择的重要因素: 立…

    2025年12月24日
    300
  • 带有 HTML、CSS 和 JavaScript 工具提示的响应式侧边导航栏

    响应式侧边导航栏不仅有助于改善网站的导航,还可以解决整齐放置链接的问题,从而增强用户体验。通过使用工具提示,可以让用户了解每个链接的功能,包括设计紧凑的情况。 在本教程中,我将解释使用 html、css、javascript 创建带有工具提示的响应式侧栏导航的完整代码。 对于那些一直想要一个干净、简…

    2025年12月24日
    000
  • 布局 – CSS 挑战

    您可以在 github 仓库中找到这篇文章中的所有代码。 您可以在这里查看视觉效果: 固定导航 – 布局 – codesandbox两列 – 布局 – codesandbox三列 – 布局 – codesandbox圣杯 &#8…

    2025年12月24日
    000
  • 隐藏元素 – CSS 挑战

    您可以在 github 仓库中找到这篇文章中的所有代码。 您可以在此处查看隐藏元素的视觉效果 – codesandbox 隐藏元素 hiding elements hiding elements hiding elements hiding elements hiding element…

    2025年12月24日
    400
  • 居中 – CSS 挑战

    您可以在 github 仓库中找到这篇文章中的所有代码。 您可以在此处查看垂直中心 – codesandbox 和水平中心的视觉效果。 通过 css 居中 垂直居中 centering centering centering centering centering centering立即…

    2025年12月24日 好文分享
    300
  • 如何在 Laravel 框架中轻松集成微信支付和支付宝支付?

    如何用 laravel 框架集成微信支付和支付宝支付 问题:如何在 laravel 框架中集成微信支付和支付宝支付? 回答: 建议使用 easywechat 的 laravel 版,easywechat 是一个由腾讯工程师开发的高质量微信开放平台 sdk,已被广泛地应用于许多 laravel 项目中…

    2025年12月24日
    000
  • 如何在移动端实现子 div 在父 div 内任意滑动查看?

    如何在移动端中实现让子 div 在父 div 内任意滑动查看 在移动端开发中,有时我们需要让子 div 在父 div 内任意滑动查看。然而,使用滚动条无法实现负值移动,因此需要采用其他方法。 解决方案: 使用绝对布局(absolute)或相对布局(relative):将子 div 设置为绝对或相对定…

    2025年12月24日
    000
  • 移动端嵌套 DIV 中子 DIV 如何水平滑动?

    移动端嵌套 DIV 中子 DIV 滑动 在移动端开发中,遇到这样的问题:当子 DIV 的高度小于父 DIV 时,无法在父 DIV 中水平滚动子 DIV。 无限画布 要实现子 DIV 在父 DIV 中任意滑动,需要创建一个无限画布。使用滚动无法达到负值,因此需要使用其他方法。 相对定位 一种方法是将子…

    2025年12月24日
    000
  • 移动端项目中,如何消除rem字体大小计算带来的CSS扭曲?

    移动端项目中消除rem字体大小计算带来的css扭曲 在移动端项目中,使用rem计算根节点字体大小可以实现自适应布局。但是,此方法可能会导致页面打开时出现css扭曲,这是因为页面内容在根节点字体大小赋值后重新渲染造成的。 解决方案: 要避免这种情况,将计算根节点字体大小的js脚本移动到页面的最前面,即…

    2025年12月24日
    000
  • Nuxt 移动端项目中 rem 计算导致 CSS 变形,如何解决?

    Nuxt 移动端项目中解决 rem 计算导致 CSS 变形 在 Nuxt 移动端项目中使用 rem 计算根节点字体大小时,可能会遇到一个问题:页面内容在字体大小发生变化时会重绘,导致 CSS 变形。 解决方案: 可将计算根节点字体大小的 JS 代码块置于页面最前端的 标签内,确保在其他资源加载之前执…

    2025年12月24日
    200
  • Nuxt 移动端项目使用 rem 计算字体大小导致页面变形,如何解决?

    rem 计算导致移动端页面变形的解决方法 在 nuxt 移动端项目中使用 rem 计算根节点字体大小时,页面会发生内容重绘,导致页面打开时出现样式变形。如何避免这种现象? 解决方案: 移动根节点字体大小计算代码到页面顶部,即 head 中。 原理: flexível.js 也遇到了类似问题,它的解决…

    2025年12月24日
    000
  • 形状 – CSS 挑战

    您可以在 github 仓库中找到这篇文章中的所有代码。 您可以在此处查看 codesandbox 的视觉效果。 通过css绘制各种形状 如何在 css 中绘制正方形、梯形、三角形、异形三角形、扇形、圆形、半圆、固定宽高比、0.5px 线? shapes 0.5px line .square { w…

    2025年12月24日
    000
  • 谷歌搜索的鼠标悬停阴影效果是如何实现的?

    谷歌搜索悬停阴影效果解析 在谷歌搜索页面中,当鼠标悬停在搜索框或按钮上时,会出现一个微妙的边缘阴影。想要了解这一效果的实现原理,许多开发者可能率先想到使用 css。 css 探索 遗憾的是,在 css 代码中无法找到与阴影效果直接相关的属性或值。继续探索其他实现方法。 浏览器开发者工具助力 使用浏览…

    2025年12月24日
    000
  • 如何用 CSS 实现谷歌搜索框鼠标悬停时的边缘阴影效果?

    谷歌搜索框鼠标悬停时边缘阴影效果实现 对于谷歌搜索框在鼠标悬停时的边缘阴影效果,你可能找不到直接的 css 代码,但这种效果可以通过 box-shadow 属性实现。 box-shadow 可以创建箱子周围的阴影效果,它的语法如下: box-shadow: h-offset v-offset blu…

    2025年12月24日
    200
  • 如何实现谷歌搜索框鼠标悬停时的边缘阴影效果?

    如何实现谷歌搜索框鼠标悬停时的边缘阴影效果? 在谷歌搜索中,当鼠标悬停在搜索框和按钮上时,会产生一种精致的边缘阴影效果。实现这一效果需要使用 css 的 box-shadow 属性。 box-shadow 属性 box-shadow 属性允许在元素周围创建阴影效果。其语法为: box-shadow:…

    2025年12月24日
    200
  • 鼠标悬停时,谷歌搜索元素的阴影效果是如何实现的?

    鼠标悬停时突出显示谷歌搜索元素的阴影效果是如何实现的 该效果是通过 css 的 box-shadow 属性实现的,该属性用于在元素周围创建阴影效果。 当鼠标悬停在元素上时,应用 :hover 伪类,并添加 box-shadow 属性,为元素指定阴影效果。 下面是一个示例 css 代码,它给谷歌搜索框…

    2025年12月24日
    100
  • 有哪些美观的开源数字大屏驾驶舱框架?

    开源数字大屏驾驶舱框架推荐 问题:有哪些美观的开源数字大屏驾驶舱框架? 答案: 资源包 [弗若恩智能大屏驾驶舱开发资源包](https://www.fanruan.com/resource/152) 软件 [弗若恩报表 – 数字大屏可视化组件](https://www.fanruan.c…

    2025年12月24日
    000
  • 网站底部如何实现飘彩带效果?

    网站底部飘彩带效果的 js 库实现 许多网站都会在特殊节日或活动中添加一些趣味性的视觉效果,例如点击按钮后散发的五彩缤纷的彩带。对于一个特定的网站来说,其飘彩带效果的实现方式可能有以下几个方面: 以 https://dub.sh/ 网站为例,它底部按钮点击后的彩带效果是由 javascript 库实…

    2025年12月24日
    000
  • 网站彩带效果背后是哪个JS库?

    网站彩带效果背后是哪个js库? 当你访问某些网站时,点击按钮后,屏幕上会飘出五颜六色的彩带,营造出庆祝的氛围。这些效果是通过使用javascript库实现的。 问题: 哪个javascript库能够实现网站上点击按钮散发彩带的效果? 答案: 根据给定网站的源代码分析: 可以发现,该网站使用了以下js…

    好文分享 2025年12月24日
    100

发表回复

登录后才能评论
关注微信