使用flexbox获得pinterest或jQuery砌体布局

时间:2012-12-17 17:38:17

标签: php css css3 flexbox

想要知道是否有可能只使用新的flexbox布局获得与pinterest或jQuery砌体相同类型的设计布局。据我所知,这是:

.flex-container {
    display: -webkit-flex;
    display: flex;
    -webkit-flex-flow: row wrap;
    flex-flow: row wrap;
}
.item {
    width: 220px;
    height: 250px;
    margin: 10px auto;
    padding: 0;
    background: #ccc;
}
.item:nth-child(3n+2) {
    background: #aaa;
    height: 400px;
}

和HTML我只是使用PHP循环来创建12个项目

<?php
    for ($i=0; $i<=11; $i++) {
        echo '<div class="item"></div>';
    }
?>

4 个答案:

答案 0 :(得分:7)

完全有可能。

感谢@ leopld的原始答案,我能够创建一个不依赖于固定高度的答案。

通过制作灵活容器position: absoluteposition: fixed,您可以让它动态填充可用空间。

链接到Codepen:http://codepen.io/anon/pen/Jpnyj?editors=110。我包含了您目前需要的所有供应商前缀。

标记

<div class="wrapper">
    <div class="box box-red"></div>
    <div class="box box-blue"></div>
    <div class="box box-pink"></div>
    <div class="box box-purple"></div>
    <div class="box box-green"></div>
    <div class="box box-yellow"></div>
    <div class="box box-brown"></div>
    <div class="box box-red"></div>
    <div class="box box-blue"></div>
    <div class="box box-pink"></div>
    <div class="box box-purple"></div>
    <div class="box box-green"></div>
    <div class="box box-purple"></div>
    <div class="box box-green"></div>
    <div class="box box-yellow"></div>
    <div class="box box-blue"></div>
    <div class="box box-pink"></div>
    <div class="box box-purple"></div>
    <div class="box box-green"></div>
    <div class="box box-yellow"></div>
    <div class="box box-red"></div>
    <div class="box box-brown"></div>
    <div class="box box-blue"></div>
    <div class="box box-red"></div>
    <div class="box box-green"></div>
    <div class="box box-yellow"></div>
    <div class="box box-brown"></div>
</div>

样式

body {
    background: black;
}

.wrapper {
    position: absolute;
    width: 100%;
    height: 100%;
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-flex-flow: column wrap;
    -ms-flex-flow: column wrap;
    flex-flow: column wrap;
    -webkit-box-align: stretch;
    -webkit-align-items: stretch;
    -ms-flex-align: stretch;
    align-items: stretch;
    -webkit-align-content: stretch;
    -ms-flex-line-pack: stretch;
    align-content: stretch;
}

.box {
    margin: 5px;
    -webkit-box-flex: 0;
    -webkit-flex: 0 1 auto;
    -ms-flex: 0 1 auto;
    flex: 0 1 auto;
}

.box-red {
    height: 100px;
    background: red;
}

.box-blue {
    height: 120px;
    background: blue;
}

.box-pink {
    height: 144px;
    background: pink;
}

.box-purple {
    height: 250px;
    background: purple;
}

.box-green {
    height: 200px;
    background: green;
}

.box-yellow {
    height: 20px;
    background: yellow;
}

.box-brown {
    height: 290px;
    background: brown;
}

答案 1 :(得分:6)

CSS3的columns会让你非常接近这个布局。 (请注意,非最近浏览器中的支持可能很差,并且规范可能会在将来发生变化。)另一个示例不适用于FF,但是这个例子确实如此:

HTML:

<div id="wrapper">
    <div id="cols">
        <div class="item">
          <img src="http://placekitten.com/400/700?image=1" />
            <p>0) Craft beer farm-to-table.</p>
        </div>
        <div class="item">
            <img src="http://placekitten.com/400/450?image=2" />
            <p>1) Mollit wolf veniam, leggings art party semiotics Brooklyn High Life sustainable occaecat Banksy actually.</p>
        </div>
        [more items]
    </div>
</div>

CSS:

h1,h2,ul,p {margin:1rem; }

#wrapper {
    width: 900px;    
    margin: 20px auto;
    padding: 10px;
    outline: solid black 1px;
    background-color: gainsboro;  
}

#cols {
    -webkit-column-count: 3;
    -webkit-column-gap: 10px;
    -moz-column-count: 3;
    -moz-column-gap: 10px;
    column-count: 3;
    column-gap: 10px;
}

.item {
    display: inline-block;
    background: #FEFEFE;
    margin: 0;
    -webkit-column-break-inside: avoid;
    -moz-column-break-inside: avoid;
    column-break-inside: avoid;
    padding: 10px;
}

.item img {
    width: 100%;
    border-bottom: 1px solid black;
    padding-bottom: 10px;
    margin-bottom: 5px;
}

.item p {
    font-size:small;
    margin: 0;
}

或者使用full example

答案 2 :(得分:3)

更新:据我所知,Flexbox无法做到这一点。 Flexbox更关注水平布局,而不是垂直布局。我很高兴被证明是错的,但这是我从有限的经验中收集到的。如果你想了解更多,我在这件事上发现的最好的文章是:http://css-tricks.com/snippets/css/a-guide-to-flexbox/(是的,当然是Chris Coyier。你怎么猜?)

在任何情况下,即使你可以使用Flexbox进行操作,也会有点麻烦,因为这不是Flexbox的用途。使用CSS3列可以更清晰地完成此操作。 Here’s an example

浏览器支持并不是最好的:http://caniuse.com/#search=column%20layout根据CanIUse的说法,即使这个例子似乎也不支持Firefox,尽管我不知道为什么,因为FF确实支持各自的属性。

所以,总结和TLDR:这是一个令人钦佩的想法,在纯CSS中这样做,但对于大多数实际目的来说,目前是不可能的。使用JQuery Masonry

可能会更好

答案 3 :(得分:3)

使用flexbox实际上可以毫不费力地做到这一点。唯一的缺点是你必须为包装器指定一个绝对高度,以使它的内容实际包装。否则它将全部放在一个伟大的,永无止境的专栏上。

HTML:

<div class="wrapper">
    <div class="red"></div>
    <div class="blue"></div>
    <div class="pink"></div>
    <div class="purple"></div>
    <div class="green"></div>
    <div class="yellow"></div>
    <div class="brown"></div>
</div>

(没有前缀的)CSS:

.wrapper {
    background: black;
    display: flex;
    flex-flow: column wrap;
    height: 450px;
    align-items: center;
}

.wrapper > div {
    height: 100px;
    margin: 5px;
    width: 100px;
}

.wrapper > :nth-child(3n+2) {
    border: 2px solid white;
    height: 300px;
}

我也made a JS Fiddle,所以你可以直接看到结果。

简而言之,诀窍是将flex-direction: columnflex-wrap: wrap结合使用,并为包装器使用固定高度。

我必须补充一点 - 这似乎只是编写CSS列规范的场景,因此KatieK的解决方案可能是更好的方法。最重要的是,当使用CSS列而不是flexbox时,不需要为包装器指定固定高度。