亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript實現類似拉勾網的鼠標移入移出效果

2019-11-20 08:38:48
字體:
來源:轉載
供稿:網友

先上效果圖(gif自己錄制的,有點難看抱歉,工具licecap)

 

實現思路

 HTML結構

  <ul>    <li>      <div class="bg">        <p>JS</p>      </div>    </li>    .....  </ul>

    li作為鼠標移入(mouseenter)和鼠標移出(mouseleave)的載體。

    div作為動畫執行的載體。

CSS

    div采用absolute定位,通過top、left改變它的位置。

    由于div的top、left可能會超出li的大小,所以要設置li的overflow:hidden;

JS

    1、采用JS操縱CSS3 transition動畫

    2、如何判斷鼠標移入移除的方向

鼠標坐標的相關知識

MouseEvent對象

下面介紹幾個MouseEvent中坐標的相關知識:

    (clientX, clientY): 以可視區域為參考系的坐標。

    (pageX, pageY): 以整個頁面(包括滾動條卷出的區域)為參考系的坐標。

    (screenX, screenY): 以你的電腦屏幕為參考系的坐標。

    獲取某個元素內部的坐標

  function pointTo(element, e) {    var elementBox = element.getBoundingClientRect();    return {      x: e.clientX - elementBox.left,      y: e.clientY - elementBox.top    };  }

    計算元素左上角的坐標

  function startPoint(element){    var x = 0,y = 0;    while(element != null) {      x += element.offsetLeft;      y += element.offsetTop;      element = element.offsetParent;    }    return {      x: x,      y: y    }  }

    獲取元素的寬度和高度(不要認為是width和height 新手特別容易犯錯)

  offsetHeight與offsetWidth

簡單的封裝一下CSS3 transition動畫

