【问题标题】:QuerySelectorAll won't work for shuffling the order of that listQuerySelectorAll 不适用于改组该列表的顺序
【发布时间】:2019-09-23 23:20:19
【问题描述】:

我正在构建一个纸牌翻转配对游戏。我想要键盘控制,而不是让卡片在鼠标点击时翻转。

我在洗牌时遇到了麻烦。如果我使用 DOM 中的“选择器”类,卡片会随机播放,但我计划在用户切换卡片时将它们用作荧光笔/选择器图标。所以我需要卡片本身来洗牌。

不要介意大部分代码都是为鼠标点击量身定做的。我仍在修改它,我需要首先能够洗牌并离开选择器类。

这是我的 HTML 的 sn-p:

    <section class='gameContainer'>
     <div class='game'>
        <div class='row'>
          <div class='selector'>
            <div class='card' data-framework='star'>
              <img class='frontSide'src='https://drive.google.com/uc?export=view&id=1A_zvQyMfZtwBqiVbYifebM07R15dUVD-'>
              <img class='backSide'src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='mushroom'>
              <img class='frontSide'src='https://drive.google.com/uc?export=view&id=1VgbaVqfGrAw_RefRbMpaKNW4yuQRA5Lm'>
              <img class='backSide'src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='flower'>
              <img class='frontSide'src='https://drive.google.com/uc?export=view&id=1Vae7dDSTQmvFlW0hoODvud_Y8_m-VVJk'>
              <img class='backSide'src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='coinTen'>
              <img class='imageWithNum'src='https://drive.google.com/uc?export=view&id=1aTtc4B_GK_EbUyk6Uhl2HFh7uZrZLahr'>
              <img class='backSide'src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='chest'>
              <img class='imageWithNum'src='https://drive.google.com/uc?export=view&id=1CYWq7iEShB2YG3bQPUCbihsW9_vzgEL_'>
              <img class='backSide' src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='mushroom'>
              <img class='frontSide'src='https://drive.google.com/uc?export=view&id=1VgbaVqfGrAw_RefRbMpaKNW4yuQRA5Lm'>
              <img class='backSide' src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
        </div>
    </div>
    </section>

这是我的 CSS:

* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}

body {
  height: 100vh;
  background-color: #000;
}

#titleContainer {
  border: solid 0px red;
  width: 50%;
  margin: auto;
  background-color: #ffe400;
  padding: 20px;
}
#title1 {
  font-family: '8BITWONDERNominal';
  font-weight: normal;
  font-style: normal;
  color: #1f57b8;
  text-align: center;
  text-shadow: 1px 2px 0px #ff0000;
}
#title2 {
  font-family: '8BITWONDERNominal';
  font-weight: normal;
  font-style: normal;
  text-align: center;
  color: #ff0000;
  text-shadow: 1px 2px 0px #000;
}

.gameContainer {
  border: solid 1px black;
  background: repeating-linear-gradient(
    -45deg,
    #fff,
    #fff 10px,
    #b30000 10px,
    #b30000 20px
  );
  width: 640px;
  height: 500px;
  margin: auto;
  display: flex;
  justify-content: center;
  align-items: center;
}
.game {
  background-color: #000;
  width: 90%;
  height: 90%;
}
.row {
  border: solid 0px red;
  width: 100%;
  height: 33.333%;
  display: flex;
  justify-content: space-around;
  align-items: center;
  padding: 20px;
  perspective: 1000px;
}
.selector, .selectorActive {
  box-sizing: content-box;
  border: solid 8px black;
  border-radius: 6px;
  position: relative;
  width: 15%;
  height: 110%;
  display: flex;
  justify-content: center;
  align-items: center;
}

.selectorActive {
  border: solid 8px orange;
}

.card {
  border: solid 0px aqua;
  position: absolute;
  display: flex;
  width: 90%;
  height: 89%;
  transform-style: preserve-3d;
  transition: transform .5s;
}

.card.flip {
  transform: rotateY(180deg);
}

.frontSide, .backSide{
  border: solid 0px deeppink;
  position: absolute;
  width: 100%;
  height: 100%;
  padding: 24px 9px;
  background-color: #ffd1d1;
  backface-visibility: hidden;
}
.frontSide {
  transform: rotateY(180deg);
}

.imageWithNum {
  border: solid 0px deeppink;
  position: absolute;
  width: 100%;
  height: 100%;
  padding: 29px 14px 0px;
  background-color: #ffd1d1;
  backface-visibility: hidden;
  transform: rotateY(180deg);
}

