侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

CSS隐藏元素的多种方法的对比

前端  /  管理员 发布于 7年前   126

一说起CSS隐藏元素,我想大部分小伙伴们都会想到的第一种方法就是设置display为none。这是最为人所熟知也是最常用的方法。我相信还有不少人想到使用设置visibility为hidden来隐藏元素,这种方式也是常用的方法,而且也有很多人知道两者的不同。除了这两种方法,本文还总结了一些比较不常用的方法,比较了这几种“隐藏”元素方法的区别和优缺点,欢迎大家交流!!

几种方法的简单介绍

首先我们分别来说说到底有哪几种隐藏元素的方法,有一些方法是众所周知的,还有一些算是一种技巧。

display:none

设置元素的display为none是最常用的隐藏元素的方法。

CSS Code复制内容到剪贴板
  1. .hide {   
  2.     display:none;   
  3. }  

将元素设置为display:none后,元素在页面上将彻底消失,元素本来占有的空间就会被其他元素占有,也就是说它会导致浏览器的重排和重绘。

visibility:hidden

设置元素的visibility为hidden也是一种常用的隐藏元素的方法,和display:none的区别在于,元素在页面消失后,其占据的空间依旧会保留着,所以它只会导致浏览器重绘而不会重排。

CSS Code复制内容到剪贴板
  1. .hidden{   
  2.     visibility:hidden  
  3. }  

visibility:hidden适用于那些元素隐藏后不希望页面布局会发生变化的场景

opacity:0

opacity属性我相信大家都知道表示元素的透明度,而将元素的透明度设置为0后,在我们用户眼中,元素也是隐藏的,这算是一种隐藏元素的方法。

CSS Code复制内容到剪贴板
  1. .transparent {   
  2.    opacity:0;   
  3. }   

这种方法和visibility:hidden的一个共同点是元素隐藏后依旧占据着空间,但我们都知道,设置透明度为0后,元素只是隐身了,它依旧存在页面中。

设置height,width等盒模型属性为0
这是我总结的一种比较奇葩的技巧,简单说就是将元素的margin,border,padding,height和width等影响元素盒模型的属性设置成0,如果元素内有子元素或内容,还应该设置其overflow:hidden来隐藏其子元素,这算是一种奇技淫巧。

CSS Code复制内容到剪贴板
  1. .hiddenBox {   
  2.     margin:0;   
  3.     border:0;   
  4.     padding:0;   
  5.     height:0;   
  6.     width:0;   
  7.     overflow:hidden;   
  8. }   

这种方式既不实用,也可能存在着着一些问题。但平时我们用到的一些页面效果可能就是采用这种方式来完成的,比如jquery的slideUp动画,它就是设置元素的overflow:hidden后,接着通过定时器,不断地设置元素的height,margin-top,margin-bottom,border-top,border-bottom,padding-top,padding-bottom为0,从而达到slideUp的效果。

元素隐藏后的事件响应

如果被隐藏的元素绑定了一些事件,我们执行了相关操作后,这些事件是否会被响应并执行呢,看看下面的代码:

CSS Code复制内容到剪贴板
  1. <style>   
  2.     div {    
  3.         width: 100px;    
  4.         height: 100px;    
  5.         background: red;    
  6.         margin: 15px;    
  7.         padding: 10px;    
  8.         border: 5px solid green;    
  9.         display: inline-block;    
  10.         overflow: hidden;    
  11.     }   
  12.     .none { display: none; }   
  13.     .hidden { visibility: hidden; }   
  14.     .opacity0 { opacity: 0; }   
  15.     .height0 { height: 0; }     
  16. </style>     
  17.   
  18. <div class="none"></div>   
  19. <div class="hidden"></div>   
  20. <div class="opacity0"></div>   
  21. <div class="height0">aa</div>     
  22.   
  23. <script src="/Scripts/jquery-1.10.2.min.js"></script>   
  24. <script>   
  25.     $(".none").on("click", function () {   
  26.         console.log("none clicked");   
  27.     })   
  28.     $(".hidden").on("click", function () {   
  29.         console.log("hidden clicked");   
  30.     })   
  31.     $(".opacity0").on("click", function () {   
  32.         console.log("opacity0 clicked");   
  33.     })   
  34.     $(".height0").on("click", function () {   
  35.         console.log("height0 clicked");   
  36.     })   
  37. </script>   
  38.   

