国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

javascript結(jié)合Flexbox簡單實(shí)現(xiàn)滑動拼圖游戲

2024-05-06 16:28:37
字體:
供稿:網(wǎng)友
本文給大家分享的是一則使用javascript結(jié)合Flexbox簡單實(shí)現(xiàn)滑動拼圖游戲的代碼,雖然沒有實(shí)現(xiàn)完整的功能,但是還是推薦給大家,喜歡的朋友可以繼續(xù)做完
 

滑動拼圖就是把一張圖片分成幾等份,打亂順序(下圖),然后通過滑動拼湊成一張完整的圖片。

javascript結(jié)合Flexbox簡單實(shí)現(xiàn)滑動拼圖游戲

要實(shí)現(xiàn)一個拼圖游戲,需要考慮怎樣隨機(jī)的打亂順序,怎樣交換兩張圖片的位置,等等。但是,使用了Flexbox布局以后,這都不需要你去考慮,瀏覽器會幫你做,F(xiàn)lexbox就是這么的強(qiáng)大。關(guān)于Flexbox的介紹可以點(diǎn)擊這里。
這個游戲中要用的是Flexbox布局的order屬性,order屬性可以用來控制Flex項(xiàng)目的順序。
這里我用九個canvas元素來把圖片分成九等分,也可以用其他方法,比如背景圖片定位:

<div class="wrap">  <canvas></canvas>  <canvas></canvas>  <canvas></canvas>  <canvas></canvas>  <canvas></canvas>  <canvas></canvas>  <canvas></canvas>  <canvas></canvas>  <canvas></canvas></div>

如果不僅限于九宮格,還要十六宮格等,上面的元素完全可以動態(tài)生成。
下面是生成打亂順序的九張圖代碼:

var drawImage = function (url) {  return new Promise(function (resolve, reject) {    var img = new Image();    img.onload = function () {      resolve(img);    };    img.src = url;  })};drawImage("2.jpg").then(function (img) {  var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];  var random = arr.sort(function() {return Math.random() > 0.5});  [].forEach.call(document.querySelectorAll("canvas"), function (item, i) {    item.width = $(".wrap").clientWidth / 3;    item.height = $(".wrap").clientHeight / 3;    item.style.order = random[i];    var ctx = item.getContext("2d");    ctx.drawImage(img, img.width * (i % 3) / 3, img.height * Math.floor(i / 3) / 3, img.width / 3, img.height / 3, 0, 0, item.width, item.height);  });});

上面的關(guān)鍵代碼是:

item.style.order = random[i];

通過將數(shù)字打亂順序,隨機(jī)賦值給每個canvas元素的order屬性,這樣瀏覽器就自動幫你排序了。
關(guān)于代碼的其他細(xì)節(jié)就不講了,這里說一下怎樣交換兩張圖片的位置,真是出乎意料的簡單:

var order1 = item.style.order;var order2 = target.style.order;

只需要交換雙方的order屬性值就可以了。

完整代碼

<!DOCTYPE html><html><head lang="en">  <meta charset="UTF-8">  <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />  <meta content="yes" name="apple-mobile-web-app-capable" />  <meta content="black" name="apple-mobile-web-app-status-bar-style" />  <meta content="telephone=no" name="format-detection" />  <title></title>  <style>    html, body {      height: 100%;    }    body {      margin: 0;      padding: 0;      overflow: hidden;    }    .wrap {      display: flex;      flex-wrap: wrap;      width: 100%;      height: 100%;      overflow: hidden;    }    .wrap canvas {      width: 33.3333%;      height: 33.3333%;      border: 1px solid red;      box-sizing: border-box;    }  </style></head><body><div class="wrap">  <canvas data-value="1"></canvas>  <canvas data-value="2"></canvas>  <canvas data-value="3"></canvas>  <canvas data-value="4"></canvas>  <canvas data-value="5"></canvas>  <canvas data-value="6"></canvas>  <canvas data-value="7"></canvas>  <canvas data-value="8"></canvas>  <canvas data-value="9"></canvas></div><script>  var $ = function (el) {    return document.querySelector(el);  };  var touchMove, touchEnd;  var drawImage = function (url) {    return new Promise(function (resolve, reject) {      var img = new Image();      img.onload = function () {        resolve(img);      };      img.src = url;    })  };  drawImage("2.jpg").then(function (img) {    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];    var random = arr.sort(function() {return Math.random() > 0.5});    [].forEach.call(document.querySelectorAll("canvas"), function (item, i) {      item.width = $(".wrap").clientWidth / 3;      item.height = $(".wrap").clientHeight / 3;      item.style.order = random[i];      var ctx = item.getContext("2d");      ctx.drawImage(img, img.width * (i % 3) / 3, img.height * Math.floor(i / 3) / 3, img.width / 3, img.height / 3, 0, 0, item.width, item.height);    });  });  document.addEventListener("touchstart", function (e) {    var target = e.target;    if (e.target.tagName.toLowerCase() !== "canvas") {      return;    }    var ctx = target.getContext("2d");    var image = ctx.getImageData(0, 0, target.width, target.height);    var obj = target.cloneNode(true);    obj.getContext("2d").putImageData(image, 0, 0);    var top = target.getBoundingClientRect().top, left = target.getBoundingClientRect().left;    obj.style.cssText = "position: absolute; top: " + top + "px; left: " + left + "px";    document.body.appendChild(obj);    var point = {"x": e.touches[0].pageX, "y": e.touches[0].pageY};    document.addEventListener("touchmove", touchMove = function (e) {      obj.style.cssText = "position: absolute; top:" + (e.touches[0].pageY - point.y + top) + "px; left: " + (e.touches[0].pageX - point.x + left) + "px";    });    document.addEventListener("touchend", touchEnd = function (e) {      var pos = {"x": e.changedTouches[0].pageX, "y": e.changedTouches[0].pageY};      [].forEach.call(document.querySelectorAll(".wrap canvas"), function (item, i) {        var offset = item.getBoundingClientRect();        if (pos.x > offset.left && pos.x < (offset.left + item.width) && pos.y > offset.top && pos.y < (offset.top + item.height)) {          var order1 = item.style.order;          var order2 = target.style.order;          if (obj.parentNode) {            document.body.removeChild(obj);          }          item.style.order = order2;          target.style.order = order1;        }      });      document.removeEventListener("touchmove", touchMove);      document.removeEventListener("touchend", touchEnd);    })  })</script></body></html>

大家做測試的時(shí)候,最好用谷歌模擬器或者手機(jī)打開,因?yàn)橹恢С忠苿佣擞|摸事件。

代碼中只實(shí)現(xiàn)了基本功能,并沒有實(shí)現(xiàn)完整功能。



注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 麻江县| 萨迦县| 同仁县| 剑阁县| 秦皇岛市| 崇阳县| 太和县| 麦盖提县| 新津县| 两当县| 泽库县| 韩城市| 长武县| 姜堰市| 许昌市| 梅州市| 太康县| 汤原县| 新宾| 黄石市| 乐平市| 雷州市| 唐河县| 林州市| 织金县| 齐齐哈尔市| 普陀区| 尼玛县| 察雅县| 原平市| 象州县| 长海县| 新蔡县| 通许县| 南郑县| 安国市| 关岭| 合肥市| 绥宁县| 隆化县| 平远县|