【问题标题】:Using Flexbox to present 4 images in a ul as a 2x2 grid使用 Flexbox 将 ul 中的 4 个图像呈现为 2x2 网格
【发布时间】:2016-05-25 03:15:30
【问题描述】:

我正在重构非响应式代码,并尝试使用 Flexbox 将以下代码显示为 2x2 网格。我曾尝试使用display: flexflex-flow: row-wrap,但我的ul 中的图像充当块元素,不会并排放置。

这里是原始代码:

<div class="gallery">
        <h2>Newest Products:</h2>
        <ul>
           <li><img src="http://placehold.it/360x240" alt="First gallery image" /></li>
           <li><img src="http://placehold.it/360x240" alt="Second gallery image" /></li>
           <li><img src="http://placehold.it/360x240" alt="Third gallery image" /></li>
           <li><img src="http://placehold.it/360x240" alt="Fourth gallery image" /></li>
        </ul>
     </div>

.gallery {
   clear: both;
}

.gallery ul {
   list-style: none;
   margin: 32px 0;
}

.gallery li {
   float: left;
   margin: 0 10px;
}

.gallery img {
   width: 280px;
   height: auto;
}

这个截图是我尝试使用这段代码时发生的:

.gallery {
clear: both;
display: flex;
flex-flow: row wrap;
}
.gallery ul {
   list-style: none;
   margin: 32px 0;
}
.gallery li {
margin: 0 10px;
flex-basis: 50%;
}
.gallery img {
width: 50%;
height: auto;
}

同样,我想要做的就是将这些图像以响应式 2x2 方向放置。谢谢!

【问题讨论】:

    标签: html css flexbox


    【解决方案1】:

    HTML(无变化)

    CSS

    .gallery {}
    
    .gallery ul {
        display: flex;
        flex-flow: row wrap;
        list-style: none;
        margin: 32px 0;
    }
    
    .gallery li {
        margin: 0 10px;
        flex-basis: calc(50% - 20px);  /* width minus margins */
    }
    
    .gallery img {
        width: 100%;                   /* occupy 100% width of li container */
        height: auto;
    }
    

    DEMO

    注意事项:

    • 当您创建弹性容器时(通过将display: flexdisplay: inline-flex 应用于元素),子元素 成为弹性项目。 flex 容器超出子元素的后代不会成为 flex 项,因此不接受 flex 属性。

      在您的代码中,.gallery 是弹性容器。这意味着它的孩子——h2ul——是弹性项目。但是,ul 的子项不是弹性项目,弹性属性不适用。这就是为什么 li 元素中包含的图像“充当块元素,不会并排放置”

    • 要将弹性属性应用于li 元素,必须将它们的父元素设为弹性容器。通过将display: flex 添加到ulli 成为弹性项目。 (注意,img 元素仍然是内联元素,因为它们不是 flex 容器的子元素。)

    【讨论】:

    • 谢谢!它运行良好,感谢您解释弹性项目的工作原理(并且不工作!)@Michael
    • @Michael_B 究竟是什么定义了它在没有容器宽度时包装 2x2?如果你想要 3 顶 3 底,你会怎么做?我很感激任何意见。
    • @SteveHartley flex-basis: calc(50% - 20px); - 随心所欲更改 50%
    • @SteveHartley,实际上有一个容器宽度。它是 100%(默认值,因为没有明确定义宽度)。无论如何,当您将弹性项目设置为 50% 宽度时,这意味着它占用其父项宽度的 50%,无论可能是什么。换句话说,容器可以有任何宽度。弹性项目将占据其中的 50%,因此每行可容纳两个。
    • 正如@vals 所说,要更改每行的弹性项目数,请调整它们的宽度。如果您希望每行 一个,请将其宽度设置为 100% DEMO。如果您希望每行 三个,则宽度将为 ~33% DEMO。每行 四个:25% DEMO。希望对您有所帮助。
    猜你喜欢
    • 2016-06-30
    • 2019-01-09
    • 2018-08-24
    • 2017-08-28
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    相关资源
    最近更新 更多