最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript實現(xiàn)類似拉勾網(wǎng)的鼠標移入移出效果

 更新時間:2016年10月27日 14:18:31   投稿:daisy  
其實也是個偶然的機會讓我想去研究一下這個效果。主要是由于有個群里的人發(fā)了個講解這個效果的鏈接,當時也沒怎么在意,然后過兩天,突然就想起這件事,便去拉勾網(wǎng)一看,效果不錯啊,所以就自己研究起來,現(xiàn)在將過程分享給大家,有需要的可以參考借鑒。

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

 

實現(xiàn)思路

 HTML結構

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

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

    div作為動畫執(zhí)行的載體。

CSS

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

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

JS

    1、采用JS操縱CSS3 transition動畫

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

鼠標坐標的相關知識

MouseEvent對象

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

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

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

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

    獲取某個元素內(nèi)部的坐標

  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參數(shù): obj: 運動的對象 speed: 運動的持續(xù)時間(可選) changeStyle: 改變的屬性,這里可能多個,所以采用函數(shù)的方式(可選) callback: 回調函數(shù)(可選) */
  function animation(options){
    if(!options.obj) {
      return false;
    }
    //設置默認持續(xù)時間
    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在每個屬性的動畫執(zhí)行完多會走一遍,所以我們要讓它只執(zhí)行一次。
      if(!flag) {

        options.callback && options.callback();
      }
    },false);
  }

如何確定方向

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

 

得到元素的運動方向

  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中的參數(shù): 觸發(fā)事件的載體: targetElement 執(zhí)行動畫的載體: 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);
      //取消過渡動畫(防止重置動畫載體位置時觸發(fā)過渡效果)
      _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;
      }
      //異步執(zhí)行
      _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);

  }

總結

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

相關文章

  • 使用js簡單實現(xiàn)了tree樹菜單

    使用js簡單實現(xiàn)了tree樹菜單

    使用js簡單實現(xiàn)了樹菜單!具體實現(xiàn)實例代碼如下,相信自己你一定可以實現(xiàn)的更好
    2013-11-11
  • js實現(xiàn)移動端圖片滑塊驗證功能

    js實現(xiàn)移動端圖片滑塊驗證功能

    這篇文章主要為大家詳細介紹了js實現(xiàn)移動端圖片滑塊驗證功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • JavaScript中實現(xiàn)Sleep功能及其應用的幾種方法

    JavaScript中實現(xiàn)Sleep功能及其應用的幾種方法

    這篇文章主要介紹了在JavaScript中實現(xiàn)sleep功能的幾種方法,包括使用Promise和setTimeout、async/await、Generator函數(shù)以及Node.js環(huán)境中的Atomics.wait,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • 最簡單的JavaScript圖片輪播代碼(兩種方法)

    最簡單的JavaScript圖片輪播代碼(兩種方法)

    基于javascript代碼實現(xiàn)最簡單的圖片輪播效果,非常簡單,本文通過兩種方式給大家介紹最簡單的圖片輪播,感興趣的朋友一起學習吧
    2015-12-12
  • JS中for...in?和?for...of?的區(qū)別解析

    JS中for...in?和?for...of?的區(qū)別解析

    for?…?in?用于迭代對象的可枚舉字符串屬性,包括自身屬性和繼承的屬性,但不會遍歷對象的原型鏈上的?非可枚舉屬性,以及對象的方法,這篇文章主要介紹了JS中for...in?和?for...of?的區(qū)別,需要的朋友可以參考下
    2024-03-03
  • 細品javascript 尋址,閉包,對象模型和相關問題

    細品javascript 尋址,閉包,對象模型和相關問題

    似乎某些程序員的集合是不相交的,就好像JS程序員和玩編譯原理和CPU指令的匯編程序員就幾乎沒有交叉。前些日子討論的火熱的“作用域鏈”問題,說白了就是尋址問題,不過,這個在C中十分簡單的問題卻被JS這個動態(tài)語言弄得很復雜。
    2009-04-04
  • 微信禁止下拉查看URL的處理方法

    微信禁止下拉查看URL的處理方法

    這篇文章主要介紹了微信禁止下拉查看URL的處理方法,需要的朋友可以參考下
    2017-09-09
  • 小程序實現(xiàn)瀑布流動態(tài)加載列表

    小程序實現(xiàn)瀑布流動態(tài)加載列表

    這篇文章主要為大家詳細介紹了小程序實現(xiàn)瀑布流動態(tài)加載列表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 如何通過Proxy實現(xiàn)JSBridge模塊化封裝

    如何通過Proxy實現(xiàn)JSBridge模塊化封裝

    這篇文章主要介紹了如何通過Proxy實現(xiàn)JSBridge模塊化封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 基于javascript實現(xiàn)判斷移動終端瀏覽器版本信息

    基于javascript實現(xiàn)判斷移動終端瀏覽器版本信息

    這篇文章主要介紹了基于javascript實現(xiàn)判斷移動終端瀏覽器版本信息,需要的朋友可以參考下
    2014-12-12

最新評論

灵寿县| 客服| 惠安县| 福鼎市| 聂荣县| 海伦市| 邵阳县| 陕西省| 宝应县| 宜黄县| 广东省| 九江市| 张家港市| 汕头市| 罗田县| 玉林市| 天峨县| 新化县| 广丰县| 九台市| 昌平区| 大理市| 昭通市| 铅山县| 务川| 南郑县| 合川市| 邹城市| 邯郸市| 潞西市| 新建县| 两当县| 左贡县| 富锦市| 孟村| 湘潭县| 综艺| 通江县| 铁岭市| 灌阳县| 长白|