show()封装没有想象中那么简单

以往写显示隐藏效果时,一般都习惯将display值设为none和block,隐藏是对的,就是display=‘none‘,但显示时我们一昧的display=‘block‘会将行内元素变成块级元素,或许你不太在意,但这始终是不对的。

那么该怎么来判断在元素显示时给它的display值设为block还是inline还是inline-block呢,我的想法是在元素隐藏前将它的display值保存起来,然后在显示的时候再将这个值设置回去就可以了。问题解决了?no,这个方法只对一开始是显示的元素有用,如果元素一上来是隐藏的,那么你获取它的display值是none,于是你还是不知道要将它显示的时候display写什么值。这时会想到,写个判断元素是行内还是块级的函数,恩,这应该是正确的思路。

一开始我创建临时节点加入到body中在获取节点样式display值,一般情况下是可以的,但也只是一般情况下,如果我一开始写样式表的时候用了该标签选择器来写,比如span{ display: none; },这时获取创建的span的display值也是none,那又该怎么办呢?恩,先加一个iframe标签,这才算基本完成了。

下面贴出完整代码,代码中有注释

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .box{
            width: 100px;
            height: 100px;
            background: red;
            /* display: none; */
        }
    </style>
</head>
<body>
    <span>显示隐藏</span>
    <button class="btn">toggle</button>
    <div class="box"></div>
</body>
<script>
    var btn = document.querySelector(‘.btn‘);
    var oBox = document.querySelector(‘.box‘);

    btn.onclick = function(){
        if(getStyle(oBox, ‘display‘) == ‘none‘){
            show(oBox)
        }else{
            hide(oBox)
        }
        // alert(defaultDisplay(oBox));
    }

    function show(el){
        var display = el.display || defaultDisplay(el);
        el.style.display = display;
    }
    function hide(el){
        el.display = getStyle(el, ‘display‘);//在元素隐藏前将其display属性值保存
        el.style.display = ‘none‘;
    }
    //判断节点是行内还是会计元素
    function defaultDisplay(el){
        var iframe = document.createElement(‘iframe‘);//相当于html作用域
        document.body.appendChild(iframe);//将iframe追加进body中
        var iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;//iframe文档元素
        var node = iframeDoc.createElement(el.nodeName)//创建要判断的节点
        iframeDoc.body.appendChild(node);//将节点追加到iframe中
        var display = getStyle(node, ‘display‘);//判断节点属性
        document.body.removeChild(iframe);//移除iframe
        return display;
    }
    //获取样式
    function getStyle(el, attr){
        return el.currentStyle ? el.currentStyle[attr] : getComputedStyle(el)[attr];
    }
</script>
</html>

  

原文地址:https://www.cnblogs.com/samfung/p/9090040.html

时间: 2024-10-18 02:48:01

show()封装没有想象中那么简单的相关文章

【经历】苹果企业账号申请记录,比想象中要简单

经过十天左右,成功完成苹果的企业账号的申请,比想象中的要快些,但从流程上来看,其实可以更快的.第一次嘛,原谅自己吧,哈哈. 申请前需要确认的事情: Before applying, please ensure the following: 1.你公司计划发布内部App(发布到AppStore的不能用企业账号) Your organization plans to create and distribute iOS apps in-house. Enroll in the iOS Develope

科目一比想象中还要简单

考试很简单,过程却很费力. 驾校在管理上多多少少还是有点问题,把200多号人马扔在考场那里,也不说明一下考试流程,弄得很多人云里雾里(包括我). 8点半坐大巴上路,接近2小时才到考场:到了考场就等驾校人员点名,点到名的就可以步行云考室楼考试:但这点名环节明显有猫腻,有教练带去的,或者驾校里面的熟人的,肯定先考!无奈,教练没有来,只能靠上天眷顾,差不多12点的时候,终于被点到名,然后拿着准考证到考室楼,然后接着排队!!!!!! 大概12点40分终于排上号,轮到我考了,妈的. 阿sir叫我坐7号位,