/* options參數: obj: 運動的對象 speed: 運動的持續時間(可選) changeStyle: 改變的屬性,這里可能多個,所以采用函數的方式(可選) callback: 回調函數(可選) */  function animation(options){    if(!options.obj) {      return false;    }    //設置默認持續時間    options.speed = options.speed || '.5s';    options.obj.style.transition = "all " + options.speed + " ease-in-out";    options.changeStyle.call(options.obj);    var flag = false;    options.obj.addEventListener('transitionend',function(){      //這里主要由于transitionend在每個屬性的動畫執行完多會走一遍,所以我們要讓它只執行一次。      if(!flag) {        options.callback && options.callback();      }    },false);  }

如何確定方向

這里要用到數學中的正切相關的概念,我自己畫了一張圖,不知道你們能不能看特明白:(奇丑。。。)

 

得到元素的運動方向

  function getDirection(element,startPoint,pagePoint){    var halfWidth = element.offsetWidth / 2,halfHeight = element.offsetHeight / 2;    //得到中心點    var center = {      x: startPoint.x + halfWidth,      y: startPoint.y + halfHeight    }    //得到鼠標偏離中心點的距離    var disX = pagePoint.x - center.x;    var disY = pagePoint.y - center.y;    if(disY < 0 && Math.abs(disY / disX) >= 1) {      //上方      return 1;    }    else if(disY > 0 && Math.abs(disY / disX) >= 1) {      //下      return 2;    }    else if(disX < 0 && Math.abs(disY / disX) < 1) {      //左      return 3;    }    else {      //右      return 4;    }  }

啟動事件的代碼,有注釋

/* options中的參數: 觸發事件的載體: targetElement 執行動畫的載體: animationElement */  function HoverAction(options) {    if(!options.targetElement || !options.animationElement) {      return false;    }    this.targetElement = options.targetElement;    this.animationElement = options.animationElement;    this.timeId = null;    this.speed = "0.3s";  }  HoverAction.prototype.addEvent = function() {    //保存this的指向    var _this = this;    _this.targetElement.addEventListener('mouseenter',function(e){      //得到鼠標的坐標      var point = {        x: e.pageX,        y: e.pageY      }      console.log(point);      //獲得方向      var dir = getDirection(_this.targetElement,startPoint(_this.targetElement),point);      clearTimeout(_this.timeId);      //取消過渡動畫(防止重置動畫載體位置時觸發過渡效果)      _this.animationElement.style.transition = "";      //得到運動的方向,要確定動畫載體的開始位置      switch(dir){        case 1:          _this.animationElement.style.top = "-100%";          _this.animationElement.style.left = "0";          break;        case 2:          _this.animationElement.style.top = "100%";          _this.animationElement.style.left = "0";          break;        case 3:          _this.animationElement.style.top = "0";          _this.animationElement.style.left = "-100%";          break;        case 4:          _this.animationElement.style.top = "0";          _this.animationElement.style.left = "100%";          break;      }      //異步執行      _this.timeId = setTimeout(function(){        animation({          obj: _this.animationElement,          speed: _this.speed,          changeStyle: function(){            this.style.top = "0";            this.style.left = "0";          }        });      },20);    },false);    _this.targetElement.addEventListener('mouseleave',function(e){      var left,top;      var point = {        x: e.pageX,        y: e.pageY      }      clearTimeout(_this.timeId);      _this.animationElement.style.transition = "";      var dir = getDirection(_this.targetElement,startPoint(_this.targetElement),point);      switch(dir) {        case 1:          top = '-100%';          left = '0';          break;        case 2:          top = '100%';          left = "0";          break;        case 3:          left = "-100%";          top = "0";          break;        case 4:          left = "100%";          top = "0";          break;      }      _this.timeId = setTimeout(function(){        animation({          obj: _this.animationElement,          speed: _this.speed,          changeStyle: function(){            this.style.top = top;            this.style.left = left;          }        });      },20);    },false);  }

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能有所幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久九九热免费视频| 欧美人交a欧美精品| 日韩极品精品视频免费观看| 91爱爱小视频k| 国产精品入口日韩视频大尺度| 久久久成人精品视频| 国产成人亚洲综合91精品| 亚洲国产精品悠悠久久琪琪| 久久99视频免费| 亚洲伊人第一页| 亚洲午夜精品久久久久久性色| 欧美三级免费观看| 成人av.网址在线网站| 欧美主播福利视频| 亚洲女同精品视频| 国产精品视频播放| 97在线免费观看视频| 亚洲高清一区二| 国产三级精品网站| 日韩www在线| 一区二区三区四区在线观看视频| 久久久久久亚洲精品不卡| 大桥未久av一区二区三区| 成人午夜在线影院| 国产在线精品成人一区二区三区| 91精品中国老女人| 美乳少妇欧美精品| 日韩av影视在线| 久久精品免费播放| 国产精品久久久久久久久久东京| 中文字幕最新精品| 久久男人资源视频| 亚洲日韩第一页| 国产在线精品播放| 久久精品国产亚洲7777| 91精品久久久久久久久青青| 人人做人人澡人人爽欧美| 狠狠躁夜夜躁人人躁婷婷91| 激情久久av一区av二区av三区| 久久综合色88| 国产精品美女主播在线观看纯欲| 成人黄色激情网| 国产欧美 在线欧美| 一级做a爰片久久毛片美女图片| 91久久国产精品91久久性色| 亚洲电影免费观看高清完整版在线观看| 日韩在线www| 91精品国产色综合久久不卡98口| 亚洲精品午夜精品| 中文字幕在线成人| 欧美性视频精品| 狠狠躁夜夜躁人人爽超碰91| 精品久久久久人成| 欧美视频在线观看免费网址| 国产91精品久久久久久| 日韩中文视频免费在线观看| 成人xxxx视频| 日韩电影网在线| 亚洲电影免费观看| 国产日韩在线免费| 中文字幕亚洲一区二区三区五十路| 欧美成在线视频| 成人日韩在线电影| 日本久久中文字幕| 亚洲激情在线观看视频免费| 国产+成+人+亚洲欧洲| 亲爱的老师9免费观看全集电视剧| 日韩在线播放一区| 国产在线视频一区| 日韩成人在线视频网站| 欧美夜福利tv在线| 97精品欧美一区二区三区| 国产精品入口夜色视频大尺度| 国产成人avxxxxx在线看| 国产ts一区二区| 亚洲精品在线观看www| 亚洲免费视频在线观看| 欧美激情精品久久久久久变态| 综合136福利视频在线| 国产香蕉精品视频一区二区三区| 国产精品久久av| 日本精品免费一区二区三区| 国产欧美一区二区三区四区| 国内自拍欧美激情| 久久久国产精品亚洲一区| 亚洲免费av电影| 日本精品久久电影| 国产精品网站入口| 日韩中文字幕在线观看| 九九热这里只有精品免费看| 在线观看不卡av| 俺去啦;欧美日韩| 久久久999精品免费| 在线精品国产欧美| 国产亚洲一区二区精品| 亚洲国产精品99| 一区三区二区视频| 亚洲美女免费精品视频在线观看| 亚洲永久在线观看| 亚洲一级黄色av| 欧美日韩国产精品专区| 国产自摸综合网| 亚洲午夜未满十八勿入免费观看全集| 精品人伦一区二区三区蜜桃网站| 国产欧美亚洲视频| 国产精品美乳一区二区免费| 日韩电影第一页| 国产日韩欧美在线播放| 欧美xxxwww| 欧美激情视频网址| 九九九热精品免费视频观看网站| 国产香蕉97碰碰久久人人| 人人澡人人澡人人看欧美| 国产精品成人v| 成人乱人伦精品视频在线观看| 91精品综合久久久久久五月天| 日韩电影免费在线观看中文字幕| 欧美性生交xxxxx久久久| 日韩在线视频线视频免费网站| 日韩电影免费观看在线观看| 97在线视频免费| 国产成人精品在线视频| 欧美中文字幕视频在线观看| 亚洲最大福利视频网| 久久久久久久国产精品视频| 欧美影院成年免费版| 国产中文字幕日韩| 亚洲精品99久久久久中文字幕| 亚洲aⅴ男人的天堂在线观看| 欧美激情一区二区三级高清视频| 奇米一区二区三区四区久久| **欧美日韩vr在线| 国产精品久久久久久久久| 久久影院模特热| 国产日韩精品电影| 亚洲欧美成人精品| 欧美专区在线播放| 国产精品99导航| 国产日韩中文字幕在线| 日本久久精品视频| 欧美视频在线免费看| 久久免费少妇高潮久久精品99| 国内精品久久久久久中文字幕| 国产深夜精品福利| 91精品久久久久| 久久久成人精品| 91天堂在线观看| 亚洲欧美日韩天堂| 国产剧情久久久久久| 久久6精品影院| 国产精品入口尤物| 一区二区三区视频免费| 久久视频在线播放| 亚洲2020天天堂在线观看| 亚洲第一页在线| 欧美寡妇偷汉性猛交| 国产成人精品a视频一区www| 国产精品一区二区三区成人| 日韩在线小视频| 欧美一区二区大胆人体摄影专业网站| 欧美日韩国内自拍| 久久精品99无色码中文字幕| 欧美日韩国产二区| 97色在线观看|