想要知道是否有可能只使用新的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>';
}
?>
答案 0 :(得分:7)
完全有可能。
感谢@ leopld的原始答案,我能够创建一个不依赖于固定高度的答案。
通过制作灵活容器position: absolute
或position: 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: column
与flex-wrap: wrap
结合使用,并为包装器使用固定高度。
我必须补充一点 - 这似乎只是编写CSS列规范的场景,因此KatieK的解决方案可能是更好的方法。最重要的是,当使用CSS列而不是flexbox时,不需要为包装器指定固定高度。