Vue列表如何實(shí)現(xiàn)滾動到指定位置樣式改變效果
這個需求大概是這樣子:
我做的一個聊天Demo,在搜索框搜索用戶,可以滾動到指定的用戶。然后成選中狀態(tài)。
這是目前狀態(tài),我搜索南宮仆射 ,想要下面的用戶列表直接滾動到南宮仆射并改變CSS樣式。

查詢之后是這個子:

嗯,我的思路:
在搜索框搜索到用戶之后會返回一個用戶對象,之后會調(diào)用列表的點(diǎn)擊事件,改變CSS樣式及做一些聊天的邏輯。然后需要獲取到列表對應(yīng)的id值,直接使用 document.getElementById(it).scrollIntoView();
具體實(shí)現(xiàn):
列表:使用vue的v-for指令 ,這里的id值使用的是遍歷的索引值,外層是一個自定義滾動條組件。樣式也是使用vue指令,一個語法糖。
<GeminiScrollbar
class="my-scroll-bars">
<li v-for="(item,index) in hrs" :id="index"
:key="index"
:class="{ active: currentSession?item.username === currentSession.username:false}"
@click="changeCurrentSession(item)">
<img class="avatar"
:src="item.userface">
<el-badge :is-dot="isDot[user.username+'#'+item.username]">
<p class="name">{{item.name}}</p>
</el-badge>
</li>
</GeminiScrollbar>
搜索框:這里使用帶提示的輸入框,
<el-autocomplete
v-model="SearchHr" class="input-with-select" popper-append-to-body="false"
style="width: 90%;padding-left: 5%;padding-top: 10px;margin-bottom: 10px"
size="small"
:fetch-suggestions="querySearch"
placeholder="請輸入內(nèi)容"
@select="handleSelect"
>
<el-button slot="append" icon="el-icon-search"
@click="SearchCurrentSession(SearchHr)"></el-button>
</el-autocomplete>
JS代碼:請求為get請求的axios封裝,hr為查詢返回的對象,hrs為所有的列表對象。
SearchCurrentSession() {
this.getRequest("/chat/?name=" + this.SearchHr).then(resp => {
if (resp) {
this.hr = resp;
this.SearchHr = '';
this.changeCurrentSession(this.hr);
let it = 0;
this.hrs.forEach((item, index) => {
if (item.name == this.hr.name) {
it = index;
}
})
document.getElementById(it).scrollIntoView();
// document.getElementsByClassName("active")[0].scrollIntoView();
}
});
changeCurrentSession(currentSession) {
this.$store.commit('changeCurrentSession', currentSession)
},
頁面全部代碼:
<template>
<div style="display: flex;justify-content:space-between;height: 100%;width: 100%">
<div class="leftlist">
<el-menu background-color="#2e3238" router
class="el-menu-vertical-demo"
active-text-color="#67C23A"
text-color="#fff"
:collapse="isCollapse">
<el-menu-item index="/chat" style="padding-left: 10px;margin:10px 0px 20px 2px">
<el-tooltip effect="light" placement="right-start" popper-class="el-scrollbar">
<div slot="content">
<div style="margin-top: 5px;font-size: 13px;lineHeight:1.5;">
<div>用戶名:{{user.name}}</div>
<div>手機(jī)號碼:{{user.phone}}</div>
<div>電話號碼:{{user.telephone}}</div>
<div>地 址:{{user.address}}</div>
<div>備注:{{user.remark}}</div>
</div>
</div>
<img class="avatar"
:src="user.userface"
:alt="user.name"></el-tooltip>
</el-menu-item>
<el-menu-item index="/chat" style="padding-left: 15px">
<i class="fa fa-weixin fa-2x"></i>
</el-menu-item>
<el-menu-item index="/chat" style="padding-left: 15px">
<i class="fa fa-windows fa-2x"></i>
</el-menu-item>
<el-menu-item index="/chat" style="padding-left: 15px">
<i class="fa fa-modx fa-2x"></i>
</el-menu-item>
<el-menu-item index="/chat" style="padding-left: 15px">
<i class="fa fa-share-alt fa-2x"></i>
</el-menu-item>
</el-menu>
</div>
<div id="list">
<div style="height:100%;width:100%;overflow-x: hidden">
<ul style="padding-left: 0px; overflow-x: hidden;">
<el-autocomplete
v-model="SearchHr" class="input-with-select" popper-append-to-body="false"
style="width: 90%;padding-left: 5%;padding-top: 10px;margin-bottom: 10px"
size="small"
:fetch-suggestions="querySearch"
placeholder="請輸入內(nèi)容"
@select="handleSelect"
>
<el-button slot="append" icon="el-icon-search"
@click="SearchCurrentSession(SearchHr)"></el-button>
</el-autocomplete>
<GeminiScrollbar
class="my-scroll-bars">
<li v-for="(item,index) in hrs" :id="index"
:key="index"
:class="{ active: currentSession?item.username === currentSession.username:false}"
@click="changeCurrentSession(item)">
<img class="avatar"
:src="item.userface">
<el-badge :is-dot="isDot[user.username+'#'+item.username]">
<p class="name">{{item.name}}</p>
</el-badge>
</li>
</GeminiScrollbar>
</ul>
</div>
</div>
</div>
</template>
<script>
import {mapState} from 'vuex'
export default {
name: 'list',
data() {
return {
isCollapse: true,
SearchHr: '',
hr: "",
restaurants: [],
user: JSON.parse(window.sessionStorage.getItem("user"))
}
},
computed: {
...mapState([
'hrs',
'isDot',
'currentSession'
])
},
methods: {
SearchCurrentSession() {
this.getRequest("/chat/?name=" + this.SearchHr).then(resp => {
if (resp) {
this.hr = resp;
this.SearchHr = '';
this.changeCurrentSession(this.hr);
let it = 0;
this.hrs.forEach((item, index) => {
if (item.name == this.hr.name) {
it = index;
}
})
document.getElementById(it).scrollIntoView();
// document.getElementsByClassName("active")[0].scrollIntoView();
}
});
},
querySearch(queryString, cb) {
this.restaurants = this.loadAll();
let restaurants = [];
this.restaurants.forEach(value => {
let {name, username} = value;
let restaurant = {value: name, username: username}
restaurants.push(restaurant);
});
var results = queryString ? restaurants.filter(this.createFilter(queryString)) : restaurants;
// 調(diào)用 callback 返回建議列表的數(shù)據(jù)
cb(results);
},
createFilter(queryString) {
return (SearchHr) => {
return (SearchHr.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0);
};
},
loadAll() {
return this.hrs;
},
changeCurrentSession(currentSession) {
this.$store.commit('changeCurrentSession', currentSession)
},
handleSelect(item) {
console.log(item);
}
},
mounted() {
this.$store.dispatch('initData');
}
}
</script>
<style lang="scss" scoped>
.my-scroll-bars {
height: 610px;
}
/* override gemini-scrollbar default styles */
/* vertical scrollbar track */
.gm-scrollbar.-vertical {
background-color: #f0f0f0
}
/* horizontal scrollbar track */
.gm-scrollbar.-horizontal {
background-color: transparent;
}
/* scrollbar thumb */
.gm-scrollbar .thumb {
background-color: rebeccapurple;
}
.gm-scroll-view {
overflow-x: hidden;
}
.gm-scrollbar .thumb:hover {
background-color: fuchsia;
}
input-with-select {
margin-top: 50px;
padding-top: 20px;
}
.el-scrollbar__wrap {
width: 100%;
height: 100%;
overflow-x: hidden;
}
.el-menu-item is-active {
padding-left: 10px;
}
.el-menu-vertical-demo {
background-color: #2e3238;
width: 80px;
height: 100%;
/*opacity:0.8;*/
}
.leftlist {
background-color: transparent;
width: 90px;
height: 700px;
overflow-x: hidden;
}
.avatar {
width: 45px;
height: 45px;
/*這個是圖片和文字居中對齊*/
border-radius: 5px;
margin-top: 5px;
}
.el-scrollbar__wrap {
background-color: #E4E7ED;
}
#el-scrollbar {
background-color: #E4E7ED;
}
#list {
background-color: #E4E7ED;
width: 100%;
overflow-x: hidden;
li {
padding: 7px 15px;
border-bottom: 1px solid #E4E7ED;
cursor: pointer;
list-style: none;
color: #505458;
&:hover {
background-color: rgba(0, 0, 0, 0.07);
}
}
li.active {
/*注意這個是.不是冒號:*/
background-color: rgba(0, 0, 0, 0.1);
}
.avatar {
border-radius: 2px;
width: 30px;
height: 30px;
vertical-align: middle;
}
.name {
display: inline-block;
margin-left: 15px;
margin-top: 0px;
margin-bottom: 0px;
}
}
</style>
總結(jié)
到此這篇關(guān)于Vue列表實(shí)現(xiàn)滾動到指定位置樣式改變的文章就介紹到這了,更多相關(guān)Vue列表實(shí)現(xiàn)滾動到指定位置樣式改變內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決Vue頁面固定滾動位置的處理辦法
- Vue實(shí)現(xiàn)渲染數(shù)據(jù)后控制滾動條位置(推薦)
- vue實(shí)現(xiàn)滾動條到頂部或者到指定位置
- vue中實(shí)現(xiàn)點(diǎn)擊按鈕滾動到頁面對應(yīng)位置的方法(使用c3平滑屬性實(shí)現(xiàn))
- vue監(jiān)聽頁面中的某個div的滾動事件并判斷滾動的位置
- Vue滾動到指定位置的多種方式示例詳解
- Vue滾動頁面到指定位置的實(shí)現(xiàn)及避坑
- 解決vue無法設(shè)置滾動位置的問題
- vue通過滾動行為實(shí)現(xiàn)從列表到詳情,返回列表原位置的方法
- vue-scroller記錄滾動位置的示例代碼
- Vue頁面返回滾動位置恢復(fù)(keep-alive滾動記憶)
相關(guān)文章
Vue如何利用flex布局實(shí)現(xiàn)TV端城市列表功能
用vue開發(fā)了三四個組件了,都是H5的,現(xiàn)在來看看PC是如何玩轉(zhuǎn)組件的,下面這篇文章主要給大家介紹了關(guān)于Vue如何利用flex布局實(shí)現(xiàn)TV端城市列表功能的相關(guān)資料,需要的朋友可以參考下2023-01-01
vue v-for出來的列表,點(diǎn)擊某個li使得當(dāng)前被點(diǎn)擊的li字體變紅操作
這篇文章主要介紹了vue v-for出來的列表,點(diǎn)擊某個li使得當(dāng)前被點(diǎn)擊的li字體變紅操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Vue+Java 通過websocket實(shí)現(xiàn)服務(wù)器與客戶端雙向通信操作
這篇文章主要介紹了Vue+Java 通過websocket實(shí)現(xiàn)服務(wù)器與客戶端雙向通信操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Vue實(shí)例中生命周期created和mounted的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Vue實(shí)例中生命周期created和mounted區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
結(jié)合mint-ui移動端下拉加載實(shí)踐方法總結(jié)
下面小編就為大家?guī)硪黄Y(jié)合mint-ui移動端下拉加載實(shí)踐方法總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Vue使用Prism實(shí)現(xiàn)頁面代碼高亮展示示例
這篇文章主要為大家介紹了Vue使用Prism實(shí)現(xiàn)頁面代碼高亮展示示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
關(guān)于el-col的使用,占據(jù)寬度的應(yīng)用解析
這篇文章主要介紹了關(guān)于el-col的使用,占據(jù)寬度的應(yīng)用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
vue3封裝echarts組件的實(shí)現(xiàn)步驟
這篇文章主要介紹了如何在Vue3中封裝一個高效、可復(fù)用的ECharts組件TChart,該組件支持響應(yīng)式圖表、空數(shù)據(jù)展示、事件監(jiān)聽、主題切換和性能優(yōu)化等功能,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-01-01
vue+echarts5實(shí)現(xiàn)中國地圖的示例代碼
本文主要介紹了vue+echarts5實(shí)現(xiàn)中國地圖的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01

