国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端開發(fā)攻略---Vue通過自定義指令實(shí)現(xiàn)元素平滑上升的動(dòng)畫效果(可以自定義動(dòng)畫時(shí)間、動(dòng)畫效果、動(dòng)畫速度等等)。

這篇具有很好參考價(jià)值的文章主要介紹了前端開發(fā)攻略---Vue通過自定義指令實(shí)現(xiàn)元素平滑上升的動(dòng)畫效果(可以自定義動(dòng)畫時(shí)間、動(dòng)畫效果、動(dòng)畫速度等等)。。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1、演示

前端開發(fā)攻略---Vue通過自定義指令實(shí)現(xiàn)元素平滑上升的動(dòng)畫效果(可以自定義動(dòng)畫時(shí)間、動(dòng)畫效果、動(dòng)畫速度等等)。,前端開發(fā)攻略,vue.js,javascript,前端

2、介紹

這個(gè)指令不是原生自帶的,需要手動(dòng)去書寫,但是這輩子只需要編寫這一次就好了,后邊可以反復(fù)利用。

3、關(guān)鍵API

IntersectionObserver?

IntersectionObserver 是一個(gè)用于監(jiān)測(cè)元素是否進(jìn)入或離開視口(viewport)的 API。它可以幫助你在頁面滾動(dòng)時(shí)或者元素位置改變時(shí)進(jìn)行回調(diào)操作,這樣你就可以根據(jù)元素是否可見來觸發(fā)動(dòng)作或者動(dòng)畫效果。

使用 IntersectionObserver 的基本步驟如下:

  1. 創(chuàng)建一個(gè) IntersectionObserver 對(duì)象,并指定一個(gè)回調(diào)函數(shù)。這個(gè)回調(diào)函數(shù)會(huì)在被觀察的元素進(jìn)入或離開視口時(shí)被調(diào)用。

  2. 使用 observe() 方法開始觀察指定的元素。你可以同時(shí)觀察多個(gè)元素。

  3. 在回調(diào)函數(shù)中處理元素的可見狀態(tài)變化。根據(jù)元素的可見性狀態(tài)來執(zhí)行相應(yīng)的操作,比如觸發(fā)動(dòng)畫、加載內(nèi)容等。

  4. 在不需要觀察元素時(shí),使用 unobserve() 方法停止觀察。

以下是一個(gè)簡(jiǎn)單的示例代碼,演示了如何使用 IntersectionObserver 來監(jiān)測(cè)元素的可見性:文章來源地址http://www.zghlxwxcb.cn/news/detail-848200.html

// 創(chuàng)建一個(gè) IntersectionObserver 對(duì)象
const observer = new IntersectionObserver((entries) => {
  // 遍歷觀察到的所有元素
  entries.forEach(entry => {
    // 如果當(dāng)前元素進(jìn)入視口
    if (entry.isIntersecting) {
      // 執(zhí)行相應(yīng)的操作,比如觸發(fā)動(dòng)畫
      entry.target.classList.add('animate');
      // 停止觀察當(dāng)前元素,可根據(jù)需求決定是否停止觀察
      observer.unobserve(entry.target);
    }
  });
});

// 要觀察的目標(biāo)元素
const targetElement = document.querySelector('.target');

// 開始觀察目標(biāo)元素
observer.observe(targetElement);

4、Vue文件代碼

<template>
  <div class="container">
    <div v-slide-in class="item" v-for="item in 10">{{ item }}</div>
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'
</script>

<style scoped lang="scss">
.container {
  width: 100%;
  display: flex;
  flex-direction: column;
  align-items: center;
}
.item {
  width: 50%;
  height: 200px;
  margin-bottom: 20px;
  text-align: center;
  line-height: 200px;
  font-size: 50px;
  color: #fff;
  box-shadow: rgba(0, 0, 0, 0.5) 0px 0px 10px 0px;
}
.item:nth-child(1) {
  background-color: rgb(87, 139, 19);
}
.item:nth-child(2) {
  background-color: rgb(33, 139, 19);
}
.item:nth-child(3) {
  background-color: rgb(139, 19, 35);
}
.item:nth-child(4) {
  background-color: rgb(139, 19, 87);
}
.item:nth-child(5) {
  background-color: rgb(139, 19, 135);
}
.item:nth-child(6) {
  background-color: rgb(91, 19, 139);
}
.item:nth-child(7) {
  background-color: rgb(19, 133, 139);
}
.item:nth-child(8) {
  background-color: rgb(221, 218, 40);
}
.item:nth-child(9) {
  background-color: rgb(173, 139, 115);
}
.item:nth-child(10) {
  background-color: rgb(29, 28, 27);
}
</style>

