shown和hidden问题

来源:2-5 用css3实现淡入淡出效果(2)

猫有一只猫

2019-12-22 14:55:05

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>显示隐藏模块</title>
    <link rel="stylesheet" href="../css/base.css" />
    <style>
        body {
            width: 400px;
            margin: 0 auto;
        }

        .btn {
            width: 50%;
            height: 30px;
        }

        #box {
            display: none;
            /*position: absolute;*/
            /* visibility: hidden;
        opacity: 0;*/
            width: 100%;
            height: 200px;
            background-color: red;
        }

        .transition {
            -o-transition: all 0.5s;
            -ms-transition: all 0.5s;
            -moz-transition: all 0.5s;
            -webkit-transition: all 0.5s;
            transition: all 0.5s;
        }

        .fadeOut {
            visibility: hidden !important;
            opacity: 0 !important;
        }
    </style>
</head>

<body>
    <button id="btn-show" class="btn">显示</button><button id="btn-hide" class="btn">隐藏</button>
    <div id="box" class="transition fadeOut"></div>
    <button class="btn">显示2</button>
    <script src="../js/jquery.js"></script>
    <script src="../js/showHide.js"></script>
    <!-- <script>
        var $box = $('#box');
        // silent.init($box);
        $('#btn-show').on('click', function () {
            css3.fade.show($box);
        });
        $('#btn-hide').on('click', function () {
            css3.fade.hide($box);
        });
        $box.on('show shown hide hidden', function (e) {
            console.log(e.type);
        });
    </script> -->
</body>

</html>
var $box = $('#box');
// silent.init($box);
$('#btn-show').on('click', function () {
    css3.fade.show($box);
});
$('#btn-hide').on('click', function () {
    css3.fade.hide($box);
});
$box.on('show shown hide hidden', function (e) {
    console.log(e.type);
});


// 正常显示和隐藏
var silent = {
    //初始化显示和隐藏的状态
    init: function ($elem) {
        if ($elem.is(':hidden')) {
            $elem.data('status', 'hidden');
        } else {
            $elem.data('status', 'shown');
        }
    },
    show: function ($elem) {
        //判断状态,解决重复触发事件  
        if ($elem.data('status') === 'show') return;
        if ($elem.data('status') === 'shown') return;
        //给元素添加状态值
        $elem.data('status', 'show').trigger('show');
        $elem.show();
        $elem.data('status', 'shown').trigger('shown');
    },
    hide: function ($elem) {
        if ($elem.data('status') === 'hide') return;
        if ($elem.data('status') === 'hidden') return;
        $elem.data('status', 'hide').trigger('hide');
        $elem.hide();
        $elem.data('status', 'hidden').trigger('hidden');
    }
};
// 带效果的显示和隐藏,css3实现方法
var css3 = {
    fade: { // 淡入淡出
        show: function ($elem) {
            $elem.trigger('show');
            $elem.on('transitionend', function () {
                $elem.trigger('shown');
            });
            $elem.show();
            setTimeout(function () {
                $elem.removeClass('fadeOut');
            }, 1);
        },
        hide: function ($elem) {
            $elem.trigger('hide');
            $elem.on('transitionend', function () {
                $elem.hide();
                $elem.trigger('hidden');
            });
            $elem.addClass('fadeOut');
        }
    },
    slideUpDown: { // 上下滚动
        show: function () {
        },
        hide: function () {
        }
    },
    slideLeftRight: { // 左右滚动
        show: function () {
        },
        hide: function () {
        }
    },
    fadeslideUpDown: { // 淡入淡出上下滚动
        show: function () {
        },
        hide: function () {
        }
    },
    fadeslideLeftRight: { // 淡入淡出左右滚动
        show: function () {
        },
        hide: function () {
        }
    }
};
// 带效果的显示和隐藏,js实现方法
var js = {
    fade: { // 淡入淡出
        show: function () {
        },
        hide: function () {
        }
    },
    slideUpDown: { // 上下滚动
        show: function () {
        },
        hide: function () {
        }
    },
    slideLeftRight: { // 左右滚动
        show: function () {
        },
        hide: function () {
        }
    },
    fadeslideUpDown: { // 淡入淡出上下滚动
        show: function () {
        },
        hide: function () {
        }
    },
    fadeslideLeftRight: { // 淡入淡出左右滚动
        show: function () {
        },
        hide: function () {
        }
    }
};

http://img.mukewang.com/climg/5dff0c9b0892f88c07430222.jpg

课件里的代码。

视频中说是on的原因导致,每一次的点击都会绑定一次,刷新网页,单击一次显示,单击一次隐藏,就会出现这个结果,就很奇怪单击显示按钮为什么触发两次shown?单击隐藏按钮为什么还能触发shown?调试半天也没看出来啊

写回答

1回答

好帮手慕粉

2019-12-22

同学你好,关于同学的问题解答如下:

1、在获取的box的时候,应该先对其进行初始化,且要放在js文件的下面,因为获取完box盒子时,还没有设置init初始化函数。修改参考:

http://img.mukewang.com/climg/5dff1f2e0957193709500537.jpg

2、在设置元素的显示隐藏时,应该先对元素的状态进行判断,show和hide方法修改参考:

http://img.mukewang.com/climg/5dff1f8609874d3609960828.jpg

http://img.mukewang.com/climg/5dff1f96099f4aca09910674.jpg

而同学的单击显示按钮为什么触发两次shown,单击隐藏按钮为什么还能触发shown就是因为同学没有初始化和判断导致的。

同学在参考老师的代码写的时候,要细心一点。

如果我的回答帮助到了你,欢迎采纳,祝学习愉快~

0

0 学习 · 14456 问题

查看课程