主頁 > 企業開發 > 記錄--巧用 overflow-scroll 實作絲滑輪播圖

記錄--巧用 overflow-scroll 實作絲滑輪播圖

2023-06-27 08:24:39 企業開發

這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

前言: 近期我在專案中就接到了一個完成輪播圖組件的需求,最開始我也像大家一樣,直接選擇使用了知名的開源專案 "Swiper",但是后來發現它在移動端專案中某些測驗環境下會白屏一段時間,無論如何除錯都不能修復這個問題,于是就自己上手寫了個輪播圖組件,實作代碼其實也只有 200 行,很少但是完美解決了我們專案的問題,

雖然已經 2023 年了,但是輪播圖組件的實作仍然是考驗前端基本功的經久不衰的題目,于是來分享一下實作思路,??

tips: 本文主要目的不是一上來就貼代碼,而是會一步一步帶你理清細節部分,即使你現在沒有輪播圖這個需求,

一. 使用 overflow-scroll 完成基礎框架

  1. 大家在專案中肯定接觸到溢位滾動的需求,其實就是用到了 overflow-auto 等相關屬性,

  • 注意:樣式方面,在這里我使用的是 UnoCSS ,將樣式內聯在了標簽里,如果你還不了解這種寫法,你可以點擊下方的文章學習,不過即使你之前從未了解過 UnoCSS ,也不會影響你下面的閱讀,因為樣式不是本文的重點,并不影響整體閱讀,
    ??手把手教你如何創建一個代碼倉庫

  • 讓我們快速制造一個溢位的場景來完成準備作業,其實非常簡單,就是簡單的創造一個容器,容器里放著三個和容器寬高相同的 div,然后給父容器一個 overflow-auto 屬性,讓它可以在內容溢位的時候發生滾動,

  1. 效果如下:
    1.gif

二. 實作合適位置自動切換

  1. 現在我們僅僅實作了一個可以滾動的容器而已,但是輪播圖最主要的事情就是用戶滾動的位置不合適,那么我們也要自動調整到合適的位置顯示,

  2. 更具體來講,就是當我們拖動圖片到了中間這樣的位置松手時,輪播圖最重要一個功能就是可以自動切換到上一張或者下一張,準確的顯示合適的內容給用戶,(因為展示內容區域展示一半一半的內容毫無意義嘛,)
    image.png

  3. 這里就需要用到兩個至關重要的 CSS 屬性,

    • snap-type
    • snap-align

    我們先看 snap 這個單詞的意思,在這里它的意思我認為 “咔嚓一聲,折斷” 更符合這個屬性的含義,不要著急,你可以暫時先帶著這個模糊的概念來慢慢理解接下來的內容,
    image.png

  4. 我們先看 snap-type 是用來干什么的,
    image.png
    這里 MDN 的解釋不是特別好懂,接下來我會用人話翻譯一下它想表達的含義,

  5. 回到我們的代碼部分,我們創建了一個容器 div,并且這個容器因為溢位,并且設定了 overflow-滾動 相關屬性,
    image.png
    其實我們的 scroll-type 是用來給滾動容器的!這里特別注意,它一定是用在設定了 overflow-auto 等屬性的那個元素上的,

  6. 關于屬性值,我們采用 snap-type: x mandatory
    image.png
    在這里 x 的含義代表著橫軸發生的滾動,那么聰明的你可以猜到,它也有一個 y 屬性,代表著豎軸發生滾動時的設定,

  7. 這里還有一個關鍵字 mandatory 代表著強制的意思,因為在某些情況下,瀏覽器會認為用戶滑到下面這種位置是自愿的,但是我們的場景是不需要考慮這種情況的,所以要告訴瀏覽器我們需要你幫我 “強制咔嚓折斷”image.png

  8. 至于 proximity ,這個屬性的演算法有點奇怪,我也沒太搞懂它的含義,不過我們的需求不需要用到這個關鍵字,大家有興趣也可以自行查閱,

  9. 接下來給我們的容器設定這個屬性,讓我們先看看效果,
    image.png
    2.gif

  10. 什么情況?怎么沒效果呢?目前為止我們僅僅給容器設定了滾動的需求還是不夠的,還得告訴子元素滾動到什么位置停下才行,這里就需要用到 snap-align 屬性了,它是給滾動容器的子元素設定的,

  11. snap-align ,這個屬性有三個值可以設定,nonecenterend
    image.png
    其實從這個屬性的名字就可以猜到,它其實設定的是子元素的位置是相對于滾動容器的左邊對齊還是右邊對齊,

  12. 怎么理解呢?我們將滾動容器的寬度調大,讓它可以漏出一點點其它元素的內容,并且只給數字2的元素設定 scroll-align 相關屬性,(tips: 這里需要重點注意,我們只給了一個元素設定了這個屬性,另外兩個元素是沒有設定這個屬性的,)

    • snpa-align: start (元素2無論如何都會在松開滑鼠的時候緊貼著滾動容的左邊,也就是滾動容器的 start 位置 start.gif

    • snap-align: center (元素2無論如何都會緊貼著滾動容器中間位置 center.gif

    • snap-align: end (元素2的右邊無論如何都會緊貼著滾動容器 end.gif

  13. 知道了這三個屬性的區別,那么接下來復原我們的容器樣子,因為我們實際上輪播圖的每一項的寬高和滾動容器的內容區是恰好相等的,所以我們給子元素無論設定怎樣的三個值的效果都是一樣的,
    image.png
    讓我們看一下效果:
    4.gif
    看起來效果還不錯~

三. 實作上一項和下一項切換功能

  1. 我們準備兩個按鈕,當用戶點擊這兩個按鈕的時候,可以進行手動的切換上一張和下一張,
    image.png

  2. 這里我們需要用到滾動容器的 scroll 事件,需要給滾動容器系結相對的回呼函式,
    image.png
    這里通過 e.target 就可以拿到我們滾動容器本身,容器自身存在一個 scollLeft 屬性,你需要知道一個知識點其實發生滾動的本質就是 scrollLeft 值的變化
    image.png
    注意觀看下面滾動容器的 scrollLeft 屬性值的變化,
    scroll.gif

  3. 知道了這個關鍵點,那么我們的 prenext 函式就可以很明確的書寫了, 首先通過 ref 拿到元素本身,
    image.png

  4. 然后在 pre 函式內部獲取當前滾動元素的 scollLeft 值,
    image.png

  5. 緊接著,你需要知道的是,這個值即是一個可讀屬性,也是一個可寫屬性,那么我們就可以進行判斷,如果當前照片不是第一張的話,,那么我就讓 scrollLeft 的值 -300,這里有兩個關鍵的知識點,

      1. 第一張對應的 scrollLeft 等于0
      1. 這里的 300 是我們寫死的寬度,你可以根據后面自己的專案優化這個值,

    image.png

  6. 讓我們看一下效果,先讓我們手動滾動到第三張,然后點擊上一張切換,
    5.gif

  7. 這里好像有一點點不對勁,我們不是平緩過度到上一張的而是直接切換到上一張的,這里很簡單,需要給滾動容器設定一個 scroll-behavior:smooth 即可,
    image.png
    我們看一下效果:
    6.gif

  8. 下一張按鈕的實作同理,這里不過多贅述,代碼如下:
    image.png

  9. 最終的效果:
    7.gif

四. 原始碼

<script setup lang="ts">
import { ref, computed } from "vue";


const box = [
  {
    number: 1,
    bg: "blue",
  },

  {
    number: 2,
    bg: "pink",
  },

  {
    number: 3,
    bg: "red",
  },
];

const containerEl = ref<HTMLDivElement>();

function scrollEvent(e: UIEvent) {
  const containerEl = e.target as HTMLDivElement;
}

// 上一張
function pre() {
  const el = containerEl.value;
  if (!el) return;

  const scrollLeft = el?.scrollLeft;

  if (scrollLeft > 0) {
    el.scrollLeft = scrollLeft - 300;
  }
}

function next() {
  const el = containerEl.value;
  if (!el) return;

  const scrollLeft = el?.scrollLeft;

  const max = (box.length - 1) * 300; //輪播圖的數量 -1

  if (scrollLeft < max) {
    el.scrollLeft = scrollLeft + 300;
  }
}
</script>

<template>
  <div
    
  >
    <div
      @click.stop="pre"
      
    >
      <span >上一張</span>
    </div>

    <div
      ref="containerEl"
      @scroll="scrollEvent"
      
    >
      <div
        v-for="(item, index) in box"
        
        :style="{ backgroundColor: item.bg }"
      >
        <span >{{ item.number }}</span>
      </div>
    </div>

    <div
      @click="next"
      
    >
      <span >下一張</span>
    </div>
  </div>
</template>

本文轉載于:

https://juejin.cn/post/7248655627927601207

如果對您有所幫助,歡迎您點個關注,我會定時更新技術檔案,大家一起討論學習,一起進步,

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/556056.html

標籤:Html/Css

上一篇:React實戰--利用甘特圖和看板,強化Paas平臺應用

下一篇:返回列表

標籤雲
其他(161676) Python(38254) JavaScript(25514) Java(18265) C(15238) 區塊鏈(8273) C#(7972) AI(7469) 爪哇(7425) MySQL(7269) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4606) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2437) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1985) HtmlCss(1973) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 記錄--巧用 overflow-scroll 實作絲滑輪播圖

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言: 近期我在專案中就接到了一個完成輪播圖組件的需求。最開始我也像大家一樣,直接選擇使用了知名的開源專案 "Swiper",但是后來發現它在移動端專案中某些測驗環境下會白屏一段時間。無論如何除錯都不能修復這個問題,于是就自己上手寫了個輪 ......

    uj5u.com 2023-06-27 08:24:39 more
  • React實戰--利用甘特圖和看板,強化Paas平臺應用

    ? 概述 這是一篇 React 在 kintone 上的實戰,我們需要利用看板和甘特圖來來強化專案管理 app。另外這次用到了 webpack,想了解基本配置思路的可以看這里 專案地址 GitHub - kintone-samples/SAMPLE-kintone-ganttchart-kanban ......

    uj5u.com 2023-06-26 10:19:55 more
  • React實戰--利用甘特圖和看板,強化Paas平臺應用

    ? 概述 這是一篇 React 在 kintone 上的實戰,我們需要利用看板和甘特圖來來強化專案管理 app。另外這次用到了 webpack,想了解基本配置思路的可以看這里 專案地址 GitHub - kintone-samples/SAMPLE-kintone-ganttchart-kanban ......

    uj5u.com 2023-06-26 10:13:12 more
  • 驅動開發:內核物理記憶體尋址讀寫

    在某些時候我們需要讀寫的行程可能存在虛擬記憶體保護機制,在該機制下用戶的`CR3`以及`MDL`讀寫將直接失效,從而導致無法讀取到正確的資料,本章我們將繼續研究如何實作物理級別的尋址讀寫。首先,驅動中的物理頁讀寫是指在驅動中直接讀寫物理記憶體頁(而不是虛擬記憶體頁)。這種方式的優點是它能夠更快地訪問記憶體,... ......

    uj5u.com 2023-06-26 10:07:28 more
  • 驅動開發:內核物理記憶體尋址讀寫

    在某些時候我們需要讀寫的行程可能存在虛擬記憶體保護機制,在該機制下用戶的`CR3`以及`MDL`讀寫將直接失效,從而導致無法讀取到正確的資料,本章我們將繼續研究如何實作物理級別的尋址讀寫。首先,驅動中的物理頁讀寫是指在驅動中直接讀寫物理記憶體頁(而不是虛擬記憶體頁)。這種方式的優點是它能夠更快地訪問記憶體,... ......

    uj5u.com 2023-06-26 10:01:23 more
  • promise

    1.處理異步有哪些方式 在計算機編程中,處理異步操作的方式有多種。下面是一些常見的處理異步的方式: 回呼函式(Callback Functions):這是一種傳統的處理異步操作的方式。在這種模式下,可以將一個函式作為引數傳遞給異步操作,當操作完成時,呼叫該函式進行后續處理。這種方式簡單直接,但容易導 ......

    uj5u.com 2023-06-26 09:09:40 more
  • 記錄--強制快取這么暴力,為什么不使用協商快取

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前段時間在看面經的時候,發現很多份面經中都被問到了 強快取 和 協商快取。因此我覺得有必要寫一篇文章來好好聊聊這兩者。 強快取和協商快取 瀏覽器快取是瀏覽器在本地磁盤對用戶最近請求過的檔案進行存盤,當訪問者再次訪問同一頁面時,瀏覽器就可以 ......

    uj5u.com 2023-06-26 09:09:26 more
  • React基本引入和JSX語法

    1.1 React介紹 1.1.1. 官網 英文官網: https://reactjs.org/ 中文官網: https://react.docschina.org/ 1.1.2. 介紹描述 用于動態構建用戶界面的 JavaScript 庫(只關注于視圖) 由Facebook開源 1.1.3. Re ......

    uj5u.com 2023-06-26 09:09:12 more
  • 前端Vue仿京東加入購物車彈框立即購買彈框shopDialog自定義彈框

    #### 前端Vue仿京東加入購物車彈框立即購買彈框shopDialog自定義彈框內容, 下載完整代碼請訪問uni-app插件市場地址:https://ext.dcloud.net.cn/plugin?id=13183 #### 效果圖如下: ![](https://p3-juejin.byteim ......

    uj5u.com 2023-06-26 09:09:06 more
  • 記錄--強制快取這么暴力,為什么不使用協商快取

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前段時間在看面經的時候,發現很多份面經中都被問到了 強快取 和 協商快取。因此我覺得有必要寫一篇文章來好好聊聊這兩者。 強快取和協商快取 瀏覽器快取是瀏覽器在本地磁盤對用戶最近請求過的檔案進行存盤,當訪問者再次訪問同一頁面時,瀏覽器就可以 ......

    uj5u.com 2023-06-26 09:03:19 more