鼠标移上显示 ( 自定义内容 ) 弹出框

方法一:介绍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

原文地址:https://www.cnblogs.com/moumou0213/p/6406465.html