我想制作一个类似Pinterest的样式页面,每个块可能会改变高度,我希望它们只在其列中重新排列。
例如,加载页面时,布局可能是:
------------------------------------
| | | |
| | | |
|---------| | |
|Hello! I | | |
|am Alice.|----------------| |
|---------| | |
|WoW! | | |
如果用户点击一个块,它的高度会发生变化,理想情况下应该是:
------------------------------------
| | | |
| | | |
|---------| | |
|Hello! I | | |
|am Alice.|----------------| |
|Who are | | |
|you? | | |
|---------| | |
|WoW! | | |
我尝试过使用Masonry和ShapeShift,两者的行为相似。默认情况下,当某些块的高度发生变化时,所有块的位置都不会改变。因此Who are you?
将位于WoW!
之下,它仍然如下:
------------------------------------
| | | |
| | | |
|---------| | |
|Hello! I | | |
|am Alice.|----------------| |
|---------| | |
|WoW! | | |
我可以手动调用一个函数来重新排列它们(例如:$('.container').trigger("ss-rearrange");
用于ShapeShift),但是块可能被安排到不同的列,这是不理想的。
我想知道是否有图书馆或我应该如何实现这一目标?当高度改变时,我只需要在当前列中移动块。
答案 0 :(得分:0)
(1)看看砌体的文档:
var container = document.querySelector('#layout-demo .masonry');
var msnry = new Masonry( container, {
columnWidth: 60
});
eventie.bind( container, 'click', function( event ) {
// don't proceed if item was not clicked on
if ( !classie.has( event.target, 'item' ) ) {
return;
}
// change size of item via class
classie.toggle( event.target, 'gigante' );
// trigger layout
msnry.layout();
});
msnry.layout()是你想要做的。
来源:http://masonry.desandro.com/methods.html
请参阅codepen:http://codepen.io/johannesjo/pen/kFixz
(2)您还可以尝试使用 css-columns :http://www.webdesignerdepot.com/2013/03/how-to-use-css3-columns/
(3)如果您不想更改像砌体或css列这样的列,则应该能够使用简单的浮动容器。您必须自己对内容进行排序。在您的情况下,它可能是最佳解决方案,因为所有其他方法都应根据其大小重新评估元素的位置。
(4)如果您不介意重叠元素,可以使用砌体单元格切换内部隐藏的div(使用display:none)。如果不调用layout(),元素将保持其位置,就像您在问题中描述的那样。