純css實現單張圖片無限迴圈無縫滾動

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

參考鏈接:https://blog.csdn.net/qq_20777797/article/details/77916029 https://www.xiabingbao.com/css3/2017/07/03/css3-infinite-scroll.html 需求是一共有兩個,1、單張豎圖持續 ...


參考鏈接:https://blog.csdn.net/qq_20777797/article/details/77916029

https://www.xiabingbao.com/css3/2017/07/03/css3-infinite-scroll.html

需求是一共有兩個,
1、單張豎圖持續向上無縫滾動,

2、單張豎圖滾動到正中間之後,停留3s,繼續滾動。

一、用js setInterval定時器實現

js實現要通過不斷的改變定位、複製圖片的方式來做,效果極其不穩定

二、用css3 animation動畫實現

需求1動畫:

 @-webkit-keyframes scrollUp {
            0% {
                -webkit-transform: translateY(0);
                transform: translateY(0);
            }
            100% {
                -webkit-transform: translateY(-400px);
                transform: translateY(-400px);
            }
        }

        @-moz-keyframes scrollUp {
            0% {
                -moz-transform: translateY(0);
                transform: translateY(0);
            }
            100% {
                -moz-transform: translateY(-400px);
                transform: translateY(-400px);
            }
        }

        @-o-keyframes scrollUp {
            0% {
                -o-transform: translateY(0);
                transform: translateY(0);
            }
            100% {
                -o-transform: translateY(-400px);
                transform: translateY(-400px);
            }
        }

        @keyframes scrollUp {
            0% {
                -webkit-transform: translateY(0);
                -moz-transform: translateY(0);
                -o-transform: translateY(0);
                transform: translateY(0);
            }
            100% {
                -webkit-transform: translateY(-400px);
                -moz-transform: translateY(-400px);
                -o-transform: translateY(-400px);
                transform: translateY(-400px);
            }
        }

需求2動畫:

@-webkit-keyframes scrollUpAndPause {
            0% {
                -webkit-transform: translateY(0);
                transform: translateY(0);
            }
            25% {
                -webkit-transform: translateY(-350px);
                transform: translateY(-350px);
            }
            100% {
                -webkit-transform: translateY(-350px);
                transform: translateY(-350px);
            }
        }

        @-moz-keyframes scrollUpAndPause {
            0% {
                -moz-transform: translateY(0);
                transform: translateY(0);
            }
            25% {
                -moz-transform: translateY(-350px);
                transform: translateY(-350px);
            }
            100% {
                -moz-transform: translateY(-350px);
                transform: translateY(-350px);
            }
        }

        @-o-keyframes scrollUpAndPause {
            0% {
                -o-transform: translateY(0);
                transform: translateY(0);
            }
            25% {
                -o-transform: translateY(-350px);
                transform: translateY(-350px);
            }
            100% {
                -o-transform: translateY(-350px);
                transform: translateY(-350px);
            }
        }

        @keyframes scrollUpAndPause {
            0% {
                -webkit-transform: translateY(0);
                -moz-transform: translateY(0);
                -o-transform: translateY(0);
                transform: translateY(0);
            }
            25% {
                -webkit-transform: translateY(-350px);
                -moz-transform: translateY(-350px);
                -o-transform: translateY(-350px);
                transform: translateY(-350px);
            }
            100% {
                -webkit-transform: translateY(-350px);
                -moz-transform: translateY(-350px);
                -o-transform: translateY(-350px);
                transform: translateY(-350px);
            }
        }

html

<div class="box">
    <div class="image-item">
    </div>
    <div class="image-item">
    </div>
    <div class="image-item">
    </div>
</div>

style:

 .box {
            width: 500px;
            height: 500px;
            overflow: hidden;
        }

應用動畫:

.image-item {
            width: 500px;
            height: 400px;
            background: url("./貓咪咪.jpg") repeat-y center center; /* 什麼圖片都可以*/
            /*animation-delay: 2s;!*延遲2s在進行滾動*!*/
            -webkit-animation: 3s scrollUp linear infinite normal;/* 3s持續滾動圖片*/
            animation: 3s scrollUp linear infinite normal;
            /*-webkit-animation: 4s scrollUpAndPause linear infinite normal;*/ /* 每停3s滾動一次*/
            /*animation: 4s scrollUpAndPause linear infinite normal;*/
 }

另外自己做好css的相容寫法即可實現。

註意:

1、前提是把一張圖片複製成3張,以實現無縫滾動,網上看了很多人此類無縫迴圈滾動的方法,實現出來之後,每次回到起點都會有跳動的感覺,這裡經過摸索,給動畫上移的距離設為圖片的高度,就不會有跳動問題了,完美無限迴圈+無縫滾動;

2、圖片每停3s滾動一次,且每次剛好停在正中間,上線留的銜接的圖片距離相等,這裡就要計算一下,每次動畫上移距離= 圖片實際顯示高度-(所在區域的總高度-上間距高度)。

以下是圖片滾動的js,如果要實現動態獲取圖片高度,則需要寫下麵的js:

function addKeyFrames(height,offsetHeight){
    let style = document.createElement('style');
    style.type = 'text/css';
    let keyFrames = '\
    @-webkit-keyframes scrollUpAndPause {\
        0% {\
            -webkit-transform: translateY(0);\
            transform: translateY(0);\
        }\
        40% {\
            -webkit-transform: translateY(0);\
            transform: translateY(A_DYNAMIC_VALUE);\
        }\
        100% {\
            -webkit-transform: translateY(0);\
            transform: translateY(A_DYNAMIC_VALUE);\
        }\
    }\
    @-moz-keyframes scrollUpAndPause {\
        0% {\
            -webkit-transform: translateY(0);\
            transform: translateY(0);\
        }\
        40% {\
            -webkit-transform: translateY(0);\
            transform: translateY(A_DYNAMIC_VALUE);\
        }\
        100% {\
            -webkit-transform: translateY(0);\
            transform: translateY(A_DYNAMIC_VALUE);\
        }\
    }\
    @-o-keyframes scrollUpAndPause {\
        0% {\
            -webkit-transform: translateY(0);\
            transform: translateY(0);\
        }\
        40% {\
            -webkit-transform: translateY(0);\
            transform: translateY(A_DYNAMIC_VALUE);\
        }\
        100% {\
            -webkit-transform: translateY(0);\
            transform: translateY(A_DYNAMIC_VALUE);\
        }\
    }\
    @keyframes scrollUpAndPause {\
        0% {\
            -webkit-transform: translateY(0);\
            transform: translateY(0);\
        }\
        40% {\
            -webkit-transform: translateY(0);\
            transform: translateY(A_DYNAMIC_VALUE);\
        }\
        100% {\
            -webkit-transform: translateY(0);\
            transform: translateY(A_DYNAMIC_VALUE);\
        }\
    }\
    @-webkit-keyframes scrollUp {\
        0% {\
             -webkit-transform: translateY(0);\
            transform: translateY(0);\
        }\
        100% {\
            -webkit-transform: translateY(0);\
            transform: translateY(B_DYNAMIC_VALUE);\
        }\
    }\
    @-moz-keyframes scrollUp {\
        0% {\
             -webkit-transform: translateY(0);\
            transform: translateY(0);\
        }\
        100% {\
            -webkit-transform: translateY(0);\
            transform: translateY(B_DYNAMIC_VALUE);\
        }\
    }\
    @-o-keyframes scrollUp {\
        0% {\
             -webkit-transform: translateY(0);\
            transform: translateY(0);\
        }\
        100% {\
            -webkit-transform: translateY(0);\
            transform: translateY(B_DYNAMIC_VALUE);\
        }\
    }\
    @keyframes scrollUp {\
        0% {\
             -webkit-transform: translateY(0);\
            transform: translateY(0);\
        }\
        100% {\
            -webkit-transform: translateY(0);\
            transform: translateY(B_DYNAMIC_VALUE);\
        }\
    }';
    keyFrames = keyFrames.replace(/A_DYNAMIC_VALUE/g, '-'+(height-(offsetHeight-height)/2)+'px');
    keyFrames = keyFrames.replace(/B_DYNAMIC_VALUE/g, '-'+height+'px');
    style.innerHTML = keyFrames;
    document.getElementsByTagName('head')[0].appendChild(style);
}
// 初始化圖片滾動動畫高度
function initAnimate() {
    const adLeftHeight = document.getElementById("adLeft").offsetHeight; // 左側區域高度
    const adLeftWidth = document.getElementById("adLeft").offsetWidth; // 左側區域寬度
    let leftImage = new Image();
    let leftImageWidth = "";
    let leftImageHeight = "";
    leftImage.src = window.campaign.image_url;
    leftImage.onload = function () {
        leftImageWidth = leftImage.width;
        leftImageHeight = leftImage.height;
        let imageRealHeight = adLeftWidth * (leftImageHeight / leftImageWidth);
        // const imageBoxScrollHeight = document.getElementById("imageBox").scrollHeight; // 三張圖片的總高度
        // const imageHeight = imageBoxScrollHeight/3;// 單張圖片高度
        addKeyFrames(imageRealHeight,adLeftHeight);
    }
}

以上js對應的html:

<div class="ad_left" id="adLeft">
        <div class="image-box" id="imageBox">
            <img class="image-item" src="xxx.jpg" alt="">
            <img class="image-item" src="xxx.jpg" alt="">
            <img class="image-item" src="xxx.jpg" alt="">
        </div>
</div>

以上html對應的css:

.ad_left{
        width:44vw;
        height: 100vh;
        overflow: hidden;
        .image-box{
          width:100%;
          height: auto;
          .image-item {
            width: 100%;
            height: auto;
            display: block;
            animation: 5s scrollUpAndPause linear infinite normal;
          }
        }
      }

 


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

-Advertisement-
Play Games
更多相關文章
  • 按照國際慣例,先放效果圖 1、js動態初始化Dom結構 首先在index.html中添加基本樣式 body{background:pink;text-align: center;} 加個移動端meta頭 <meta name="viewport" content="width=device-widt ...
  • 瀏覽器首碼: css3屬性:預覽版,還沒有最終版,所以有很多相容性問題,瀏覽器不識別。 瀏覽器為了使這些屬性相容,每個瀏覽器廠商都提供了一個屬於自己瀏覽器的語法規則,瀏覽器相容首碼。 主流瀏覽器:谷歌,IE,歐朋,火狐,蘋果 瀏覽器首碼: -wekit- 谷歌 -moz- 火狐 -ms- IE -o ...
  • 閉包的定義:閉包是指有權訪問另一個函數作用域中的變數的函數 --《JavaScript 高級程式設計》。 如何理解這句話:其實就是指在函數a外面能夠訪問函數a裡面的函數b。 例如: 1 function a () { 2 var v = 123; 3 function b() { 4 console ...
  • Lodash是一個一致性、模塊化、高性能的 JavaScript 實用工具庫。 Lodash 通過降低 array、number、objects、string 等等的使用難度從而讓 JavaScript 變得更簡單。Lodash 的模塊化方法 非常適用於: 遍歷 array、object 和 str ...
  • Node.js Net 模塊提供了一些用於底層的網路通信的小工具,包含了創建伺服器/客戶端的方法 server.js var net = require("net"); var server=net.createServer(function(connection){ console.log("客戶 ...
  • 廢話不多說,直接聊乾貨。 關鍵詞“零基礎”和“迅速”,針對這兩個詞,我們就應該相應的學習規劃。首先你是一個零基礎的人,現在急需把web前端相關技能學好,在“保證學習質量”的同時用最短的時間學好web前端應該掌握的必要技術。 具體實行方案如下: 1.瞭解web前端市場需求 首先,零基礎的人應該去瞭解目 ...
  • 今天來說說es6的語法,最基礎的也就是var,let,const 的用法與區別了,我們來看看他們之間的恩怨情仇。 首先來說說var,這個只要是學過js的都知道,它是用來聲明一個變數的,但是它在開發中也會遇到一些問題,比較難解決。先來看看下麵的代碼: var str="hello world"; ​ ...
  • 問題描述:在console.log中列印一個json對象時會顯示[object Object] //清空控制台輸出並將游標顯示在第一排 console.clear(); //定義一個json格式的對象 var j = {}; j.name = "小J"; j.sex = true; j.age = ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...