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 相关文章推荐
Extjs4 GridPanel的主要配置参数详细介绍
Apr 18 Javascript
JSF中confirm弹出框的用法示例介绍
Jan 07 Javascript
用JS在浏览器中创建下载文件
Mar 05 Javascript
jquery获取radio值实例
Oct 16 Javascript
详解javascript中原始数据类型Null和Undefined
Dec 17 Javascript
非常漂亮的相册集 使用jquery制作相册集
Apr 28 Javascript
jquery实现侧边栏左右伸缩效果的示例
Dec 19 jQuery
JS 实现百度搜索功能
Feb 01 Javascript
swiper4实现移动端导航切换
Oct 16 Javascript
vue实现element表格里表头信息提示功能(推荐)
Nov 20 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
May 06 Javascript
bootstrap-table后端分页功能完整实例
Jun 01 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源码之explode使用说明
2011/08/05 PHP
自己写的兼容低于PHP 5.5版本的array_column()函数
2014/10/24 PHP
PHP提示Warning:phpinfo() has been disabled函数禁用的解决方法
2014/12/17 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
High Performance JavaScript(高性能JavaScript)读书笔记分析
2011/05/05 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
js 验证身份证信息有效性
2014/03/28 Javascript
JavaScript实现控制打开文件另存为对话框的方法
2015/04/17 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
浅谈vue获得后台数据无法显示到table上面的坑
2020/08/13 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
售后服务承诺书范文
2014/03/26 职场文书
死亡证明书样本说明
2014/10/18 职场文书
穆斯林的葬礼读书笔记
2015/06/26 职场文书
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js
css filter和getUserMedia的联合使用
2022/02/24 HTML / CSS
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS
Redis批量生成数据的实现
2022/06/05 Redis