移動端原生實現列表列固定橫向滾動功能

功能介紹:

在移動端開發中,會用到列表作為信息展示方式,一般希望上下滾動時,可以固定表頭,左右滾動時,可以固定最左列。

需求:

1、列表可以使用數組循環遍歷;
2、上下滾動時,可以固定表頭在最頂端顯示;
3、左右滾動時,可以固定左邊一列或多列可以固定顯示;
4、列表的列寬允許在數組中設置;

思路:

1、頁面使用四個dom元素分別存儲四種元素:

1)固定在左上角,完全不參與滾動表頭元素;
2)固定在頂部,只允許左右滾動表頭元素;
3)固定在左側,只允許上下滾動列元素;
4)右下角,左右上下均可隨意滾動列元素;

2、表頭數組與列表數據數組之間互相聯系,表頭屬性可以控制列表列排序、列表寬度、是否為固定列等;

3、四個dom之間增加聯動,使用@scroll、scrollLeft、scrollTop;

示意圖:

列表固定滾動布局圖

實現代碼:

html代碼:

<div class="table-box"><div class="listFlexSty"><div class="fixedHeadBox" :style="{width: fixedWid}"><divclass="thClass"v-for="(item, index) in fixedHead":key="index":style="{width: item.width, justifyContent:item.name === '名稱'?'flex-start':'',padding:item.name === '名稱'?'0 10px':''}"@click="thItemClick(item)"><div>{{item.name}}</div><div class="playIconSty"><div class="topArrow"></div><div class="bottomArrow"></div></div></div></div><divclass="nomalHeadBox"style="{width: 'calc(100% - ' + fixedWid + ')';}"><div ref="nomalHeadBox" @scroll="scrollHList"><div class="thClass" :style="{width: nomalWid}"><divclass="thClass"v-for="(item, index) in nomalHead":key="index":style="{width: item.width,padding:item.name === '折扣偏差'?'0 10px':''}"@click="thItemClick(item)"><div>{{item.name}}</div><div class="playIconSty"><div class="topArrow"></div><div class="bottomArrow"></div></div></div></div></div></div></div><div style="height: calc(100% - 40px); overflow: auto" id="dataBodyId"><div v-show="tBodyData.length!==0" class="listFlexSty"><div class="fixedListBox" :style="{width: fixedWid}"><div ref="fixedListBox" @scroll="scrollFList"><div class="rLineSty" v-for="(item, index) in tBodyData" :key="index"><divv-for="(it, inx) in fixedHead":key="inx":style="{width: it.width, justifyContent:it.name === '名稱'?'flex-start':'',padding:it.name === '名稱'?'0 10px':''}"class="thClass"><span v-if="it.prop === 'storeName' || it.prop === 'curDiscount'">{{item[it.prop]}}</span><spanv-if="it.prop === 'orderAmount' || it.prop === 'diffAmount'"v-format="'#,##0.##'">{{item[it.prop]}}</span><span v-if="it.prop === 'completionRate'">{{item[it.prop]}}%</span><spanv-if="it.prop === 'yearEarlier'":class="item[it.prop]<0?'downArrow':item[it.prop]>0?'upArrow':''">{{item[it.prop]}}%</span><span v-if="it.prop === 'diffDiscount'">{{item[it.prop]>0?'+':''}}{{item[it.prop]}}</span></div></div></div></div><divclass="nomalListBox"ref="nomalListBox":style="{width: 'calc(100% - '+fixedWid+')'}"@scroll="scrollList"><divclass="rLineSty":style="{width: nomalWid}"v-for="(item, index) in tBodyData":key="index"><divv-for="(it, inx) in nomalHead":key="inx":style="{width: it.width,padding:it.name === '折扣偏差'?'0 10px':''}"class="thClass"><span v-if="it.prop === 'storeName' || it.prop === 'curDiscount'">{{item[it.prop]}}</span><span v-if="it.prop === 'orderAmount' || it.prop === 'diffAmount'" v-format="'#,##0.##'">{{item[it.prop]}}</span><span v-if="it.prop === 'completionRate'">{{item[it.prop]}}%</span><spanv-if="it.prop === 'yearEarlier'":class="item[it.prop]<0?'downArrow':item[it.prop]>0?'upArrow':''">{{item[it.prop]}}%</span><span v-if="it.prop === 'diffDiscount'">{{item[it.prop]>0?'+':''}}{{item[it.prop]}}</span></div></div></div></div><div v-show="tBodyData.length>0 && !finished" class="bottomTip" @click="moreLoad"><span style="color: #999999">展開查看更多</span><van-icon name="arrow-down" color="#999999" /></div><div v-show="tBodyData.length>0 && finished" class="bottomTip"><span style="color: #999999">已加載完全部數據</span></div><div v-show="tBodyData.length===0" class="noData">暫無數據</div></div>
</div>

