基于el-scrollbar封装滚动条

news2025/1/31 8:18:02

Element UI中内置的滚动条插件el-scrollbar,但没有公示在文档中,这里基于它封装一个组件,提供回到顶部、滚动放向、最大高度功能。完整代码在最后。

基础结构

接收height属性,可以动态设置高度,默认是100%

<template>
  <el-scrollbar
    :class="['scroll-bar']"
    ref="scroll"
    :style="style">
    <slot />
  </el-scrollbar>
</template>

<script>
export default {
  props: {
    height: {
      type: String,
      default () {
        return '100%'
      }
    }
  },
  data () {
    return {
    }
  },
  computed: {
    style () {
      return {
        height: this.height
      }
    }
  },
  methods: {
  }
}
</script>

<style lang="scss">
.scroll-bar {
  .el-scrollbar__wrap {
    overflow-x: hidden; // 去除横向滚动条
  }
}
</style>
<style lang="scss" scoped>
</style>

引入页面即可使用
在这里插入图片描述

<template>
  <div style="width: 400px; height: 400px; margin: 0 auto;">
    <scroll-bar>
      <ul>
        <li
          v-for="item in 100"
          :key="item">{{ item }}</li>
      </ul>
    </scroll-bar>
  </div>
</template>

<script>
import ScrollBar from '@/components/ScrollBar'

export default {
  components: {
    ScrollBar
  }
}
</script>

回到顶部

接收toTop属性,需要显示回到顶部按钮设置,默认是false

<template>
  <el-scrollbar
    :class="['scroll-bar']"
    ref="scroll"
    :style="style">
    <slot />
    <div
      v-show="showToTop"
      class="to-top"
      :style="[
        {'background-color': toTopTheme.bgc},
        {'color': toTopTheme.color},
        {'right': toTopPos.right},
        {'bottom': toTopPos.bottom}
      ]"
      @click="handleToTop">
      <i class="el-icon-top"></i>
    </div>
  </el-scrollbar>
</template>

<script>
export default {
  props: {
    height: {
      type: String,
      default () {
        return '100%'
      }
    },
    toTop: {
      type: Boolean,
      default () {
        return false
      }
    },
    toTopTheme: {
      type: Object,
      default () {
        return {
          bgc: '',
          color: ''
        }
      }
    },
    toTopPos: {
      type: Object,
      default () {
        return {
          right: '',
          bottom: ''
        }
      }
    }
  },
  data () {
    return {
      showToTop: false
    }
  },
  computed: {
    style () {
      return {
        height: this.height
      }
    }
  },
  mounted () {
    this.toTop && this.$refs.scroll.wrap.addEventListener('scroll', this.scrollFunc)
  },
  methods: {
    scrollFunc (e) {
      const scrollTop = e.target.scrollTop
      if (scrollTop > 80) {
        this.showToTop = true
      } else {
        this.showToTop = false
      }
    },
    handleToTop () {
      // el-scrollbar滚动层为wrap
      this.$refs.scroll.wrap.scrollTo({
        top: 0,
        behavior: 'smooth'
      })
    }
  }
}
</script>

<style lang="scss">
.scroll-bar {
  .el-scrollbar__wrap {
    overflow-x: hidden; // 去除横向滚动条
  }
}
</style>
<style lang="scss" scoped>
.to-top {
  width: 32px;
  height: 32px;
  border-radius: 8px;
  text-align: center;
  line-height: 35px;
  position: absolute;
  bottom: 40px;
  right: 20px;
  background-color: #3756d4;
  color: #fff;
  font-size: 20px;
  transition: all .4s;
  .el-icon-top {
    transition: all .4s;
  }
  &:hover {
    cursor: pointer;
    opacity: .88;
  }
  &.active {
    .el-icon-top {
      transform: translateY(-6px);
    }
  }
}
</style>

在引用处传入toTop即可显示回到顶部按钮
在这里插入图片描述

<scroll-bar toTop>
  <ul>
    <li
      v-for="item in 100"
      :key="item">{{ item }}</li>
  </ul>
</scroll-bar>

横向滚动

接收direction属性,控制滚动方向,默认为y,这里主要通过改变样式实现。

