用 vue-gird-layout 时发现,当改变 margin 值时,item 的尺寸也会跟着变化。
如下图:row height 和每个 item 的 h 都保持不变。修改 margin-y,item 的实际高度也跟着变了:

研究了一番,发现原因。关键在于网格模式
考虑以下情况:第一列是两个 h=1 的item,第二列是一个 h=2 的 item。无论 margin 是多少,都应该保证第一和第二列的底部是平齐的(不然网格逻辑就崩溃了)

记 h=1 的 item 的实际高度为 real_height。
那么 h=2 的 item 的实际高度不应该是简单的 2 * real_height,而应该是 2 * real_height + margin_y。
同理 h=x 的 item 的实际高度应该是 x * real_height + (x-1) * margin_y。
所以就出现了最上面说的问题。而且 h 越大的 item,需要“补齐”的 margin 就越多。
其实 vue-grid-layout 的实现逻辑是合理的。但是不符合我的需求:我项目中的 row height 的值设置得比较小,导致每个 item 的 h 都很大。margin 稍微一变,item 的实际高度就剧烈变化,效果不好。
我的理想效果是:在保持网格系统效果(对齐)的同时,margin 变化时 item 的高度不要剧变。
思路:将 vue-grid-layout 的 margin-y 设置为 0,在 item 中自己模拟一个 margin 的效果
具体实现:
传给 grid-layout 的 marginY 恒为0
item 内部模拟margin,grid-item 设置属性 drag-allow-from

整体效果:

挪动 resize-handle 的位置
.vue-grid-item:not(.vue-grid-placeholder) > .vue-resizable-handle {
bottom: 50px !important;
}

把 placeholder 改小:
placeholder 是在drag或者resize时的一个图形提示,下图粉色背景的:

placeholder 的大小没法改。正好它下面有一个没用的 .vue-resizable-handle。把真正的 placehoder 背景去掉,用它内部的 handle 伪装 placeholder。
.vue-grid-placeholder {
background: none !important;
}
.vue-grid-placeholder .vue-resizable-handle {
position: absolute;
bottom: 50px !important;
background: pink !important;
width: auto !important;
height: auto !important;
}
改后的效果:

最终效果:
