WHATWG HTML 把 width 從 img「相關變動」清單移除
WHATWG HTML · 2026-10-06
HTML 規格的 img 元素不再把 width 屬性的變動視為會重跑 update the image data 演算法的「relevant mutation」,屬性部分只剩 src、srcset、sizes。這是 commit ba3400b,由 Tim van der Lippe 於 2026-10-03 撰寫,Simon Pieters 於 2026-10-06 合入,對應 issue #9371。
原本的問題
規格說明 img 在哪些變動發生時要重新挑選並載入圖片資料。width 曾列在這張清單裡,意思是改 width 屬性就可能觸發重新載入。
這個設計是 sizes 計算的 fallback 遺留物:srcset 沒給 sizes 時,曾以 width 屬性推算來源大小。PR #5900(2020-09-10 合入)已移除該 fallback,PR 描述指出被移除的部分「沒有任何實作支援」,但清單裡的 width 沒一併刪掉。Issue #9371 在 2023-06-01 提出這個疏漏,到這次 commit 才補上。
核心改動
commit 只動了規格 source 檔的 2 行,把 width 從清單移出:
- The element's src, srcset, width, or sizes attributes
- are set, changed, or removed.
+ The element's src, srcset, or sizes
+ attributes are set, changed, or removed.commit message 的理由是:若有引擎照舊規格實作,會讓數個測試變得不穩定或誤判通過,並連到 Servo 的修正。Servo PR #48599 的說明寫得更直接:規格要求 width 是 relevant mutation,但其他瀏覽器都沒有這樣做,Servo 照規格做後,/_webgl/conformance/textures/misc/texture-upload-size.html 在本機幾乎立刻 flake,移除後可連跑 20 次以上不 flake。
影響範圍
- 瀏覽器實作者:Servo 照舊規格實作後踩到 flake,已於 2026-10-03 合入對應修正。Servo 的說明表示其他瀏覽器本來就沒有這個行為,因此這次變動讓規格對齊既有實作,不是新行為。
- 前端開發者:在 JS 裡動態改
img.width或setAttribute('width', …)時,不必預期它會重新選圖或重抓資源;要換圖仍要改src、srcset或sizes。 - 測試與 WPT 維護者:依賴舊清單的測試,其預期結果以這次規格為準重新檢查。
commit 與 Servo PR 均未提到任何瀏覽器需要修改行為,也未說明是否新增 WPT 測試;這些細節以規格倉庫後續紀錄為準。
為何值得留意
這次修正只有兩行,但反映規格與實作之間的落差:清理 fallback 時漏掉一個引用點,三年後才被一個照規格實作的引擎撞出來。對只看實際瀏覽器行為的前端開發者沒有影響,對寫新引擎或跑 WPT 的人則是少了一個誤導的規則。