这段代码将四种隐藏元素的方法分别展示出来,然后绑定其点击事件,经过测试,主要有下面的结论:

1、display:none:元素彻底消失,很显然不会触发其点击事件
2、visibility:hidden:无法触发其点击事件,有一种说法是display:none是元素看不见摸不着,而visibility:hidden是看不见摸得着,这种说法是不准确的,设置元素的visibility后无法触发点击事件,说明这种方法元素也是消失了,只是依然占据着页面空间。
3、opacity:0:可以触发点击事件,原因也很简单,设置元素透明度为0后,元素只是相对于人眼不存在而已,对浏览器来说,它还是存在的,所以可以触发点击事件
4、height:0:将元素的高度设置为0,并且设置overflow:hidden。使用这种方法来隐藏元素,是否可以触发事件要根据具体的情况来分析。如果元素设置了border,padding等属性不为0,很显然,页面上还是能看到这个元素的,触发元素的点击事件完全没有问题。如果全部属性都设置为0,很显然,这个元素相当于消失了,即无法触发点击事件。

但是这些结论真的准确吗?

我们在上面的代码中添加这样一句代码:

JavaScript Code复制内容到剪贴板
  1. $(".none").click();   

结果发现,触发了click事件,也就是通过JS可以触发被设置为display:none的元素的事件。

所以前面无法触发点击事件的真正原因是鼠标无法真正接触到被设置成隐藏的元素!!!

CSS3 transition对这几种方法的影响

CSS3提供的transition极大地提高了网页动画的编写,但并不是每一种CSS属性都可以通过transition来进行动画的。我们修改代码如下:

CSS Code复制内容到剪贴板
  1. <style>   
  2.     div {    
  3.         width: 100px;    
  4.         height: 100px;    
  5.         background: red;    
  6.         margin: 15px;    
  7.         padding: 10px;    
  8.         border: 5px solid green;    
  9.         display: inline-block;    
  10.         overflow: hidden;    
  11.         transition: all linear 2s;     
  12.     }   
  13. </style>     
  14.   
  15. <div class="none"></div>   
  16. <div class="hidden"></div>   
  17. <div class="opacity0"></div>   
  18. <div class="height0">aa</div>     
  19.   
  20. <script src="/Scripts/jquery-1.10.2.min.js"></script>   
  21. <script>   
  22. $(".none").on("click", function () {   
  23.     console.log("none clicked");   
  24.     $(this).css("display", "none");   
  25. })   
  26. $(".hidden").on("click", function () {   
  27.     console.log("hidden clicked");   
  28.     $(this).css("visibility", "hidden");   
  29. })   
  30. $(".opacity0").on("click", function () {   
  31.     console.log("opacity0 clicked");   
  32.     $(this).css("opacity", 0);   
  33. })   
  34. $(".height0").on("click", function () {   
  35.     console.log("height0 clicked");   
  36.     $(this).css({   
  37.         "height": 0,   
  38.     });   
  39. })   
  40. </script>   
  41.   

经过测试,可以看到:

1、display:none:完全不受transition属性的影响,元素立即消失
2、visibility:hidden:元素消失的时间跟transition属性设置的时间一样,但是没有动画效果
3、opacity和height等属性能够进行正常的动画效果

假设我们要通过CSS3来做一个淡出的动画效果,应该如下:

CSS Code复制内容到剪贴板
  1. fadeOut { visibility: visible; opacity: 1; transition: all linear 2s; }   
  2. fadeOut:hover { visibility: hidden; opacity: 0; }  

应该同时设置元素的visibility和opacity属性。

本文总结说明了“隐藏”元素的几种方式,其中最常用的还是display:none和visibility:hidden。其他的方式只能算是奇技淫巧,并不推荐使用它们来隐藏元素,它们的真正用途应该不在隐藏元素,而是通过了解这些方法的特点,挖掘出其真正的使用场景。欢迎大家交流!!

来自小伙伴们补充的技巧:

1、设置元素的position与left,top,bottom,right等,将元素移出至屏幕外

2、设置元素的position与z-index,将z-index设置成尽量小的负数

以上就是本文的全部内容,希望对大家的学习有所帮助。


  • 上一条:
    兼容浏览器的css inline-block写法
    下一条:
    实例讲解如何使用CSS保持页面内容宽高比
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客