.backSide {
  background-color: #fff;
}

.cardSelector {
  border: solid 8px #ff7b00;
}

这是我的 JavaScript。我在脚本的开头抓取卡片类,然后在最后有洗牌功能。另外,不要介意 For 循环从 1 而不是 0 开始。这是有意的:

const cards = document.querySelectorAll('.card');

let hasFlippedCard = false;
let lockBoard = false;
let firstCard, secondCard;

function flipCard(){
  // This will disable any clicks that occur before the non-matched cards reset
  if(lockBoard)
    return;
  // This will prevent a double click on the same card to obtain a match
  if(this === firstCard)
    return;

  this.classList.add('flip');

  if(!hasFlippedCard){
    // First card is clicked
    hasFlippedCard = true;
    firstCard = this;

    return;
  } 

// Second card is clicked
secondCard = this;

// Check if cards match
checkForMatch();    
}


//This function will check if the two cards chosen match
function checkForMatch(){
  let isMatch = firstCard.dataset.framework === secondCard.dataset.framework;
  isMatch ? disableCards() : unflipCards();
}

//This function will disable the chosen cards whenever there's a match
function disableCards(){
  firstCard.removeEventListener('click', flipCard);
  secondCard.removeEventListener('click', flipCard);

  resetBoard();
}

//This function will reset the cards if they don't match
function unflipCards(){
  lockBoard = true;

  setTimeout(() => {
    firstCard.classList.remove('flip');
    secondCard.classList.remove('flip');

    resetBoard();
  }, 1500);
}

function resetBoard(){
  [hasFlippedCard, lockBoard] = [false, false];
  [firstCard, secondCard] = [null, null];
}

(function shuffle(){

  for(let x = 1; x < cards.length; x++){
    let randomPos = Math.floor(Math.random() * 17);
    cards[x].style.order = randomPos;
  }

})();

cards.forEach(card => card.addEventListener('click', flipCard));

也是的,我正在尝试重新创建超级马里奥兄弟 3 中的纸牌翻转游戏。:D

