簡體   English   中英

即使在更改源之后,舊圖像也會暫時顯示

[英]old image is getting displayed momentarily even after changing the source

我們需要從右到左完全移動一個div(背景圖像和img在div標簽內),一旦div完全消失,我們需要再次從右邊開始移動div,但div中有不同的圖像。

一旦div完全消失,我們將div中的圖像源更改為新圖像。 但是在新圖像顯示在div上之前,舊圖像會暫時顯示。

以下是源代碼。

<!DOCTYPE html>
<html>
    <head>
        <style>
            html, body {
                background-image: url("background/moon_bg.png");
                background-repeat: no-repeat;
                background-size: cover;
                position: relative;
                height: 100%;
                width: 100%;
                margin: 0px;
            }

            #board {
                position: absolute;
                background-repeat: no-repeat;
                z-index: 99999;
            }
        </style>
    </head>
    <body>
        <div id="board">
            <img id="poster" src="//:0">
        </div>

        <script>
            var board = document.getElementById('board');
            var poster = document.getElementById('poster');

            var poster_images = ['IronMan.png',
                                 'gladiator.png',
                                 'Ghostbusters.png'];

            let bd_image_path = 'url(billboard/b.png)';
            let posterIndex = 0;
            let newPoster = true;
            let posterPath = 'posters/' + poster_images[posterIndex];;

            function moveLeft()
            {   
                if(newPoster === true) {
                    if(poster.complete === true) {
                        poster.style.left = '10px';
                        poster.style.top = '65px';
                        poster.style.width = '422px';
                        poster.style.height = '198px';
                        poster.style.position = 'absolute';

                        board.style.width = "441px";
                        board.style.height = "395px";
                        board.style.left = (window.innerWidth - 441) + "px";
                        board.style.top = (window.innerHeight - 415) + "px";
                        board.style.backgroundImage = bd_image_path;

                        poster.style.display = 'block';
                        newPoster = false;
                    }
                    else {
                        console.log('in else');
                    }
                }
                else {
                    board.style.left = board.style.left || 0;

                    if(parseInt(board.style.left) <= -(parseInt(board.style.width))) {
                        newPoster = true;
                        posterIndex ++;
                        if(posterIndex >= poster_images.length) {
                            posterIndex = 0;
                        }
                        posterPath = 'posters/' + poster_images[posterIndex];
                        poster.style.display = 'none';
                    }
                    else {
                        board.style.left = parseInt(board.style.left) - 2 + 'px';

                        poster.style.left = '10px'
                        poster.style.top = '65px';
                        poster.style.width = '422px';
                        poster.style.height = '198px';
                        poster.style.position = 'absolute';
                        poster.src = posterPath;
                    }
                }
                requestAnimationFrame(moveLeft);
            }

            moveLeft();
        </script>
    </body>
</html>

任何人都可以幫我解決這個問題。

我相信這歸結為緩存問題,您可以通過添加標識符來告知瀏覽器新的圖像,時間通常是最簡單的方法。

poster.src = posterPath + '?' + new Date().getTime();

您正在重置每個幀上的海報屬性,除非電路板剛退出屏幕。 下面的靜態屬性被連續調用,這會干擾src負載並顯示一幀的先前圖像。

                poster.style.left = '10px'
                poster.style.top = '65px';
                poster.style.width = '422px';
                poster.style.height = '198px';
                poster.style.position = 'absolute';
                poster.src = posterPath;

應將這些屬性(或至少src屬性)添加到上面的if語句中,以便僅在首次請求新海報時調用它們。 這將解決問題。 但是在實際的服務器上,第一次加載每個新圖像需要花費一些時間,因為它們沒有被預加載。 因此,您還應該添加預加載/緩存例程或事件處理程序,以便僅在下一個映像成功加載(onload)后從右側啟動映像。

暫無
暫無

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

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