5、指令文件及代碼注釋(清晰明了)

// WeakMap是一種鍵值對(duì)的集合
// 這里用來將一個(gè)dom元素和一種動(dòng)畫對(duì)應(yīng)起來
const map = new WeakMap()

// 創(chuàng)建一個(gè)觀察對(duì)象
const ob = new IntersectionObserver(entries => {
  // 遍歷所有被觀察的元素 entries為一個(gè)數(shù)組
  for (const entry of entries) {
    // 判斷該元素是否與視口相交(出現(xiàn)在視口里面了)
    if (entry.isIntersecting) {
      // 判斷目標(biāo)元素是出現(xiàn)在上視口還是下視口
      if (entry.boundingClientRect.top > entry.rootBounds.top) {
        // 找出這個(gè)元素對(duì)應(yīng)的動(dòng)畫
        const animation = map.get(entry.target)
        if (animation) {
          // 播放該元素的動(dòng)畫
          animation.play()
        }
      }
    }
  }
})
// 輔助函數(shù),用來判斷頁面上的元素是否在視口外
function isBelowViewport(el) {
  const rect = el.getBoundingClientRect()
  return rect.top > window.innerHeight
}

export default function (app) {
  app.directive('slideIn', {
    mounted(el, bindings) {
      // 如果元素已經(jīng)在視口內(nèi)了,直接return 不加動(dòng)畫
      if (!isBelowViewport(el)) return
      //  創(chuàng)建一個(gè)動(dòng)畫  animate是Vue自帶的
      const animation = el.animate(
        [
          // 數(shù)組的每一個(gè)對(duì)象都表示關(guān)鍵幀 相當(dāng)于css中的 @keyframes 這里想寫多少個(gè)就寫多少個(gè)
          {
            transform: `translateY(${200}px)`,
          },
          {
            transform: `translateY(0px)`,
          },
        ],
        // duration:執(zhí)行時(shí)間  easing:動(dòng)畫效果,fill:動(dòng)畫結(jié)束過后的行為  這些跟css中的一樣
        { duration: 1000, easing: 'ease-in-out', fill: 'forwards' }
      )
      // 一開始的時(shí)候讓動(dòng)畫暫停,這里只是先定義好
      animation.pause()
      // 當(dāng)元素進(jìn)入視口的時(shí)候在進(jìn)行動(dòng)畫播放
      ob.observe(el)
      // 存儲(chǔ)鍵值
      map.set(el, animation)
    },
    // 在元素卸載時(shí),取消觀察
    unmounted(el) {
      ob.unobserve(el)
    },
  })
}

