元素的顯示與隱藏(讓元素“看不見”)

元素的顯示與隱藏(讓一個(gè)元素“看不見”的方式)

  • 常規(guī):
    • display: none;
    • visibility: hidden;
    • opacity: 0;
  • 其他(以下消失都是有前提條件的):(注:這里 etc 的意思是 等等)
    • height: 0; width: 0; padding: 0; margin: 0; border: 0; ... etc
    • position: absolute; left: 1000000px; top: 100000px; ...etc;
    • z-index: -1000; ...etc
    • background-color: rgba(0, 0, 0, 0);
  • 總結(jié):元素“看不見”的方式主要方式讓元素用戶在當(dāng)前頁面展示的視口里看不見。
  • 區(qū)別:
    • display: none; 從文檔流消失,不占據(jù)文檔空間,但是還存在DOM樹中
    • visibility: hidden; 和 opacity: 0; 還是會占據(jù)文檔空間
    • display: none; 和 visibility: hidden; 綁定的事件不會觸發(fā)
    • opacity: 0; 的元素綁定的事件還是會觸發(fā)事件

display

  • 對于元素顯隱來說,最常見就是display: none; | display: block;,但是使用這種方法有個(gè)問題,元素的display屬性在隱藏前并不都是block,還有可能是inline、inline-block等
  • 如果要適用于任何元素需要提前儲存元素的display值
<body>
<button id="show">顯示</button>
<button id="hide">隱藏</button>
<div id="test" style="background: lightblue; width: 100px; height: 60px; margin-top: 10px;">測試文字</div>

<script type="text/javascript">
show.onclick = function(){
    test.style.display = 'block';
}    

hide.onclick = function(){
    test.style.display = 'none';
}
</script>
</body>

visibility

  • visibility: hidden;display: none;作為隱藏元素的兩種方式,常常被人們拿來比較。其實(shí)區(qū)別很簡單,前者不脫離文檔流,保留隱藏之前元素占據(jù)的物理區(qū)域;而后者則脫離文檔流,如果重新顯示則需要頁面的重新繪制。還有一點(diǎn)區(qū)別卻很少人提到,如果父級設(shè)置display: none;子級設(shè)置display: block;也不會顯示;而如果父級設(shè)置visibility: hidden;子級設(shè)置visibility: visible;時(shí)子級會顯示出來
  • visibility 可應(yīng)用 transition 屬性。因?yàn)?visibility 是離散步驟,在0到1數(shù)字范圍之內(nèi),0表示隱藏,1表示顯示。visibility: hidden;可以看成visibility: 0;visibility: visible;可以看成visibility: 1;。于是,visibility 應(yīng)用 transition 等同于0~1之間的過渡效果。實(shí)際上,只要 visibility 的值大于0就是顯示的。由于這個(gè)現(xiàn)象,我們可以利用 transition 實(shí)現(xiàn)元素的延時(shí)顯示隱藏
<body>
<button id="show">顯示</button>
<button id="hide">隱藏</button>
<div id="test" style="background: lightblue; width: 100px; height: 60px; margin-top: 10px;">測試文字</div>

<script type="text/javascript">
show.onclick = function(){
    test.style.transition = 'none';
    test.style.visibility = 'visible';
}    
hide.onclick = function(){
    test.style.transition = 'visibility 0.2s 0.5s';
    test.style.visibility = 'hidden';
}
</script>
</body>

hidden

  • HTML有個(gè)hidden全局屬性,專門用于顯示隱藏元素,與display: none;的作用類似,元素隱藏時(shí)脫離文檔流,無法接受javascript事件
  • 注意:IE7-不支持,IE10-不支持test.hidden = 'hidden';寫法,只支持test.setAttribute('hidden', 'hidden');寫法
<body>
<button id="show">顯示</button>
<button id="hide">隱藏</button>
<div id="test" style="background: lightblue; width: 100px; height: 60px; margin-top: 10px;">測試文字</div>

<script type="text/javascript">
show.onclick = function(){
    test.removeAttribute('hidden');
    /*test.hidden = '';*/
}    
hide.onclick = function(){
    test.setAttribute('hidden', 'hidden');
    /*test.hidden = 'hidden';*/
}
</script>
</body>

opacity

  • 對于元素顯隱,opacity的使用頻率也挺多。opacity的好處是,即使opacity為0的元素,仍然可以接受javascript事件,這是display: none;visibility: hidden;所不具備的
<body>
<button id="show">顯示</button>
<button id="hide">隱藏</button>
<button id="reset">還原</button>
<div id="test" style="background: lightblue; width: 100px; height: 60px; margin-top: 10px;">測試文字</div>

<script type="text/javascript">
show.onclick = function(){
    test.style.transition = 'none';
    test.style.opacity = '1';
}    
hide.onclick = function(){
    test.style.transition = 'opacity 0.2s';
    test.style.opacity = '0';
}
test.onclick = function(){
    this.style.width = '200px';
}
reset.onclick = function(){
    history.go();
}
</script>
</body>

overflow

  • overflow: hidden;代表著溢出隱藏。我們可以利用父級的overflow: hidden;配合父級的height: 0;width: 0;來實(shí)現(xiàn)元素的顯隱
    <style type="text/css">
    #testWrap{
        height: 70px;
        transition: height 1s;
        overflow: hidden;
    }
    </style>
