Vue<自定義鼠標(biāo)指針效果>

效果圖:
mouseMove.gif

說實話,看到很多別的網(wǎng)站上的好的效果抛杨,就很想學(xué)够委!但是很多時候會發(fā)現(xiàn)自己無從下手 ??,此篇文章的效果也算是琢磨了兩天怖现,才知道原來是這么寫的茁帽,原來還挺簡單的。

首先屈嗤,你如果想實現(xiàn)一個標(biāo)簽跟隨鼠標(biāo)移動潘拨,這個效果其實并不難。但是當(dāng)你寫好之后恢共,會發(fā)現(xiàn)一些點擊和鼠標(biāo)移入效果战秋,無法實現(xiàn)了??(原因:因為跟隨的標(biāo)簽璧亚,往往會在內(nèi)容之上讨韭,所以你再怎么點擊也就是點擊的移動跟隨的那個標(biāo)簽脂信,壓根就點不到下面的標(biāo)簽~~~ 氣不氣??)

你可能會想到用(但是你又會發(fā)現(xiàn),每當(dāng)移入到點擊的標(biāo)簽上時透硝,跟隨鼠標(biāo)的那個標(biāo)簽不見了狰闪。因為你設(shè)置了圖層,所以它被壓在了最下面濒生,你肯定不想要這種效果~~)

z-index:-1;

用這個CSS屬性就能解決以上的糾結(jié)B癖谩!
(是不是很簡單罪治,但是往往在你不知道的情況下丽声,根本想不起來這個東西 ??)
還是看人家的效果,然后下載下來慢慢研究的 http://www.jq22.com/jquery-info22482

 pointer-events: none; //禁止選擇器方法

當(dāng)然觉义,簡單的解決上面的雁社,肯定遠(yuǎn)遠(yuǎn)不夠的,在學(xué)習(xí)當(dāng)中又發(fā)現(xiàn)了

 mix-blend-mode: difference; //背景混合

具體就是用在鼠標(biāo)移入時的效果晒骇,想深入了解的可以參考http://www.reibang.com/p/7a6fe5d29252

知識點:
1.e.screenX霉撵,e.clientX ,e.pageX三者的區(qū)別

screenX:鼠標(biāo)位置相對于用戶屏幕水平偏移量洪囤,而screenY也就是垂直方向的徒坡,此時的參照點也就是原點是屏幕的左上角。
clientX:跟screenX相比就是將參照點改成了瀏覽器內(nèi)容區(qū)域的左上角瘤缩,該參照點會隨之滾動條的移動而移動喇完。因此此處用的是 clientX
pageX:參照點也是瀏覽器內(nèi)容區(qū)域的左上角,但它不會隨著滾動條而變動.

下面就是我整體應(yīng)用起來的代碼了??

代碼如下:
<template>
  <div class="overall">
    <div class="mouseMove-dot" :style="`width:${dt_w}px;height:${dt_w}px`"></div>
    <div class="mouseMove-bck" :style="`width:${bk_w}px;height:${bk_w}px`"></div>
    <div id="box">
      <div class="box">HOVER</div>
      <span class="text">mouse</span>
    </div>
  </div>
</template>

