Vue列表如何实现滚动到指定位置样式改变效果


Posted in Javascript onMay 09, 2020

这个需求大概是这样子:

我做的一个聊天Demo,在搜索框搜索用户,可以滚动到指定的用户。然后成选中状态。

这是目前状态,我搜索南宫仆射 ,想要下面的用户列表直接滚动到南宫仆射并改变CSS样式。

Vue列表如何实现滚动到指定位置样式改变效果

查询之后是这个子:

Vue列表如何实现滚动到指定位置样式改变效果

嗯,我的思路:

在搜索框搜索到用户之后会返回一个用户对象,之后会调用列表的点击事件,改变CSS样式及做一些聊天的逻辑。然后需要获取到列表对应的id值,直接使用 document.getElementById(it).scrollIntoView();

具体实现:

列表:使用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="请输入内容"
       @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>手机号码:{{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="请输入内容"
       @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;
    // 调用 callback 返回建议列表的数据
    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>

总结

到此这篇关于Vue列表实现滚动到指定位置样式改变的文章就介绍到这了,更多相关Vue列表实现滚动到指定位置样式改变内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 Javascript
Prototype中dom对象方法汇总
Sep 17 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
Sep 11 Javascript
node.js中的fs.linkSync方法使用说明
Dec 15 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
Dec 29 Javascript
Javascript将数字转化成为货币格式字符串
Jun 22 Javascript
瀑布流的实现方式(原生js+jquery+css3)
Jun 28 Javascript
Angular 输入框实现自定义验证功能
Feb 19 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
Aug 31 Javascript
在vue项目中正确使用iconfont的方法
Sep 28 Javascript
使用node搭建自动发图文微博机器人的方法
Mar 22 Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 Javascript
Node.js API详解之 util模块用法实例分析
May 09 #Javascript
Vue实现PC端靠边悬浮球的代码
May 09 #Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
May 08 #Javascript
基于JavaScript实现表格隔行换色
May 08 #Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
May 09 #Javascript
基于JQuery实现页面定时弹出广告
May 08 #jQuery
使用vue cli4.x搭建vue项目的过程详解
May 08 #Javascript
You might like
PHP与SQL注入攻击[三]
2007/04/17 PHP
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
2014/06/19 PHP
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
Jquery组件easyUi实现表单验证示例
2016/08/23 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
vue中监听返回键问题
2019/08/28 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
Python常用随机数与随机字符串方法实例
2015/04/09 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
Django开发中的日志输出的方法
2018/07/02 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
Python request post上传文件常见要点
2020/11/20 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
会计电算化专业应届大学生求职信
2013/10/22 职场文书
会计电算化专业毕业生求职信范文
2013/12/10 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
高二英语教学反思
2014/01/19 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
开展党的群众路线教育实践活动工作总结
2014/11/05 职场文书
2014年政工师工作总结
2014/12/18 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
MySQL优化及索引解析
2022/03/17 MySQL