山竹”台风过后,发觉选择数据中心没有想象中那么简单了

超强台风"山竹"刚刚过去4天,香港地区在第一个工作日已陆续复产复业复市.有谁敢相信,"山竹"袭来的当天,香港天文台的10号风球信号整整挂足了10个小时. 根据香港中华电力当天新闻稿称,其供电系统在"山竹"的袭击下,40万伏特及13万2千伏特架空天线受到严重影响,导致约40000个客户供电中断.在这里新天域互联小编给大家做个小科普, 中华电力(中电)负责香港九龙.新界区的电力供应,而港灯电力(港灯)负责香港港岛地区的电力供给,双方分工分明.举个例子

Swap in JAVA, 不是想象中的简单

是个程序员都知道,在C/C++里面交换值的方法: [cpp] view plaincopyprint? void swap(int&a ,int&b) { int temp; temp = a; a = b; b = temp; } 但在JAVA中用这种方法是行不通的,因为“Java对普通类型的变量是不支持引用传递的”. 怎么办呢? 1. 可以像下面这样通过传数组(也属于传值)的方法来完成对换(在很多排序算法里面就是这么干的): [java] view plaincopyprint? pu

刚刚完成了在vs2013中通过 ef连接mysql数据库的工作。感觉没有想象中的简单。试了n次终于成功。故记录成功的方法,希望可以帮到大家

分两种情况,如果你是用entity framework 5.0的时候 mysql-connector-net的版本不是很重要. MySQL For VisualStudio的版本也不重要 (这个不装就不能选择连mysql) 如果你是要用entity framework 6.0的时候就麻烦点了,mysql-connector-net用最新的mysql-connector-net 6.9.6(下载地址:http://cdn.mysql.com/Downloads/Connector-Net/mysq

单例模式是设计模式中最简单的形式之一

单例模式是设计模式中最简单的形式之一.这一模式的目的是使得类的一个对象成为系统中的唯一实例.要实现这一点,可以从客户端对其进行实例化开始.因此需要用一种只允许生成对象类的唯一实例的机制,"阻止"所有想要生成对象的访问.使用工厂方法来限制实例化过程.这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义 意图: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 适用性: 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时. 当这个唯一实例应该是通过子

比你想象中还要强大的枚举类型---案例篇

前几天写了一篇介绍枚举功能强大的文章.有几个朋友给我指正说,没有案例单纯描述不够直观.确实啊,在这里我就在写一个案例篇,对上次的文章做补充说明. 此案例是一个游戏服务器的消息识别器的简化.做过游戏开发都知道,客户端和服务器之间的交互需要定义很多的消息类型,而且这个消息类型是需要不断扩展的.消息识别器就是根据客户端发送过来的消息编码封装成消息实体对象,以供业务逻辑层处理.这里就用这个简化后的消息识别器展示一下枚举的一个应用.(此处主要用作枚举的一个应用实例演示,由于代码做了简化处理,设计上难免会有

Linux组件封装(七)——线程池的简单封装

线程池的封装,基础思想与生产者消费者的封装一样,只不过我们是将线程池封装为自动获取任务.执行任务,让用户调用相应的接口来添加任务. 在线程池的封装中,我们同样需要用到的是MutexLock.Condition.Thread这些基本的封装. 基础封装如下: MutexLock: 1 #ifndef MUTEXLOCK_H 2 #define MUTEXLOCK_H 3 4 #include "NonCopyable.h" 5 #include <pthread.h> 6 #i

(译) Google Flutter 中的简单状态管理

原文链接 我是如何遇见 Google Flutter的 这对我来这是像往常一样的码代码的一天.我的一个朋友在我们的开发者群组中发了这么一个问题,是否有人尝试过Google Flutter.它想要知道React Native 和 Google Flutter之间的比较.这个问题让我种草了Google Flutter.我之前从没有听过Google Flutter.它是否值得与React Native进行比较,就像AngularJS相较于ReactJS? 我必须承认.我是一个React的迷弟.我已经使