[英]Shouldn't this span color be green?
跨度顏色不應該是綠色的,它在 Chrome 中是紅色的。
HTML 規范說它應該是綠色的,它在 Firefox 中是綠色的。
HTML 規范使用 fetch 來獲取元素引用的資源(請參閱此內容並且 fetch 始終是異步操作。因此在加載新樣式表之前獲取計算樣式,因此顏色應為綠色。
var div = document.createElement("div"); document.body.appendChild(div); var link = document.createElement("link"); link.href = "data:text/css,div { color: red }"; link.rel = "stylesheet"; var div = document.createElement("div"); document.body.appendChild(div); var link = document.createElement("link"); link.href = "data:text/css,div { color: red }"; link.rel = "stylesheet"; document.head.appendChild(link); document.querySelector("span").style.color = getComputedStyle(div).color; link.remove(); div.remove();
div { color: green }
<span>This should be green</span>
為了使分析更容易,我減少了您的樣本以刪除重復和不相關的行; 以下內容足以重現該問題:
var div = document.createElement("div"); document.body.appendChild(div); var link = document.createElement("link"); link.href = "data:text/css,div { color: red }"; link.rel = "stylesheet"; document.head.appendChild(link); document.querySelector("span").style.color = getComputedStyle(div).color;
div {color:green}
<span>This is a span</span> <div>this is a div</div>
所以這里發生的事情是,有內聯 CSS 說 div 應該是綠色的; 您生成一個將 div 設置為紅色的 text/css 鏈接,並將其附加到文檔頭。 然后使用getComputedStyle
將顏色從 div 復制到跨度上。
在 Safari、Chrome 和 Edge 中,兩條線都以紅色結束; 在 Firefox 中,跨度為綠色,div 為紅色。
但是! 首次加載時,或者如果您在 Safari
或 Chrome 中
使用干凈的空緩存加載此頁面*您將看到與 Firefox 中相同的行為:綠色跨度和紅色 div。 Edge 的行為永遠不會像 FF,即使在第一次加載時,它也始終為紅色。
* (在 Safari 中,您可以只使用隱私瀏覽窗口。我可以發誓,我曾在 Chrome 中看到過相同的內容,但不再能夠重現;可能我弄錯了。)
因此,這是我對正在發生的事情的假設:
getComputedStyle
,它是異步的,因此getComputedStyle
從內聯樣式中選取顏色。 在以后的加載中,當getComputedStyle
運行時,生成的樣式表已經在緩存中,因此它的規則會接管。data
URI 不需要網絡時間?)因此在getComputedStyle
運行之前進行處理。這是一個足夠奇怪的邊緣情況,我不確定哪種行為可以被描述為“根據規范”。
嘗試 HTML 或 HTML5(這是 Chrome):
<span type="color:green">shouldn't this be green</span>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.