<script>
import { TweenLite } from 'gsap'
export default {
  data() {
    return {
      w: window.innerWidth, //窗口寬
      h: window.innerHeight, //窗口高
      dt_w: 4, //小點寬高
      bk_w: 50 //圓框?qū)捀?    }
  },
  mounted() {
    //注意:此處針對樣式的放大款咖,是通過 TweenLite.to(bk, 0.3, { x: x軸, y: y軸, scale: 1.3 })何暮,而不是直接通過添加樣式 transform: scale();
    //因為 TweenLite 是相對于 transform:translate() 進行位置確定的,而不是 top,left
    //所以單純的修改 transform: scale() 會造成位置坐標(biāo)歸0
    this.MouseMove('.box', 'incursor-bck')
    this.MouseMove('.text', 'incursor-bck-text')
    this.MouseClick()
  },
  methods: {
    //鼠標(biāo)移動時相關(guān)樣式的添加 (el 為鼠標(biāo)移入的標(biāo)簽铐殃, cl 為鼠標(biāo)移入該標(biāo)簽內(nèi)更改鼠標(biāo)的樣式)
    MouseMove(el, cl) {
      let _this = this
      let dt = document.querySelector('.mouseMove-dot') //小點
      let bk = document.querySelector('.mouseMove-bck') //圓框
      let dt_w = _this.dt_w / 2 //小點 默認(rèn)位置偏移量
      let bk_w = _this.bk_w / 2 //圓框 默認(rèn)位置偏移量
      //監(jiān)聽鼠標(biāo)移動
      window.addEventListener('mousemove', function(e) {
        let x = e.clientX
        let y = e.clientY
        TweenLite.to(dt, 0.5, {
          ease: Back.easeOut.config(1.7),
          x: x - dt_w,
          y: y - dt_w
        })
        TweenLite.to(bk, 1, {
          ease: Back.easeOut.config(1.7),
          x: x - bk_w,
          y: y - bk_w
        })

        let o = document.querySelectorAll(el)
        for (let e = 0; e < o.length; e++)
          //移入定義標(biāo)簽時海洼,放大圓框
          (o[e].onmouseenter = function() {
            TweenLite.to(bk, 0.3, {
              x: x - bk_w,
              y: y - bk_w,
              scale: 1.3
            })
            dt.classList.add('incursor-dot') //隱藏小點
            bk.classList.add(cl) //給圓框添加樣式
          }),
            //移除定義標(biāo)簽時,恢復(fù)樣式
            (o[e].onmouseleave = function() {
              TweenLite.to(bk, 0.3, {
                x: x - bk_w,
                y: y - bk_w,
                scale: 1
              })
              dt.classList.remove('incursor-dot')
              bk.classList.remove(cl)
            })
        console.log(x, y)

        //當(dāng)鼠標(biāo)不在瀏覽器窗口范圍內(nèi)時富腊,隱藏起來
        if (_this.w <= x + 5 || _this.h <= y + 5 || x < 5 || y < 5) {
          dt.style.opacity = 0
          bk.style.opacity = 0
        } else {
          dt.style.opacity = 1
          bk.style.opacity = 1
        }
      })
    },
    //鼠標(biāo)點擊時坏逢,相關(guān)樣式的添加
    MouseClick() {
      let _this = this
      let dt = document.querySelector('.mouseMove-dot')
      let bk = document.querySelector('.mouseMove-bck')
      let dt_w = _this.dt_w / 2 //小點 默認(rèn)位置偏移量
      let bk_w = _this.bk_w / 2 //圓框 默認(rèn)位置偏移量
      window.addEventListener('mousedown', function(e) {
        let x = e.clientX
        let y = e.clientY
        //點擊時放大圓框
        TweenLite.to(bk, 0.3, {
          x: x - bk_w,
          y: y - bk_w,
          scale: 1.8
        })
        dt.classList.add('click-dot')
        bk.classList.add('click-bck')
      })
      window.addEventListener('mouseup', function(e) {
        let x = e.clientX
        let y = e.clientY
        //松開時恢復(fù)原來大小
        TweenLite.to(bk, 0.3, {
          x: x - bk_w,
          y: y - bk_w,
          scale: 1
        })
        dt.classList.remove('click-dot')
        bk.classList.remove('click-bck')
      })
    }
  }
}
</script>

<style lang="scss" scoped>
//消除鼠標(biāo)樣式
.overall {
  cursor: none;
}
.text {
  display: inline-block;
  font-size: 25px;
  font-weight: 200;
  padding: 20px;
  color: #77f3de;
}
.box {
  width: 200px;
  height: 200px;
  background: rgb(29, 192, 204);
  transition: 0.5s;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 30px;
  font-weight: bold;
  color: white;
  opacity: 0.8;
  &:hover {
    background: rgb(29, 204, 151);
  }
}
.mouseMove-dot,
.mouseMove-bck {
  user-select: none;
  pointer-events: none; //禁止選擇器方法
  mix-blend-mode: difference; //背景如何混合
  position: fixed;
  left: 0;
  top: 0;
  border-radius: 50%;
  z-index: 999;
  opacity: 0;
}
.mouseMove-dot {
  background: #686868;
  transform: translate(-50%, -50%);
  transition: opacity 0.3s;
}
.mouseMove-bck {
  border: 2px solid #575757;
  box-sizing: border-box;
  transform: translate(-50%, -50%);
  transition: border 0.3s, opacity 0.3s, background 0.5s;
}

// 鼠標(biāo)點擊樣式
.click-dot {
  opacity: 0;
}
.click-bck {
  border: 2px solid #77f3de;
}
//鼠標(biāo)移入樣式
.incursor-dot {
  background: transparent;
}
.incursor-bck {
  border: 2px solid transparent;
  background: #fff;
}
.incursor-bck-text {
  border: 2px solid transparent;
  background: rgb(240, 221, 113);
}
</style>

給大家推薦幾個素材網(wǎng)站:
http://www.jq22.com/ ??各種插件,功能等(建議主 + )
https://greensock.com/showcase/ ??各種大佬整的網(wǎng)頁效果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赘被,一起剝皮案震驚了整個濱河市是整,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌民假,老刑警劉巖浮入,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異羊异,居然都是意外死亡事秀,警方通過查閱死者的電腦和手機彤断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來易迹,“玉大人宰衙,你說我怎么就攤上這事《糜” “怎么了供炼?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窘疮。 經(jīng)常有香客問我袋哼,道長,這世上最難降的妖魔是什么闸衫? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任先嬉,我火速辦了婚禮,結(jié)果婚禮上楚堤,老公的妹妹穿的比我還像新娘疫蔓。我一直安慰自己,他們只是感情好身冬,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布衅胀。 她就那樣靜靜地躺著,像睡著了一般酥筝。 火紅的嫁衣襯著肌膚如雪滚躯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天嘿歌,我揣著相機與錄音掸掏,去河邊找鬼。 笑死宙帝,一個胖子當(dāng)著我的面吹牛丧凤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播步脓,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼愿待,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了靴患?” 一聲冷哼從身側(cè)響起仍侥,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸳君,沒想到半個月后农渊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡或颊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年砸紊,在試婚紗的時候發(fā)現(xiàn)自己被綠了况脆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡批糟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出看铆,到底是詐尸還是另有隱情徽鼎,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布否淤,位于F島的核電站,受9級特大地震影響啰扛,放射性物質(zhì)發(fā)生泄漏隐解。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钦扭。 院中可真熱鬧土全,春花似錦裹匙、人聲如沸概页。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鸠真。三九已至,卻和暖如春祭隔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背程奠。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工慌核, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垮卓,地道東北人诬滩。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吴攒。 傳聞我的和親對象是個殘疾皇子洼怔,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355