</head>
<body>
<button id="show">顯示</button>
<button id="hide">隱藏</button>
<div id="testWrap">
    <div id="test" style="background: lightblue; width: 100px; height: 60px; margin-top: 10px;">測試文字</div>
</div>

<script type="text/javascript">
show.onclick = function(){
    testWrap.style.height = '70px';
}    
hide.onclick = function(){
    testWrap.style.height = '0';
}
</script>
</body>

clip

  • CSS裁剪clip這個(gè)屬性平時(shí)用的不多,當(dāng)clip: rect(top, right, bottom, left);中的top >= bottom,或者left >= right時(shí),可實(shí)現(xiàn)元素的隱藏效果,效果類似于visibility: hidden;
  • 注意:clip屬性只能應(yīng)用在絕對定位或固定定位元素上
<body>
<button id="show">顯示</button>
<button id="hide">隱藏</button>
<div id="test" style="background: lightblue; width: 100px; height: 60px; margin-top: 10px;">測試文字</div>

<script type="text/javascript">
show.onclick = function(){
    test.style.position ='static';
    test.style.clip = 'auto';
}    
hide.onclick = function(){
    test.style.position ='absolute';
    test.style.clip = 'rect(0 0 0 0)';
}
</script>
</body>

transform

  • CSS變形transform是一些效果的集合,主要是移動、旋轉(zhuǎn)、縮放和傾斜這四種基本操作,還可以通過設(shè)置matrix矩陣來實(shí)現(xiàn)更復(fù)雜的效果。通過不同的變形函數(shù)可以實(shí)現(xiàn)元素顯隱效果
  • 注意:IE9-瀏覽器不支持,safari3.1-8、android2.1-4.4.4、IOS3.2-8.4都需要添加前綴
    <style type="text/css">
    div{
        width: 100px; 
        height: 60px; 
        margin-bottom: 10px;
        background: lightblue; 
    }
    </style>
</head>
<body>
<button id="show1">顯示</button>
<button id="hide1">隱藏</button>
<div id="test1">測試文字1</div>

<button id="show2">顯示</button>
<button id="hide2">隱藏</button>
<div id="test2">測試文字2</div>

<button id="show3">顯示</button>
<button id="hide3">隱藏</button>
<div id="test3">測試文字3</div>

<script type="text/javascript">
// transform:scale(0) 時(shí),元素被隱藏
show1.onclick = function(){
    test1.style.transform ='scale(1)';
}    
hide1.onclick = function(){
    test1.style.transform ='scale(0)';
}


// transform:rotateX(90deg) 時(shí),元素被隱藏
show2.onclick = function(){
    test2.style.transform ='rotateX(0)';
}    
hide2.onclick = function(){
    test2.style.transform ='rotateX(90deg)';
}


// transform:skew(90deg) 時(shí),元素被隱藏
show3.onclick = function(){
    test3.style.transform ='skew(0)';
}    
hide3.onclick = function(){
    test3.style.transform ='skew(90deg)';
}
</script>
</body>

覆蓋

  • 利用定位元素可以覆蓋普通流元素的特性。為元素的before偽元素設(shè)置相同的尺寸,通過控制偽元素的定位屬性,實(shí)現(xiàn)顯隱效果
    <style type="text/css">
    /*鼠標(biāo)移入移出會出現(xiàn)元素的顯隱效果*/
    #test:hover:before{
        content: "";
        position: absolute;
        width: 100px;
        height: 60px;
        background-color: white;
    }  
    </style>
</head>
<body>
<div id="test" style="background: lightblue; width: 100px; height: 60px; margin-top: 10px;">測試內(nèi)容</div>
</body>

偏移

  • 元素顯示隱藏的另一種常見思路是偏移,將元素移動到視窗范圍外,也可以實(shí)現(xiàn)等價(jià)的顯隱效果
    <style type="text/css">
    div{
        width: 100px; 
        height: 60px; 
        margin-top: 10px;
        background: lightblue; 
        transition: 0.5s;
    }

    #test2{
        position: relative;
        /*position: absolute;*/
    }
    </style>
</head>
<body>
<button id="show1">顯示</button>
<button id="hide1">隱藏</button>
<div id="test1">測試內(nèi)容1</div>

<button id="show2">顯示</button>
<button id="hide2">隱藏</button>
<div id="test2">測試內(nèi)容2</div>

<button id="show3">顯示</button>
<button id="hide3">隱藏</button>
<div id="test3">測試內(nèi)容3</div>

<script type="text/javascript">
// margin-top
// 利用負(fù)margin將元素移出視窗外,要注意的是設(shè)置負(fù)margin的元素并沒有脫離普通流,后續(xù)元素會跟著一起移動
show1.onclick = function(){
    test1.style.marginTop = '10px';
}    
hide1.onclick = function(){
    test1.style.marginTop = '-9999px';
}


// left
// 通過設(shè)置相對定位或絕對定位元素的偏移屬性,將元素移動到視窗外
show2.onclick = function(){
    test2.style.left ='0';
}    
hide2.onclick = function(){
    test2.style.left ='-9999px';
}


// translate
show3.onclick = function(){
    test3.style.transform ='translate(0, 0)';
}    
hide3.onclick = function(){
    test3.style.transform ='translate(-9999px, -9999px)';
}
</script>
</body>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容