簡體   English   中英

如何在 CSS 多列布局中使單列居中

[英]How to center single column in CSS multi-column layout

我有一個使用 CSS 多列布局的元素來顯示項目列表。

<div style="column-width: 300px; column-count: 3; text-align: center;">
    <div>Item 1</div>
    <div>Item 2</div>
    <div>Item 3</div>
    <div>Item 4</div>
    <div>Item 5</div>
    <div>Item 6</div>
</div>

示例列表正確顯示為三列,每列包含兩個項目,每個項目都在其列內居中。

但是,當我有一個僅包含一個項目的列表時,該項目將顯示在第一列中,而第二列和第三列的空間仍為空。

有沒有辦法使單列在父元素內居中? 同樣,如果我只有兩個項目的列表,有沒有辦法讓兩個填充的列在父元素內居中?

本質上,我想要的是,如果有三個或更多項目,則顯示三列,但如果只有一兩個項目,則僅顯示顯示這些項目所需的列數,而不保留未使用的列空間。

編輯

問題是當我有一個只有一項的列表時,例如:

<div style="column-width: 300px; column-count: 3; text-align: center;">
    <div>Item 1</div>
</div>

單個項目在第一列,而第二列和第三列所在的空間仍然保留,即使那里沒有內容。

我創建了一個小提琴: https : //jsfiddle.net/Lvtya3qL/

<div class="parent">
    <div class="child">Item 1</div>
    <div class="child">Item 2</div>
    <div class="child">Item 3</div>
    <div class="child">Item 4</div>
    <div class="child">Item 5</div>
    <div class="child">Item 6</div>
    <div class="child">Item 7</div>
</div>

.parent{
  display:flex;
  width: 300px;
  flex-wrap: wrap;
  justify-content: center;
}

.child {
  width: 100px;
}

我不打算回答這個問題,因為我面臨的問題是不同的。 但是后來我注意到這里唯一的答案是扔掉了columns並切換到flexbox ,這做了完全不同的事情,使問題沒有得到解答。

我做了一個你可以在下面找到的實現。 我還添加了第四列,以便更清楚我在 CSS 的:nth-child(n):nth-last-child(n)部分所做的事情。

您可以看到有 3 個奇數選擇器,它們都在左側添加了一個inset ,以便所有子項都居中。 您可以繼續將這些選擇器添加到您想要的更多列中。 您需要的選擇器數量是列數 - 1。

要進行3列時,可以刪除最后一個奇數的選擇器。
如上所述,我已經添加了第四列,以便您可以看到需要應用的選擇器模式才能使其工作。

 .parent { --columns: 4; --gap: 1em; column-count: var(--columns); column-gap: var(--gap); } .child { position: relative; break-inside: avoid; break-inside: avoid-column; } .child:only-child { left: calc((100% + var(--gap)) * (var(--columns) - 1) / 2); } .child:nth-child(1):nth-last-child(2), .child:nth-child(2):nth-last-child(1) { left: calc((100% + var(--gap)) * (var(--columns) - 2) / 2); } .child:nth-child(1):nth-last-child(3), .child:nth-child(2):nth-last-child(2), .child:nth-child(3):nth-last-child(1) { left: calc((100% + var(--gap)) * (var(--columns) - 3) / 2); } /* Prettifications only */ body { margin: 0; font-family: sans-serif; } .parent { margin: var(--gap); text-align: center; } .child { padding: 8px 0; background-color: rgba(127,127,127,.1); outline: 1px solid black; outline-offset: -1px; }
 <div class="parent"> <div class="child">1</div> </div> <div class="parent"> <div class="child">1</div> <div class="child">2</div> </div> <div class="parent"> <div class="child">1</div> <div class="child">2</div> <div class="child">3</div> </div> <div class="parent"> <div class="child">1</div> <div class="child">2</div> <div class="child">3</div> <div class="child">4</div> </div>

但是,這有一個很大的缺點。 它本身不再響應!

我已經刪除了column-width ,這可能會使這個實現對您的情況毫無用處,因為column-width屬性以前全權負責使整個響應。 但是,如果您可以手動添加斷點,那么我認為這是實現居中多列布局的唯一方法之一。

最好按如下方式添加斷點:

@media all and (min-width: 500px) {
  .parent { --columns: 2 }

  .child:only-child {
    left: calc((100% + var(--gap)) * (var(--columns) - 1) / 2);
  }
}

@media all and (min-width: 600px) {
  .parent { --columns: 3 }

  .child:nth-child(1):nth-last-child(2),
  .child:nth-child(2):nth-last-child(1) {
    left: calc((100% + var(--gap)) * (var(--columns) - 2) / 2);
  }
}

@media all and (min-width: 700px) {
  .parent { --columns: 4 }

  .child:nth-child(1):nth-last-child(3),
  .child:nth-child(2):nth-last-child(2),
  .child:nth-child(3):nth-last-child(1) {
    left: calc((100% + var(--gap)) * (var(--columns) - 3) / 2);
  }
}

這樣,樣式僅在需要時應用 另外:請記住按此順序保留媒體查詢。 媒體查詢越高, --columns變量必須越高

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM