jQuery实现简单弹出框

这篇具有很好参考价值的文章主要介绍了jQuery实现简单弹出框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

功能点

1、点击“更多”出现弹出框

2、点击下拉列表触发回调

3、点击空白区域收起弹出框

效果演示

jQuery实现简单弹出框

PS:鼠标右键效果图`另存为`到本地 ,再将图片后缀gif改为rar即可得到完整代码压缩包。

实现思路

1、提前声明弹出标识做判断;

2、通过jQuery的has()、is()或其他类似方法判断点击的是弹出层以外的空白区域。

PS:太久不写jQuery了,很生疏了...文章来源地址https://www.toymoban.com/news/detail-504542.html

HTML 

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Popover of Jquery</title>
    <link rel="stylesheet" href="./index.css">
</head>

<body>
    <div class="container">
        <!-- 弹出框html START -->
        <span class="popover-wrapper">
            <button class="reference" type="button">更多</button>
            <div class="popover">
                <input class="search" type="text" placeholder="搜索...">
                <ul class="unstyled list">
                    <li><a href="javascript:void(0);">示例选项1</a></li>
                    <li><a href="javascript:void(0);">示例选项2</a></li>
                    <li><a href="javascript:void(0);">示例选项3</a></li>
                    <li><a href="javascript:void(0);">示例选项4</a></li>
                    <li><a href="javascript:void(0);">示例选项5</a></li>
                </ul>
            </div>
        </span>
        <!-- 弹出框html END -->
        <div class="logs"></div>
    </div>
</body>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
<script src="./index.js"></script>

</html>

JS

//Popover plugin
(function ($) {

    //默认参数
    var defaults = {
        //触发器
        reference: '.reference',
        //弹出层
        popover: '.popover',
        //下拉列表
        dropdown: '.popover > .list',
        //回调函数
        callback: function () { }
    };

    /**
     * 构造函数
     * @param options 参数
     * @constructor
     */
    function Plugin(options) {
        this.options = $.extend({}, defaults, options || {});
        this.$reference = $(this.options.reference);
        if (!this.$reference.length) {
            return;
        }
        this.$popover = $(this.options.popover);
        if (!this.$popover.length) {
            return;
        }
        this.render();
    }

    Plugin.prototype = {
        /**
         * 渲染主方法
         */
        render: function () {
            this.$dropdown = $(this.options.dropdown);
            //标识声明
            this.popoverShow = false;
            //事件绑定
            this.bindEvent();
        },
        /**
         * 绑定事件
         */
        bindEvent: function () {
            this.bindPopoverShow();
            this.bindPopoverHide();
            this.bindDropdownClick();
        },
        bindPopoverShow: function () {
            var that = this;
            that.$reference.bind('click', function (e) {
                if (that.popoverShow) {
                    that.$popover.fadeOut();
                    that.popoverShow = false;
                } else {
                    that.$popover.fadeIn();
                    that.popoverShow = true;
                }
                //阻止冒泡,避免弹出时触发document点击
                e.stopPropagation();
            })
        },
        bindPopoverHide: function () {
            var that = this;
            $(document).bind("click", function (e) {
                if (that.popoverShow) {
                    if (
                        !that.$popover.is(e.target) &&
                        that.$popover.has(e.target).length === 0
                    ) {
                        that.$popover.fadeOut();
                        that.popoverShow = false;
                    }
                }
            });
        },
        bindDropdownClick: function () {
            var that = this;
            that.$dropdown.children().bind('click', function (e) {
                //关闭悬浮框
                that.$popover.fadeOut();
                that.popoverShow = false;
                //执行回调
                (typeof that.options.callback === 'function') &&
                    that.options.callback.call(this, "");
            })
        }
    };

    window.Popover = Plugin;

})(jQuery);

/**
 * 渲染入口
 * @param options
 * @returns {Plugin}
 */
new Popover({
    //触发器
    reference: '.reference',
    //弹出层
    popover: '.popover',
    //下拉列表
    dropdown: '.popover > .list',
    //回调函数
    callback: function () {
        $('.logs').append('<p>【' + $(this).text() + '】被选中了...</p>');
    }
});

CSS

button {
    background-color: #eee;
    font-weight: 300;
    font-size: 16px;
    font-family: "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
    text-decoration: none;
    text-align: center;
    line-height: 28px;
    height: 28px;
    padding: 0 16px;
    margin: 0;
    display: inline-block;
    appearance: none;
    cursor: pointer;
    border: none;
    box-sizing: border-box;
    transition: all .3s;
}

button:focus,
button:hover {
    background-color: #f6f6f6;
    text-decoration: none;
    outline: 0;
}

button:active {
    text-shadow: 0 1px 0 rgb(255 255 255 / 30%);
    text-decoration: none;
    background-color: #eee;
    border-color: #cfcfcf;
    color: #999;
    transition-duration: 0s;
    box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}

ul.unstyled {
    padding: 0;
    margin: 0;
    list-style: none;
}

ul.unstyled>li {
    list-style-type: none;
}

.popover-wrapper {
    position: relative;
}

.popover-wrapper .popover {
    padding: 8px;
    border: 1px solid #ebeef5;
    box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
    width: 150px;
    position: absolute;
    right: 0;
    top: 28px;
    margin-top: 4px;
    display: none;
}

