我需要构建适用于平板电脑、桌面显示器以及某些情况下非常大的4K+高分辨率电影屏幕的d3可视化。
因此,我正在尝试弄清楚在使用SVG的'viewBox'属性与'preserveaspectratio'之间与调用重置函数重新渲染窗口大小调整事件并使用绝对值之间的权衡。大多数示例(例如此博客文章http://eyeseast.github.io/visible-data/2013/08/28/responsive-charts-with-d3/)建议后者,在其中执行以下操作:
d3.select(window).on('resize', resize)
resize() {
// rerender each individual element with the new width+height of the parent node
d3.select('svg')
.attr('width', newWidth)
//etc... and many lines of code depending upon how complex my visualisation is
}
但是,为什么我不能只使用SVG viewBox来让我的SVG调整大小呢:
d3.select('svg')
.attr( 'preserveAspectRatio',"xMinYMin meet")
.attr("viewBox", "0 0 900 500")
.attr('width', '100%')
我假设我的宽度和高度是900x500像素(或其他大小),然后利用SVG作为矢量格式处理所有琐碎的细节,如文本大小和边距。我很难理解为什么在使用D3制作响应式或可缩放可视化的示例时,有这么多人喜欢使用resize()函数,我非常担心如果我选择viewBox路线会错过一些东西。补充说明:除了mef下面说的内容,还有一种情况是,在使用固定高度(例如线条或条形图)的可视化中,我可能希望高度保持不变,但宽度需要响应。由于固定的宽高比,这种情况并不可行。这种情况需要一个resize()函数来重新呈现以适应新的宽高比。
因此,虽然具有固定宽高比的viewBox实现更容易,但也有许多常见情况需要更精细的控制,这就需要一个resize()函数,并解释了为什么社区偏向更复杂的解决方案作为首选和最后手段。我的用例可能更适合viewBox解决方案,这在要求响应性时略有不同。