js代碼:

data(){return {// 下面是首頁底部列表數據相關字段tHeadData: [{ name: '名稱', prop: 'storeName', width: '100px', isfixed: true },{ name: '總業績(元)', prop: 'orderAmount', width: '80px' },{ name: '平均折扣', prop: 'curDiscount', width: '80px' },{ name: '同比', prop: 'yearEarlier', width: '60px' },{ name: '完成率', prop: 'completionRate', width: '80px' },{ name: '缺口(元)', prop: 'diffAmount', width: '100px' },{ name: '折扣偏差', prop: 'diffDiscount', width: '80px' }],tBodyData: [],fixedHead: [],nomalHead: [],fixedWid: '',nomalWid: ''}
},methods: {// 列表數據相關initData() {this.fixedHead = this.tHeadData.filter(item => {return item.isfixed;});this.nomalHead = this.tHeadData.filter(item => {return !item.isfixed;});this.initSize();},initSize() {let fwid = 0;let nwid = 0;this.fixedHead.forEach(item => {// 此處以px單位為例const len = item.width.length - 2;const width = item.width.substring(0, len) - 0;fwid += width;});this.nomalHead.forEach(item => {const len = item.width.length - 2;const width = item.width.substring(0, len) - 0;nwid += width;});this.fixedWid = fwid + 'px';this.nomalWid = nwid + 'px';},// 首頁下方數據列表聯動相關scrollHList() {this.$refs.nomalListBox.scrollLeft = this.$refs.nomalHeadBox.scrollLeft;},scrollFList() {this.$refs.nomalListBox.scrollTop = this.$refs.fixedListBox.scrollTop;},scrollList() {this.$refs.fixedListBox.scrollTop = this.$refs.nomalListBox.scrollTop;this.$refs.nomalHeadBox.scrollLeft = this.$refs.nomalListBox.scrollLeft;}
}

css代碼:

.table-box {width: 100%;height: calc(100% - 80px);overflow: hidden;
}
.listFlexSty {display: flex;
}
.fixedHeadBox {height: 40px;line-height: 40px;color: #333333;font-size: 12px;
}
.nomalHeadBox {height: 40px;line-height: 40px;overflow: hidden;color: #333333;font-size: 12px;
}
.fixedListBox {height: 100%;overflow: hidden;color: #666666;font-size: 12px;
}
.nomalListBox {height: 100%;overflow: auto;color: #666666;font-size: 12px;
}
.thClass {display: flex;align-items: center;justify-content: flex-end;
}
.rLineSty {height: 34px;padding: 10px 0;display: flex;
}
.rLineSty > div {display: -webkit-box;-webkit-line-clamp: 2;overflow: hidden;
}/* 隱藏滾動條 */
/* 隱藏右邊表格頭部滾動條 */
.nomalHeadBox > div {overflow: auto;height: calc(100% + 10px);
}
/* 隱藏左邊列表滾動條 */
.fixedListBox > div {overflow: auto;height: 100%;width: calc(100% + 10px);
}
.noDataNew {height: calc(100% - 40px);display: flex;align-items: center;justify-content: center;color: #999;font-size: 12px;
}

效果圖:

列表固定滾動

注意: 代碼里的方法thItemClick是列排序功能,與此文章無關,實現代碼未貼出,除此之外,其他未貼出的代碼均與此文章所講功能無關,忽略即可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213839.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213839.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213839.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

離線環境下使用百度地圖(vue版)(展示自己的地圖瓦片)3.0版本api

1.下載自己想要的地圖網片 (1)瓦片圖下載 提取百度網盤中文件&#xff0c;然后運行exe文件&#xff0c;選擇要下載的層級及地區即可 百度網盤鏈接&#xff1a;https://pan.baidu.com/s/16sOJ9ws7HCgNH3EMf7Ejyg?pwd0q0e 提取碼&#xff1a;0q0e (2)將瓦片圖映射到網上 推薦使…

CSS中常用的10個文本樣式屬性

一個頁面中&#xff0c;文本樣式&#xff0c;是必不可少的&#xff0c;當然css也給我們準備了很多很多很多的文本樣式&#xff0c;以下列舉了10個常用的文本樣式屬性及常用的屬性值&#xff0c;掌握了&#xff0c;也基本滿足使用了 1: text-transform 可以用來設置文本的大小寫…

Python-docx 深入word源碼 自定義字符間距

代碼和實現效果 from docx import Document from docx.oxml import OxmlElement from docx.oxml.ns import qn from docx.shared import Pt# 調整pt設置字間距 def SetParagraphCharSpaceByPt(run, pt1):通過修改word源碼方式, 添加w:spacing標簽直接通過調整pt來設置字符間距…

Blender學習--制作帶骨骼動畫的機器人

1. 首先創建一個機器人模型 時間關系&#xff0c;這部分步驟有時間補充 2. 然后為機器人創建一副骨架 時間關系&#xff0c;這部分步驟有時間補充 3.骨骼綁定 切換到物體模式&#xff0c;選中機器人頭部&#xff0c;Shift選中骨骼&#xff0c;切換到姿態模式&#xff0c;&am…

SpringBoot集成系列--xxlJob

文章目錄 一、搭建調度中心xxl-job-admin1、下載項目2、調整項目參數3、執行初始化數據庫SQL4、啟動項目5、訪問 二、集成步驟1、添加xxl-job的依賴2、添加xxl-job的依賴3、配置執行器4、創建執行器5、開發任務1&#xff09;方式1&#xff1a;BEAN模式&#xff08;方法形式&…

RocketMQ源碼

RocketMQ的核心三流程 啟動流程 RocketMQ服務端由兩部分組成NameServer和Broker&#xff0c;NameServer是服務的注冊中心&#xff0c;Broker會把自己的地址注冊到NameServer&#xff0c;生產者和消費者啟動的時候會先從NameServer獲取Broker的地址&#xff0c;再去從Broker發…

【自動駕駛】2023年度盤點:智能汽車、自動駕駛、車聯網必讀書

2023年&#xff0c;智能駕駛和新能源汽車行業仍然有著肉眼可見的新進展。自動駕駛技術繼續嘗試從輔助駕駛向自動駕駛的過渡&#xff0c;更重要的是相關技術成本的下降。根據《全球電動汽車展望2023》等行業報告&#xff0c;預計2023年平均成本將降至100美元/千瓦時以下&#xf…

知識筆記(四十八)———mysql的優缺點

MySQL作為一個廣泛應用的關系型數據庫管理系統&#xff0c;具有以下優點和缺點&#xff1a; 優點&#xff1a; 開源和免費&#xff1a;MySQL是開源軟件&#xff0c;用戶可以免費獲取和使用它。這使得MySQL成為個人開發者和小型組織的理想選擇。 良好的性能&#xff1a;MySQL經…

成都工業學院Web技術基礎(WEB)實驗八:BOM、DOM基本操作

寫在前面 1、基于2022級計算機大類實驗指導書 2、代碼僅提供參考&#xff0c;前端變化比較大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一樣 3、圖片和文字僅為示例&#xff0c;需要自行替換 4、如果代碼不滿足你的要求&#xff0c;請尋求其他的…

【開源】基于Vue.js的就醫保險管理系統

文末獲取源碼&#xff0c;項目編號&#xff1a; S 085 。 \color{red}{文末獲取源碼&#xff0c;項目編號&#xff1a;S085。} 文末獲取源碼&#xff0c;項目編號&#xff1a;S085。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 科室檔案模塊2.2 醫生檔案模塊2.3 預…

最好的貓罐頭品牌有哪些?精選的5款口碑好的貓罐頭推薦!

對于一個剛入門的養貓小白來說&#xff0c;面對市面上琳瑯滿目的貓罐頭選擇確實讓人頭大。我們總想選到營養價值高的罐頭&#xff0c;但又怕貓咪不喜歡吃&#xff0c;也擔心選到不安全的產品。 最好的貓罐頭品牌有哪些&#xff1f;根據我開寵物店7年的經驗&#xff0c;今天我將…

Java基礎——static關鍵字

對象只有在new的時候才會分配空間&#xff0c;有時候我們希望不管是否產生了對象或無論產生了多少對象的情況下&#xff0c;某些特定的數據在內存空間里只有一份&#xff0c;就可以static修飾成員&#xff0c;也稱靜態成員或類成員。 static可修飾屬性、方法、代碼塊、內部類。…

python一點通:參數列表里面有星號 * 什么意思?

在Python類或函數參數列表中&#xff0c;我們有時會看到星號*&#xff0c;它是什么意思呢&#xff1f; 什么是僅限關鍵字參數&#xff1f; Python 3中引入的僅限關鍵字參數是指必須通過其名稱來指定的函數或方法參數。它們避免了由于存在多個參數而引起的混淆&#xff0c;增強…

「哈士奇贈書活動 - 46期」-『技術人修煉之道:從程序員到百萬高管的72項技能(第2版)』

?? 贈書 - 《技術人修煉之道&#xff08;第2版&#xff09;》 ?? 內容簡介 本書旨在幫助計算機IT技術人員提升職場核心技能、架構思維、團隊管理能力、商業認知&#xff0c;讓每一位普通的技術從業者&#xff0c;修煉成為"技術職場超級個體”&#xff0c;通過全面升級…

IntelliJ IDEA無公網遠程連接Windows本地Mysql數據庫提高開發效率

&#x1f525;博客主頁&#xff1a; 小羊失眠啦. &#x1f3a5;系列專欄&#xff1a;《C語言》 《數據結構》 《Linux》《Cpolar》 ??感謝大家點贊&#x1f44d;收藏?評論?? 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;…

windows啟動出現 zookeeper此處不應有java

可能是Java 路徑出了問題&#xff0c;這個programFiles直接有空格&#xff0c;沒錯就有空格&#xff0c;筆者一開始以為這么點算什么空格&#xff0c;需要把這個對應的Java文件到別的英文路徑下&#xff0c;并且修改環境變量。就可以啟動的。 還可以啟動方式有很多種&#xff0…

2.2 模型基礎

建模流程 作業 這次搞了10天左右終于把作業做完了。 先是去學習了下如何建模->然后將模型導入Substance Painter里繪制貼圖->最后導入到unity中&#xff08;雖然最后效果很差&#xff09;&#xff0c;但是回過頭來看整個過程學習到了次時代美術的工作流&#xff0c;思考…

658. 找到 K 個最接近的元素

658. 找到 K 個最接近的元素 Java代碼&#xff1a;滑窗 class Solution {public List<Integer> findClosestElements(int[] arr, int k, int x) {List<Integer> list new ArrayList<>();for (int i 0; i < arr.length; i) {arr[i] arr[i] - x;}for(i…

【打卡】牛客網:BM63 跳臺階

自己寫的 class Solution { public:/*** 代碼中的類名、方法名、參數名已經指定&#xff0c;請勿修改&#xff0c;直接返回方法規定的值即可** * param number int整型 * return int整型*/int jumpFloor(int number) {// write code hereif(number 1)return 1;if(number 2)r…

簡單實現Spring容器(二) 封裝BeanDefinition對象放入Map

階段2: // 1.編寫自己的Spring容器,實現掃描包,得到bean的class對象.2.掃描將 bean 信息封裝到 BeanDefinition對象,并放入到Map.思路: 1.將 bean 信息封裝到 BeanDefinition對象中,再將其放入到BeanDefinitionMap集合中,集合的結構大概是 key[beanName]–value[beanDefintion…