vue实现歌手列表字母排序,下拉滚动条侧栏排序实时更新
栏目: JavaScript · 发布时间: 6年前
内容简介:今天写项目的时候遇到了歌手排序的问题,联想到了我们平时的手机通讯录侧栏字母排序,按照ABCDE这样的顺序对名字进行排序那就用vue来实现一遍
今天写项目的时候遇到了歌手 排序 的问题,联想到了我们平时的手机通讯录侧栏字母排序,按照ABCDE这样的顺序对名字进行排序
我们先来看看效果
那就用vue来实现一遍
首先新建一个vue页面,取名为helloworld.vue
在页面里写入内容
<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:[], // 侧栏排序列表
currentSort: 'hot', // 当前排序的标签
singerTopTag: 'hot', // 歌手栏头部的标签名字
};
},
mounted() {
this.testData()
// 监听滚动条
window.addEventListener('scroll', this.handleScroll)
},
destroyed () {
// 页面摧毁的时候要关闭监听
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) => {
// 获取每个排序标签的位置
offsetTop = document.querySelectorAll('.singer-ul-li')[index].offsetTop
// 当前滚动条的位置 和 当前的标签偏移顶部的距离进行对比
// 每一个歌手的li标签的高度必须要保持一致,我这里的高度是70,可以计算自己项目的内容的具体高度进行修改
if (scrollTop > offsetTop && scrollTop < (offsetTop+ 70*item.data.length)) {
this.singerTopTag = item.tag
this.currentSort = item.tag
}
})
},
// 请求数据
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) => {
// 添加侧栏排序
item.Findex = item.Findex == 9 ? 'hot' : item.Findex
this.sortList.push(item.Findex)
})
// 去除重复
this.sortList = new Set(this.sortList)
this.sortList = [...this.sortList]
// 添加排序标签和歌手列表
this.sortList.forEach(e => {
this.list.push({
tag:e,
data:res.filter(i => i.Findex ==e)
})
})
})
},
// 跳转标签
jumpTag(i){
this.singerTopTag = i
this.currentSort = i
document.querySelector(`#${i}`).scrollIntoView()
}
},
filters :{
filterSingerTag(i) {
return i == `hot` ? `热门` : 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音乐接口,获取的数据需要进行处理,如果觉得麻烦可以自己写静态数据来代替
数据的格式
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:`邓紫棋`
}
]
},
]复制代码
再者还要注意页面的img标签,直接复制上面的数据的话要对img标签进行修改,去掉http那一串,直接用:src="item.img"代替
最后就可以看效果了,有什么疑问可以在下面评论。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- DuiC 配置中心 1.7.0 发布,支持配置实时更新
- Flink 使用 broadcast 实现维表或配置的实时更新
- 亿级视频内容如何实时更新?(附阿里文娱智能算法PDF下载)
- probie 插件更新,新增实时编程
- 配置中心 duic-java-client 1.3.0 发布,配置实时更新
- 原 荐 缓存架构之借助消息中间件RabbitMQ实现Redis缓存实时更新实战演练
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Spring Into HTML and CSS
Molly E. Holzschlag / Addison-Wesley Professional / 2005-5-2 / USD 34.99
The fastest route to true HTML/CSS mastery! Need to build a web site? Or update one? Or just create some effective new web content? Maybe you just need to update your skills, do the job better. Welco......一起来看看 《Spring Into HTML and CSS》 这本书的介绍吧!