【问题讨论】:

    标签: javascript html css dom selectors-api


    【解决方案1】:

    当您指定顺序时,它适用于弹性容器的子容器。根据the specification

    弹性容器的内容由零个或多个弹性项目组成: flex 容器的每个子项都成为一个 flex 项。

    您的 .card 元素似乎不是 flex 容器的子元素。它们是它的后代,但它们是 .selector 元素的子元素。如果您将排序应用于具有selector 类的元素,我认为它应该可以工作。

    请注意,您的第一张卡片将始终是星号,因为您的 for 循环是从 x = 1 开始的。这可能是故意的,但我只是想指出这一点。

    const cards = document.querySelectorAll('.card');
    
    let hasFlippedCard = false;
    let lockBoard = false;
    let firstCard, secondCard;
    
    function flipCard() {
      // This will disable any clicks that occur before the non-matched cards reset
      if (lockBoard)
        return;
      // This will prevent a double click on the same card to obtain a match
      if (this === firstCard)
        return;
    
      this.classList.add('flip');
    
      if (!hasFlippedCard) {
        // First card is clicked
        hasFlippedCard = true;
        firstCard = this;
    
        return;
      }
    
      // Second card is clicked
      secondCard = this;
    
      // Check if cards match
      checkForMatch();
    }
    
    
    //This function will check if the two cards chosen match
    function checkForMatch() {
      let isMatch = firstCard.dataset.framework === secondCard.dataset.framework;
      isMatch ? disableCards() : unflipCards();
    }
    
    //This function will disable the chosen cards whenever there's a match
    function disableCards() {
      firstCard.removeEventListener('click', flipCard);
      secondCard.removeEventListener('click', flipCard);
    
      resetBoard();
    }
    
    //This function will reset the cards if they don't match
    function unflipCards() {
      lockBoard = true;
    
      setTimeout(() => {
        firstCard.classList.remove('flip');
        secondCard.classList.remove('flip');
    
        resetBoard();
      }, 1500);
    }
    
    function resetBoard() {
      [hasFlippedCard, lockBoard] = [false, false];
      [firstCard, secondCard] = [null, null];
    }
    
    (function shuffle() {
      let s = document.querySelectorAll(".selector");
      for (let x = 1; x < s.length; x++) {
        let randomPos = Math.floor(Math.random() * 17);
        s[x].style.order = randomPos;
      }
    
    })();
    
    cards.forEach(card => card.addEventListener('click', flipCard));
    * {
      padding: 0;
      margin: 0;
      box-sizing: border-box;
    }
    
    body {
      height: 100vh;
      background-color: #000;
    }
    
    #titleContainer {
      border: solid 0px red;
      width: 50%;
      margin: auto;
      background-color: #ffe400;
      padding: 20px;
    }
    
    #title1 {
      font-family: '8BITWONDERNominal';
      font-weight: normal;
      font-style: normal;
      color: #1f57b8;
      text-align: center;
      text-shadow: 1px 2px 0px #ff0000;
    }
    
    #title2 {
      font-family: '8BITWONDERNominal';
      font-weight: normal;
      font-style: normal;
      text-align: center;
      color: #ff0000;
      text-shadow: 1px 2px 0px #000;
    }
    
    .gameContainer {
      border: solid 1px black;
      background: repeating-linear-gradient( -45deg, #fff, #fff 10px, #b30000 10px, #b30000 20px);
      width: 640px;
      height: 500px;
      margin: auto;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    
    .game {
      background-color: #000;
      width: 90%;
      height: 90%;
    }
    
    .row {
      border: solid 0px red;
      width: 100%;
      height: 33.333%;
      display: flex;
      justify-content: space-around;
      align-items: center;
      padding: 20px;
      perspective: 1000px;
    }
    
    .selector,
    .selectorActive {
      box-sizing: content-box;
      border: solid 8px black;
      border-radius: 6px;
      position: relative;
      width: 15%;
      height: 110%;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    
    .selectorActive {
      border: solid 8px orange;
    }
    
    .card {
      border: solid 0px aqua;
      position: absolute;
      display: flex;
      width: 90%;
      height: 89%;
      transform-style: preserve-3d;
      transition: transform .5s;
    }
    
    .card.flip {
      transform: rotateY(180deg);
    }
    
    .frontSide,
    .backSide {
      border: solid 0px deeppink;
      position: absolute;
      width: 100%;
      height: 100%;
      padding: 24px 9px;
      background-color: #ffd1d1;
      backface-visibility: hidden;
    }
    
    .frontSide {
      transform: rotateY(180deg);
    }
    
    .imageWithNum {
      border: solid 0px deeppink;
      position: absolute;
      width: 100%;
      height: 100%;
      padding: 29px 14px 0px;
      background-color: #ffd1d1;
      backface-visibility: hidden;
      transform: rotateY(180deg);
    }
    
    .backSide {
      background-color: #fff;
    }
    
    .cardSelector {
      border: solid 8px #ff7b00;
    }
    <section class='gameContainer'>
      <div class='game'>
        <div class='row'>
          <div class='selector'>
            <div class='card' data-framework='star'>
              <img class='frontSide' src='https://drive.google.com/uc?export=view&id=1A_zvQyMfZtwBqiVbYifebM07R15dUVD-'>
              <img class='backSide' src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='mushroom'>
              <img class='frontSide' src='https://drive.google.com/uc?export=view&id=1VgbaVqfGrAw_RefRbMpaKNW4yuQRA5Lm'>
              <img class='backSide' src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='flower'>
              <img class='frontSide' src='https://drive.google.com/uc?export=view&id=1Vae7dDSTQmvFlW0hoODvud_Y8_m-VVJk'>
              <img class='backSide' src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='coinTen'>
              <img class='imageWithNum' src='https://drive.google.com/uc?export=view&id=1aTtc4B_GK_EbUyk6Uhl2HFh7uZrZLahr'>
              <img class='backSide' src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='chest'>
              <img class='imageWithNum' src='https://drive.google.com/uc?export=view&id=1CYWq7iEShB2YG3bQPUCbihsW9_vzgEL_'>
              <img class='backSide' src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
          <div class='selector'>
            <div class='card' data-framework='mushroom'>
              <img class='frontSide' src='https://drive.google.com/uc?export=view&id=1VgbaVqfGrAw_RefRbMpaKNW4yuQRA5Lm'>
              <img class='backSide' src='https://drive.google.com/uc?export=view&id=1YUCKsNqGAr81BMW1s8utU3zZFGzvm2uz'>
            </div>
          </div>
        </div>
      </div>
    </section>

    【讨论】:

      猜你喜欢
      • 2016-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多