<template>
  <el-scrollbar
    :class="['scroll-bar', {'direction-x': direction === 'x'}]"
    ref="scroll"
    :style="style">
    <slot />
    <div
      v-show="showToTop"
      class="to-top"
      :style="[
        {'background-color': toTopTheme.bgc},
        {'color': toTopTheme.color},
        {'right': toTopPos.right},
        {'bottom': toTopPos.bottom}
      ]"
      @click="handleToTop">
      <i class="el-icon-top"></i>
    </div>
  </el-scrollbar>
</template>

<script>
export default {
  props: {
    height: {
      type: String,
      default () {
        return '100%'
      }
    },
    toTop: {
      type: Boolean,
      default () {
        return false
      }
    },
    toTopTheme: {
      type: Object,
      default () {
        return {
          bgc: '',
          color: ''
        }
      }
    },
    toTopPos: {
      type: Object,
      default () {
        return {
          right: '',
          bottom: ''
        }
      }
    },
    direction: {
      type: String,
      default () {
        return 'y'
      }
    }
  },
  data () {
    return {
      showToTop: false
    }
  },
  computed: {
    style () {
      return {
        height: this.height
      }
    }
  },
  mounted () {
    this.toTop && this.$refs.scroll.wrap.addEventListener('scroll', this.scrollFunc)
  },
  methods: {
    scrollFunc (e) {
      const scrollTop = e.target.scrollTop
      if (scrollTop > 80) {
        this.showToTop = true
      } else {
        this.showToTop = false
      }
    },
    handleToTop () {
      // el-scrollbar滚动层为wrap
      this.$refs.scroll.wrap.scrollTo({
        top: 0,
        behavior: 'smooth'
      })
    }
  }
}
</script>

<style lang="scss">
.scroll-bar {
  &.direction-x {
    .el-scrollbar__wrap{
      overflow-x: auto !important;
      height: calc(100% + 20px);
      .el-scrollbar__view{
        height: 100%;
      }
    }
  }
  .el-scrollbar__wrap {
    overflow-x: hidden;
  }
}
</style>
<style lang="scss" scoped>
.to-top {
  width: 32px;
  height: 32px;
  border-radius: 8px;
  text-align: center;
  line-height: 35px;
  position: absolute;
  bottom: 40px;
  right: 20px;
  background-color: #3756d4;
  color: #fff;
  font-size: 20px;
  transition: all .4s;
  .el-icon-top {
    transition: all .4s;
  }
  &:hover {
    cursor: pointer;
    opacity: .88;
  }
  &.active {
    .el-icon-top {
      transform: translateY(-6px);
    }
  }
}
</style>

使用处记得横向超出不换行
在这里插入图片描述

<template>
  <div style="width: 400px; height: 400px; margin: 0 auto;">
    <scroll-bar direction="x">
      <ul>
        <li
          v-for="item in 100"
          :key="item">{{ item }}</li>
      </ul>
    </scroll-bar>
  </div>
</template>

<script>
import ScrollBar from '@/components/ScrollBar'

export default {
  components: {
    ScrollBar
  },
  data () {
    return {

    }
  },
  methods: {
  }
}
</script>

<style lang="scss" scoped>
ul {
  display: flex;
  flex-wrap: nowrap;
  li {
    width: 100px;
  }
}
</style>

最大高度(完整代码)

接收maxHeight属性,动态内容不设置固定高度时使用,通过给容器el-scrollbar__wrap设置最大高度实现。

<template>
  <el-scrollbar
    :class="['scroll-bar', {'direction-x': direction === 'x'}, {'max-height': maxHeight}]"
    ref="scroll"
    :style="style">
    <slot />
    <div
      v-show="showToTop"
      class="to-top"
      :style="[
        {'background-color': toTopTheme.bgc},
        {'color': toTopTheme.color},
        {'right': toTopPos.right},
        {'bottom': toTopPos.bottom}
      ]"
      @click="handleToTop">
      <i class="el-icon-top"></i>
    </div>
  </el-scrollbar>
</template>

<script>
export default {
  props: {
    height: {
      type: String,
      default () {
        return '100%'
      }
    },
    maxHeight: {
      type: String
    },
    toTop: {
      type: Boolean,
      default () {
        return false
      }
    },
    toTopTheme: {
      type: Object,
      default () {
        return {
          bgc: '',
          color: ''
        }
      }
    },
    toTopPos: {
      type: Object,
      default () {
        return {
          right: '',
          bottom: ''
        }
      }
    },
    direction: {
      type: String,
      default () {
        return 'y'
      }
    }
  },
  data () {
    return {
      showToTop: false
    }
  },
  computed: {
    style () {
      return {
        height: this.height,
        '--maxHeight': this.maxHeight || ''
      }
    }
  },
  mounted () {
    this.toTop && this.$refs.scroll.wrap.addEventListener('scroll', this.scrollFunc)
  },
  methods: {
    scrollFunc (e) {
      const scrollTop = e.target.scrollTop
      if (scrollTop > 80) {
        this.showToTop = true
      } else {
        this.showToTop = false
      }
    },
    handleToTop () {
      // el-scrollbar滚动层为wrap
      this.$refs.scroll.wrap.scrollTo({
        top: 0,
        behavior: 'smooth'
      })
    }
  }
}
</script>

