記錄--移動端 H5 Tab 如何滾動居中

来源:https://www.cnblogs.com/smileZAZ/p/17976920
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 移動端 H5 Tab 如何滾動居中 Tab 在 PC 端、移動端應用都上很常見,不過 Tab 在移動端 比 PC 端更複雜。為什麼呢?移動端設備屏幕較窄,一般僅能展示 4 ~ 7 個 Item。考慮到用戶體驗,UI 往往要求程式員實現一個 ...


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

移動端 H5 Tab 如何滾動居中

Tab 在 PC 端、移動端應用都上很常見,不過 Tab 在移動端 比 PC 端更複雜。為什麼呢?移動端設備屏幕較窄,一般僅能展示 4 ~ 7 個 Item。考慮到用戶體驗,UI 往往要求程式員實現一個功能——點擊 Item 後,Item 滾動到屏幕中央,拼多多的 Tab 就實現了這個功能。

如果你也想實現這個功能,看了這篇文章,你一定會有所收穫。我會先說明 Tab 滾動的本質,分析出滾動距離的計算公式,接著給出偽代碼,最後再給出 Vue、React 和微信小程式的示例代碼。

Tab 滾動的本質

Tab 滾動,本質是包裹著 Item 的容器在滾動。

如下圖,豎著的虛線長方形代表手機屏幕,橫著的長方形代表 Tab 的容器,標著數字的小正方形代表一個個 Tab Item。

左半部分中,Tab 容器緊貼手機屏幕左側。右半部分中,Item 4 位於屏幕中央,兩部分表示 Item 4 從屏幕右邊滾動到屏幕中央。

不難看出,Item 4 滾動居中,其實就是容器向左移動 distance。此時容器滾動條到容器左邊緣的距離也是 distance。

換句話說,讓容器向左移動 distance,Item 4 就能居中。 因此只要我們能找出計算 distance 的公式,就能控制某個 Item 居中。

計算 distance 的公式

該如何計算 distance 呢?我們看下方這張更細緻的示意圖。

屏幕中央有一條線,它把 Item 4 分成了左右等寬的兩部分,也把手機屏幕分成了左右等寬的兩部分。你可以把 Item 4 一半的寬度記為 halfItemWidth,把手機屏幕一半的寬度記為 halfScreenWidth。再把 Item 4 左側到容器左側的距離記為 itemOffsetLeft

 不難看出,這四個值滿足如下等式:

distance + halfScreenWidth = itemOffsetLeft + halfItemWidth
簡單推導一下,就得到了計算 distance 的公式。
distance = itemOffsetLeft + halfItemWidth - halfScreenWidth

公式的偽代碼實現

現在開始解釋公式的代碼實現。

先看下 itemOffsetLefthalfItemWidthhalfScreenWidth 如何獲取。

  • itemOffsetLeft 是 Item 元素到容器左側的距離,你可以用 HTMLElement.offsetLeft 作它的值。

  • halfItemWidth 是 Item 元素一半的寬度。HTMLElement.offsetWidth 是元素的整體寬度,你可以用 offsetWidth / 2 作它的值,也可以先用 Element.getBoundingClientRect() 獲取一個 itemRect 對象,再用 itemRect.width / 2 作它的值。

  • halfScreenWidth 是手機屏幕一半的寬度。 window.innerWidth 是手機屏幕的整體寬度,你可以用 innerWidth / 2 作它的值。

再看下如何把 distance 設置到容器上。

在 HTML 中,我們可以使用 Element.scrollLeft 來讀取和設置元素滾動條到元素左邊的位置。因此,你只需要容器的 scrollLeft 賦值為 distance,就可以實現 Item 元素滾動居中。

現在給出點擊 tab 的函數的偽代碼:

const onClick = () => {
  const itemOffsetLeft = item.offsetLeft;
  const halfItemWidth = item.offsetWidth / 2;
  const halfScreenWidth = window.innerWidth / 2;
  tabContainer.scrollLeft = itemOffsetLeft + halfItemWidth - halfScreenWidth
}

代碼示例

Vue

Tab 滾動居中 | Vue

React

Tab 滾動居中 | React

微信小程式

Tab 滾動居中 | 微信小程式

小程式的 API 和瀏覽器的 API 有差異。

  • itemOffsetLeft ,你需要從點擊事件的 event.currentTarget 中獲取。
  • halfItemWidth,你需要先用 wx.createSelectorQuery() 選取到 Item 後,從 exec() 的執行結果中獲取到 Item 整體寬度,然後再除以 2。
  • halfScreenWidth,你需要先用 wx.getSystemInfoSync() 獲取屏幕整體寬度,然後再除以 2。

至於把 distance 設置到容器上,微信小程式 scroll-view 組件中,有 scroll-left 這個屬性,你可以把 distance 賦值給 scroll-left

本文轉載於:

https://juejin.cn/post/7322730720732921867

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

 


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

-Advertisement-
Play Games
更多相關文章
  • Tansci-Boot 基於 SpringBoot2 + magic-api + Vue3 + Element Plus + amis3.0 快速開發管理系統 Tansci-Boot 是一個前後端分離後臺管理系統, 前端集成 amis 低代碼前端框架,後端集成 magic-api 的介面快速開發框架 ...
  • 函數根據有沒有參數,有沒有返回值,可以相互組合,一共有4種 無參數,無返回值 無參數,有返回值 有參數,無返回值 有參數,有返回值 一、無參數,無返回值的函數 此類函數,不能接收參數,也沒有返回值,一般情況下用來列印提示等類似的功能 def print_menu(): print(' ') prin ...
  • title: 使用json代替resw文件 date: 2024-01-20 categories: 編程 tags: - C# - .NET 前言 在寫WinUI3或UWP項目的時候,總覺得resw文件冗長可讀性又差,希望要是能用json就好了。 我在測試MakePri.exe[1]的時候意外發現 ...
  • title: 分析器/源生成器添加項目依賴的方式 date: 2024-01-19 categories: 編程 tags: - C# - .NET - Roslyn 前言 寫分析器(源生成器)時經常需要引用別的包,但直接引用是無法運行的。 下麵我們分不同情況來討論在分析器項目如何對依賴進行引用。 ...
  • 運算符用於對變數和值執行操作。在C#中,有多種運算符可用,包括算術運算符、關係運算符、邏輯運算符等。 算術運算符 算術運算符用於執行常見的數學運算: int x = 100 + 50; // 加法,結果為 150 int y = x - 30; // 減法,結果為 120 int z = x * 2 ...
  • ​ 1、概念 mvcc作用在於解決併發條件下,讀寫衝突的問題。一般用於RC和RR隔離級別,解決臟讀和不可重覆讀的問題。 (1)當前讀 讀取的是記錄的最新版本,讀取時還要保證其他事務不能修改當前記錄,會對讀取的記錄進行加鎖。對於我們日常的操作,如:select ... lock in share mo ...
  • 什麼是大數據 大數據(Big Data)是指在傳統數據處理方法難以處理的情況下,需要新的處理模式來具有更強的決策力、洞察發現力和過程優化能力的海量、高增長率和多樣化的信息資產。大數據的特征通常被概括為“4V”,即: Volume(容量):大數據的規模非常龐大,通常以 TB(太位元組)、PB(拍位元組)或 ...
  • 前言 在 上一小節 我介紹了我學習vue入門 插值語法 的過程。 在本篇,我將記錄我對vue的 計算屬性和偵聽器 的學習記錄 註:本篇對於”偵聽“和”監聽“是一個意思 一、計算屬性 在官網上,可以看到這樣一個例子: <div id="example"> {{ message.split('').re ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...