在CSS网格布局中填充空单元格
我有一组div瓷砖,我通过CSS网格布局尽可能“自动”排列; 我最后的想法是,即使我不知道有多少瓷砖,它们都会得到正确的尺寸和放置。 这工作正常。
现在,我希望将所点击的任何图块的区域加倍。 据我所知,这意味着增加这个瓷砖的范围:
grid-row: span 2; grid-column: span 2;
如果我点击不在最右边的列中的任何图块,我对结果感到满意。 当最右边的瓷砖展开时,它们会被包裹到下一行。
有没有办法强制这些瓷砖向左扩展,以便包裹其他非活动瓷砖?
Codepen示例在这里
$('div.tile').click(function() { $('div.tile').not(this).removeClass('chosen'); $(this).toggleClass('chosen'); /* Attempt to find current placement, to see if we could change the span rules based on results. Probably disregard. */ var colCount = $('div.wrapper').css('grid-template-columns').split(' ').length; console.log(colCount); var placement = $(this).css('grid-row'); console.log(placement); });
body { margin: 0; padding: 0; background-color: #eee; } .wrapper { display: grid; margin: 18px; grid-template-columns: repeat(auto-fill, minmax(252px, 1fr)); grid-auto-rows: 286px; grid-gap: 18px; } .tile { position: relative; background-color: #eee; background-color: #149; text-align: center; box-shadow: 0 3px 12px rgba(0,0,0, 0.15), 0 4px 6px rgba(0,0,0, 0.25); } .tile.chosen { grid-row: span 2; grid-column: span 2; } .tile.chosen::before { position: absolute; top: 0; left: 0; width: 100%; height: 100%; content: " "; background-color: rgba(255,255,255,.2); }
A B C D E F G H I
使用CSS网格自动放置
CSS grid-auto-flow
属性控制自动放置的网格项在网格中的放置方式。
此属性有三个可能的值:
-
row
(默认) -
column
-
dense
对于dense
,自动放置算法使未占用的单元格填充适合的项目。
这是你的代码, grid-auto-flow: dense
网格容器grid-auto-flow: dense
:
$('div.tile').click(function() { $('div.tile').not(this).removeClass('chosen'); $(this).toggleClass('chosen'); var colCount = $('div.wrapper').css('grid-template-columns').split(' ').length; console.log(colCount); var placement = $(this).css('grid-row'); console.log(placement); });
body { margin: 0; padding: 0; background-color: #eee; } .wrapper { display: grid; margin: 18px; grid-template-columns: repeat(auto-fill, minmax(252px, 1fr)); grid-auto-rows: 286px; grid-gap: 18px; grid-auto-flow: dense; /* NEW */ } .tile { position: relative; background-color: #eee; background-color: #149; text-align: center; box-shadow: 0 3px 12px rgba(0, 0, 0, 0.15), 0 4px 6px rgba(0, 0, 0, 0.25); } .tile.chosen { grid-row: span 2; grid-column: span 2; } .tile.chosen::before { position: absolute; top: 0; left: 0; width: 100%; height: 100%; content: " "; background-color: rgba(255, 255, 255, .2); }
A B C D E F G H I