【问题标题】:Random Flip Card HTML JavaScript随机翻转卡片 HTML JavaScript
【发布时间】:2021-02-17 21:20:51
【问题描述】:

我应该让一组卡片以随机顺序出现,但由于控制台上出现大量错误,我似乎无法这样做。我对编写 JavaScript 没有信心,因为我仍在学习过程中。有38张照片卡,当我刷新页面时,照片应该会改变它们的顺序。

  let card = document.createElement("div");
  let front = document.createElement("div");
  let back = document.createElement("div");
  front.classList.add("card-front");
  back.classList.add("card-back");
  card.appendChild(front);
  card.appendChild(back);
  card.classList.add("card");
  let img = document.createElement('img');
  parent.appendChild(img);

  let cards = [];
  for (let i = 0; i < 19; i++) {
    let num = document.createElement('card-front');
    num.appendChild(i);
    cards.push(num);
    //num.textContent = r;
    //pearent.appendChild(num);
  }

  while(cards.length != 0) {
    let r = Math.floor(Math.random()*cards.length);
    let n = cards.splice(r, 1);
    parent.appendChild(n[0]);
    let cont = document.getElementById("CONTAINER");
    parent.appendChild(n[0]);
  }

The HTML looks like this

【问题讨论】:

  • 从我从你的 HTML 的图片中看到的,我可以看到你对不同的元素重复使用相同的 ID。你不能那样做!
  • 请将代码发布为文本而不是图像。
  • 我的错!可能最大的错误是将 ID 添加到每个元素。

标签: html image random flip


【解决方案1】:

正如@54ka 已经说过的,您对id 属性的使用是错误的。 id 必须是唯一的。所以它只能在整个文档中出现一次。这就是您的document.getElementById() 无法正常工作的原因。

以下示例使用flexbox layoutflexbox order property,由javascript 随机化。这意味着没有删除和添加元素。它只是将顺序直接设置为随机的。这干净多了。这也更好地区分了(在我看来)样式,使用 css 完成,以及由 javascript 完成的“功能”。

let cards = document.getElementsByClassName("card");
if(cards !== null){
  for(let i = 0; i < cards.length; i++){
    cards.item(i).style.order = parseInt(Math.random() * 1000);
  }
 }
.card-container{
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-content: center;
  width: 430px;
  padding: 10px;
  border: 1px solid #aaa;
}

.card{
  padding: 15px;
  margin: 15px;
  box-shadow: 1px 1px 5px #aaa;
}
<div class="card-container">
  <div class="card">
    <div class="card-front">  
      <img src="https://via.placeholder.com/150/ff0000" />
    </div>
  </div>
  <div class="card">
    <div class="card-front">  
      <img src="https://via.placeholder.com/150/00ff000" />
    </div>
  </div>
  <div class="card">
    <div class="card-front">  
      <img src="https://via.placeholder.com/150/0000ff" />
    </div>
  </div>
  <div class="card">
    <div class="card-front">  
      <img src="https://via.placeholder.com/150/ffff00" />
    </div>
  </div>
</div>

如果您想坚持添加和删除(我不建议这样做!),您可以使用以下代码:

let cards = document.getElementsByClassName("card");
if(cards !== null){
  // create a list that contains all indices of the cards
  let card_indices = [];
  for(let i = 0; i < cards.length; i++){
    card_indices.push(i);
  }
  
  // randomize the card indices and insert the card
  for(let i = 0; i < cards.length; i++){
    // get a random card index
    let j = Math.floor(Math.random() * card_indices.length);
    // re-add this element to the same parent to the front, adding
    // all elements will shuffle them
    let card = cards.item(card_indices[j]);
    card.parentNode.appendChild(card);
    // mark this index as taken
    card_indices.splice(j, 1);
  }
 }
<div class="card-container">
  <div class="card">
    <div class="card-front">  
      <img src="https://via.placeholder.com/150/ff0000" />
    </div>
  </div>
  <div class="card">
    <div class="card-front">  
      <img src="https://via.placeholder.com/150/00ff000" />
    </div>
  </div>
  <div class="card">
    <div class="card-front">  
      <img src="https://via.placeholder.com/150/0000ff" />
    </div>
  </div>
  <div class="card">
    <div class="card-front">  
      <img src="https://via.placeholder.com/150/ffff00" />
    </div>
  </div>
</div>

【讨论】:

  • flexbox布局很有帮助+解释很清楚。我完全同意,代码看起来更干净!非常感谢!
猜你喜欢
  • 2021-05-31
  • 2021-02-19
  • 2017-04-03
  • 2018-08-27
  • 2014-02-25
  • 2013-11-22
  • 2015-06-05
  • 2022-01-03
  • 2012-04-04
相关资源
最近更新 更多