<style lang="scss">
.scroll-bar {
  &.direction-x {
    .el-scrollbar__wrap{
      overflow-x: auto !important;
      height: calc(100% + 20px);
      .el-scrollbar__view{
        height: 100%;
      }
    }
  }
  &.max-height {
    .el-scrollbar__wrap {
      max-height: var(--maxHeight);
      overflow-x: hidden;
    }
  }
  .el-scrollbar__wrap {
    overflow-x: hidden;
  }
}
</style>
<style lang="scss" scoped>
.to-top {
  width: 32px;
  height: 32px;
  border-radius: 8px;
  text-align: center;
  line-height: 35px;
  position: absolute;
  bottom: 40px;
  right: 20px;
  background-color: #3756d4;
  color: #fff;
  font-size: 20px;
  transition: all .4s;
  .el-icon-top {
    transition: all .4s;
  }
  &:hover {
    cursor: pointer;
    opacity: .88;
  }
  &.active {
    .el-icon-top {
      transform: translateY(-6px);
    }
  }
}
</style>

引用处设置maxHeight
在这里插入图片描述

<template>
  <div style="width: 400px; margin: 0 auto;">
    <scroll-bar maxHeight="200px">
      <ul>
        <li
          v-for="item in 100"
          :key="item">{{ item }}</li>
      </ul>
    </scroll-bar>
  </div>
</template>

<script>
import ScrollBar from '@/components/ScrollBar'

export default {
  components: {
    ScrollBar
  },
  data () {
    return {

    }
  },
  methods: {
  }
}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/924056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

合肥先进光源高速数据采集网的规划

合肥先进光源束测后台的初步设计&#xff0c;这里的网络相关的部分摘出来换个名字重新整理一下&#xff1a; 合肥光源中&#xff0c;没有把数据量大的设备比如摄像头、示波器规划进单独的网络&#xff0c;所有的设备都直接接入控制网&#xff0c;运行实践的过程中&#xff0c;有…

FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装

FreeSWITCH 1.10.10 简单图形化界面1 - docker/脚本/ISO镜像安装 0. 界面预览1. Docker安装1.1 下载docker镜像1.2 启动docker镜像1.3 登录 2. 脚本安装2.1 下载2.2 安装2.3 登录2.4 卸载程序 3. 镜像安装3.1 下载镜像3.2 安装镜像3.3 登录 0. 界面预览 http://myfs.f3322.net…

c++使用zlib对字符串进行压缩和解压

官网下载zlib库编译后就能使用 #include <string> #include <iostream> #include <memory> #include <assert.h> #include <cstring> #include "zlib.h"#define CHUNK 16384/* Compress from file source to file dest until EOF on …

【MPC控制方法】

今天在读百度的MPC算法的代码。 研究对象 LQR的研究对象是现代控制理论中以状态空间方程形式给出的线性系统。MPC的研究对象可以是线性系统&#xff0c;也可以是非线性系统&#xff0c;只不过为了某些需求&#xff0c;如时效性&#xff0c;计算的便捷&#xff0c;操控性等&am…

pyside6常用组件的示例

pyside6常用组件的示例 一、制作界面 1.绘制界面 2.生成代码 # -*- coding: utf-8 -*-################################################################################ ## Form generated from reading UI file t1gui.ui ## ## Created by: Qt User Interface Compiler…

aws PinPoint发附件demo

php 版aws PinPoint发附件demo Laravel8框架&#xff0c;安装了"aws/aws-sdk-php": "^3.257" 主要代码&#xff1a; public function sendRawMail(Request $request) {$file $request->file(attachment);/*echo count($file);dd($file);*/$filenam…

软考信息安全工程师考前刷题、巩固基础 【必看!】

