亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

React 中的響應式 D3 圖表:ResizeObserver 還是 viewBox 屬性?

React 中的響應式 D3 圖表:ResizeObserver 還是 viewBox 屬性?

忽然笑 2023-03-24 14:40:00
我最近從 D3 + React 教程系列中看到了這個視頻。在此視頻中,為了調整圖表的大小,創建了一個自定義掛鉤,它使用ResizeObserver:const useResizeObserver = ref => {  const [dimensions, setDimensions] = useState(null);  useEffect(() => {    const observeTarget = ref.current;    const resizeObserver = new ResizeObserver(entries => {      entries.forEach(entry => {        setDimensions(entry.contentRect);      });    });    resizeObserver.observe(observeTarget);    return () => {      resizeObserver.unobserve(observeTarget);    };  }, [ref]);  return dimensions;};正如本文(以及許多其他文章)所討論的,我以前總是看到 / 在viewBox屬性之前使用過,以使 SVG 具有響應性。我的問題是:是否有理由(性能、簡單性)使用這個自定義掛鉤而不是簡單地使用?使用,我不需要創建自定義掛鉤,也不需要在我的 SVG 周圍使用包裝器 div(正如他在視頻中解釋的那樣),或者必須使用... viewBox 似乎更簡單。然而,顯然是一個獲取元素尺寸的新 API,也許使用它比 viewBox 有一些不明顯的優勢。useResizeObserverviewBoxviewBoxrefsResizeObserver
查看完整描述

1 回答

?
FFIVE

TA貢獻1797條經驗 獲得超6個贊

問題與viewBox

雖然viewBox是最快的解決方案,但它有幾個缺點:

  • viewBox試圖滿足縱橫比。如果圖表的縱橫比不是 1:1,則會發生這種情況:

http://img1.sycdn.imooc.com//641d45e80001a8bd06230217.jpg

圖表本身不適合容器。而是viewBox保持縱橫比并添加填充。我們可以拉伸preserveAspectRatio=none

http://img1.sycdn.imooc.com//641d45f9000164fa06270111.jpg

  • 圖表(和文本)縮放。不保留寬高比會引入另一個問題。如果您使用heightand width,您可以在 CSS 中將文本定義為特定大小 - 但不能使用viewBox以適合1200*600 頁面的0 0 600 300 viewBoxed 圖表為例。在這種情況下,所有內容都會縮放,包括文本,如上所示:您無法再設置字體大小。這不會只發生在文本上:其他不能完美拉伸的元素,如圓圈,也會有同樣的問題。

乍一看,viewBox似乎簡單多了。但是由于上面強調的腳槍,viewBox在實踐中使用起來變得非常復雜。

手動縮放

height解決方案是使用和手動調整圖表大小width,避免上述所有問題。假設我們有一個基于高度和寬度呈現自身的圖表組件。過程變為:

  • 在第一個渲染器上設置widthheight適合容器。容器需要自己設置寬度和高度。

  • ResizeObserver在容器上使用 a ,它會在其大小發生變化時通知我們。

  • 調整圖表大小時,獲取新的高度和寬度,并使用它們來呈現圖表。

當手動設置高度和寬度時,我們只調整需要縮放的部分。例如,對于上面的條形圖:

  • 我們可以根據圖表的高度和寬度設置條形的大小。

  • 如果我們有文本,我們可以相對于高度和寬度定位它,但將文本大小固定為,這在 中是不可能的viewBox,因為它會縮放所有內容:

http://img1.sycdn.imooc.com//641d4608000146ee06280111.jpg

結論

  • viewBox如果您的圖表包含不受拉伸影響的元素:例如矩形,或者如果您不關心上述問題,則可用作快速解決方案。

  • 如果您有無法拉伸的元素(例如文本或圓圈)并且需要文本保持您指定的大小,請使用手動縮放。

如果您不關心寬高比問題,并且可以解決放大或縮小文本的問題,那么viewBox只要您意識到它的缺陷,這就是正確的選擇。

然而,在實踐中,在絕大多數情況下,手動縮放最終是更好的選擇,因為很少有圖表中只有可拉伸元素的情況。

來源

從響應式 SVG 圖表中獲取的圖像— viewBox 可能不是答案。


查看完整回答
反對 回復 2023-03-24
  • 1 回答
  • 0 關注
  • 184 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號