日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Vue3 實(shí)現(xiàn)最近很火的酷炫功能:卡片懸浮發(fā)光

來源: 責(zé)編: 時(shí)間:2024-05-22 17:14:11 224觀看
導(dǎo)讀有趣的動(dòng)畫效果前幾天在網(wǎng)上看到了一個(gè)很有趣的動(dòng)畫效果,如下,光會(huì)跟隨鼠標(biāo)在卡片上進(jìn)行移動(dòng),并且卡片會(huì)有視差的效果。那么在 Vue3 中應(yīng)該如何去實(shí)現(xiàn)這個(gè)效果呢?圖片基本實(shí)現(xiàn)思路其實(shí)實(shí)現(xiàn)思路很簡(jiǎn)單,無非就是分幾步:首先,卡

有趣的動(dòng)畫效果

前幾天在網(wǎng)上看到了一個(gè)很有趣的動(dòng)畫效果,如下,光會(huì)跟隨鼠標(biāo)在卡片上進(jìn)行移動(dòng),并且卡片會(huì)有視差的效果。cN328資訊網(wǎng)——每日最新資訊28at.com

那么在 Vue3 中應(yīng)該如何去實(shí)現(xiàn)這個(gè)效果呢?cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

基本實(shí)現(xiàn)思路

其實(shí)實(shí)現(xiàn)思路很簡(jiǎn)單,無非就是分幾步:cN328資訊網(wǎng)——每日最新資訊28at.com

  • 首先,卡片是相對(duì)定位,光是絕對(duì)定位
  • 監(jiān)聽卡片的鼠標(biāo)移入事件mouseenter,當(dāng)鼠標(biāo)進(jìn)入時(shí)顯示光
  • 監(jiān)聽卡片的鼠標(biāo)移動(dòng)事件mouseover,鼠標(biāo)移動(dòng)時(shí)修改光的left、top,讓光跟隨鼠標(biāo)移動(dòng)
  • 監(jiān)聽卡片的鼠標(biāo)移出事件mouseleave,鼠標(biāo)移出時(shí),隱藏光

我們先在 Index.vue 中準(zhǔn)備一個(gè)卡片頁面,光的CSS效果可以使用filter: blur() 來實(shí)現(xiàn)。cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

可以看到現(xiàn)在的效果是這樣:cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

實(shí)現(xiàn)光源跟隨鼠標(biāo)

在實(shí)現(xiàn)之前我們需要注意幾點(diǎn):cN328資訊網(wǎng)——每日最新資訊28at.com

1、鼠標(biāo)移入時(shí)需要設(shè)置卡片 overflow: hidden,否則光會(huì)溢出,而鼠標(biāo)移出時(shí)記得還原。cN328資訊網(wǎng)——每日最新資訊28at.com

2、獲取鼠標(biāo)坐標(biāo)時(shí)需要用clientX/Y而不是pageX/Y,因?yàn)榍罢邥?huì)把頁面滾動(dòng)距離也算進(jìn)去,比較嚴(yán)謹(jǐn)。cN328資訊網(wǎng)——每日最新資訊28at.com

剛剛說到實(shí)現(xiàn)思路時(shí)我們說到了mouseenter、mousemove、mouseleave,其實(shí)mouseenter、mouseleave 這二者的邏輯比較簡(jiǎn)單,重點(diǎn)是 mouseover 這個(gè)監(jiān)聽函數(shù)。cN328資訊網(wǎng)——每日最新資訊28at.com

而在 mouseover 這個(gè)函數(shù)中,最重要的邏輯就是:光怎么跟隨鼠標(biāo)移動(dòng)呢?cN328資訊網(wǎng)——每日最新資訊28at.com

或者也可以這么說:怎么計(jì)算光相對(duì)于卡片盒子的 left 和 top。cN328資訊網(wǎng)——每日最新資訊28at.com

對(duì)此我專門畫了一張圖,相信大家一看就懂怎么算了。cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

  • left = clientX - x - width/2
  • height = clientY - y - height/2

知道了怎么計(jì)算,那么邏輯的實(shí)現(xiàn)也很明了了~封裝一個(gè)use-light-card.ts:cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

接著在頁面中去使用:cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

這樣就能實(shí)現(xiàn)基本的效果啦~cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

卡片視差效果

卡片的視差效果需要用到樣式中 transform 樣式,主要是配置四個(gè)東西:cN328資訊網(wǎng)——每日最新資訊28at.com

  • perspective:定義元素在 3D 變換時(shí)的透視效果
  • rotateX:X 軸旋轉(zhuǎn)角度
  • rotateY:Y 軸旋轉(zhuǎn)角度
  • scale3d:X/Y/Z 軸上的縮放比例

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在就有了卡片視差的效果啦~cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

給所有卡片添加光源

上面只是給一個(gè)卡片增加光源,接下來可以給每一個(gè)卡片都增加光源啦!!!cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

讓光源變成可配置

上面的代碼,總感覺這個(gè) hooks 耦合度太高不太通用,所以我們可以讓光源變成可配置化,這樣每個(gè)卡片就可以展示不同大小、顏色的光源了~像下面一樣。cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

既然是配置化,那我們希望是這么去使用 hooks 的,我們并不需要自己在頁面中去寫光源的dom節(jié)點(diǎn),也不需要自己去寫光源的樣式,而是通過配置傳入 hooks 中。cN328資訊網(wǎng)——每日最新資訊28at.com

圖片cN328資訊網(wǎng)——每日最新資訊28at.com

所以 hooks 內(nèi)部要自己通過操作 DOM 的方式,去添加、刪除光源,可以使用createElement、appendChild、removeChild 去做這些事~。cN328資訊網(wǎng)——每日最新資訊28at.com

圖片圖片cN328資訊網(wǎng)——每日最新資訊28at.com

完整源碼

