实例介绍
【实例简介】
【实例截图】
【核心代码】
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> body { margin: 0; padding: 0; background: url(img/bg.png); } #main { width: 100%; height: 100%; } .nav { width: 100%; height: 200px; display: flex; justify-content: space-around; align-items: center; } #allPoker, #fourPokers { display: flex; justify-content: space-around; align-items: center; } #fourPokers div, #sevenPokers div, #allPoker div { width: 105px; height: 150px; margin: 0 20px; box-sizing: border-box; border: 2px solid rgba(255, 255, 255, 0.6); border-radius: 5px; cursor: pointer; position: relative; } #fourPokers div img, #sevenPokers div img, #allPoker div img { position: relative; border-radius: 5px; } #allPoker div:nth-child(1).active:after { content: ""; width: 105px; height: 150px; position: absolute; left: 0; top: 0; background: url(img/01.png); } #sevenPokers { display: flex; justify-content: space-around; align-items: center; } #fourPokers div img, #sevenPokers div img, #allPoker div img { position: absolute; left: 0; top: 0; } </style> </head> <body> <div id="main"> <!-- 顶部牌堆 --> <div class="nav"> <!-- 左侧牌堆 --> <div id="allPoker"> <div class="active"></div> <div></div> </div> <!-- 右侧4个牌堆 --> <div id="fourPokers"> <div></div> <div></div> <div></div> <div></div> </div> </div> <!-- 底部 7个牌堆--> <div id="sevenPokers"> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> <div></div> </div> </div> <script> // 循环遍历将poker图片添加到数组中 var pokersList = []; var flower = 0; for (var i = 1; i <= 52; i ) { var poker = new Image(); poker.src = "img/" i ".jpg" poker.setAttribute("data-i",i-flower*13); //保存扑克的值 poker.setAttribute("data-flower",flower); //保存扑克的花色 pokersList.push(poker); if(i%13==0){flower } } console.log(pokersList); //随机生成长度为52的数组 保存下标,0~51; var pokerObjI = []; for (var i = 0; pokerObjI.length < 52; i ) { var num = Math.floor(Math.random() * 52); var isRepeat = false; for (var item of pokerObjI) { if (item == num) { isRepeat = true; } } if (!isRepeat) { pokerObjI.push(num); } } // -----------------向所有牌堆中添加扑克----------------- // 创建全局变量 pokerNum 来保存以添加过的最后一个下标 var pokerNum = 0; // 获取牌堆对象 var allPoker = document.getElementById('allPoker').children[0]; // 向牌堆中插入24张扑克 for (var i = 0; i < 24; i ) { allPoker.appendChild(pokersList[pokerObjI[i]]); pokerNum ; //同时样poker的下标增加 } // 向下方7个牌堆中分别保存 1,2,3,4,5,6,7张扑克(共28张) // 获取7个牌堆对象 var sevenObj = document.getElementById('sevenPokers').children; // console.log(sevenObj) // 循环向牌堆中添加扑克 for (var i = 1; i <= 7; i ) { for (var j = 1; j <= i; j ) { sevenObj[i - 1].appendChild(pokersList[pokerObjI[pokerNum]]); pokerNum ; } } // ----------------为下方7个牌堆添加层叠样式----------------- // 给除最后一张扑克外添加active样式 function addClass(){ for (var item of sevenObj) { var items = item.children; try{ for(var j of items){ var src = j.getAttribute("data-src"); if(src !==null){j.src = src;j.removeAttribute("data-src")}; } }catch(e){ //TODO handle the exception } if (items.length > 1) { for (var i = items.length - 2; i >= 0; i--) { items[i].setAttribute("data-src", items[i].src); items[i].src = "img/01.png"; } } } } // 判断7个牌堆中如果有最后一个扑克均为背面,则让最后一个变为正面, // 如果最后一个为正面,则什么都不改变 function changeClass(){ for (var item of sevenObj){ var lastItem = item.children[item.children.length-1]; var penultimate = item.children[item.children.length-2]; if(item.children.length>0){ if(penultimate==undefined){ if(lastItem.dataset.src!=null){ console.log(lastItem); console.log(lastItem.src); console.log(lastItem.dataset.src); lastItem.src = lastItem.dataset.src; } }else if(penultimate.src == lastItem.src){ // 如果倒数第二个扑克和倒数第一个扑克src相等,让最后一个变为正面 lastItem.src = lastItem.dataset.src; } } } } // 给扑克添加上外边距 让他们分开 function addMarginTop() { for (var item of sevenObj) { var items = item.children; for(var i of items){ i.removeAttribute("style"); } if (items.length > 1) { for (var i = 1; i < items.length; i ) { items[i].style.marginTop = i * 30 "px"; } } } } addClass(); addMarginTop(); // ----------在所有扑克分发结束后绑定事件---------- //为牌堆中poker绑定点击事件 [点击显示一张,全部显示完后再次点击让所有牌回到牌堆] // 1.获取到所有牌堆中的扑克 var AllpokerObj = allPoker.getElementsByTagName('img'); // 2.获取牌堆展示的div var AllpokerDiv = allPoker.nextElementSibling; // 创建变量保存被拖动的扑克和展示区域当前已添加的扑克数 var thisPoker, pakerListNum; // 创建变量保存当前被拖动扑克的花色和值 var thisI,thisFlower; // 为牌堆添加点击事件 allPoker.onclick = function() { // 将展示区域的所有扑克保存在list中 var pokerList = AllpokerDiv.getElementsByTagName('img'); // 创建变量保存展示区域扑克个数 pakerListNum = pokerList.length; // console.log(pokerList); if (AllpokerObj.length > 0) { AllpokerDiv.appendChild(AllpokerObj[AllpokerObj.length - 1]); //将最后一张扑克(最上方的),移动到展示区域 if (AllpokerObj.length == 0) { allPoker.classList.remove('active') } //如果牌堆没有扑克了,去掉active样式(取消扑克背面样式) } else { allPoker.classList.add('active') //为牌堆添加active样式 for (var i = pakerListNum - 1; i >= 0; i--) { allPoker.appendChild(pokerList[i]); //循环遍历将展示区域扑克添加到牌堆中 } } // console.log(pakerListNum); // 为牌堆展示框中所有扑克绑定拖动事件 写在点击事件里,每次点击都更新 // 创建变量保存鼠标位置 var left, top; for (item of pokerList) { item.ondragstart = function(e) { console.log("拖动开始") thisPoker = this; thisI = this.dataset.i; thisFlower = this.dataset.flower; //保存当前鼠标在扑克上的位置 left = e.clientX - this.offsetLeft; top = e.clientY - this.offsetTop; } item.ondrag = function(e) { // console.log("拖动ing~") // 设置当前扑克的位置 //this.style.position = "fixed" this.style.top = e.clientY - top "px"; this.style.left = e.clientX - left "px"; } item.ondragend = function() { console.log("拖动结束") // 移除之前添加的样式 this.removeAttribute("style") } } } // 为7个牌堆的最后一个扑克添加拖动事件 function addDrag(){ for (var item of sevenObj) { var list = item.children[item.children.length - 1]; var left,op,style; if(list){ list.ondragstart = function(e) { console.log("拖动开始") thisPoker = this; thisI = this.dataset.i; thisFlower = this.dataset.flower; //保存当前鼠标在扑克上的位置 } list.ondrag = function(e) { } list.ondragend = function() { console.log("拖动结束") // 移除之前添加的样式 //this.removeAttribute("style"); //this.setAttribute("style",style); } } } } addDrag(); // 为4个牌堆添加拖动释放事件 // 获取4个牌堆 var fourPokers = document.getElementById('fourPokers').children; for (var item of fourPokers) { item.ondragenter = function() { console.log("拖动进入") } item.ondragover = function(e) { e.preventDefault(); console.log("拖动悬停") } item.ondragleave = function() { console.log("拖动离开") } item.ondrop = function() { console.log(this.children.length) // 当本牌堆里没有扑克时,只可放入A,即thisI为1的扑克 if(this.children.length==0){ // 判断当前拖动的扑克的值不等于1则停止运行 return if(thisI != 1){ console.log("只可放入A"); return; } }else{ // 当牌堆中有扑克时,先判断当前拖动扑克的值和花色,如果与牌堆中的花色不同and值不大于最后一个扑克1时,停止运行 // 获取当前牌堆的data-i和data-flower var itemI = parseInt(this.dataset.i); var itemFlower = this.dataset.flower; if(thisFlower != itemFlower || (thisI - itemI) != 1){ console.log("仅可放入同花色且值仅能比当前值大1") return; } } console.log("拖动释放") console.log(thisPoker); console.log(thisI); console.log(thisFlower); console.log(this); this.appendChild(thisPoker); this.setAttribute("data-i",thisI); this.setAttribute("data-flower",thisFlower); for(var i of this.children){ i.removeAttribute("style"); } addDrag(); changeClass(); // pakerListNum--; } } // 为下方7个牌堆添加拖动释放事件 for(var item of sevenObj){ item.ondragenter = function() { console.log("拖动进入") } item.ondragover = function(e) { e.preventDefault(); console.log("拖动悬停") } item.ondragleave = function() { console.log("拖动离开") } item.ondrop = function() { console.log(this.children.length) if(this.children.length==0){ // 当本牌堆里没有扑克时,只可放入K,即thisI为13的扑克 // 判断当前拖动的扑克的值不等于1则停止运行 return if(thisI != 13){ console.log("只可放入K"); return; } }else{ var thisItem = this.children[this.children.length-1]; var itemI = parseInt(thisItem.dataset.i); var itemFlower = parseInt(thisItem.dataset.flower); if(thisFlower%2 == itemFlower%2 || itemI - thisI !=1){ console.log("只能放置不同的花色,并且值执行相差1") return; } } console.log("拖动释放"); this.appendChild(thisPoker) for(var i of this.children){ i.removeAttribute("style"); } addDrag(); addMarginTop(); changeClass(); // pakerListNum--; } } </script> </body> </html>
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论