使弹性项目重叠

新手上路,请多包涵

我想展示一系列未知数量的扑克牌。为此,如果数量太多,它们将不得不重叠。我无法说服 flex box 在不缩小卡片的情况下重叠卡片。下面的例子缩小了卡片。我尝试 flex-shrink: 0 ,但后来 max-width 没有得到尊重。

 .cards {
  display: flex;
  max-width: 300px;
}

.card {
  width: 50px;
  height: 90px;
  border: 1px solid black;
  border-radius: 3px;
  background-color: rgba(255, 0, 0, 0.4);
}
 <div class='cards'>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
</div>

原文由 Michael Arrison 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 439
2 个回答

下面是我如何使用 flexbox 来做到这一点。

 .cards {
  display: flex;
  align-content: center;
  max-width: 35em;
}

.cardWrapper {
  overflow: hidden;
}

.cardWrapper:last-child, .cardWrapper:hover {
    overflow: visible;
}

.card {
    width: 10em;
    min-width: 10em;
    height: 6em;
    border-radius: 0.5em;
    border: solid #666 1px;
    background-color: #ccc;
    padding: 0.25em;

    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
}
 <div class="cards">
  <div class="cardWrapper">
    <div class="card">card 1 blah blah blah</div>
  </div>
  <div class="cardWrapper">
    <div class="card">card 2 blah blah blah</div>
  </div>
  <div class="cardWrapper">
    <div class="card">card 3 blah blah blah</div>
  </div>
  <div class="cardWrapper">
    <div class="card">card 4 blah blah blah</div>
  </div>
  <div class="cardWrapper">
    <div class="card">card 5 blah blah blah</div>
  </div>
</div>

请注意,从技术上讲,卡片并没有重叠,它们只是被剪裁了。但它们 看起来 像是重叠的。诀窍是将每张卡片包装在另一个带有溢出的元素中:隐藏。

环绕元素会缩小以适应可用空间,并在该空间中显示尽可能多的卡片。

我包含 :hover 规则只是为了展示如何从“堆栈”中间完全显示一张卡片,但在实际项目中,我可能会对选定的卡片而不是悬停的卡片执行此操作。

原文由 FTWinston 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 transform: translateX(-10px) 使 flex 布局中的元素重叠,但这不会解决您想要获得的布局。我不认为你可以在 flexbox 中做到这一点。但是你可以用 JS 轻松地做到这一点。

 var parentEl = document.getElementById("cards");

function sortCards() {
  var cards = document.getElementsByClassName("card"),
      cw = parentEl.clientWidth,
      sw = parentEl.scrollWidth,
      diff = sw - cw,
      offset = diff / (cards.length - 1);

  for (var i = 1; i < cards.length; i++) {
    cards[i].style.transform = "translateX(-" + offset * i + "px)";
  }
}

sortCards();

var b = document.getElementById("button");
b.addEventListener("click", function() {
  var div = document.createElement("div");
  div.classList.add("card");
  parentEl.appendChild(div);
  sortCards();
});
 .cards {
  display: flex;
  max-width: 300px;
}

.card {
  height: 90px;
  border: 1px solid black;
  border-radius: 3px;
  background-color: rgba(255, 0, 0, 0.4);
  flex: 0 0 50px;
  background: red;
  transition: transform .25s;
}
 <div><button id="button">addcards</button></div>
<div class='cards' id="cards">
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
  <div class='card'></div>
</div>

原文由 Michael Coker 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题