css隐藏元素的7种思路

前言

displayvisibilityopacity三个属性隐藏元素之间的异同点一直是前端面试面试的常考题。

属性 是否在页面上显示 注册点击事件是否有效 是否存在于可访问性树中
display none
visibility hidden
opacity 0

除了displayvisibilityopacity三个属性可以隐藏元素之外,是否还存在其它属性可以隐藏元素呢?它们之间又存在什么必然的联系呢?这就是我们今天要讨论的问题。

注:由于篇幅有限,本文并未提及一些像filter:alpha(opacity=0); zoom:0;之类的兼容属性。

第一种:移除出可访问性树

display : none

display属性可以设置元素的内部和外部显示类型。将display设置为none会将元素从可访问性树中移除。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>display : none</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 display : none;
21             }
22         </style>
23     </head>
24     <body>
25         <div>
26             <button id="normal">按钮</button>
27         </div>
28         <div>
29             <button id="bt">按钮</button>
30         </div>
31 
32         <script type="text/javascript">
33             let normal = document.getElementById('normal');
34             let bt = document.getElementById('bt');
35             normal.addEventListener('click',function(){
36                 alert('click normal');   
37             })
38             bt.addEventListener('click',function(){
39                 alert('click bt');   
40             })
41         </script>
42     </body>
43 </html>

第二种:隐藏元素

visibility: hidden

visibility设置为hidden会使元素不可见,但此时元素仍然位于可访问性树中(display: none时元素被移出可访问性树 ),注册点击事件无效。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>visibility: hidden</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 visibility: hidden;
21             }
22         </style>
23     </head>
24     <body>
25         <div>
26             <button id="normal">按钮</button>
27         </div>
28         <div>
29             <button id="bt">按钮</button>
30         </div>
31 
32         <script type="text/javascript">
33             let normal = document.getElementById('normal');
34             let bt = document.getElementById('bt');
35             normal.addEventListener('click',function(){
36                 alert('click normal');   
37             })
38             bt.addEventListener('click',function(){
39                 alert('click bt');   
40             })
41         </script>
42     </body>
43 </html>

第三种:透明

opacity: 0

opacity(不透明度),取值范围0(完全透明) ~ 1(完全不透明),将opacity设置为0会使元素完全透明,此时元素不可见(因为它是透明的),仍然位于可访问性树中,注册点击事件有效。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>opacity: 0</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 opacity: 0;
21             }
22         </style>
23     </head>
24     <body>
25         <div>
26             <button id="normal">按钮</button>
27         </div>
28         <div>
29             <button id="bt">按钮</button>
30         </div>
31 
32         <script type="text/javascript">
33             let normal = document.getElementById('normal');
34             let bt = document.getElementById('bt');
35             normal.addEventListener('click',function(){
36                 alert('click normal');   
37             })
38             bt.addEventListener('click',function(){
39                 alert('click bt');   
40             })
41         </script>
42     </body>
43 </html>

transparent

将元素的background-colorcolorborder-color设置为transparent(透明),此时元素不可见(因为它是透明的),仍然位于可访问性树中,注册点击事件有效。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>transparent</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 color: transparent;
21                 background-color: transparent;
22                 border-color: transparent;
23             }
24         </style>
25     </head>
26     <body>
27         <div>
28             <button id="normal">按钮</button>
29         </div>
30         <div>
31             <button id="bt">按钮</button>
32         </div>
33 
34         <script type="text/javascript">
35             let normal = document.getElementById('normal');
36             let bt = document.getElementById('bt');
37             normal.addEventListener('click',function(){
38                 alert('click normal');   
39             })
40             bt.addEventListener('click',function(){
41                 alert('click bt');   
42             })
43         </script>
44     </body>
45 </html>

rgba(0,0,0,0)

从技术上说,transparent是 rgba(0,0,0,0) 的简写,将元素的background-colorcolorborder-color设置为rgba(0,0,0,0)(透明),此时元素不可见(因为它是透明的),仍然位于可访问性树中,注册点击事件有效。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>rgba(0,0,0,0)</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 color: rgba(0,0,0,0);
21                 background-color: rgba(0,0,0,0);
22                 border-color: rgba(0,0,0,0);
23             }
24         </style>
25     </head>
26     <body>
27         <div>
28             <button id="normal">按钮</button>
29         </div>
30         <div>
31             <button id="bt">按钮</button>
32         </div>
33 
34         <script type="text/javascript">
35             let normal = document.getElementById('normal');
36             let bt = document.getElementById('bt');
37             normal.addEventListener('click',function(){
38                 alert('click normal');   
39             })
40             bt.addEventListener('click',function(){
41                 alert('click bt');   
42             })
43         </script>
44     </body>
45 </html>

