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

Vue自定義指令實現(xiàn)卡片翻轉(zhuǎn)功能

 更新時間:2023年11月14日 08:38:13   作者:傑丶  
這篇文章主要給大家介紹了Vue自定義指令實現(xiàn)卡片翻轉(zhuǎn)功能的代碼示例,文章通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的參幫助,需要的朋友可以參考下

效果預(yù)覽

1 原理介紹

1.1 前置知識

backface-visibility

backface-visibility 是一個用于控制元素的背面是否可見的 CSS 屬性。該屬性通常用于在進(jìn)行 3D 轉(zhuǎn)換時,控制元素背面的可見性。

當(dāng)元素進(jìn)行 3D 轉(zhuǎn)換時,其背面可能會變得可見,backface-visibility 屬性就是用來控制這種可見性的。屬性有兩個可能的值:

  • visible:默認(rèn)值。背面可見。
  • hidden:背面不可見,即不會顯示。

如果設(shè)置了 backface-visibility: hidden; 盒子背面將不可見,把盒子繞 y 軸進(jìn)行3d 旋轉(zhuǎn) 180° 后,我們將看到盒子的背面。

backface-visibility 主要用于處理 3D 轉(zhuǎn)換的情況,如果沒有使用 3D 轉(zhuǎn)換,該屬性的效果可能不會顯著。

transform-style: preserve-3d

transform-style: preserve-3d 主要用于配合 CSS 3D 變換,它告訴瀏覽器在進(jìn)行 3D 變換時應(yīng)該如何處理子元素。當(dāng)給父元素應(yīng)用 transform-style: preserve-3d 時,其子元素將以三維的方式定位,而不是被扁平化到同一個平面。

必須在父盒子上加上這個屬性,因為這里是父盒子翻轉(zhuǎn)帶動子盒子,如果不加上這個屬性,子盒子中的back背面將顯示不出來!

1.2 步驟分析

首先你需要一個大盒子,里面包含兩個小盒子,這里第一個小盒子為正面內(nèi)容,第二個小盒子為反面內(nèi)容。結(jié)構(gòu)如下:

    <div class="card">
      <div class="front">front</div>
      <div class="back">back</div>
    </div>
      .card {
        height: 270px;
        width: 270px;
        margin: 40px auto;
        border: 1px solid #f00;
        position: relative;
      }
      .front,.back {
        width: 100%;
        height: 100%;
      }

      .front {
        background-image: url(./imgs/youli.png);
        background-repeat: no-repeat;
        background-size: cover;
      }

      .back {
        background-image: url(./imgs/erha.jpg);
        background-repeat: no-repeat;
        background-size: cover;
      }

加上上面樣式后得到如下效果:

上面的效果顯然不滿足翻轉(zhuǎn)卡片的前置條件,思考一下我們想要達(dá)到的效果:

  • 首先,正面和背面應(yīng)該疊在一起。

    實現(xiàn):絕對定位。

  • 疊在一起的初始狀態(tài)應(yīng)該只顯示正面,隱藏背面。

    實現(xiàn):

    默認(rèn)將正面css設(shè)置為:transform: rotateY(0deg); backface-visibility: hidden;

    默認(rèn)將背面css設(shè)置為:transform: rotateY(180deg); backface-visibility: hidden;

    這樣初始狀態(tài)下只顯示正面內(nèi)容,背面會自動隱藏。

  • 翻轉(zhuǎn)后應(yīng)該顯示背面,隱藏正面。

    實現(xiàn):將父盒子沿y軸翻轉(zhuǎn) 180度,這樣子盒子 front 會旋轉(zhuǎn)到背面去,從而隱藏。子盒子 back 會旋轉(zhuǎn)到正面,從而顯示。通過點擊父盒子 添加移除 flipped 類名,從而實現(xiàn)翻轉(zhuǎn)功能。

完整代碼如下:

<!DOCTYPE html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>卡片旋轉(zhuǎn)效果</title>
    <style>

      .card {
        height: 270px;
        width: 270px;
        margin: 40px auto;
        border: 1px solid #f00;
        position: relative;

        transform-style: preserve-3d;
        transition: transform 0.5s;
        perspective: 0px;
      }

      .card.flipped {
        transform: rotateY(180deg);
      }

      .front,.back {
        width: 100%;
        height: 100%;
        position: absolute;
        left: 0;
        top: 0;
      }

      .front {
        background-image: url(./imgs/youli.png);
        background-repeat: no-repeat;
        background-size: cover;

        backface-visibility: hidden;
        transform: rotateY(0deg);
      }

      .back {
        background-image: url(./imgs/erha.jpg);
        background-repeat: no-repeat;
        background-size: cover;

        transform: rotateY(180deg);
        backface-visibility: hidden;
      }
    </style>
  </head>
  <body>
    <div class="card">
      <div class="front">front</div>
      <div class="back">back</div>
    </div>

    <script>
      const card = document.querySelector('.card')
      card.addEventListener('click', function() {
        this.classList.toggle('flipped')
 
      })
    </script>
  </body>
</html>

2 用 Vue 自定義指令實現(xiàn)卡片翻轉(zhuǎn)

這里自定義指令的用法就不再介紹了,直接貼上實現(xiàn)代碼:

Vue.directive('flip', {
    bind: function (el, binding) {
        // console.log('bind', el.children.length, binding.value)
        el.style.position = 'relative'
        el.style.transformStyle = 'preserve-3d'
        el.style.transition = 'transform 0.5s'

        el.initChidren = (el, binding) => {
          // console.log(el.children.length)
          if (el.children.length !== 2) {
            return
          }

          if (binding.value) {
            el.style.transform = 'rotateY(180deg)'
          } else {
            el.style.transform = 'rotateY(0deg)'
          }

          for (let i = 0; i < el.children.length; i++) {
            const element = el.children[i]
            element.style.position = 'absolute'
            element.style.position = 'absolute'
            element.style.width = '100%'
            element.style.height = '100%'
            element.style.left = 0
            element.style.top = 0
            if (i === 0) {
              element.style.backfaceVisibility = 'hidden'
              element.style.transform = 'rotateY(0deg)'
            }
            if (i === 1) {
              element.style.backfaceVisibility = 'hidden'
              element.style.transform = 'rotateY(180deg)'
            }
          }
        }

        el.initChidren(el, binding)
      },

      // inserted: function (el, binding) {
      //   console.log('inserted', el, binding.value)
      // },

      // update: function (el, binding) {
        // console.log('update', el, binding)
      // },

      componentUpdated: function (el, binding) {
        // console.log('componentUpdated', el, binding.value)
        console.log(el.children.length)

        // el.innerHTML 更新之后先重置子元素css屬性,再初始化
        for (let i = 0; i < el.children.length; i++) {
          const element = el.children[i]
          element.style.backfaceVisibility = 'visible'
          element.style.transform = 'rotateY(0deg)'
        }

        el.initChidren(el, binding)
      },

      // unbind(el) {
        // 在解綁時移除事件
      // },
    
})

組件中使用(注意 html 結(jié)構(gòu)必須如下):

<template>
    <div class="flipped_card" v-flip="isFlipped" @click="handleFlippedClick">
        <div class="front">front</div>
        <div class="back">back</div>
    </div>
</template>
<script>
  data() {
    return {
      isFlipped: false,
    }
  },
  
  methods: {
    handleFlippedClick() {
      if (!this.isFlipped) {
        this.isFlipped = true
      } else {
        this.isFlipped = false
      }
    },
  }    
</script>

以上就是Vue自定義指令實現(xiàn)卡片翻轉(zhuǎn)功能的詳細(xì)內(nèi)容,更多關(guān)于Vue實現(xiàn)卡片翻轉(zhuǎn)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • uniapp使用條件編譯#ifdef(跨平臺設(shè)備兼容)

    uniapp使用條件編譯#ifdef(跨平臺設(shè)備兼容)

    這篇文章主要介紹了uniapp使用條件編譯#ifdef(跨平臺設(shè)備兼容),需要的朋友可以參考下
    2022-12-12
  • 啟動myvue報錯npm?ERR!?code?ENOENT?npm?ERR!?syscall?open的解決辦法

    啟動myvue報錯npm?ERR!?code?ENOENT?npm?ERR!?syscall?open的解

    這篇文章主要介紹了啟動myvue報錯npm?ERR!?code?ENOENT?npm?ERR!?syscall?open的解決辦法,文中給出了詳細(xì)的解決方法,并通過圖文結(jié)合的方式介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Vue Element校驗validate的實例

    Vue Element校驗validate的實例

    這篇文章主要介紹了Vue Element校驗validate的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue項目初始化到登錄login頁面的示例

    vue項目初始化到登錄login頁面的示例

    今天小編就為大家分享一篇vue項目初始化到登錄login頁面的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • vue-element-admin 菜單標(biāo)簽失效的解決方式

    vue-element-admin 菜單標(biāo)簽失效的解決方式

    今天小編就為大家分享一篇vue-element-admin 菜單標(biāo)簽失效的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue中computed、methods與watch的區(qū)別總結(jié)

    Vue中computed、methods與watch的區(qū)別總結(jié)

    這篇文章主要給大家介紹了關(guān)于Vue中computed、methods與watch區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • element中Select選擇器實現(xiàn)自定義顯示內(nèi)容

    element中Select選擇器實現(xiàn)自定義顯示內(nèi)容

    在我們很多前端業(yè)務(wù)開發(fā)中,往往為了方便,都需要自定義一些用戶組件,本文主要介紹了element中Select選擇器實現(xiàn)自定義顯示內(nèi)容,感興趣的可以了解一下
    2023-12-12
  • vue?父子組件共用mixins的注意點

    vue?父子組件共用mixins的注意點

    這篇文章主要介紹了vue?父子組件共用mixins的注意點,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue的子組件props如何設(shè)置多個校驗類型

    Vue的子組件props如何設(shè)置多個校驗類型

    這篇文章主要介紹了Vue的子組件props如何設(shè)置多個校驗類型問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • vite+vue3中require?is?not?defined問題及解決

    vite+vue3中require?is?not?defined問題及解決

    這篇文章主要介紹了vite+vue3中require?is?not?defined問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05

最新評論

营口市| 林周县| 富锦市| 应城市| 夹江县| 朝阳县| 宿州市| 体育| 同江市| 建德市| 石首市| 来安县| 定兴县| 夏河县| 双流县| 保山市| 景东| 汉川市| 泗洪县| 阿坝| 西畴县| 于田县| 房山区| 安龙县| 揭西县| 永德县| 平武县| 长寿区| 铅山县| 大宁县| 云龙县| 湖南省| 永城市| 襄垣县| 团风县| 佳木斯市| 临沂市| 喀喇沁旗| 临潭县| 崇明县| 孝昌县|