天天看點

Vue3 -- teleport傳送門teleport傳送門總結

目錄

  • teleport傳送門
    • 例: 蒙層特效
    • 目标效果
    • 代碼示範
    • 頁面效果
    • 未使用teleport存在的問題
    • 使用teleport實作目标效果
    • 完整代碼
  • 總結

teleport傳送門

Teleport 是一種能夠移動 DOM到Vue根節點之外的技術。

例: 蒙層特效

目标效果

點選按鈕這個頁面顯示一個滿屏的半透明的黑色蒙層,再次點選隐藏蒙層。

代碼示範

首先建立DOM結構:

<div class="area">
                <button @click="handleClick">按鈕</button>
                <div class="mask" v-show="show" @click="handleClick"></div>
            </div>
           

然後綁定樣式:

/* 父容器樣式 */
  		.area{
            position: absolute;
            left: 50%;
            top: 50%;
            width: 100px;
            height: 150px;
            transform: translate(-50%, -50%);
            background-color: #ccc;
        }
        /* 蒙層樣式 */
        .mask{
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            background-color: #000;
            opacity: 0.5;
        }
           

最後寫上綁定的方法和資料:

data(){
                return{
                    show: false
                }
            },
            methods:{
                handleClick(){
                    this.show = !this.show;
                }
            },
           

頁面效果

Vue3 -- teleport傳送門teleport傳送門總結

點選按鈕,觸發點選事件後頁面效果。

Vue3 -- teleport傳送門teleport傳送門總結

未使用teleport存在的問題

在未使用teleport标簽情況下、蒙層div受父容器影響。蒙層鋪滿父容器,但并未鋪滿整個螢幕。

使用teleport實作目标效果

使用teleport标簽、将蒙層div傳送到body節點下,實作目标效果。

<div class="area">
                <button @click="handleClick">按鈕</button>
                <teleport to="body">
                    <div class="mask" v-show="show" @click="handleClick"></div>
                </teleport>
            </div>
           

頁面結構:

Vue3 -- teleport傳送門teleport傳送門總結

頁面效果:

Vue3 -- teleport傳送門teleport傳送門總結

完整代碼

<!DOCTYPE html>
<html lang="en">
<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>Vue3 -- teleport傳送門</title>
    <!-- 使用CDN引入Vue -->
    <script src="https://unpkg.com/[email protected]"></script>
    <style>
        .area{
            position: absolute;
            left: 50%;
            top: 50%;
            width: 100px;
            height: 150px;
            transform: translate(-50%, -50%);
            background-color: #ccc;
        }
        .mask{
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            background-color: #000;
            opacity: 0.5;
        }
    </style>
</head>
<body>
    <div id="root"></div>
    <script>
        const app = Vue.createApp({
            data(){
                return{
                    show: false
                }
            },
            methods:{
                handleClick(){
                    this.show = !this.show;
                }
            },
            template:`
            <div class="area">
                <button @click="handleClick">按鈕</button>
                <teleport to="body">
                    <div class="mask" v-show="show" @click="handleClick"></div>
                </teleport>
            </div>
            `
        });
        const vm = app.mount('#root');
    </script>
</body>
</html>
           

總結

使用Teleport能夠移動DOM,避免其受父容器的影響

結語

本小節到此結束,謝謝大家的觀看!

如有問題歡迎各位指正

繼續閱讀