rgba只需要第四个参数为0即可达到隐藏元素的效果。

hsla(0,0%,0%,0)

hsla使用元素隐藏的机制与rgba一致,都是由第四个参数Alpha所控制的,将元素的background-color、color和border-color设置为hsla(0,0%,0%,0),此时元素不可见(因为它是透明的),仍然位于可访问性树中,注册点击事件有效。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>hsla(0,0%,0%,0)</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 color: hsla(0,0%,0%,0);
21                 background-color: hsla(0,0%,0%,0);
22                 border-color: hsla(0,0%,0%,0);
23             }
24         </style>
25     </head>
26     <body>
27         <div>
28             <button id="normal">按钮</button>
29         </div>
30         <div>
31             <button id="bt">按钮</button>
32         </div>
33 
34         <script type="text/javascript">
35             let normal = document.getElementById('normal');
36             let bt = document.getElementById('bt');
37             normal.addEventListener('click',function(){
38                 alert('click normal');   
39             })
40             bt.addEventListener('click',function(){
41                 alert('click bt');   
42             })
43         </script>
44     </body>
45 </html>

hsla和rgba一致,只需要第四个参数为0即可达到隐藏元素的效果。

filter: opacity(0%)

filter(滤镜opacity(0% ~ 100%)转化图像的透明程度,值范围于0%(完全透明) ~ 100%(完全不透明)之间。将元素的filter设置为opacity(0%),此时元素不可见(因为它是透明的),仍然位于可访问性树中,注册点击事件有效。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>filter: opacity(0%)</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 filter: opacity(0%);
21             }
22         </style>
23     </head>
24     <body>
25         <div>
26             <button id="normal">按钮</button>
27         </div>
28         <div>
29             <button id="bt">按钮</button>
30         </div>
31 
32         <script type="text/javascript">
33             let normal = document.getElementById('normal');
34             let bt = document.getElementById('bt');
35             normal.addEventListener('click',function(){
36                 alert('click normal');   
37             })
38             bt.addEventListener('click',function(){
39                 alert('click bt');   
40             })
41         </script>
42     </body>
43 </html>

第四种:缩放

transform: scale(0, 0)

transform设置为scale(0, 0)会使元素在x轴和y轴上都缩放到0像素,此元素会显示,也会占用位置,但是因为已经缩放到0%,元素和内容占用像素比为0*0,所以看不到此元素及其内容,也无法点击。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>transform: scale(0, 0)</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 transform: scale(0,0);
21             }
22         </style>
23     </head>
24     <body>
25         <div>
26             <button id="normal">按钮</button>
27         </div>
28         <div>
29             <button id="bt">按钮</button>
30         </div>
31 
32         <script type="text/javascript">
33             let normal = document.getElementById('normal');
34             let bt = document.getElementById('bt');
35             normal.addEventListener('click',function(){
36                 alert('click normal');   
37             })
38             bt.addEventListener('click',function(){
39                 alert('click bt');   
40             })
41         </script>
42     </body>
43 </html>

width: 0;height: 0;overflow: hidden

widthheight都设置为0,使元素占用像素比为0*0,但此时会出现两种情况
当元素的display属性为inline时,元素内容会将元素宽高拉开;
当元素的display属性为blockinline-block时,元素宽高为0,但元素内容依旧正常显示,此时再加上overflow:hidden;即可裁剪掉元素外的元素内容。

这个方法跟transform: scale(0,0)的不同点在于:transform: scale(0,0)是将元素与内容都进行缩放,而此方法是将元素缩放到0px,再裁剪掉元素外的元素内容。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>width: 0;height: 0;overflow: hidden</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 width:0;
21                 height:0;
22                 overflow: hidden;
23                 border-width: 0;/* user agent stylesheet中border-width: 2px; */
24                 padding: 0;/* user agent stylesheet中padding: 1px 6px; */
25             }
26         </style>
27     </head>
28     <body>
29         <div>
30             <button id="normal">按钮</button>
31         </div>
32         <div>
33             <button id="bt">按钮</button>
34         </div>
35 
36         <script type="text/javascript">
37             let normal = document.getElementById('normal');
38             let bt = document.getElementById('bt');
39             normal.addEventListener('click',function(){
40                 alert('click normal');   
41             })
42             bt.addEventListener('click',function(){
43                 alert('click bt');   
44             })
45         </script>
46     </body>
47 </html>

第五种:旋转

transform: rotateX(90deg)

将元素沿着X轴顺时针旋转90度达到隐藏元素的效果。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>transform: rotateX(90deg)</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 transform: rotateX(90deg);
21             }
22         </style>
23     </head>
24     <body>
25         <div>
26             <button id="normal">按钮</button>
27         </div>
28         <div>
29             <button id="bt">按钮</button>
30         </div>
31 
32         <script type="text/javascript">
33             let normal = document.getElementById('normal');
34             let bt = document.getElementById('bt');
35             normal.addEventListener('click',function(){
36                 alert('click normal');   
37             })
38             bt.addEventListener('click',function(){
39                 alert('click bt');   
40             })
41         </script>
42     </body>
43 </html>

transform: rotateY(90deg)

将元素沿着Y轴顺时针旋转90度达到隐藏元素的效果。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>transform: rotateY(90deg)</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 transform: rotateY(90deg);
21             }
22         </style>
23     </head>
24     <body>
25         <div>
26             <button id="normal">按钮</button>
27         </div>
28         <div>
29             <button id="bt">按钮</button>
30         </div>
31 
32         <script type="text/javascript">
33             let normal = document.getElementById('normal');
34             let bt = document.getElementById('bt');
35             normal.addEventListener('click',function(){
36                 alert('click normal');   
37             })
38             bt.addEventListener('click',function(){
39                 alert('click bt');   
40             })
41         </script>
42     </body>
43 </html>

第六种:脱离屏幕显示位置

脱离屏幕显示位置同样可以使元素不可见,但是达到这种效果的css样式太多了,这里只举例一种情况说明。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>脱离屏幕显示位置</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 position: fixed;
21                 top: -100px;
22                 left: -100px;
23             }
24         </style>
25     </head>
26     <body>
27         <div>
28             <button id="normal">按钮</button>
29         </div>
30         <div>
31             <button id="bt">按钮</button>
32         </div>
33 
34         <script type="text/javascript">
35             let normal = document.getElementById('normal');
36             let bt = document.getElementById('bt');
37             normal.addEventListener('click',function(){
38                 alert('click normal');   
39             })
40             bt.addEventListener('click',function(){
41                 alert('click bt');   
42             })
43         </script>
44     </body>
45 </html>

第七种:遮盖

使用元素遮盖也可以使元素不可见,因为达到这种效果的css样式也很多,故这里只举例一种情况说明。

代码:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="charset" content="utf-8"/>
 5         <title>遮盖</title>
 6         <style type="text/css">
 7             div {
 8                 background-color: red;
 9                 width: 100px;
10                 height: 100px;
11                 line-height: 100px;
12                 text-align: center;
13                 margin-top: 24px;
14             }
15             button {
16                 background-color: black;
17                 color: white;
18             }
19             #bt {
20                 z-index: -1;
21                 position: absolute;
22                 top: 50%;
23                 left: 50%;
24                 transform: translate(-50%,-50%);
25             }
26             #cover {
27                 z-index: 1;
28                 position: absolute;
29                 top: 0;
30                 left: 0;
31                 margin: 0;
32             }
33         </style>
34     </head>
35     <body>
36         <div>
37             <button id="normal">按钮</button>
38         </div>
39         <div style="position: relative;line-height: normal;">
40             <button id="bt">按钮</button>
41             <div id="cover"></div>
42         </div>
43 
44         <script type="text/javascript">
45             let normal = document.getElementById('normal');
46             let bt = document.getElementById('bt');
47             normal.addEventListener('click',function(){
48                 alert('click normal');   
49             })
50             bt.addEventListener('click',function(){
51                 alert('click bt');   
52             })
53         </script>
54     </body>
55 </html>

 

上一篇:在uni-app中使用阿里巴巴图标库字体图标


下一篇:apt-mirror