【发布时间】:2019-01-17 12:11:43
【问题描述】:
鉴于以下 DOM 结构...
<div id="outer-container">
<div class="side-panel"><div width="200px"/></div>
<div id="content"><!-- some content --></div>
<div class="side-panel"><div width="100px"/></div>
</div>
使用以下 CSS 规则...
#outer-container {
display: 'flex';
align-items: 'stretch';
width: '100vw';
height: '100vh';
}
.side-panel {
flex-shrink: 0;
}
#content {
display: 'flex';
flex-direction: 'column';
align-items: 'stretch';
flexGrow: 1;
}
如何观察#content 的宽度/高度的变化?
这通常通过观察style 属性中的突变来完成,并在样式发生更改时检查元素的边界(或其他一些变体)。但是,作为一个 flex 容器和子元素,我注意到当我检查元素的宽度/高度时,它们没有被定义。
更改#content 的大小不会从我的 MutationObserver 产生事件(它使用以下配置:{attributes: true, attributeFilter: ['style']})
我的用例是当#content 宽度减小到某个定义的阈值以下时,将侧面板变成抽屉。我正在使用React,但这似乎是原生 html/js 问题。
帮助不胜感激!
PS:我尝试将#content 上的flex-basis 设置为我选择的阈值,但这没有帮助。我想知道是否应该定义 width 而不是 flex-basis.. 但是我不确定这是否会产生不希望的 flex 行为。
【问题讨论】:
-
那么你想知道flex修改元素大小后
#content元素的宽高吗? -
是的。我想随时听听宽度/高度的变化 flex 修改元素大小
-
这对我来说就像一个 XY 问题:您不应该订阅元素计算样式的更改。相反,您应该订阅导致布局更改的事件,进而更改元素的大小。例如,也许你有一个改变其大小的 CSS 过渡/动画:然后你监听
transitionEnd或animationEnd事件。如果 DOM 正在发生变异,则改为检查 MutationObserver。观察style属性不起作用的原因是它适用于内联样式属性,而不是元素的计算样式。 -
我希望将此行为抽象为一个纯粹的“布局”组件,而不是将其与外部事件耦合。似乎我最好的选择是监听视口大小的变化(这反过来会导致修改
#content的宽度)。顺便说一句,我没有意识到 MutationObservers 只观察到内联样式属性。感谢您的信息。 -
你需要一个 ResizeObserver 或 IntersectionObserver,而不是 MutationObserver。
标签: html css flexbox mutation-observers