
在网页开发中,有时我们需要动态调整页面元素的顺序,使其在每次加载时呈现不同的布局,同时又需要遵循特定的排列规则。本教程将详细讲解如何使用javascript和jquery来实现这一目标,特别是针对具有不同类型且需按特定模式交替排列的dom元素。
假设我们有两类DIV元素:卡片(Card,共5个)和图片(Image,共4个)。我们需要实现以下重排规则:
传统的数组洗牌算法(如Fisher-Yates)虽然能实现完全随机,但无法满足上述复杂的交替和首位规则。因此,我们需要一种更精细的控制策略。
解决这类问题的核心策略可以分为以下几个步骤:
我们将使用jQuery来简化DOM操作,并实现Fisher-Yates洗牌算法。
立即学习“Java免费学习笔记(深入)”;
首先,确保你的HTML中包含需要重排的DIV元素,并为它们分配易于区分的ID或类名。例如,这里我们使用ID前缀来区分卡片和图片。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>按规则随机重排DOM元素</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
body {
font: medium monospace;
}
/* 示例样式,非核心功能 */
.col-sm-12 { border: 1px solid #ccc; padding: 10px; margin-bottom: 5px; }
</style>
</head>
<body>
<div class="row" id="content">
<div class="col-sm-12 col-md-6 col-lg-4" id="card1">Card #1</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="card2">Card #2</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="card3">Card #3</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="card4">Card #4</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="card5">Card #5</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="image1">Image #1</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="image2">Image #2</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="image3">Image #3</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="image4">Image #4</div>
</div>
</body>
</html>Fisher-Yates 洗牌算法是一种高效且公平的洗牌算法,它通过从数组末尾开始,每次随机选择一个未处理的元素与当前元素交换位置,直到数组开头。
/**
* Fisher-Yates 洗牌算法
* @param {Array} array - 需要洗牌的数组
*/
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1)); // 随机选择一个索引,范围从0到i
// 交换 array[i] 和 array[j]
const temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}在DOM加载完成后,我们执行以下操作:
$(function() { // 等待DOM加载完成
// 1. 提取并移除DOM中的元素,转换为原生数组
let cards = $("#content > [id^=card]").remove().get();
let images = $("#content > [id^=image]").remove().get();
// 2. 分别对卡片和图片数组进行洗牌
shuffle(cards);
shuffle(images);
// 3. 根据规则重新组合并追加到DOM
// 规则:第一个必须是C,然后C, I, C, I... 交替
for (let i = 0; i < cards.length; i++) {
// 首先添加一个卡片
$("#content").append(cards[i]);
// 如果还有图片,则添加一个图片,实现C-I交替
if (i < images.length) {
$("#content").append(images[i]);
}
}
});将上述JavaScript代码放入 <script> 标签中,并确保在jQuery库加载之后执行。
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>按规则随机重排DOM元素</title>
<!-- 引入jQuery库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<style>
body {
font: medium monospace;
}
/* 示例样式,非核心功能 */
.col-sm-12 { border: 1px solid #ccc; padding: 10px; margin-bottom: 5px; }
</style>
</head>
<body>
<div class="row" id="content">
<div class="col-sm-12 col-md-6 col-lg-4" id="card1">Card #1</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="card2">Card #2</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="card3">Card #3</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="card4">Card #4</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="card5">Card #5</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="image1">Image #1</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="image2">Image #2</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="image3">Image #3</div>
<div class="col-sm-12 col-md-6 col-lg-4" id="image4">Image #4</div>
</div>
<script>
/**
* Fisher-Yates 洗牌算法
* @param {Array} array - 需要洗牌的数组
*/
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
const temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
$(function() { // 等待DOM加载完成
// 1. 提取并移除DOM中的元素,转换为原生数组
let cards = $("#content > [id^=card]").remove().get();
let images = $("#content > [id^=image]").remove().get();
// 2. 分别对卡片和图片数组进行洗牌
shuffle(cards);
shuffle(images);
// 3. 根据规则重新组合并追加到DOM
// 规则:第一个必须是C,然后C, I, C, I... 交替
for (let i = 0; i < cards.length; i++) {
// 首先添加一个卡片
$("#content").append(cards[i]);
// 如果还有图片,则添加一个图片,实现C-I交替
if (i < images.length) {
$("#content").append(images[i]);
}
}
});
</script>
</body>
</html>通过以上方法,我们成功地实现了在满足特定排列规则的同时,对DOM元素进行随机重排的功能,这在构建动态和个性化的网页布局时非常有用。
以上就是使用JavaScript和jQuery按规则随机重排DOM元素的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号