.popover-wrapper .popover .search {
    -webkit-appearance: none;
    background-color: #fff;
    background-image: none;
    border-radius: 4px;
    border: 1px solid #dcdfe6;
    box-sizing: border-box;
    color: #606266;
    display: inline-block;
    font-size: inherit;
    height: 28px;
    line-height: 28px;
    outline: none;
    padding: 0 15px;
    transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
    width: 100%;
}

.popover-wrapper .popover .list {
    margin-top: 4px;
}

.popover-wrapper .popover .list li a {
    display: block;
    padding: 4px 8px;
    text-decoration: none;
    color: #000;
    transition: all .3s;
}

.popover-wrapper .popover .list li a:hover,
.popover-wrapper .popover .list li a:focus {
    background: rgba(39, 174, 96, 0.2);
}

.popover-wrapper .popover .list li a:active {
    background: rgba(39, 174, 96, 0.8);
}

.logs {
    display: inline-block;
    vertical-align: text-top;
    width: 400px;
    padding: 8px;
    border: 1px solid;
    height: 400px;
    overflow: auto;
    margin-left: 16px;
}

.logs>p {
    margin: 0 0 8px;
}

.container {
    height: 600px;
    width: 600px;
    position: absolute;
    left: 0;
    top: 0;
    right: 0;
    bottom: 0;
    margin: auto;
}

到了这里,关于jQuery实现简单弹出框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序实现气泡弹出框

    这个组件可以实现 引用别人的组件,上面github可以很好的实现气泡弹窗效果 show:function(){ //如果show值为true,则更改为false 反之设置true if(this.data.show){ this.setData({ show:false }) }else{ this.setData({ show:true }) } }, he(){ console.log(“sadasdd”) this.setData({ show:!this.show }) wx.navigateTo({ url: ‘/p

    2024年02月09日
    浏览(35)
  • Python利用Selenium实现弹出框的处理

    现如今经常出现在网页上的基于 JavaScript 实现的弹出框有三种,分别是  alert、confirm、prompt  。该章节主要是学习如何利用 selenium 处理这三种弹出框。奥利给,冲! JavaScript的三种对话框是通过调用 \\\"window对象\\\" 的三个方法 \\\"alert()\\\"、\\\"confirm()\\\" 、\\\"prompt()\\\" 来获得,我们可以利用这

    2024年02月01日
    浏览(33)
  • Vue3 + Element UI 实现文件上传弹出框

    Vue3 + Element UI 实现文件上传 实现如下: 1.首页添加按钮点击弹出文件框 给dialog设置传参 展示对话框,设置 页面部分代码如下: 语法部分代码如下: 2.弹出框 页面部分代码如下: 语法部分代码如下 上述实现弹出框上传文件事件,当文件上传后需要更新文件管理展示页面,

    2024年02月11日
    浏览(43)
  • vue实现弹出框内嵌页面展示,添加tab切换展示实时加载

    最近做业务的时候,发现产品的原型图上有一个弹出框,上面包含了两个窗口要进行切换。 每个窗口都有分页列表展示、搜索、添加和删除,感觉就是两个完整的页面,如果全写在一个页面会很麻烦,还可能会出现一系列的问题,后期改起来比较麻烦,所以我就准备分开来写

    2024年02月16日
    浏览(25)
  • selenium-弹出框、下拉框

            对js使用的alert、confirm 以及 prompt定位也是项目中常见的,比如弹出提 示框“确定”等。要定位这类提示框具体思路是switch_to_alert()方法定位 alert/confirm/prompt,然后使用text/accept/dismiss/send_keys这一系列动作。 driver.switch_to.alert.accept()         #点击ok driver.switch_t

    2024年02月02日
    浏览(43)
  • 【微信小程序 uniapp】 ws-wx-privacy 微信隐私保护弹出框 隐私协议弹出框

    插件地址 (https://mp.weixin.qq.com/wxamp/basicprofile/index?token=1956320193lang=zh_CN) 4. 将调试基础库改为 3.0.0以上。 微信开发者工具-详情-本地设置-调试基础库 5. 页面 使用示例 仅有在指引中 声明所处理的用户信息 ,才可以调用平台提供的对应接口或组件。若未声明,对应接口或组件将

    2024年02月08日
    浏览(37)
  • 微信小程序实现简单的点击切换功能(微信开发者工具)

    📚文章目录 🔗首先创建一个简单的切换按钮📋 如图下  📋wxml代码  📋wxss代码 🔗但是这个元素是无法点击的,所以要添加一个点击事件到这两个元素里面  📋js代码(在page({})里面添加) 📋wxml代码  🔗class使用三元表达式来继续点击判断  🔗使用bindtap绑定事件  事件的

    2024年02月09日
    浏览(61)
  • 用Axure RP 9制作弹出框

    1.准备文本框  下拉列表   按钮   动态面板  如图  2.先把下拉列表放好 再放动态面板覆盖  3.点动态面板 进入界面 如图 4.给按钮添加交互 3个按钮一样的 如图 5.提交按钮添加交互 如图

    2024年01月23日
    浏览(34)
  • vue 弹出框 引入另一个vue页面

    为什么要这么做,适用于在一个页面逻辑比较多的时候,可以搞多个页面,防止出错 index页面点击解约按钮,弹出框 进入jieyue.vue 核心代码 代码截图 jieyue.vue就是常规代码了 参考博客

    2024年02月12日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包