使用 JavaScript 实现 CSS Grid 元素动态随机排序

使用 JavaScript 实现 CSS Grid 元素动态随机排序

本教程详细介绍了如何利用 javascript 实现 css grid 布局中元素的动态随机排序。通过生成初始元素、使用洗牌算法对数据进行随机化,并动态更新 dom,我们可以轻松创建如宾果板等需要随机显示内容的应用。文章将提供完整的代码示例,并解释其实现原理,帮助开发者理解和应用这一技术。

在现代网页开发中,CSS Grid 布局为我们提供了强大的二维布局能力。然而,CSS Grid 本身并没有内置的机制来直接随机化网格项(grid-item)的显示顺序。对于需要动态改变元素位置的场景,例如制作一个可随机洗牌的宾果板,我们需要结合 JavaScript 来实现元素的顺序管理和 DOM 操作。

核心原理

实现 CSS Grid 元素随机排序的核心思想是:

数据与视图分离: 维护一个包含所有网格项内容的数组。随机化数据: 使用 JavaScript 对这个数组进行随机洗牌。动态更新 DOM: 根据洗牌后的数组顺序,重新生成或更新 HTML 元素,并将其插入到 CSS Grid 容器中。

实现步骤与代码示例

我们将通过一个简单的宾果板示例来演示这一过程。

1. HTML 结构

首先,我们需要一个容器来承载我们的网格项,以及一个按钮来触发洗牌操作。

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

            CSS Grid 随机排序            #bingo {            display: grid;            grid-template-columns: repeat(5, 1fr); /* 5x5 网格 */            gap: 10px; /* 网格项间距 */            width: 500px;            margin: 20px auto;            border: 1px solid #ccc;            padding: 10px;        }        .grid-item {            display: flex;            justify-content: center;            align-items: center;            height: 80px;            background-color: #f0f0f0;            border: 1px solid #ddd;            font-size: 1.5em;            font-weight: bold;        }        button {            display: block;            margin: 20px auto;            padding: 10px 20px;            font-size: 1em;            cursor: pointer;        }        
// JavaScript 代码将在这里

