zoukankan      html  css  js  c++  java
  • 遮罩层随鼠标方向显示隐藏

    效果如下:

    思路:

      给标签绑定监听事件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

  • 相关阅读:
    如果一切需要重学,2014年应该学哪些技术?
    LINUX 更新
    LINUX学习
    判断设备是笔记本,还是台式机
    DUILIB 实现微信气泡聊天效果
    OC学习1
    DUILIB 背景贴图
    DUILIB CDialogBuilder 使用问题
    my english dream
    oracle 函数
  • 原文地址:https://www.cnblogs.com/chenxiangling/p/7743308.html
Copyright © 2011-2022 走看看