zoukankan      html  css  js  c++  java
  • 鼠标移上显示 ( 自定义内容 ) 弹出框

    方法一:介绍bootstrap组件Popover弹出框自定义内容的方法

    Popover的常用参数以及使用方法可以详见 http://www.runoob.com/bootstrap/bootstrap-popover-plugin.html 

    要实现如图所示效果:

    1:引入样式和js文件

    <link rel="stylesheet" href="https://cdn.static.runoob.com/libs/bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdn.static.runoob.com/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdn.static.runoob.com/libs/bootstrap/3.3.7/js/bootstrap.min.js"></script>

    2:html代码

    <body>
        <a class="btn btn-lg btn-danger" role="button">弹出框2</a>
        <a class="btn btn-lg btn-success" role="button">弹出框3</a>
    </body>

    3:js代码

        $(function () {
                $('a').each(function () {
                    var element = $(this);
                    var txt = element.html();
                    element.popover({
                        trigger: 'manual',
                        placement: 'auto', //top, bottom, left or right
                        // title: txt,
                        html: 'true',
                        content: ContentMethod(txt),
                    }).on("mouseenter", function () {
                        var _this = this;
                        $(this).popover("show");
                        $(this).siblings(".popover").on("mouseleave", function () {
                        $(_this).popover('hide');
                        });
                    }).on("mouseleave", function () {
                        var _this = this;
                        setTimeout(function () {
                            if (!$(".popover:hover").length) {
                              $(_this).popover("hide")
                            }
                        }, 100);
                    });
                });
            });
    
            function ContentMethod(txt){
                return '<input type="text" class="form-control"><span>弹出框</span>';
            };

    缺点就是,此方法自定义的弹出框的内容是用js拼成的html代码,当需要显示的内容比较多的时候页面加载起来比较慢,js代码看起来也会比较杂乱冗余。

    方法二:简单的逻辑:试用相对定位控制对应元素的显示隐藏

    1:html代码

        <table>
                <tbody>
                    <tr>
                        <td class="same-name">
                            <a href="javascript:;" data-id="<?= $v['order_id']?>"><?= $v['order_sn'] ?></a>
                            <div class="order-goods" id="order_goods_layer"></div><!-显示的内容->
                        </td>
                        ...
                    </tr>
                    <tr>
                        <td class="same-name">
                            <a href="javascript:;" data-id="<?= $v['order_id']?>"><?= $v['order_sn'] ?></a>
                            <div class="order-goods" id="order_goods_layer"></div><!-显示的内容->
                        </td>
                        ...
                    </tr>
              <tr>
                        <td class="same-name">
                            <a href="javascript:;" data-id="<?= $v['order_id']?>"><?= $v['order_sn'] ?></a>
                            <div class="order-goods" id="order_goods_layer"></div><!-显示的内容->
                        </td>
                        ...
                    </tr>
                </tbody>
            </table>

    2:js代码 

    $(document).ready(function(){
            var t;
            $('.same-name i').mouseover(function() {
                var url = '<?= base_url('Sale_manage/OrderCenter/get_order_div')?>';
                var order_id = $(this).data("id");
                var get_data = {'order_id':order_id};
                $.getJSON(url, get_data, function(data) {
                    if (data.code == 1) {
                        $('.same-name span').empty();
                        $('.same-name span').html(data.data);
                    } else {
                        alert(data.msg);
                    }
                });
    
                $('.same-name span').hide();
                $(this).siblings('span').show();
            });
            $('.same-name i').mouseout(function() {
                t = setTimeout(yc(),1000);
                function yc(){
                    $('.same-name span').hide();
                };
            });
    
            $('.same-name span').mouseover(function() {
                clearTimeout(t);
                $(this).show();
            });
            $('.same-name span').mouseout(function() {
                $(this).hide();
            });
        }) 

     这个方法的缺点:不能根据鼠标触发的位置来自定义提示框的位置,当鼠标触发屏幕底部的几个元素来弹出对应提示框,并且提示框内容相对比较多显示的

    时候超出整个div范围导致页面出现滚动条,这时的体验就非常不好,可能会出现页面抖动等情况,那怎样实现像插件里面那样能根据触发位置自适应弹出框的位置呢?

    我试了两个方法:

    1:根据判断页面是否出现滚动条,来修改弹出框的位置(向上弹出/向下弹出),但是此方法也有漏洞,因为是先判断有无滚动条再决定弹出框的位置,

    那就是说出现滚动条的时候就会有页面的抖动,事实证明不可行。

    2:根据判断 鼠标触发的元素到屏幕底部的距离 来决定弹出框的位置,此方法暂时未发现问题,所以上面代码更新为:

    function mouseover_init(){
            var t;
            var w_h = $(window).height();  //获取屏幕的高度
            $('.cl-order-sn a').mouseover(function() {
                var url = '<?= base_url('Sale_manage/Order/get_goingout_order_div')?>';
                var order_id = $(this).data("id");
                var get_data = {'order_id':order_id};
                $.getJSON(url, get_data, function(data) {
                    if (data.code == 1) {
                        $('.cl-order-sn .order-goods').empty();
                        $('.cl-order-sn .order-goods').html(data.data);
                    } else {
                        alert(data.msg);
                    }
                });
                
                var a_h_t = $(this).offset().top - $(window).scrollTop();  //获取触发元素到顶部的距离
                var a_h_b = w_h - a_h_t;  //触发元素到底部的距离
                
                if (a_h_b < 250) {
                    $('.cl-order-sn .order-goods').hide();
                    $(this).siblings('.order-goods').addClass('position_b').removeClass('position_t').show();
                } else{
                    $('.cl-order-sn .order-goods').hide();
                    $(this).siblings('.order-goods').addClass('position_t').removeClass('position_b').show();
                };
            });
            
            $('.cl-order-sn a').mouseout(function() {
                t = setTimeout(yc(),1000);
                function yc(){
                    $('.cl-order-sn .order-goods').hide();
                };
            });
    
            $('.cl-order-sn .order-goods').mouseover(function() {
                clearTimeout(t);
                $(this).show();
            });
            $('.cl-order-sn .order-goods').mouseout(function() {
                $(this).hide();
            });
        };

    方法三:webui-popover插件,它兼容bootstrap但并不依赖于bootstrap

    <!doctype html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 
        <meta content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0" name="viewport" />
        <title>基于Bootstrap的轻量级弹出提示框插件</title>
        <link href="http://www.jq22.com/jquery/bootstrap-3.3.4.css" rel="stylesheet">
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/jquery.webui-popover/1.2.1/jquery.webui-popover.min.css">
    </head>
    <body>
        <table>
            <thead>
                <tr>
                    <th>订单号</th>
                    <th>名称</th>
                    <th>状态</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td><a href="#" class="show-pop-table" data-placement="auto">123456789</a></td>
                    <td>【破损】天衡宝 甜薯三文鱼无谷犬粮(细颗粒) 4.5磅</td>
                    <td>正常</td>
                </tr>
                <tr>
                    <td><a href="#" class="show-pop-table" data-placement="auto">123456789</a></td>
                    <td>【破损】天衡宝 甜薯三文鱼无谷犬粮(细颗粒) 4.5磅</td>
                    <td>正常</td>
                </tr>
            </tbody>
        </table>
    
        <div id="tableContent" style="display:none;">
            <table class="table">
              <thead>
                <tr>
                  <th>#</th>
                  <th>First Name</th>
                  <th>Last Name</th>
                  <th>Username</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td>1</td>
                  <td>Mark</td>
                  <td>Otto</td>
                  <td>@mdo</td>
                </tr>
                <tr>
                  <td>2</td>
                  <td>Jacob</td>
                  <td>Thornton</td>
                  <td>@fat</td>
                </tr>
                <tr>
                  <td>3</td>
                  <td>Larry</td>
                  <td>the Bird</td>
                  <td>@twitter</td>
                </tr>
              </tbody>
            </table>
        </div>
    <script src="http://www.jq22.com/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/jquery.webui-popover/1.2.1/jquery.webui-popover.min.js"></script>    
    <script>
        (function(){
            var tableContent = $('#tableContent').html();
            $('a.show-pop-table').webuiPopover({
                    content: tableContent,
                    trigger: 'hover',
                     500,
                    multi: true,
                    placement: 'auto',
                    padding: true,
                    delay: 300,
                    closeable: false,
                    style: ''
                });
        })();
    </script>
    </body>
    </html>

    另外还有异步加载模式,具体API请查看网址http://www.jcodecraeer.com/a/javascript/2016/1003/6656.html

  • 相关阅读:
    Python2+appinum基础操作封装
    appinum+python环境搭建
    Python学习-pymysql(一)
    小程序onShow事件获取options方法
    css中content-box和border-box当宽度为百分比时的位置区别,vw和%区别
    JavaScript
    canvas入门基础,七巧板、五角星、粒子时钟等
    JavaScript 自适应轮播图
    css使用padding-bottom百分比进行提前占位,防止抖动
    Dreamweaver配色方案
  • 原文地址:https://www.cnblogs.com/moumou0213/p/6406465.html
Copyright © 2011-2022 走看看