setInerval實現圖片滾動離開頁面後又返回頁面時圖片加速滾動問題解決

来源:https://www.cnblogs.com/beileixinqing/archive/2020/03/18/12518275.html
-Advertisement-
Play Games

問題: setInerval實現圖片滾動,離開頁面後又返回頁面時圖片加速滾動 代碼本身實現方案: 在每次頁面載入的時候會清除定時器。 問題產生原因: 由於在載入了圖片滾動的頁面之後,又去到了其他頁面,但是定時器沒有停止,而頁面又沒有顯示在用戶面前,當返回頁面的時候,就會把之前定時器中已經移動的圖片動 ...


問題:

setInerval實現圖片滾動,離開頁面後又返回頁面時圖片加速滾動

代碼本身實現方案:

在每次頁面載入的時候會清除定時器。

問題產生原因:

由於在載入了圖片滾動的頁面之後,又去到了其他頁面,但是定時器沒有停止,而頁面又沒有顯示在用戶面前,當返回頁面的時候,就會把之前定時器中已經移動的圖片動畫一股腦移動,就會出現如題所述加速滾動的效果。

解決辦法:

監聽頁面是否顯示在用戶面前,是:重新走定時器方法,否,清除定時器。

以下判斷頁面是否展示的方法,在安卓5.0 等低版本系統下不生效。

function bannerScroll() {
    let imageBox = document.getElementById("imageBox");
    imageBox.classList.remove('roll-animation-3');
    imageBox.classList.remove('roll-animation-2');
    imageBox.classList.remove('roll-animation-1');
    const bodyWidth = document.body.clientWidth;
    const bodyHeight = document.body.clientHeight;
    const v1 = ((320 / 250) + (320 / 90)) / 2; //320*250尺寸比邊界值
    const ratio = bodyWidth / bodyHeight;
    let leftImage = new Image();
    leftImage.src = window.campaign.image_url;
    let leftImageWidth = "";
    let leftImageHeight = "";
    let adLeft = document.getElementById("adLeft");
    leftImage.onload = function () {
        leftImageWidth = leftImage.width;
        leftImageHeight = leftImage.height;
        let imageRealHeight = adLeft.offsetWidth * (leftImageHeight / leftImageWidth);
        // 設置所有圖片的高度相同,否則會出現圖片拼接不居中問題
        let imageItem = Array.from(document.getElementsByClassName('image-item'));
        for(let item of imageItem){
            item.style.height = imageRealHeight+'px';
        }
        if (ratio < v1) {  //  適配 320*250 設計圖樣式,停留3s
            slider(imageRealHeight, 4000, "roll-animation-1")
        } else {  // 不停留,直接滾動,1s速度跟css 動畫速度保持一致
            slider(imageRealHeight, 3000, "roll-animation-3")
        }
    }
}
var scrollTimer ;// 定義banner滾動定時器
var hidden, visibilityChange;
if (typeof document.hidden !== "undefined") {
    hidden = "hidden";
    visibilityChange = "visibilitychange";
} else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
}

function handleVisibilityChange() {
    if (document[hidden]) {
        //頁面失去焦點也就是切換頁面時清除定時器
        clearInterval(scrollTimer)    //清除定時器
        console.log("失去焦點");
    } else {
        //頁面聚焦時開啟定時器,即重新初始化banner圖片滾動
        bannerScroll()
        console.log("得到焦點");
    }
}

// 判斷瀏覽器的支持情況
if (typeof document.addEventListener === "undefined" || typeof document[hidden] === "undefined") {
    console.log("不支持檢測頁面焦點獲取。");
} else {
    // 監聽visibilityChange事件
    document.addEventListener(visibilityChange, handleVisibilityChange, false);
}
// 圖片向上滾動,暫停3s
function slider(imageRealHeight, interval, rollClass) {
    clearInterval(scrollTimer);
    let imageBox = document.getElementById("imageBox");
    imageRealHeight = parseFloat(imageRealHeight);
    let clientHeight = parseFloat(document.body.clientHeight);
    let edgeLength = (clientHeight - imageRealHeight) / 2;
    const imageHtml = imageBox.innerHTML;
    imageBox.innerHTML = imageHtml + imageHtml + imageHtml;
    imageBox.style.top = -(imageRealHeight - edgeLength) + 'px';
    let count = 0;
    scrollTimer = setInterval(() => {
        imageBox.classList.add(rollClass);
        const initTop = -(imageRealHeight - edgeLength) + 'px';
        if (count++ === 30) {
            imageBox.classList.remove(rollClass);
            imageBox.innerHTML = imageHtml + imageHtml + imageHtml;
            imageBox.style.top = initTop;
            count = 0;
        } else {
            imageBox.innerHTML = imageBox.innerHTML + imageHtml;
            imageBox.style.top = parseFloat(imageBox.style.top) - (imageRealHeight) + 'px';
        }
    }, interval)
}

bannerScroll();// 執行圖片滾動方法
 

頁面顯示監聽參考鏈接


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. OneNET簡介 中國移動物聯網開放平臺是由中國移動打造的PaaS物聯網開放平臺。 平臺能夠幫助開發者輕鬆實現設備接入與設備連接,提供綜合性的物聯網解決方案,實現物聯網設備的數據獲取,數據存儲,數據展現。 中移物聯網官方網址 https://open.iot.10086.cn/ 安卓平臺接入O ...
  • 構建編譯項目 不需要安裝CMake,MinGW等額外工具。只需要Android NDK和OpenCV源碼 。 在WIN10上使用cmd視窗命令編譯OpenCV步驟,操作版本為4.0.1: 1. 在OpenCV根目錄下麵新建一個文件夾,比如叫做build_cmd。因為OpenCV要求 不和 是同一個文 ...
  • js預設提示框 js有三種預設提示框 提示框 alert('hello world!'); 確認框 var result=confirm('確認刪除XX文件?');result為bool類型 回覆確認框 var result=prompt('請輸入文件標題:');result返回輸入的值 自定義提示 ...
  • 今天學習雲開發如何發請求和進行數據安全監測 問題:用got請求token可以,但進行安全監測時卻報錯 在網上找了許多篇文章,也在群里跟別人交流過,綜合了一下,找到瞭解決辦法 用request promise代替got 我這是獲取taken時用got,進行安全檢測則使用request promise, ...
  • zepto中的動畫 zepto中不具備動畫模塊,需要單獨引入 fx.js 和 fx_methods.js https://github.com/madrobby/zepto toggle 元素顯示與隱藏 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...
  • //數組var arr = new Array();arr.push({"id":1, "value":"a"});arr.push({"id":2, "value":"b"}); //jquery的方法,將數組轉為json字元串var jsonStr = $.toJSON(arr); //jque ...
  • css3系列 1.css基礎知識入門 1.css 如何引用 內部 外部 內聯 代碼示例 內部css代碼示例 index 外部css代碼示例 index 微信公眾號:全棧學習筆記 css文件裡面的代碼(test.css) h1{ color: red; } 內聯css代碼示例 這裡推薦使用第二種方式, ...
  • 記錄下兩款好用的輪播圖插件: Swiper 官網:https://www.swiper.com.cn/ slick 官網:http://kenwheeler.github.io/slick/ 中文詳解參考:https://www.awesomes.cn/repo/kenwheeler/slick 圖 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...