【问题标题】:Centering a div with dynamic width, containing cards以动态宽度居中 div,包含卡片
【发布时间】:2019-08-07 01:18:16
【问题描述】:

如何使以下元素居中:

<div class="outer">
  <div class="inner">
    <div class="cards card1">Card 1</div>
    <div class="cards card2">Card 2</div>
    <div class="cards card3">Card 3</div>
    <div class="cards card4">Card 4</div>
  </div>
</div>

卡的数量是动态设置的。外部div的宽度也是如此。根据外部 div 的宽度,我想像这样显示它们:

|                                    |
|    |Card 1 | |Card 2 | |Card 3|    |
|    |       | |       | |      |    |
|                                    |
|    |Card 4 |                       |
|    |       |                       |



|                           |
|    |Card 1 | |Card 2 |    |
|    |       | |       |    |
|                           |
|    |Card 3 | |Card 4 |    |
|    |       | |       |    |



|                                              |
|    |Card 1 | |Card 2 | |Card 3| |Card 4 |    |
|    |       | |       | |      | |       |    |

还有其他类似的问题 (Centering a div block without the width),但它们不处理多行卡片。 我尝试过使用以下内容:

.outer {
  text-align: center;
}

但是这会使卡片 4 位于中间而不是左侧。

或者

.outer {
  width: 100%;
}
.inner {
  display: inline-block;
  transform: translateX(-50%); 
  left: 50%;
}

这有效,但仅在有单行卡片时才有效。当卡片的数量超过一行时,它会将所有内容对齐。

