再談visibility:hidden和display:none

勤勞的插秧哥發表於2014-11-03

之前寫過一篇有關visibility:hidden和display:none的文章:為什麼要用用visibility:hidden;代替display:none;?主要是從瀏覽器效能方面入手,卻沒寫兩者的主要區別,今天補充。

首先display:none,這個none會把元素從dom樹中“摘除”,這時其他元素會立馬填充該元素的位置,也就是說一旦設定為none,這個元素是真的不存在了。

而visibility:hidden,它就像一塊“抹布”,把花花綠綠的元素都擦成透明色,透明到我們看不到,但元素依然存在。就像一塊玻璃雖然透明到我們看不到,但依然存在佔領著原來就擁有的空間,不會像display:none;一樣從dom樹上摘除。這就是我目前階段所理解的。

以下是段小程式碼,效果立竿見影:

<html>
<head>
<style>
</style>
<script language="JavaScript">
    function toggleDisplay(me){
        if (me.style.display=="block"){
            me.style.display="inline";
            alert("Text is now 'inline'.");
            }
        else {
            if (me.style.display=="inline"){
                me.style.display="none";
                alert("Text is now 'none'. It will reappear in three seconds.");
                window.setTimeout("blueText.style.display='block';",3000,"JavaScript");
                }
            else {
                me.style.display="block";
                alert("Text is now 'block'.");
                }
            }
        }
</script>
 	<body>
		<div>
				Click on the <span id="blueText" onclick="toggleDisplay(this)" 
			style="color:blue;position:relative;cursor:hand;">blue text</span> to 
			see how it affects the flow.
		</div>
	</body>
</html>


下面是各個屬性值:

display的屬性值有block,inline,none。先說block,前端攻城師都能信手捏來一大批塊級元素和行內元素,這兩種元素的根本區別在於其display屬性的預設值,倘若display屬性的預設值是block,如<div>,那麼很明顯那它天生就是塊級元素,如果預設為inline,如<span>那很順其自然就是行內元素,因此,行內元素和塊級元素可以通過改變其預設的display屬性值來相互轉換,也就是說把<div>設為display:inline;那麼它也立馬成為行內元素,同樣<span>設為display:block;也會變成塊級元素。

visibility的屬性值有:visible,hidden,collapse,inherit.

visible為預設屬性,元素可見。

hidden如上所述,隱藏不可見(擦成透明,不顯示但依然佔有空間)

clooapse用於表格,作用與hidden一樣。

inherit表示遵從父元素的visibility屬性值,即繼承自父元素。

說起inherit那就不得不提auto,那就再寫篇有關兩者的總結吧。

相關文章