vue實(shí)現(xiàn)歌手列表字母排序下拉滾動(dòng)條側(cè)欄排序?qū)崟r(shí)更新
今天寫(xiě)項(xiàng)目的時(shí)候遇到了歌手排序的問(wèn)題,聯(lián)想到了我們平時(shí)的手機(jī)通訊錄側(cè)欄字母排序,按照ABCDE這樣的順序?qū)γ诌M(jìn)行排序。
我們先來(lái)看看效果
那就用vue來(lái)實(shí)現(xiàn)一遍
首先新建一個(gè)vue頁(yè)面,取名為helloworld.vue
在頁(yè)面里寫(xiě)入內(nèi)容
<template> <div class="hello"> <div class="singer" id="singer"> <div class="singer-top-tag">{{singerTopTag | filterSingerTag}}</div> <ul class="singer-ul"> <li v-for="(item, index) in list" :key="index" class="singer-ul-li"> <div class="singer-tag" :id="item.tag">{{item.tag | filterSingerTag}}</div> <ul> <li v-for="(fitem, findex) in item.data" :key="findex"> <img :src="`https://y.gtimg.cn/music/photo_new/T001R300x300M000${fitem.Fsinger_mid}.jpg?max_age=2592000`"> <div>{{fitem.Fsinger_name}}</div> </li> </ul> </li> </ul> </div> <div class="sort"> <ul> <li v-for="(item, index) in sortList" :key="index" @click="jumpTag(item)" :class="{current:currentSort == item ? true : false}" > {{item == `hot` ? `熱` : item}} </li> </ul> </div> </div> </template>
<script> import axios from 'axios' export default { name: "HelloWorld", data() { return { list:[], // 歌手列表 sortList:[], // 側(cè)欄排序列表 currentSort: 'hot', // 當(dāng)前排序的標(biāo)簽 singerTopTag: 'hot', // 歌手欄頭部的標(biāo)簽名字 }; }, mounted() { this.testData() // 監(jiān)聽(tīng)滾動(dòng)條 window.addEventListener('scroll', this.handleScroll) }, destroyed () { // 頁(yè)面摧毀的時(shí)候要關(guān)閉監(jiān)聽(tīng) window.removeEventListener('scroll', this.handleScroll) }, methods: { handleScroll () { let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop let offsetTop = 0 this.list.forEach((item,index) => { // 獲取每個(gè)排序標(biāo)簽的位置 offsetTop = document.querySelectorAll('.singer-ul-li')[index].offsetTop // 當(dāng)前滾動(dòng)條的位置 和 當(dāng)前的標(biāo)簽偏移頂部的距離進(jìn)行對(duì)比 // 每一個(gè)歌手的li標(biāo)簽的高度必須要保持一致,我這里的高度是70,可以計(jì)算自己項(xiàng)目的內(nèi)容的具體高度進(jìn)行修改 if (scrollTop > offsetTop && scrollTop < (offsetTop+ 70*item.data.length)) { this.singerTopTag = item.tag this.currentSort = item.tag } }) }, // 請(qǐng)求數(shù)據(jù) testData(){ axios.get(`https://c.y.qq.com/v8/fcg-bin/v8.fcg?g_tk=1928093487&inCharset=utf-8&outCharset=utf-8¬ice=0&format=jsonp&channel=singer&page=list&key=all_all_all&pagesize=100&pagenum=1&hostUin=0&needNewCode=0&platform=yqq&jsonpCallback=jp1`) .then(res => { res = res.data.substring(5,res.data.length-1) res = JSON.parse(res).data.list res = res.sort((a,b) => a.Findex.localeCompare(b.Findex)) res.forEach((item,index) => { // 添加側(cè)欄排序 item.Findex = item.Findex == 9 ? 'hot' : item.Findex this.sortList.push(item.Findex) }) // 去除重復(fù) this.sortList = new Set(this.sortList) this.sortList = [...this.sortList] // 添加排序標(biāo)簽和歌手列表 this.sortList.forEach(e => { this.list.push({ tag:e, data:res.filter(i => i.Findex ==e) }) }) }) }, // 跳轉(zhuǎn)標(biāo)簽 jumpTag(i){ this.singerTopTag = i this.currentSort = i document.querySelector(`#${i}`).scrollIntoView() } }, filters :{ filterSingerTag(i) { return i == `hot` ? `熱門(mén)` : i } } }; </script> <!-- Add "scoped" attribute to limit CSS to this component only --> <style scoped> .hello { position: relative; background-color: #222; } .singer { position: relative; width: 100%; height: 100%; overflow: hidden; background: #222; } .singer-top-tag { position: fixed; top: 0px; left: 0; width: 100%; height: 30px; line-height: 30px; padding-left: 20px; font-size: 12px; color: hsla(0,0%,100%,.5); background: #333; } .singer-tag { width: 100%; height: 30px; margin-bottom: 20px; line-height: 30px; padding-left: 20px; font-size: 12px; color: hsla(0,0%,100%,.5); background: #333; } .singer-ul-li ul li { list-style-type: none; display: flex; justify-content: flex-start; align-items: center; padding: 0 0 20px 20px; color: rgba(255, 255, 255, .5); } .singer-ul-li ul li img { border-radius: 50%; widows: 50px; height: 50px; } .singer-ul-li ul li div { padding-left: 20px; } .sort { position: fixed; z-index: 30; right: 0; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); width: 20px; padding: 20px 0; border-radius: 10px; text-align: center; background: rgba(0,0,0,.3); font-family: Helvetica; } ul { margin: 0; padding: 0; } .sort ul{ color: rgba(255,255,255,.6); } .sort ul li { list-style-type: none; padding: 3px; line-height: 1; font-size: 12px; } .current { color: #ffcd32; } </style>
我是使用的qq音樂(lè)接口,獲取的數(shù)據(jù)需要進(jìn)行處理,如果覺(jué)得麻煩可以自己寫(xiě)靜態(tài)數(shù)據(jù)來(lái)代替
數(shù)據(jù)的格式
const list = [ { tag:`A`, data:[ { img:`https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558361071&di=0a522afe68fc7e2aa3af34cb5cd8c96a&imgtype=jpg&er=1&src=http%3A%2F%2Fwerkstette.dk%2Fwp-content%2Fuploads%2F2015%2F09%2FEntertainment_Weekly_Photographer_Marc_Hom_British_Actor_Charlie_Hunnam_as_King_Arthur_Retouch_Werkstette10-770x841.jpg`, Fsinger_name:`奧巴里` } ] }, { tag:`B`, data:[ { img:`https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558361071&di=0a522afe68fc7e2aa3af34cb5cd8c96a&imgtype=jpg&er=1&src=http%3A%2F%2Fwerkstette.dk%2Fwp-content%2Fuploads%2F2015%2F09%2FEntertainment_Weekly_Photographer_Marc_Hom_British_Actor_Charlie_Hunnam_as_King_Arthur_Retouch_Werkstette10-770x841.jpg`, Fsinger_name:`BIGBANG` } ] }, { tag:`C`, data:[ { img:`https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558361071&di=0a522afe68fc7e2aa3af34cb5cd8c96a&imgtype=jpg&er=1&src=http%3A%2F%2Fwerkstette.dk%2Fwp-content%2Fuploads%2F2015%2F09%2FEntertainment_Weekly_Photographer_Marc_Hom_British_Actor_Charlie_Hunnam_as_King_Arthur_Retouch_Werkstette10-770x841.jpg`, Fsinger_name:`蔡依林` } ] }, { tag:`D`, data:[ { img:`https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558361071&di=0a522afe68fc7e2aa3af34cb5cd8c96a&imgtype=jpg&er=1&src=http%3A%2F%2Fwerkstette.dk%2Fwp-content%2Fuploads%2F2015%2F09%2FEntertainment_Weekly_Photographer_Marc_Hom_British_Actor_Charlie_Hunnam_as_King_Arthur_Retouch_Werkstette10-770x841.jpg`, Fsinger_name:`鄧紫棋` } ] }, ]
再者還要注意頁(yè)面的img標(biāo)簽,直接復(fù)制上面的數(shù)據(jù)的話要對(duì)img標(biāo)簽進(jìn)行修改,去掉http那一串,直接用:src="item.img"
代替
const list = [ { tag:`A`, data:[ { img:`https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558361071&di=0a522afe68fc7e2aa3af34cb5cd8c96a&imgtype=jpg&er=1&src=http%3A%2F%2Fwerkstette.dk%2Fwp-content%2Fuploads%2F2015%2F09%2FEntertainment_Weekly_Photographer_Marc_Hom_British_Actor_Charlie_Hunnam_as_King_Arthur_Retouch_Werkstette10-770x841.jpg`, Fsinger_name:`奧巴里` } ] }, { tag:`B`, data:[ { img:`https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558361071&di=0a522afe68fc7e2aa3af34cb5cd8c96a&imgtype=jpg&er=1&src=http%3A%2F%2Fwerkstette.dk%2Fwp-content%2Fuploads%2F2015%2F09%2FEntertainment_Weekly_Photographer_Marc_Hom_British_Actor_Charlie_Hunnam_as_King_Arthur_Retouch_Werkstette10-770x841.jpg`, Fsinger_name:`BIGBANG` } ] }, { tag:`C`, data:[ { img:`https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558361071&di=0a522afe68fc7e2aa3af34cb5cd8c96a&imgtype=jpg&er=1&src=http%3A%2F%2Fwerkstette.dk%2Fwp-content%2Fuploads%2F2015%2F09%2FEntertainment_Weekly_Photographer_Marc_Hom_British_Actor_Charlie_Hunnam_as_King_Arthur_Retouch_Werkstette10-770x841.jpg`, Fsinger_name:`蔡依林` } ] }, { tag:`D`, data:[ { img:`https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1558361071&di=0a522afe68fc7e2aa3af34cb5cd8c96a&imgtype=jpg&er=1&src=http%3A%2F%2Fwerkstette.dk%2Fwp-content%2Fuploads%2F2015%2F09%2FEntertainment_Weekly_Photographer_Marc_Hom_British_Actor_Charlie_Hunnam_as_King_Arthur_Retouch_Werkstette10-770x841.jpg`, Fsinger_name:`鄧紫棋` } ] }, ]
總結(jié)
以上所述是小編給大家介紹的vue實(shí)現(xiàn)歌手列表字母排序下拉滾動(dòng)條側(cè)欄排序?qū)崟r(shí)更新,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
- vue實(shí)現(xiàn)循環(huán)滾動(dòng)列表
- Vue.js 無(wú)限滾動(dòng)列表性能優(yōu)化方案
- Vue列表如何實(shí)現(xiàn)滾動(dòng)到指定位置樣式改變效果
- vue通過(guò)滾動(dòng)行為實(shí)現(xiàn)從列表到詳情,返回列表原位置的方法
- vue實(shí)現(xiàn)列表滾動(dòng)的過(guò)渡動(dòng)畫(huà)
- 基于vue實(shí)現(xiàn)循環(huán)滾動(dòng)列表功能
- vue實(shí)現(xiàn)列表無(wú)縫滾動(dòng)
- vue實(shí)現(xiàn)列表無(wú)縫滾動(dòng)效果
- 基于Vue3實(shí)現(xiàn)列表虛擬滾動(dòng)效果
- vue實(shí)現(xiàn)列表固定列滾動(dòng)
相關(guān)文章
在Echarts圖中給坐標(biāo)軸加一個(gè)標(biāo)識(shí)線markLine
這篇文章主要介紹了在Echarts圖中給坐標(biāo)軸加一個(gè)標(biāo)識(shí)線markLine,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07vue+ts實(shí)現(xiàn)元素鼠標(biāo)拖動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了vue+ts實(shí)現(xiàn)元素鼠標(biāo)拖動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Vue Element前端應(yīng)用開(kāi)發(fā)之整合ABP框架的前端登錄
VUE+Element 前端是一個(gè)純粹的前端處理,前面介紹了很多都是Vue+Element開(kāi)發(fā)的基礎(chǔ),從本章隨筆開(kāi)始,就需要進(jìn)入深水區(qū)了,需要結(jié)合ABP框架使用2021-05-05Vue3+script setup+ts+Vite+Volar搭建項(xiàng)目
本文主要介紹了Vue3+script setup+ts+Vite+Volar搭建項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08vue draggable resizable 實(shí)現(xiàn)可拖拽縮放的組件功能
這篇文章主要介紹了vue draggable resizable 實(shí)現(xiàn)可拖拽縮放的組件功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Vue項(xiàng)目每次發(fā)版后要清理瀏覽器緩存問(wèn)題解決辦法
最近項(xiàng)目更新頻繁,每次一更新客戶都說(shuō)還跟之前的一樣,一查原因是因?yàn)榭蛻魶](méi)有清空瀏覽器的緩存,所以為了方便客戶看到最新版本,開(kāi)始調(diào)研再發(fā)布新版本后自動(dòng)清理緩存,這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目每次發(fā)版后要清理瀏覽器緩存問(wèn)題的解決辦法,需要的朋友可以參考下2024-02-02vuex頁(yè)面刷新導(dǎo)致數(shù)據(jù)丟失的解決方案
這篇文章主要介紹了vuex頁(yè)面刷新導(dǎo)致數(shù)據(jù)丟失的解決方案,幫助大家更好的使用vue框架,感興趣的朋友可以了解下2020-12-12