【问题讨论】:

    标签: html css


    【解决方案1】:

    这是否解决了您想要做的事情?

    .outer {
      display: flex;
      justify-content: center;
    }
    
    .inner {
      display: flex;
      flex-wrap: wrap;
    }
    
    .cards {
      flex-basis: calc(100% / 3);
    }
    <div class="outer">
      <div class="inner">
        <div class="cards card1">Card 1</div>
        <div class="cards card2">Card 2</div>
        <div class="cards card3">Card 3</div>
        <div class="cards card4">Card 4</div>
      </div>
    </div>

    【讨论】:

    • 谢谢,如果外部 div 足够宽,我希望所有卡片都排成一行。如果三张卡片太短,则应该有两排两排。
    • @Honey_Badger 感觉就像您正在寻找一个纯粹的CSS 解决方案。如果是这样,我看不出它是如何工作的,因为看起来你需要容器​​查询(还不是一个东西)才能让它工作。 JavaScript 是不是禁止这样做?
    • 我只在可能的情况下更喜欢 CSS。我想另一种选择是在window.onresize上设置.inner的宽度
    【解决方案2】:

    .outer {
      width: 100%;
    }
    .inner {
      display: flex;
      flex-flow: wrap;
      justify-content: flex-start;
    }
    
    .cards {
        width: calc(33.3333% - 40px);
        height: 270px;
        background-color: bisque;
        margin: 20px;
        box-sizing: border-box;
    }
    <div class="outer">
      <div class="inner">
        <div class="cards card1">Card 1</div>
        <div class="cards card2">Card 2</div>
        <div class="cards card3">Card 3</div>
        <div class="cards card4">Card 4</div>
      </div>
    </div>

    .outer {
      width: 100%;
    }
    .inner {
      display: flex;
      flex-flow: wrap;
      justify-content: center;
    }
    
    .cards {
        width: calc(33.3333% - 40px);
        height: 270px;
        background-color: bisque;
        margin: 20px;
        box-sizing: border-box;
    }
    <div class="outer">
      <div class="inner">
        <div class="cards card1">Card 1</div>
        <div class="cards card2">Card 2</div>
        <div class="cards card3">Card 3</div>
        <div class="cards card4">Card 4</div>
      </div>
    </div>

    .outer {
      width: 100%;
    }
    .inner {
        display: flex;
        flex-flow: wrap;
        justify-content: flex-start;
    }
    
    .cards {
        width: 200px;
        height: 270px;
        background-color: bisque;
        margin: 20px;
        box-sizing: border-box;
    }
    <div class="outer">
      <div class="inner">
        <div class="cards">Card 1</div>
        <div class="cards">Card 2</div>
        <div class="cards">Card 3</div>
        <div class="cards">Card 4</div>
        <div class="cards">Card 5</div>
        <div class="cards">Card 6</div>
        <div class="cards">Card 7</div>
        <div class="cards">Card 8</div>
        <div class="cards">Card 9</div>
        <div class="cards">Card 10</div>
        <div class="cards">Card 11</div>
        <div class="cards">Card 12</div>
      </div>
    </div>

    来自俄罗斯的您好!我爱来自美国、欧洲、亚洲的人们。那你想做什么?

    【讨论】:

    • 谢谢,我希望卡片根据外部 div 的宽度对齐。这不会总是为三张卡片留出空间,数量取决于宽度。
    • @Honey_Badger 在这种情况下,您需要指定卡片的固定宽度。我给你举了三个例子。你想要的是最后一个,第三个例子。我不太懂英语。但是,我可以做任何设计、结构、施工。联系我们。
    • 是的,卡片的宽度已经设置好了。第三个示例是正确对齐卡片,但是,如您所见,.inner 元素不是居中而是左对齐。我试图在左右两边有相等的边距。
    • @Honey_Badger 好。我可以建造你想要的。但为此我需要更多数据:1)最小网站宽度 2)最大网站宽度 3)卡片宽度 4)从一张卡片到另一张卡片的所有边距单位像素
    【解决方案3】:

    尝试在您的卡片上使用flex: auto

    .cards { 
       flex: auto; 
    }
    

    这和flex: 1 1 auto一样,又是flex-grow: 1; flex-shrink: 1; flex-basis: auto的简写;

    然后在.inner 上使用display: flex; flex-wrap: wrap;

    .inner { 
       display: flex;
       flex-wrap: wrap; 
    }
    

    看看这个sn-p中的css。它有一个小操场,因此您可以动态调整 .outer 容器宽度,以及外部填充、卡片边距和卡片填充:

    如果你愿意,可以试试CodePen Demo

    var controlContainer=document.createElement("div");controlContainer.innerHTML='&lt;div style="margin: 0px 0px 20px; display: flex; width: 100%; flex-direction: column; justify-content: space-around;" class="controls"&gt;&lt;div style="display: flex; align-items: center; height: 30px;"&gt;&lt;input class="outer-ctrl" type="range" min="100" max="1200" value="300"&gt;&lt;label&gt; &lt;code&gt;.outer { width: &lt;span class="outer-span"&gt;300px&lt;/span&gt; } &lt;/code&gt;&lt;/label&gt;&lt;/div&gt;&lt;div style="display: flex; align-items: center; height: 30px;"&gt;&lt;input class="outer-padding" type="range" min="0" max="30" value="0"&gt;&lt;label&gt;&lt;code&gt;.outer: { padding: &lt;span class="padding-span"&gt;0px&lt;/span&gt; }&lt;/code&gt;&lt;/label&gt;&lt;/div&gt;&lt;div style="display: flex; align-items: center; height: 30px;"&gt;&lt;input class="card-margin" type="range" min="0" max="30" value="0"&gt;&lt;label&gt;&lt;code&gt;.cards { margin: &lt;span class="margin-span"&gt;0px&lt;/span&gt; }&lt;/code&gt;&lt;/label&gt;&lt;/div&gt;&lt;div style="display: flex; align-items: center; height: 30px;"&gt;&lt;input class="card-padding" type="range" min="0" max="30" value="0"&gt;&lt;label&gt;&lt;code&gt;.cards { padding: &lt;span class="card-padding-span"&gt;0px&lt;/span&gt; }&lt;/code&gt;&lt;/label&gt;&lt;/div&gt;&lt;/div&gt;',document.body.prepend(controlContainer),document.querySelectorAll("span").forEach(function(e){e.style.cssText="background: black;color:white;padding: 7px;"}),document.querySelectorAll(".cards").forEach(function(e){e.style.cssText="background:yellow; border: 1px solid blue;"}),document.querySelector(".outer-ctrl").addEventListener("input",function(e){var n="".concat(e.target.value,"px");document.querySelector(".outer").style.width=n,document.querySelector(".outer-span").innerText=n}),document.querySelector(".card-margin").addEventListener("input",function(e){var n="".concat(e.target.value,"px");document.querySelectorAll(".cards").forEach(function(e){e.style.margin=n}),document.querySelector(".margin-span").innerText=n}),document.querySelector(".outer-padding").addEventListener("input",function(e){var n="".concat(e.target.value,"px");document.querySelector(".outer").style.padding=n,document.querySelector(".padding-span").innerText=n}),document.querySelectorAll(".cards").forEach(function(e){e.style.cssText="background:yellow; border: 1px solid blue;"}),document.querySelector(".card-padding").addEventListener("input",function(e){var n="".concat(e.target.value,"px");document.querySelectorAll(".cards").forEach(function(e){e.style.padding=n}),document.querySelector(".card-padding-span").innerText=n}),document.body.style.cssText="margin:0;padding:0;",document.querySelector(".outer").style.border="1px solid #333;";
    .outer {
      width: 300px;
      border: 1px solid #333;
    }
    
    .inner {
      display: flex;
      flex-wrap: wrap;
    }
    
    .cards {
      flex: auto;
    }
    <div class="outer">
      <div class="inner">
        <div class="cards card1">Card 1</div>
        <div class="cards card2">Card 2</div>
        <div class="cards card3">Card 3</div>
        <div class="cards card4">Card 4</div>
      </div>
    </div>

    【讨论】:

    • 谢谢,这与我想要实现的目标很接近。有没有办法设置卡片宽度,比如 100 像素?
    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 2013-01-31
    • 1970-01-01
    • 2012-03-24
    • 2012-01-03
    相关资源
    最近更新 更多