信息安全工程师&#xff08;第二版&#xff09;–1、网络信息安全概述 https://ks.wjx.top/vj/wLADwkY.aspx 信息安全工程师&#xff08;第二版&#xff09;–2、网络攻击原理与常用方法 https://ks.wjx.top/vj/eG4wyO0.aspx 信息安全工程师&#xff08;第二版&#xff09;…

YOLO目标检测——足球比赛中球员检测数据集下载分享

足球比赛中球员检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富&#xff0c;图片格式为jpg&#xff0c;共500张图片 数据集点击下载&#xff1a;YOLO足球比赛中球员检测数据集500图片.rar

教你实现自动化测试

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…

视频云存储/安防监控/AI视频智能分析平台新功能:人员倒地检测详解

人工智能技术已经越来越多地融入到视频监控领域中&#xff0c;近期我们也发布了基于AI智能视频云存储/安防监控视频智能分析平台的众多新功能&#xff0c;该平台内置多种AI算法&#xff0c;可对实时视频中的人脸、人体、物体等进行检测、跟踪与抓拍&#xff0c;支持口罩佩戴检测…

YOLOv8教程系列:四、使用yolov8仓库训练自己的图像分类数据集(含推理预测)

YOLOv8教程系列&#xff1a;四、使用yolov8仓库训练自己的图像分类数据集&#xff08;含推理预测&#xff09; 0.引言 Yolov8是最新一代的You Only Look Once目标检测模型,它由Ultralytics研究团队在2022年开发。相比于之前的Yolo版本,Yolov8在速度和精度上都有很大的提升。 …

ARM开发,stm32mp157a-A7核SPI总线实验(实现数码管的显示)

1.目标&#xff1a; a.数码管显示相同的值 0000 1111 ......9999&#xff1b; b.数码管显示不同的值 1234&#xff1b; 2.分析m74hc595芯片内部框图&#xff1b; 真值表&#xff1a; 3.代码&#xff1b; ---spi.h头文件--- #ifndef __SPI_H__ #define __SPI_H__#include &quo…

Oracle的学习心得和知识总结(二十八)|Oracle数据库数据库回放功能之论文二翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

湘潭大学 湘大 XTU OJ 1271 Color 题解(非常详细)

链接 1271 题面 题目描述 Alice在玩一个游戏&#xff0c;她在一个mn的格子里&#xff0c;随机涂黑k个格子。然后她每次可以把一行或者一列的格子染成红色&#xff0c;但是这一行中不能有黑色的格子。 请问她最多能把多少个格子涂成红色&#xff1f; 输入 第一行是一个整数…

低代码平台:开发应用程序的新革命

一、前言 在传统的软件开发交付链中&#xff0c;需求经过多次传递&#xff0c;往往造成需求失真和功能返工。然而&#xff0c;随着业务的不断变化&#xff0c;低代码开发作为软件开发的新兴分支&#xff0c;呈现出高效、灵活和稳定的特点&#xff0c;为企业提供了解决方案。 在…

MAC电脑外放没有声音解决方案

烦人呐&#xff0c;我的mac外接显示屏幕&#xff0c;显示器没有音频输出&#xff0c;需要mac笔记本的音频输出&#xff0c;但是经常打开后&#xff0c;mac没有声音输出&#xff0c;需要重启电脑才能生效。亲测一下方法有效&#xff0c;请参考&#xff1a; 文章目录 一、短期方案…

Java的类加载顺序

加载、验证、准备、解析和初始化。 加载 “加载”(Loading)阶段是“类加载”(Class Loading)过程的第一个阶段&#xff0c;在此阶段&#xff0c;虚拟机需要完成以下三件事情&#xff1a; 通过一个类的全限定名来获取定义此类的二进制字节流。将这个字节流所代表的静态存储结构…

CentOS8中使用yum命令出现错误提示:为仓库 ‘appstream‘ 下载元数据失败

需求 最近安装了虚拟机并配置了CentOS8&#xff0c;然后打算继续安装WEB服务环境 科普 yum是一个命令行工具&#xff0c;可以在Linux系统下帮助我们方便地管理软件包&#xff08;包括安装、卸载、检查更新等操作&#xff09;&#xff0c;yum install命令的作用是在系统上安装…

很干的 Nginx

&#x1f3a8; 前言 本篇文章有些概念性的东西&#xff0c;是结合自己的理解表达出来的&#xff0c;可能有些理解不到位的地方。希望多多指教&#xff0c;谢谢大家。 红包献上 &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;…