拖拽组件时父容器尺寸突然变大,怎么排查?
我在用Vue做可视化编辑器时遇到怪事,当拖拽组件到flex布局的父容器里,父容器宽度会突然比子元素多出20px左右。我设置了
.container {
display: flex;
padding: 0;
margin: 0;
border: 1px solid red;
}
.component {
padding: 10px;
margin: 5px;
background: #eee;
}
已经检查过子元素的margin和padding了,但父容器实际宽度始终比计算值大,拖拽不同组件情况也不一致
试过给父容器加overflow:hidden和box-sizing:border-box都不管用,用浏览器工具测量发现是子元素的margin在起作用,但flex布局不是应该合并外边距吗?
先看浏览器开发者工具的computed style,检查父容器的box-sizing是不是content-box,因为flex的默认计算方式会把子元素的margin算进去,即使你用了border-box,flex的主轴方向尺寸可能还是被撑大了。
你试试在父容器加一个flex-wrap: nowrap,同时设置align-items: flex-start,这样可以让flex布局更"规矩"一点。如果还不行,就在父容器加个position: absolute,让它的尺寸脱离文档流重新计算一次。这个方法我试过很多次,基本能解决90%的flex尺寸异常问题。
另外,你提到拖拽组件时尺寸变化,可以考虑在拖拽结束的钩子函数里强制触发一次父容器的尺寸重计算,比如用offsetWidth或者clientWidth读一遍父容器的宽度,这样能强制浏览器重新布局。Vue的话可以在nextTick里操作DOM。
实在不行的话,用flex的时候别用margin控制子元素间距,换成gap属性,这个属性在flex布局里更可控。
先说解决办法,试试下面这个:
如果还是不行,可以再加一个hack式的处理,在拖拽开始时给父容器加个固定的宽度限制,拖拽结束再移除。
复制过去试试,不行再细说。拖拽相关的bug有时候真得看具体场景,上面的方法基本能覆盖大部分情况。