jquery配合css实现的悬浮提示效果

a 标签的titile属性能得到提示的效果,但是效果非常不好,而且当鼠标移动到提示信息上面的时候,提示信息就隐藏了,这篇文章主要解决以下几个问题:

当鼠标移到一个a标签之上的时候,能以淡出的方式显示提示信息,

当我将鼠标移动到提示信息的区域之上,提示信息继续保留,知道鼠标离开提示信息区域

提示信息的显示位置是灵活的,能根据当前处罚事件的元素在页面的位置而智能的改变。比如当我鼠标移动到网页左上角的一个超链接上时,这个提示区域自动向下显示,以免隐藏在浏览器的边界之外。

这里的难点在于第二和第三条,第二条主要通过定时器来实现,第三条则需要比较精细的判断。还有一个难点是提示区域的界面,要能在适当的位置显示提示的箭头,这个需要配合第三点的要求实现。

先看js代码:

/****  以下是悬浮提示效果的代码  ****/  
$(document).ready(function() {                                      
    var element;     
    var v,t;     
    //初始化小名片     
    if( !element ){     
        element = $("<div/>")     
        .css({display:'none',position:'absolute','background-color':'white','z-index':1024})     
        .attr('id','space_card_content')     
        .appendTo(document.body).bind('mouseenter',function(){     
            clearTimeout( v );     
        }).bind('mouseleave',function(){     
            $(this).hide();     
        }).show();     
    }     
    var defaults = {     
        status: 'on',     
        //小名片模版     
        cardTpl:'<div class="card_layer"><div class="bg"><div class="effect">'+     
                '<table><tbody><tr><td>'+     
                '<div class="card_content">'+     
                    '<div class="card_name clearfix">'+     
                        '<div class="links clearfix" id="space_card_toolbar">专业简介</div>'+     
                        '<dl class="name clearfix">'+     
                            '<dd class="major_detail">'+     
                            '<p>软件工程</p>'+     
                            '<p>计算机科学与技术</p>'+     
                            '<p>信息安全</p>'+     
                            '<p>数值分析</p>'+     
                            '</dd>'+     
                        '</dl>'+     
                    '</div>'+     
                '</div>'+     
                '</td></tr></tbody></table>'+     
                '<div id="space_card_arrow" class="arrow arrow_b"></div></div></div></div>'
    }     
    $("a\[rel='face'\]").bind('mouseover',function(){     
        var width = $(this).width();     
        var height = $(this).height();     
        var position = $(this).offset();     
        position.width = width;     
        position.height = height;     
        t = setTimeout(function(){   //当需要ajax动态获取数据的时候,这个定时器才有用,不过本身还有延时的作用     
        clearTimeout( v );     
        $('#space_card_content').html(defaults\['cardTpl'\]);              
        //alert($('#space_card_content').html());                  
                            //小名片的位置.在顶端朝下.在右侧朝左.     
        var scrollTop = $(document).scrollTop();     
        var windowWidth = $(window).width();         
        //当前元素距离顶部的距离     
        var cardTop = position.top - scrollTop;     
        //当前元素距离右侧的距离     
        var cardRight = windowWidth - position.left;     
        //设置小名片位置 - 朝左     
        if(cardRight<400) {     
            element.css({top:position.top + 145, left:position.left - 320}).show();     
            $('#space_card_arrow').removeClass('arrow_b').addClass('arrow_r');     
        //设置小名片位置 - 朝下     
        } else if (cardTop<900){     
            element.css({top:position.top +157 + position.height, left:position.left+5}).show();     
            $('#space_card_arrow').removeClass('arrow_b').addClass('arrow_t');     
        //设置小名片位置 - 朝上     
        } else {     
            element.css({top:position.top-43, left:position.left}).show();     
        }     
        $('#space_card_content').fadeIn("fast");     
        }, 550);      
    }).bind('mouseout',function(event){     
        clearTimeout(t);     
        v = setTimeout(function(){     
            element.hide();     
        },700);     
    });              
});     

这里特别要注意setTimeout的用法,每个setTimeout都是不能少的。否则会出现功能上的欠缺。 要完整显示出效果来,还需要配上css样式,本来需要加载一张箭头的图片,这里就不放上来了,不过还是保留了这张图片的css样式。

<style type="text/css">   
.card_layer .card_content {   
    background: none repeat scroll 0 0 #FFFFFF;   
    border: 1px solid #BBB;   
    border-radius: 3px 3px 3px 3px;   
    box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);   
    position: relative;   
    cursor: pointer;   
    width: 350px;   
}   
.card_layer {   
    border-radius: 4px 4px 4px 4px;   
    color: #666666;   
    left: -22px;   
    position: absolute;   
    top: -158px;   
    z-index: 9999;   
}   
.card_layer .bg {   
    border-radius: 4px 4px 4px 4px;   
    padding: 4px;   
    background-color: #F5F5F5;   
}   
table {   
    border-collapse: collapse;   
    border-spacing: 0;   
}   
.clearfix:after {   
    clear: both;   
    content: ".";   
    display: block;   
    font-size: 0;   
    line-height: 0;   
    margin: 0;   
    overflow: hidden;   
    padding: 0;   
}   
.card_name {   
    color: #5D5D5D;   
}   
.card_name .name {   
    padding: 4px 15px 10px;   
}   
.card_name .name dt,.card_name .name dd,.card_name .info dt,.card_name .info dd   
    {   
    display: inline;   
    float: left;   
}   
.card_name .userdata {   
    width: 200px;   
}   
ul,ol {   
    list-style: none outside none;   
}   
.card_name .userdata li {   
    float: left;   
    margin-right: 10px;   
    text-align: left;   
}   
.card_name .links {   
    background-color: #f8f8f8;   
    line-height: 25px;   
    padding: 3px 10px;   
    text-align: left;   
}   
.card_layer .arrow,.card_layer .arrow_hui {   
    background: url("https://img.paonet.com/upload-images-old/banner/layer_arrow.png")   
        no-repeat scroll 0 0 transparent;   
    display: block;   
    overflow: hidden;   
    position: absolute;   
}   
.card_layer .arrow_r,.card_layer .arrow_l {   
    background-position: -11px -24px;   
    height: 16px;   
    right: -5px;   
    top: 20px;   
    width: 11px;   
}   
.card_layer .arrow_l {   
    background-position: 0 -24px;   
    left: -5px;   
    right: auto;   
}   
.card_layer .arrow_t,.card_layer .arrow_b {   
    background-position: 0 -1px;   
    height: 11px;   
    left: 30px;   
    top: -5px;   
    width: 16px;   
}   
.card_layer .arrow_b {   
    background-position: 0 -11px;   
    bottom: -5px;   
    top: auto;   
}   
</style>

最后你还需要引入你的jquey包。本文的代码可以在这里下载 http://pan.baidu.com/netdisk/singlepublic?fid=287700_1447341484