簡體   English   中英

Firefox 中堆疊 div 的內部內容無法正常工作

[英]Inner content of stacked divs not working properly in Firefox

我創建了一本帶有翻頁的書的 animation。 我使用z-index來堆疊頁面,它們都在瀏覽器 UI 中以正確的順序翻轉和顯示,但檢查器顯示的內容有所不同。

在 Firefox 中,如果我右鍵單擊第 1 頁和 select 檢查它會轉到第 4 頁的元素,我還將輸入元素放在頁面上,但在第 1 頁上我無法單擊並輸入它。 有些頁面可以正常工作,檢查器轉到正確的元素,我可以輸入輸入,但是當我翻閱頁面時,一些頁面將停止工作,而其他頁面將開始工作。

這只發生在 Firefox 中,它在 Chrome 中完全按預期工作。 這是 Firefox 問題還是我的代碼有問題?

編輯: https://codesandbox.io/s/my-book-jlrmw?file=/src/components/HelloWorld.vue

模板:

<template>
<div class="row">
    <div class="col-md-12 mb-3">
        <button class="btn btn-primary" @click="nextPage">next page</button>
        <button class="btn btn-primary" @click="previousPage">previous page</button>
    </div>
    
    <div class="col-md-6">
        <div class="book">
            <span class="front-cover"></span>
            
            <div class="page" v-for="page in pageNums">
                <div class="page-side right">
                    <div class="page-number next" @click="nextPage">{{page[0]}}</div>
                    <input />
                </div>
                <div class="page-side left">
                    <div class="page-number prev" @click="previousPage">{{page[1]}}</div>
                    <input />
                </div>
            </div>
            
            <div class="front-cover">
                <div class="face front">
                    <div class="inner-triangle" @click="openBook"></div>
                    <div class="title">Book</div>
                </div>
                <div class="face back"></div>
            </div>
        </div>
    </div>
    
    <div class="col-md-6">
    </div>
</div>
</template>

腳本:

<script>
    export default {
        name: 'Book',
        components: {
        },
        data() {
            return {
                bookOpen: false,
                numPages: 7,
                pageNums: [],
                pageNum: 0,
            }
        },
        created() {
            this.addPageNums();
        },
        mounted() {
            this.setPageStackOrder();
        },
        methods: {
            addPageNums() {
                const pages = this.numPages * 2;
                let page = [];
                
                for(let n = 1; n <= pages; n++) {
                    page.push(n);
                    
                    if(page.length === 2) {
                        this.pageNums.push(page);
                        page = [];
                    }
                }
                this.pageNums = this.pageNums.reverse();
            },
            
            setPageStackOrder() {
                for(let n = 0; n < this.numPages; n++) {
                    const page = $(".page").eq(n);
                    page.css("z-index", n+1);
                }
                const cover = $(".front-cover").eq(1);
                cover.css("z-index", 8);
            },
            
            openBook() {
                if(this.bookOpen === false) {
                    this.bookOpen = true;
                    
                    const cover = $(".front-cover").eq(1);
                    cover.addClass("turn");
                    setTimeout( () => {
                        cover.css("z-index", 0)
                    }, 2500);
                }
            },
            
            nextPage() {
                if(this.bookOpen === true && this.pageNum < this.numPages) {
                    this.pageNum++;
                    
                    const zIndex = this.pageNum;
                    const page = $(".page").eq(this.numPages - this.pageNum);
                    page.removeClass("turnBack");
                    page.addClass("turn");
                    setTimeout( () => {
                        page.css("z-index", zIndex);
                    }, 1000);
                }
            },
            
            previousPage() {
                if(this.bookOpen === true && this.pageNum <= this.numPages) {
                    const zIndex = (this.numPages - this.pageNum) + 1;
                    const page = $(".page").eq(this.numPages - this.pageNum);
                    page.removeClass("turn");
                    page.addClass("turnBack");
                    setTimeout( () => {
                        page.css("z-index", zIndex);
                    }, 2200);
                    
                    this.pageNum--;
                }
            },
        },
    }
</script>

CSS:

<style scoped>
    .book {
        position: relative;
        display: -ms-flexbox;
        display: flex;
        -ms-flex-direction: column;
        flex-direction: column;
        min-width: 0;
        perspective: 220rem;
    }
    
    .front-cover {
        background-color: #36354e;
        color: white;
        font-weight: bold;
        position: absolute;
        transform-style: preserve-3d;
        transform-origin: 0 100%;
        top: 0;
        right: 0;
        width: 50%;
        height: 17.5rem;
        padding: 1rem;
        border-radius: 0 5px 5px 0;
        box-sizing: border-box;
    }

    .face {
        position: absolute;
        -webkit-backface-visibility: hidden;
        backface-visibility: hidden;
    }

    .face.front {
        top: 0;
        right: 0;
        height: 100%;
        width: 100%;
        -webkit-transform:rotateY(0deg);
    }

    .face.back {
        top: 0;
        right: 0;
        padding: 40% 0;
        text-align: center;
        height: 100%;
        width: 100%;
        transform: rotateY(-180deg);
    }
    
    .front-cover.turn {
        animation: bookOpen 3s forwards;
    }
    
    @keyframes bookOpen {
        0%  {
            transform: rotateY(0deg);
        }
        100% {
            transform: rotateY(-180deg);
        }
    }
    
    .title {
        padding: 40% 0 0 0;
        text-align: center;
        font-size: 25px;
        color: darkgrey;
    }

    .inner-triangle {
        border-left: 20px solid transparent;
        border-right: 20px solid green;
        border-bottom: 20px solid transparent;
        height: 0;
        width: 0;
        position: absolute;
        right: 0;
        z-index: 2;
    }
    
    .page {
        background-color: #e9e6c4;
        color: #777;
        position: absolute;
        transform-style: preserve-3d;
        perspective: 120rem;
        transform-origin: 0 100%;
        top: 0.25rem;
        right: 1%;
        width: 49%;
        height: 17rem;
        box-shadow: inset 3px 0px 20px rgba(0, 0, 0, 0.2),
                          0px 0px 15px rgba(0, 0, 0, 0.1);
    }

    .page-side {
        position: absolute;
        -webkit-backface-visibility: hidden;
        backface-visibility: hidden;
    }

    .page-side.right {
        top: 0;
        right: 0;
        height: 100%;
        width: 100%;
        -webkit-transform:rotateY(0deg);
        transform: rotateY(0deg);
    }

    .page-side.left {
        top: 0;
        right: 0;
        height: 100%;
        width: 100%;
        -webkit-transform:rotateY(-180deg);
        transform: rotateY(-180deg);
    }

    .page.turn {
        animation: nextPage 3s forwards;
    }

    @keyframes nextPage {
        0%  {
            transform: rotateY(0deg);
        }
        100% {
            transform: rotateY(-180deg);
        }
    }

    .page.turnBack {
        animation: prevPage 3s backwards;
        animation-direction: reverse;
    }

    @keyframes prevPage {
        0%  {
            transform: rotateY(0deg);
        }
        100% {
            transform: rotateY(-180deg);
        }
    }
    
    .page-number {
        font-size: 0.7rem;
        color: #0000FF;
        cursor: pointer;
    }
    
    .page-number.next {
        padding: 5px 10px 0 0;
        text-align: right;
    }
    
    .page-number.prev {
        padding: 5px 0 0 10px;
        text-align: left;
    }
</style>

您可以將所有隱藏頁面設置為display: none 如果我在 firefox 開發工具中這樣做 - 問題就會消失。 不幸的是,我無法弄清楚如何在您的程序中實現這一點......

感謝@biberman 找到了display: none解決了這個問題,我現在發現pointer-events: none也可以工作,這對我的目的來說更好。

我已經包含了解決問題的更改部分。

我也將其報告為錯誤: https://bugzilla.mozilla.org/show_bug.cgi?id=1715796

腳本:

    export default {
        data() {
            return {
                pageNum: 1,
            }
        },
        methods: {
            openBook() {
                if(this.bookOpen === false) {
                    this.setPageStackOrder();
                    this.bookOpen = true;
                    
                    const cover = $(".front-cover").eq(1);
                    cover.addClass("turn");
                    setTimeout( () => {
                        cover.css("z-index", 0)
                    }, 2500);
                    
                    const page = $(".page").eq(this.numPages - this.pageNum);
                    page.removeClass("disable");
                    page.addClass("enable");
                }
            },

            setPageStackOrder() {
                for(let n = 0; n < this.numPages; n++) {
                    const page = $(".page").eq(n);
                    page.css("z-index", n+1);
                    page.addClass("disable")
                }
                const cover = $(".front-cover").eq(1);
                cover.css("z-index", 8);
            },
            
            SetPageEvents(direction) {
                const cur = this.numPages - this.pageNum;
                const next = (direction === "forward") ? cur - 1 : cur + 1;
                const prev = (direction === "forward") ? cur + 1 : cur - 1;
                const page = $(".page").eq(cur);
                const nextPage = $(".page").eq(next);
                const prevPage = $(".page").eq(prev);
                
                page.addClass("enable");
                page.removeClass("disable");
                nextPage.addClass("enable");
                nextPage.removeClass("disable");
                prevPage.addClass("disable");
                prevPage.removeClass("enable");
            },
            
            nextPage() {
                if(this.bookOpen === true && this.pageNum <= this.numPages) {
                    const page = $(".page").eq(this.numPages - this.pageNum);
                    const zIndex = this.pageNum;
                    
                    this.SetPageEvents("forward");
                    page.removeClass("turnBack");
                    page.addClass("turn");
                    setTimeout( () => {
                        page.css("z-index", zIndex);
                    }, 1000);
                    
                    this.pageNum++;
                }
            },
            
            previousPage() {
                if(this.bookOpen === true && this.pageNum > 0) {
                    this.pageNum--;
                    const page = $(".page").eq(this.numPages - this.pageNum);
                    const zIndex = (this.numPages - this.pageNum);
                    
                    this.SetPageEvents("backward");
                    page.removeClass("turn");
                    page.addClass("turnBack");
                    setTimeout( () => {
                        page.css("z-index", zIndex);
                    }, 2200);
                }
            },
        },

CSS:

.page.enable {
    pointer-events: all;
}

.page.disable {
    pointer-events: none;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM