遮罩层随鼠标方向显示隐藏

效果如下:

思路:

  给标签绑定监听事件mouseenter和mouseleave,

  以标签中心点为圆心,

  获取标签右上角到圆心的角度:当鼠标进入时通过标签的clientWidth/2和clientHeight/2的对比使用Math.atan获取到弧度再换算成角度(弧度/180*Math.PI),

  获取鼠标到圆心的角度:当鼠标进入或离开时通过目标事件event的offseX和offseY的对比使用Math.atan获取到弧度再换算成角度,

  当鼠标的角度在(-右上角的角度)和(右上角的角度)之间时,判断鼠标位置的offseY>标签的高度/2则方向为下,否则方向为上,

  当鼠标的角度小于(-右上角的角度)或大于(右上角的角度)时,判断鼠标位置的offseX>标签的宽度/2则方向为右,否则方向为左,

  再通过animate执行遮罩层进入和离开的动画

  调用之前需把遮罩层标签的样式写好(left设为100%或top值设为100%),调用时需传入遮罩层标签的选择器名

 

示例代码:

  CSS:

ul{overflow:hidden;max-width:1024px;margin:auto;}
ul li{box-sizing:border-box; position:relative; float:left; overflow:hidden; padding:15px; list-style: none; width: 33.3%; height:300px;}
ul li .content{position:relative; overflow:hidden; box-sizing:border-box; height:100%;}
ul li img{width:100%; height:100%;}
ul li .shade{position:absolute; top:0; left:100%; width:100%; height:100%; background:rgba(0,0,0,.3); color:red;}

  HTML:

    <ul>
            <li>
                <div class="content">
                    <img src="http://mpic.tiankong.com/863/b01/863b0144785ad8b1defb09d816f98062/fod-278001.jpg@300h">
                    <div class="shade">详情信息。。。</div>
                </div>
            </li>
            <li>
                <div class="content">
                    <img src="http://mpic.tiankong.com/2db/29f/2db29f75de82c56d2bad8dd52f0a22da/fod-398259.jpg@300h">
                    <div class="shade">详情信息。。。</div>
                </div>
            </li>
            <li>
                <div class="content">
                    <img src="http://mpic.tiankong.com/cb9/779/cb97790ca6c4110b7a9040ee05467804/fod-445054.jpg@300h">
                    <div class="shade">详情信息。。。</div>
                </div>
            </li>
            <li>
                <div class="content">
                    <img src="http://mpic.tiankong.com/80d/729/80d72961fb16c6704d6c9d2c3ffd3686/fod-455932.jpg@300h">
                    <div class="shade">详情信息。。。</div>
                </div>
            </li>
            <li>
                <div class="content">
                    <img src="http://mpic.tiankong.com/0cd/5b1/0cd5b1c2f12febcb2df5496833b95a92/fod-282284.jpg@300h">
                    <div class="shade">详情信息。。。</div>
                </div>
            </li>
            <li>
                <div class="content">
                    <img src="http://mpic.tiankong.com/ab8/705/ab870509e2af2aa37a674b15700f5b45/fod-264641.jpg@300h">
                    <div class="shade">详情信息。。。</div>
                </div>
            </li>
        </ul>
    <script id="jquery_183" type="text/javascript" class="library" src="http://code.jquery.com/jquery-latest.js"></script>

  JS:

;(function($){
    $.fn.moveShade = function(options){
        var anglePoint,w,h;
        this.each(function(){
            var $shade = $(options,$(this));
            this.addEventListener('mouseenter',function(e){
                w = this.clientWidth/2;
                h = this.clientHeight/2;
                anglePoint = Math.atan(w / h) * 180 /Math.PI;
                var direct = getDirection(e || event);
                switch (direct) {
                    case 'down': 
                        $shade.css({left: '0px', top: '100%'}).stop(true, true).animate({top: '0px'}, 'fast');
                        break;
                    case 'up':
                        $shade.css({left: '0px', top: '-100%'}).stop(true, true).animate({top: '0px'}, 'fast')
                            break;
                    case 'right':
                        $shade.css({left: '100%', top: '0px'}).stop(true, true).animate({left: '0px'}, 'fast');
                        break;
                    case 'left':
                        $shade.css({left: '-100%', top: '0px'}).stop(true, true).animate({left: '0px'}, 'fast')
                            break;
                }
            })
                this.addEventListener('mouseleave',function(e){
                    var direct = getDirection(e || event);
                    switch (direct) {
                        case 'down':
                            $shade.stop(true, true).animate({top: '100%'}, 'fast');
                            break;
                        case 'up':
                            $shade.stop(true, true).animate({top: '-100%'}, 'fast')
                                break;
                            case 'right':
                                $shade.stop(true, true).animate({left: '100%'}, 'fast');
                                break;
                            case 'left':
                                $shade.stop(true, true).animate({left: '-100%'}, 'fast');
                                break;
                        }
                    })
                });
                var getDirection = function (event) {
                    var direct,
                            x = event.offsetX,
                            y = event.offsetY,
                            angle = Math.atan((x - w) /- (y - h)) * 180 / Math.PI;
                    if(angle <= anglePoint && angle >= -anglePoint){
                        if(y > h){
                            direct = 'down';
                        }else{
                            direct = 'up';
                        }
                    }else if(x > w){
                        direct = 'right';
                    }else{
                        direct = 'left';
                    }
                    return direct;
                }
                        return this;
            }
})(jQuery)
//调用方式
$('ul li .content').moveShade('.shade');

在线演示:http://sandbox.runjs.cn/show/ykkza2mi

posted on 2017-10-27 14:57  湘陵  阅读(625)  评论(0编辑  收藏  举报

导航