JS实现宫格拖动动画效果

效果图如下:

效果图

html布局:

<!DOCTYPE html>
<html>
<head>
	<title>dragLabel</title>
	<meta charset="utf-8">
</head>
<body>
	<div class="container">
		<div class="item" draggable="true"><span>1</span></div>
		<div class="item" draggable="true"><span>2</span></div>
		<div class="item" draggable="true"><span>3</span></div>
		<div class="item" draggable="true"><span>4</span></div>
		<div class="item" draggable="true"><span>5</span></div>
		<div class="item" draggable="true"><span>6</span></div>
		<div class="item" draggable="true"><span>7</span></div>
		<div class="item" draggable="true"><span>8</span></div>
		<div class="item" draggable="true"><span>9</span></div>
	</div>
</body>
</html>

css样式:

.container{
	width: 910px;
	font-size: 0px;
}
.item{
	font-size: 40px;
	color: white;
	width: 300px;
    height: 200px;
    background-color: yellowgreen;
    display: inline-block;
    text-align: center;
    position: absolute;
    cursor: grab;
    transition: left,top;
    transition-duration: 0.6s;
}
.item span{
    display: block;
    width: fit-content;
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    margin: 0 auto;
    user-select: none;
}

JS实现:

var divs = document.querySelectorAll(".item"),i,div,dragDiv,isMoving = false;
for(i=0;i<divs.length;i++){
	divs[i].style["background-color"] = getRandomColor();
}
document.body.addEventListener("dragover",function(ev){
	ev.preventDefault();
})
sortDiv(divs);
for(i=0;i<divs.length;i++){
	div = divs[i];
	div.addEventListener("dragstart",function(e){
		dragDiv = this;
	})
	div.addEventListener("dragover",function(e){
		if(isMoving || this.isEqualNode(dragDiv)){
			return;
		}
		if(isPreviousElements(this,dragDiv)){
			this.parentNode.insertBefore(dragDiv,this.nextSibling);
		}else{
			this.parentNode.insertBefore(dragDiv,this);
		}
		isMoving = true;
		var st = setTimeout(function(){
			isMoving = false;
			clearTimeout(st);
		},600);
		sortDiv(document.querySelectorAll(".item"))
	})
}

// 随机生成颜色
function getRandomColor(){
	return "rgb(" + Math.random()*256 +","+ Math.random()*256+","+ Math.random()*256+")"
}

// 判断拖动元素是否在目标元素之前
function isPreviousElements(sourse, target){
	if(!sourse.previousSibling){
		return false;
	}

	if(target.isEqualNode(sourse.previousSibling)){
		return true;
	}
	return isPreviousElements(sourse.previousSibling, target)
}

// 位置排序
function sortDiv(divs){
	for(var i=0;i<divs.length;i++){
		divs[i].style.top = Math.floor(i/3)*201 + "px";
		divs[i].style.left = (i%3)*301 + "px";
	}
}

完整代码更新地址:github地址

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JS宫格抽奖可以通过以下步骤实现: 1. 首先,需要定义一个包含所有奖品的数组,每个奖品包含奖品名称和奖品图片等信息。 2. 创建一个随机数生成函数,用于随机选取一个奖品。 3. 创建一个函数,用于将选中的奖品在页面上展示出来,可以使用HTML和CSS实现。 4. 创建一个点击事件,当用户点击抽奖按钮时,触发随机选取奖品的函数,将选中的奖品展示在页面上。 5. 可以添加一些动画效果,如旋转、闪烁等,增加用户体验。 下面是一个简单的JS宫格抽奖的代码示例: HTML部分: ``` <div class="lottery-container"> <div class="lottery-item" id="lottery-item1"> <img src="奖品1.png" alt="奖品1"> <p>奖品1</p> </div> <<div class="lottery-item" id="lottery-item2"> <img src="奖品2.png" alt="奖品2"> <p>奖品2</p> </div> <div class="lottery-item" id="lottery-item3"> <img src="奖品3.png" alt="奖品3"> <p>奖品3</p> </div> <div class="lottery-item" id="lottery-item4"> <img src="奖品4.png" alt="奖品4"> <p>奖品4</p> </div> </div> <button class="lottery-btn" onclick="startLottery()">开始抽奖</button> ``` CSS部分: ``` .lottery-container { display: flex; justify-content: space-around; align-items: center; height: 400px; } .lottery-item { display: flex; flex-direction: column; align-items: center; width: 150px; height: 150px; border-radius: 50%; border: 5px solid #ccc; overflow: hidden; } .lottery-item img { width: 100%; height: 100%; object-fit: cover; } .lottery-item p { font-size: 18px; margin-top: 10px; } .lottery-btn { margin-top: 20px; padding: 10px 20px; font-size: 24px; background-color: #f00; color: #fff; border: none; border-radius: 5px; } .lottery-btn:hover { cursor: pointer; } ``` JS部分: ``` var prizes = [ { name: "奖品1", img: "奖品1.png" }, { name: "奖品2", img: "奖品2.png" }, { name: "奖品3", img: "奖品3.png" }, { name: "奖品4", img: "奖品4.png" } ]; function getRandomPrize() { var randomIndex = Math.floor(Math.random() * prizes.length); return prizes[randomIndex]; } function showPrize(prize) { var item = document.createElement("div"); item.classList.add("lottery-item"); item.innerHTML = ` <img src="${prize.img}" alt="${prize.name}"> <p>${prize.name}</p> `; var container = document.querySelector(".lottery-container"); container.innerHTML = ""; container.appendChild(item); } function startLottery() { var prize = getRandomPrize(); showPrize(prize); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值