在上述 HTML 中,我们定义了一个 div 元素作为 CSS Grid 容器 (#bingo),并为其应用了基本的 CSS Grid 样式,使其呈现为一个 5×5 的网格布局。grid-item 类则定义了每个网格项的样式。

2. JavaScript 逻辑

接下来是核心的 JavaScript 部分,它负责生成初始的网格项,并在点击按钮时进行洗牌。

    // 初始化宾果板    makeBoard();    /**     * 生成初始宾果板的网格项。     * 从 1 到 25 顺序生成数字。     */    function makeBoard() {        let str = "";        for (let i = 1; i <= 25; i++) {            str += "
" + i + "
"; } document.getElementById("bingo").innerHTML = str; } /** * 随机洗牌宾果板的网格项。 * 使用 Fisher-Yates (或类似) 洗牌算法的变体。 */ function shuffleBoard() { // 原始数字数组 let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]; let str = ""; // 循环直到 numbers 数组为空 while (numbers.length > 0) { // 随机生成一个索引 const randomIndex = Math.floor(Math.random() * numbers.length); // 将随机选中的数字添加到 HTML 字符串 str += "
" + numbers[randomIndex] + "
"; // 从数组中移除已选中的数字,确保不重复 numbers.splice(randomIndex, 1); } // 更新 #bingo 容器的内部 HTML document.getElementById("bingo").innerHTML = str; }

代码解析:

makeBoard() 函数:

在页面加载时调用,用于初始化宾果板。它循环从 1 到 25,为每个数字创建一个 div 元素字符串,并将其累加到 str 变量中。最后,通过 document.getElementById(“bingo”).innerHTML = str; 将生成的 HTML 字符串插入到 #bingo 容器中。

shuffleBoard() 函数:

当用户点击“洗牌”按钮时触发。首先,它定义了一个包含 1 到 25 所有数字的 numbers 数组。进入一个 while 循环,只要 numbers 数组中还有元素就继续执行。在循环内部:Math.random() * numbers.length 生成一个介于 0(包含)和 numbers.length(不包含)之间的浮点数。Math.floor() 将其向下取整,得到一个有效的数组索引 randomIndex。numbers[randomIndex] 获取随机选中的数字,并将其包裹在 div 标签中添加到 str 字符串。numbers.splice(randomIndex, 1) 从 numbers 数组中移除这个已经被选中的数字,防止重复。循环结束后,str 变量包含了所有数字的随机排序的 HTML 字符串。同样,document.getElementById(“bingo”).innerHTML = str; 将新的随机排序的 HTML 更新到页面上。

注意事项与优化

性能考量: 对于少量元素(如本例中的 25 个),直接操作 innerHTML 是可接受的。但如果网格项数量非常庞大,频繁地完全重绘 DOM 可能会导致性能问题。在这种情况下,可以考虑使用更精细的 DOM 操作(如 appendChild、insertBefore 配合 DocumentFragment),或者利用虚拟 DOM 库(如 React, Vue)来优化更新效率。洗牌算法: 示例中使用的随机选择并移除的逻辑是 Fisher-Yates (Knuth) 洗牌算法的一个变体,它能确保每个排列组合的概率均等。数据源: 在实际应用中,网格项的内容可能不仅仅是数字,可以是更复杂的数据对象。可以将这些数据对象存储在数组中,然后对数组进行洗牌,再根据洗牌后的数据渲染对应的 HTML。可访问性: 如果元素的视觉顺序变化对用户理解内容有重要影响,需要考虑如何通过 ARIA 属性或其他方式提升可访问性。CSS order 属性: 虽然 CSS Grid 有 order 属性可以改变网格项的视觉顺序,但它通常用于调整少数元素的顺序,而不是大规模的随机化。如果要使用 order 属性,你需要通过 JavaScript 为每个元素生成一个随机的 order 值,这可能比直接重新渲染 innerHTML 更复杂,且在某些浏览器中 order 的随机性可能不如直接 DOM 排序直观。

总结

通过结合 JavaScript 的数据处理能力和 DOM 操作,我们可以有效地实现 CSS Grid 元素的动态随机排序。这种方法在需要创建交互式、动态布局的应用中非常实用,例如游戏界面、数据展示板等。理解其核心原理——数据随机化和视图更新——是掌握此类动态网页交互的关键。

以上就是使用 JavaScript 实现 CSS Grid 元素动态随机排序的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
CSS响应式图片实践:正确处理宽度与高度属性
上一篇 2025年12月23日 14:29:42
Three.js教程:动态切换3D模型纹理(GLTF, GLB, FBX)
下一篇 2025年12月23日 14:29:54

相关推荐

  • 京东双11国补APP上怎么找_京东双11国补APP查找入口教程

    首先通过搜索“家电900”或“数码900”口令进入京东国补会场,享受商品立减优惠;其次利用历史记录一键直达活动页面;最后输入“红包900”领取最高1888元全品类叠加红包,每日可领一次,与国补优惠叠加使用。 如果您想在京东APP上参与双11国补活动,但找不到领取入口,可能是由于搜索口令变更或未保存历…

    2026年8月31日
    000
  • 网页底部光标样式失效了?如何排查及解决?

    网页底部光标样式失效了?如何排查及解决?网页底部光标样式失效了?如何排查及解决?网页底部光标样式失效了?如何排查及解决?网页底部光标样式失效了?如何排查及解决?

    网页底部鼠标指针样式异常:诊断与修复 在网页设计中,自定义鼠标指针样式能显著提升用户体验。然而,有时会出现底部区域鼠标指针样式失效的情况,即使该区域没有被其他元素遮挡。本文将分析此问题,并提供有效的解决方法。 问题表现为:开发者已正确设置cursor样式,但网页底部区域仍显示默认指针,且排查后确认无…

    2026年8月31日 用户投稿
    000
  • qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍

    qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍qq浏览器如何把多个文件压缩成一个文件 具体操作方法介绍

    点击文件选项 启动手机上的QQ浏览器,进入应用主界面后选择底部菜单里的文件功能。 选择查看更多选项 在文件浏览界面中找到并点击查看更多按钮。 进入文件夹列表 在查看更多内容的页面中,点击文件夹选项以进入文件夹列表。 选中目标文件 长按需要压缩的文件,在出现的操作界面中勾选这些文件,随后点击右下角的更…

    2026年8月31日 用户投稿
    100
  • 开发中如何选择合适的Emoji表情库?

    寻找合适的emoji表情库? 在开发过程中,我们常常需要用到Emoji表情来增强用户体验,提升应用的趣味性。那么,有哪些好用的Emoji表情库可以选择呢?本文将介绍几个常用的库,帮助你找到合适的工具。 Emoji Mart:这是一个功能强大的Emoji表情库,它提供了丰富的表情符号,并且支持多种编程…

    用户投稿 2026年8月31日
    100
  • 铁路12306怎么给残疾人买票_铁路12306残疾人票购买流程

    必须使用残疾人本人账号在12306 App或车站窗口购票,系统自动识别资格并分配无障碍席位。线上购票需绑定证件、勾选“残疾人专用票”和“需要轮椅席位”,确认票面带“专”字;人工窗口购票须携带身份证和残疾证原件,现场申请专用票额及无障碍服务;首次购票前需完成优惠资质核验,通过自助机或人工窗口绑定证件信…

    2026年8月31日
    000
  • 还在 SSH + Vim?VS Code 都支持远程开发了

    还在 SSH + Vim?VS Code 都支持远程开发了还在 SSH + Vim?VS Code 都支持远程开发了还在 SSH + Vim?VS Code 都支持远程开发了还在 SSH + Vim?VS Code 都支持远程开发了

    一.趋势 随着容器化和深度学习等技术在生产中的应用,越来越多的场景需要“远程”开发。例如: 服务器虚拟机容器等远程环境往往难以或无法在本地完全重建,比如: 特定配置:例如曾经遇到的 .Net Framework 4.0 + MSSQL 2000 ,以及安装了特定版本补丁的历史项目,几乎无法重现其环境…

    2026年8月31日 用户投稿
    100
  • 360浏览器如何截图 具体操作步骤

    360浏览器如何截图 具体操作步骤360浏览器如何截图 具体操作步骤360浏览器如何截图 具体操作步骤360浏览器如何截图 具体操作步骤

    启动360浏览器,进入首页后,在右上角可以看到一个由四个小方块组成的图标,点击该图标展开菜单 在弹出的扩展面板中,选择“管理”选项 进入扩展管理页面后,我们需要查找截图类工具并添加至浏览器扩展。点击页面右上角的“添加更多扩展”按钮 在扩展应用市场界面,右侧设有搜索框,在此输入“截图”关键词进行查找,…

    2026年8月31日 用户投稿
    100
  • Copilot怎么集成到Edge浏览器_Edge侧边栏Copilot使用攻略

    答案是Copilot集成在Edge浏览器侧边栏中,用户只需更新浏览器并开启侧边栏功能即可使用。通过设置启用Copilot后,可实现网页内容总结、智能提问、内容创作辅助和图像生成等功能,提升浏览效率。尽管可能遇到响应异常、内容准确性或隐私顾虑等问题,但多数可通过刷新、验证信息或关闭功能解决。结合提示词…

    2026年8月31日
    000
  • VSCode的Vue怎么打开_VSCode运行和调试Vue项目的环境配置教程

    首先确保Node.js、Vue CLI和VSCode插件(如Volar、ESLint、Prettier)已安装,接着通过终端运行npm run serve启动项目,然后配置launch.json文件并安装Debugger for Chrome扩展,最后启动调试会话即可在VSCode中调试Vue应用。…

    2026年8月31日
    000
  • 多多视频号怎么开通直播?直播注意事项有哪些?

    想要在多多视频上通过直播带货提升销量,却不清楚如何开启直播功能?其实流程并不复杂,只要符合平台要求,并按步骤操作,就能顺利开播。 一、如何开通多多视频号直播? 需要注意的是,多多视频的直播功能主要面向拼多多商家开放,属于店铺营销的一部分。因此,开通直播的前提是拥有一个合规运营的拼多多店铺。具体操作如…

    2026年8月31日
    000
  • Vue3组件实例未销毁:如何解决useDocumentVisibility导致的定时器泄漏问题?

    Vue3组件销毁失败及定时器泄漏解决方案 在Vue3开发中,组件未能按预期销毁是常见问题,可能导致内存泄漏或定时器持续运行。本文分析一个useDocumentVisibility导致定时器泄漏的案例,并提供解决方案。 问题描述: 使用@vueuse/core库的useDocumentVisibili…

    2026年8月31日
    000
  • 俄罗斯搜索引擎入口网址https 俄罗斯yandex首页入口https

    如果您正在寻找俄罗斯最主流的搜索引擎入口,那么Yandex无疑是首选。本文将直接为您提供Yandex的官方首页网址,并详细介绍如何访问及进行基本操作,帮助您轻松开始使用这个强大的俄语区搜索引擎。 Yandex 官方入口网址 1、立即进入“俄罗斯搜索引擎入口网址https☜☜☜☜☜点击进入”; 2、立…

    2026年8月31日
    000
  • yandex入口入口地址https yandex浏览器登录入口免登录

    这篇文章将为您介绍被誉为“俄罗斯谷歌”的强大搜索引擎Yandex的直接访问入口。无论您是想体验不同于主流的搜索服务,还是寻找特定资源,本指南都将教您如何快速、免登录地进入和使用Yandex,发掘其独特价值。 1、立即进入“yandex入口入口地址https☜☜☜☜☜点击进入”; 2、立即进入“yan…

    2026年8月31日
    000
  • 微信小程序webview内H5页面JS代码无法执行是什么原因?

    微信小程序 web-view 组件JS代码执行失败排查指南 在微信小程序中使用 web-view 组件加载 H5 页面时,开发者经常会遇到一个难题:H5 页面在浏览器和模拟器上运行正常,但在真机上却无法执行 JavaScript 代码。本文将通过一个案例分析,帮助您解决此类问题。 问题描述: 一个使…

    2026年8月31日
    100
  • Laravel Middleware 中 Request 对象访问错误及安全实践

    本文旨在解决 Laravel 8 中使用 Middleware 拦截请求时,由于错误使用 $request 对象导致参数获取失败的问题,并强调通过 URL 参数传递用户身份信息的安全隐患。我们将深入探讨如何正确访问请求参数,并提供更安全的身份验证方案。 在 Laravel 中使用 Middlewar…

    2026年8月31日
    100
  • Win10 v2004如何移除Cortana开机启动项

    Win10 v2004如何移除Cortana开机启动项Win10 v2004如何移除Cortana开机启动项Win10 v2004如何移除Cortana开机启动项Win10 v2004如何移除Cortana开机启动项

    在本站之前发布的文章里,我们讲解了如何在Windows 10 May 2020(20H1/Version 2004)功能更新中卸载Cortana语音助手的小窍门。接下来,我们将介绍另一个方法,用于从开机启动项中移除Cortana。这个过程相当简便。 若想避免Cortana在开机时启动或在后台持续运行…

    2026年8月31日 用户投稿
    100
  • 如何用CSS绘制任意形状的圆弧线?

    利用css绘制任意形状圆弧线的技巧 许多前端开发者在CSS页面设计中,常常需要绘制各种形状,其中,创建特定形状的圆弧线是一个常见的挑战。本文将通过一个案例分析,讲解如何使用CSS实现复杂的圆弧效果。 文中探讨了使用CSS实现曲线效果的方法。 提问者尝试使用border-radius属性: img {…

    2026年8月31日
    000
  • 百词斩社区功能怎么使用_百词斩学习交流社区指南

    百词斩社区通过“社区”入口进入,可浏览动态、点赞评论、发布文字图片或打卡内容,参与话题活动赢奖励,促进学习交流与坚持。 百词斩的社区功能是帮助用户在背单词过程中进行学习交流、分享经验、互相激励的重要平台。通过社区,你可以看到其他用户的学习动态,参与话题讨论,还能展示自己的学习成果。下面详细介绍如何使…

    2026年8月31日
    000
  • WPF 使用 Composition API 做高性能渲染

    在 wpf 中,许多开发者会遇到渲染性能的问题。尽管 wpf 的渲染性能比浏览器渲染要高出不少,但仍然无法满足游戏级别的渲染需求。wpf 使用的 directx 版本仅优化到 9 级别,与 directx 9 的性能相当。鉴于开发者的需求,微软推出了现代渲染方法——composition api,这…

    2026年8月31日
    100
  • CSS如何实现图片底部圆弧边框效果?

    CSS打造图片底部圆弧边框:高效技巧详解 在网页设计中,灵活运用CSS创建各种形状的边框是提升页面美观度的关键。本文将详细讲解如何使用CSS高效地实现图片底部圆弧边框效果,解决开发者在实际应用中常遇到的难题。 问题: 如何仅用CSS为图片底部创建圆弧边框?单纯使用border-radius属性似乎无…

    2026年8月31日
    000

发表回复

登录后才能评论
关注微信