<!-- Index.vue --><template>  <div class="container">    <!-- 方塊盒子 -->    <div class="item" ref="cardRef1"></div>    <!-- 方塊盒子 -->    <div class="item" ref="cardRef2"></div>    <!-- 方塊盒子 -->    <div class="item" ref="cardRef3"></div>  </div></template><script setup lang="ts">import { useLightCard } from './use-light-card';const { cardRef: cardRef1 } = useLightCard();const { cardRef: cardRef2 } = useLightCard({  light: {    color: '#ffffff',    width: 100,  },});const { cardRef: cardRef3 } = useLightCard({  light: {    color: 'yellow',  },});</script><style scoped lang="less">.container {  background: black;  width: 100%;  height: 100%;  padding: 200px;  display: flex;  justify-content: space-between;  .item {    position: relative;    width: 125px;    height: 125px;    background: #1c1c1f;    border: 1px solid rgba(255, 255, 255, 0.1);  }}</style>
// use-light-card.tsimport { onMounted, onUnmounted, ref } from 'vue';interface IOptions {  light?: {    width?: number; // 寬    height?: number; // 高    color?: string; // 顏色    blur?: number; // filter: blur()  };}export const useLightCard = (option: IOptions = {}) => {  // 獲取卡片的dom節(jié)點(diǎn)  const cardRef = ref<HTMLDivElement | null>(null);  let cardOverflow = '';  // 光的dom節(jié)點(diǎn)  const lightRef = ref<HTMLDivElement>(document.createElement('div'));  // 設(shè)置光源的樣式  const setLightStyle = () => {    const { width = 60, height = 60, color = '#ff4132', blur = 40 } = option.light ?? {};    const lightDom = lightRef.value;    lightDom.style.position = 'absolute';    lightDom.style.width = `${width}px`;    lightDom.style.height = `${height}px`;    lightDom.style.background = color;    lightDom.style.filter = `blur(${blur}px)`;  };  // 設(shè)置卡片的 overflow 為 hidden  const setCardOverflowHidden = () => {    const cardDom = cardRef.value;    if (cardDom) {      cardOverflow = cardDom.style.overflow;      cardDom.style.overflow = 'hidden';    }  };  // 還原卡片的 overflow  const restoreCardOverflow = () => {    const cardDom = cardRef.value;    if (cardDom) {      cardDom.style.overflow = cardOverflow;    }  };  // 往卡片添加光源  const addLight = () => {    const cardDom = cardRef.value;    if (cardDom) {      cardDom.appendChild(lightRef.value);    }  };  // 刪除光源  const removeLight = () => {    const cardDom = cardRef.value;    if (cardDom) {      cardDom.removeChild(lightRef.value);    }  };  // 監(jiān)聽卡片的鼠標(biāo)移入  const onMouseEnter = () => {    // 添加光源    addLight();    setCardOverflowHidden();  };  // use-light-card.ts  // 監(jiān)聽卡片的鼠標(biāo)移動(dòng)  const onMouseMove = (e: MouseEvent) => {    // 獲取鼠標(biāo)的坐標(biāo)    const { clientX, clientY } = e;    // 讓光跟隨鼠標(biāo)    const cardDom = cardRef.value;    const lightDom = lightRef.value;    if (cardDom) {      // 獲取卡片相對(duì)于窗口的x和y坐標(biāo)      const { x, y } = cardDom.getBoundingClientRect();      // 獲取光的寬高      const { width, height } = lightDom.getBoundingClientRect();      lightDom.style.left = `${clientX - x - width / 2}px`;      lightDom.style.top = `${clientY - y - height / 2}px`;      //   設(shè)置動(dòng)畫效果      const maxXRotation = 10; // X 軸旋轉(zhuǎn)角度      const maxYRotation = 10; // Y 軸旋轉(zhuǎn)角度      const rangeX = 200 / 2; // X 軸旋轉(zhuǎn)的范圍      const rangeY = 200 / 2; // Y 軸旋轉(zhuǎn)的范圍      const rotateX = ((clientX - x - rangeY) / rangeY) * maxXRotation; // 根據(jù)鼠標(biāo)在 Y 軸上的位置計(jì)算繞 X 軸的旋轉(zhuǎn)角度      const rotateY = -1 * ((clientY - y - rangeX) / rangeX) * maxYRotation; // 根據(jù)鼠標(biāo)在 X 軸上的位置計(jì)算繞 Y 軸的旋轉(zhuǎn)角度      cardDom.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`; //設(shè)置 3D 透視    }  };  // 監(jiān)聽卡片鼠標(biāo)移出  const onMouseLeave = () => {    // 鼠標(biāo)離開移出光源    removeLight();    restoreCardOverflow();  };  onMounted(() => {    // 設(shè)置光源樣式    setLightStyle();    // 綁定事件    cardRef.value?.addEventListener('mouseenter', onMouseEnter);    cardRef.value?.addEventListener('mousemove', onMouseMove);    cardRef.value?.addEventListener('mouseleave', onMouseLeave);  });  onUnmounted(() => {    // 解綁事件    cardRef.value?.removeEventListener('mouseenter', onMouseEnter);    cardRef.value?.removeEventListener('mousemove', onMouseMove);    cardRef.value?.removeEventListener('mouseleave', onMouseLeave);  });  return {    cardRef,  };};

cN328資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-90040-0.htmlVue3 實(shí)現(xiàn)最近很火的酷炫功能:卡片懸浮發(fā)光

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python 并發(fā)編程的 12 個(gè)實(shí)用技巧

下一篇: ViewRootImpl如何負(fù)責(zé)管理繪制視圖樹和刷新界面

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場(chǎng)的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號(hào)為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號(hào)的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 7月安卓手機(jī)性價(jià)比榜:努比亞+紅魔兩款新機(jī)入榜

    7月登場(chǎng)的新機(jī)有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產(chǎn)品,而且努比亞和紅魔也一貫有著不錯(cuò)的性價(jià)比,所以在本次的性價(jià)比榜單
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場(chǎng)風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時(shí)間,進(jìn)入8月份之
  • SpringBoot中使用Cache提升接口性能詳解

    環(huán)境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對(duì) Spring 應(yīng)用程序提供了透明式添加緩存的支持。和事務(wù)支持一樣,抽象緩存允許一致地使用各
  • 這款新興工具平臺(tái),讓你的電腦效率翻倍

    隨著信息技術(shù)的發(fā)展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個(gè)瓶頸。于是各種工具應(yīng)運(yùn)而生,都在爭(zhēng)相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯(lián)網(wǎng)那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 華為HarmonyOS 4升級(jí)計(jì)劃公布:首批34款機(jī)型今日開啟公測(cè)

    8月4日消息,今天下午華為正式發(fā)布了HarmonyOS 4系統(tǒng),在更流暢的前提下,還帶來了不少新功能,UI設(shè)計(jì)也有變化,會(huì)讓手機(jī)煥然一新。華為宣布,首批機(jī)型將會(huì)在
  • iQOO Neo8系列或定檔5月23日:首發(fā)天璣9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列機(jī)型,不僅搭載了天璣9000+,而且是同價(jià)位唯一一款天璣9000+直屏旗艦,一經(jīng)上市便受到了用戶的廣泛關(guān)注。在時(shí)隔半年后,
  • 電博會(huì)與軟博會(huì)實(shí)現(xiàn)"線下+云端"的雙線融合

    在本次“電博會(huì)”與“軟博會(huì)”雙展會(huì)利好條件的加持下,既可以發(fā)揮展會(huì)拉動(dòng)人流、信息流、資金流實(shí)現(xiàn)快速交互流動(dòng)的作用,繼而推動(dòng)區(qū)域經(jīng)濟(jì)良性發(fā)展;又可以聚
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
99精品国产福利在线观看免费| 国产自产2019最新不卡| 欧美高清不卡| 欧美激情导航| 国产精品福利在线观看网址| 国产精品一区二区在线观看不卡| 国产一区二区按摩在线观看| 亚洲黄色性网站| 亚洲一级高清| 久久久久久成人| 欧美日韩伦理在线免费| 国产精品欧美久久| 一区精品在线| 一区二区三区成人精品| 久久狠狠亚洲综合| 欧美精品一区二区精品网| 国产精品美女久久久| 精品动漫3d一区二区三区免费 | 亚洲精品一区在线| 亚洲自拍偷拍福利| 久久人人看视频| 欧美日韩一区成人| 黄色成人精品网站| 亚洲视频欧美视频| 久久久久国产精品午夜一区| 欧美精品系列| 国产自产女人91一区在线观看| 日韩一区二区免费看| 久久国产黑丝| 欧美涩涩网站| 亚洲国产99| 欧美在线看片a免费观看| 欧美国产日韩精品| 国产亚洲精品bt天堂精选| 亚洲精品一区中文| 久久精品欧美| 国产精品海角社区在线观看| 亚洲电影免费| 欧美中文字幕第一页| 欧美日韩一区免费| 亚洲国产中文字幕在线观看| 久久av一区二区| 国产精品久久久一本精品| 亚洲国产一区二区三区在线播 | 亚洲欧洲精品一区二区三区| 欧美在线一级视频| 欧美午夜不卡影院在线观看完整版免费| 韩国一区二区三区美女美女秀| 亚洲视频中文字幕| 欧美激情视频在线播放| 国内伊人久久久久久网站视频| 亚洲深夜av| 欧美精品一区二区三区高清aⅴ| 极品中文字幕一区| 欧美在线视频全部完| 国产精品久久久久久久免费软件| 亚洲人成人77777线观看| 久久久久久香蕉网| 国产视频综合在线| 亚洲欧美综合| 国产精品xxx在线观看www| 99精品欧美一区二区蜜桃免费| 免费在线观看精品| 精久久久久久| 久久精品99国产精品| 国产精品自拍网站| 亚洲一区二区三区在线视频| 欧美日韩免费高清| 亚洲免费观看高清完整版在线观看熊 | 国产一区久久| 欧美在线观看一区二区三区| 国产精品一国产精品k频道56| 亚洲色诱最新| 国产精品第一区| 亚洲一区二区影院| 国产精品理论片| 夜夜嗨av一区二区三区四区| 欧美日本高清视频| 亚洲美女黄色| 欧美日韩日日骚| 一区二区三区黄色| 欧美性片在线观看| 亚洲一区精品在线| 国产精品揄拍500视频| 欧美影院成年免费版| 国产一区二区三区久久| 久久精品99国产精品酒店日本| 国产一区二区三区自拍| 久久免费视频一区| 亚洲福利视频网站| 欧美激情一区二区三区高清视频| 91久久中文字幕| 欧美另类极品videosbest最新版本| 日韩一级视频免费观看在线| 欧美视频日韩| 午夜精品视频在线| 狠狠88综合久久久久综合网| 猫咪成人在线观看| 亚洲精品一区二区三区蜜桃久| 欧美日韩亚洲综合| 亚洲欧美视频在线观看| 韩国精品一区二区三区| 女仆av观看一区| 一区二区久久| 国产精品一区在线观看你懂的 | 国产精品理论片| 欧美影院久久久| 在线播放不卡| 欧美日本一区二区高清播放视频| 亚洲视频欧美视频| 国产亚洲精品高潮| 毛片一区二区三区| 99精品视频免费| 国产欧美日韩在线播放| 久久婷婷国产综合精品青草| 91久久国产综合久久| 欧美视频在线观看视频极品 | 欧美国产91| 亚洲视频在线二区| 国产午夜精品美女视频明星a级| 久久三级视频| 99亚洲一区二区| 国产欧美日韩三级| 老司机午夜精品视频在线观看| 一本色道久久88综合亚洲精品ⅰ | 国产精品大片| 久久久精品一品道一区| 亚洲精选一区| 国产区精品视频| 欧美激情网友自拍| 亚洲欧美影院| 91久久精品国产91久久性色tv| 国产精品国产三级国产aⅴ浪潮 | 久久精品二区亚洲w码| 亚洲精品欧洲精品| 国产女精品视频网站免费| 欧美成年网站| 欧美一区二区黄| 亚洲精品乱码久久久久久按摩观| 国产精品―色哟哟| 欧美.www| 欧美一级视频| 一区二区三区导航| 精东粉嫩av免费一区二区三区| 欧美日韩一区二区在线观看视频| 久久久久久久精| 亚洲在线观看| 亚洲欧洲视频在线| 国产亚洲欧美日韩美女| 欧美日韩国产免费观看| 久久乐国产精品| 亚洲一区二区影院| 亚洲欧洲偷拍精品| 国产亚洲一区二区三区在线观看| 欧美日本一道本| 久久露脸国产精品| 午夜精品在线看| 在线综合亚洲欧美在线视频| 亚洲成人自拍视频| 国产日韩精品一区二区三区| 欧美日韩精品高清| 美女91精品| 欧美在线观看视频在线| 在线亚洲精品| 亚洲美女免费精品视频在线观看| 韩国av一区二区三区| 国产美女精品免费电影| 欧美日韩国产另类不卡| 欧美成人午夜激情| 久久久久久久久久久久久9999| 亚洲专区欧美专区| 一区二区欧美激情| 亚洲高清123| 黄色在线一区| 国产午夜精品久久久| 国产精品午夜视频| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 久久精品国产v日韩v亚洲| 亚洲综合色网站| 亚洲天堂第二页| 99国产精品久久久久久久| 亚洲精品1区2区| 亚洲电影在线免费观看| 国自产拍偷拍福利精品免费一| 国产亚洲一级| 国产一区二区黄色| 国产亚洲女人久久久久毛片| 国产精品男女猛烈高潮激情| 欧美日韩一区二区三区视频| 欧美成人亚洲成人| 欧美 日韩 国产 一区| 久久综合久久综合这里只有精品 | 欧美高潮视频| 欧美成人免费大片| 欧美大片va欧美在线播放| 牛牛国产精品| 欧美wwwwww| 欧美护士18xxxxhd| 欧美黄色片免费观看| 欧美成人久久| 欧美精品成人在线| 欧美人妖在线观看| 欧美视频四区| 国产精品捆绑调教|