到了這里,關(guān)于前端開發(fā)攻略---Vue通過自定義指令實(shí)現(xiàn)元素平滑上升的動(dòng)畫效果(可以自定義動(dòng)畫時(shí)間、動(dòng)畫效果、動(dòng)畫速度等等)。的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • vue前端開發(fā)中,通過vue.config.js配置和nginx配置,實(shí)現(xiàn)多個(gè)入口文件的實(shí)現(xiàn)方法

    由于vue為單頁面項(xiàng)目,通過控制組件局部渲染,main.js是整個(gè)項(xiàng)目唯一的入口,整個(gè)項(xiàng)目都在一個(gè)index.html外殼中。 若項(xiàng)目過大,會(huì)造成單頁面負(fù)載過重;同時(shí),多頁面利于模塊獨(dú)立部署。 如果項(xiàng)目中不同的頁面需要不同的main.js和App.vue這樣就需要配置多個(gè)入口了。 要單獨(dú)將頁

    2024年01月22日
    瀏覽(31)
  • Vue自定義指令-讓你的業(yè)務(wù)開發(fā)更簡(jiǎn)單

    Vue自定義指令-讓你的業(yè)務(wù)開發(fā)更簡(jiǎn)單

    在日常開發(fā)中,我們會(huì)將重復(fù)代碼抽象為一個(gè)函數(shù)或者組件,然后在需要時(shí)調(diào)用或者引入。但是,對(duì)于某些功能,這種方法可能不夠優(yōu)雅或者不夠靈活。例如,我們可能需要在DOM元素上添加一些自定義屬性或者綁定一些事件,這些操作可能難以通過函數(shù)或組件來實(shí)現(xiàn)。這時(shí),

    2024年02月08日
    瀏覽(22)
  • 實(shí)現(xiàn)圖片點(diǎn)擊切換、通過classList修改樣式、操作表單元素屬性、自定義屬性
  • 前端開發(fā)攻略---實(shí)現(xiàn)與ChatGPT同款光標(biāo)閃爍打字效果。

    前端開發(fā)攻略---實(shí)現(xiàn)與ChatGPT同款光標(biāo)閃爍打字效果。

    創(chuàng)建一個(gè)空字符串? strp ?用于存儲(chǔ)逐字打印的文本內(nèi)容,以及一個(gè)計(jì)數(shù)器? i ?用于跟蹤當(dāng)前打印到的字符的索引。 編寫? print1() ?函數(shù),該函數(shù)負(fù)責(zé)實(shí)現(xiàn)文本的逐字打印效果。在函數(shù)內(nèi)部,通過檢查? textStr ?中的字符來逐個(gè)構(gòu)建? strp ?字符串,并將其顯示在 HTML 頁面上的

    2024年04月17日
    瀏覽(24)
  • Vue自定義指令實(shí)現(xiàn)按鈕級(jí)的權(quán)限控制

    提示:原文參考鏈接*且聽風(fēng)吟 提示:鉤子函數(shù): 自定義指令有五個(gè)生命周期(也叫鉤子函數(shù)),分別是: bind,inserted,update,componentUpdated,unbind 。 bind :只調(diào)用一次,指令第一次綁定到元素時(shí)調(diào)用。用這個(gè)鉤子函數(shù)可以定義一個(gè)綁定時(shí)執(zhí)行一次的初始化設(shè)置。( bind 時(shí)父節(jié)點(diǎn)

    2024年02月10日
    瀏覽(23)
  • VUE3實(shí)現(xiàn)拖拽功能自定義指令

    VUE3實(shí)現(xiàn)拖拽功能自定義指令

    1.首先創(chuàng)建一個(gè)js文件,命名為drag.js ? ?注意看注釋部分,對(duì)操作DOM塊進(jìn)行了不同需求的支持 ? ? 可以只在移動(dòng)頭部時(shí)操作整個(gè)DOM,或者是否允許DOM元素移出屏幕都能實(shí)現(xiàn) 2.在main.js中引入drag.js 3.在你想使用的標(biāo)簽中添加 v-drag 即可實(shí)現(xiàn)拖動(dòng)了 ?

    2024年02月14日
    瀏覽(30)
  • Vue3實(shí)現(xiàn)圖片懶加載及自定義懶加載指令

    Vue3實(shí)現(xiàn)圖片懶加載及自定義懶加載指令

    大家好,我是南木元元,熱衷分享有趣實(shí)用的文章。圖片懶加載是一種常見性能優(yōu)化的方式,它只去加載可視區(qū)域圖片,而不是在網(wǎng)頁加載完畢后就立即加載所有圖片,能減少很多不必要的請(qǐng)求,極大的提升用戶體驗(yàn)。 圖片懶加載的 實(shí)現(xiàn)原理 :在圖片沒進(jìn)入可視區(qū)域的時(shí)候

    2024年02月13日
    瀏覽(34)
  • 前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應(yīng)式原理。

    前端開發(fā)攻略---從源碼角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章讓你徹底弄懂響應(yīng)式原理。

    Vue的響應(yīng)式到底要干什么? 無非就是要知道當(dāng)你 讀取 對(duì)象的時(shí)候,要知道它讀了。要做一些別的事情 無非就是要知道當(dāng)你 修改 對(duì)象的時(shí)候,要知道它改了。要做一些別的事情 所以要想一個(gè)辦法, 把讀取和修改的動(dòng)作變成一個(gè)函數(shù) ,讀取和修改的時(shí)候分別調(diào)用對(duì)應(yīng)的函數(shù)

    2024年04月17日
    瀏覽(34)
  • vue-pc端實(shí)現(xiàn)按鈕防抖處理-自定義指令

    vue-pc端實(shí)現(xiàn)按鈕防抖處理-自定義指令

    前言 我們經(jīng)常在移動(dòng)端會(huì)處理按鈕和輸入框的防抖和節(jié)流處理,在pc端很少進(jìn)行這樣的操作 但是在pc端也是可以進(jìn)行按鈕的防抖操作,這樣也是比較合理,可以不用但不可以不會(huì) 我們只要配合vue項(xiàng)目自定義指令加上全局注冊(cè),就可以實(shí)現(xiàn)按鈕的防抖操作。 并且這種方式是在

    2024年02月13日
    瀏覽(19)
  • vue3前端實(shí)現(xiàn)全屏顯示,元素垂直填滿頁面

    1、 toggleFullscreen方法實(shí)現(xiàn)選定元素全屏展示 2、使用flex屬性+ flex-direction 實(shí)現(xiàn)垂直布局填滿整個(gè)頁面

    2024年01月16日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包