Element-ui之ElScrollBar组件滚动条的使用

2023-11-02

Element-ui之ElScrollBar组件滚动条封面图

2021-1-6更新
针对评论出现的问题
1、 noresize="false"属性类型不符,加冒号绑定为动态属性 :noresize="false"
2、代码不生效的问题,可能是没有设置高度导致,为<el-scrollbar /> 设置高度。

在使用 vue + element-ui 搭建后台管理页面的时候,做了一个头部、侧栏、面包屑固定的布局,导航栏和主要内容区域当内容超出时自动滚动。

使用的原因:

原来是采用优化浏览器样式的方式,对滚动条进行样式调整。但这个方法并不兼容火狐浏览器,在火狐访问时依然是浏览器默认的滚动条样式。

/* style.css */
.sidebar {
    position: fixed;
    border-right: 1px solid rgba(0,0,0,.07);
    overflow-y: auto;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    transition: transform .25s ease-out;
    width: 300px;
    z-index: 3;
}
.sidebar::-webkit-scrollbar {
    width: 4px
}

.sidebar::-webkit-scrollbar-thumb {
    background: transparent;
    border-radius: 4px
}

.sidebar:hover::-webkit-scrollbar-thumb {
    background: hsla(0,0%,53%,.4)
}

.sidebar:hover::-webkit-scrollbar-track {
    background: hsla(0,0%,53%,.1)
}

灵感来源

在翻看 element-ui官网的文档时,发现其左侧导航和右边的内容超出屏幕时,滚动条的样式比较小巧,通过浏览器审查工具查看,发现它是使用了el-scrollbar的样式,跟element-ui的组件样式命名一致。但文档中并没有关于这个 scrollbar组件的使用文档,搜索一番得知这是一个隐藏组件,官方在 github 的 issues 中表示不会写在文档中,需要用的自己看源码进行调用。

最终实现效果

后台管理框架

实现步骤

一、阅读源码

通过阅读源码,scrollbar组件暴露了 native, wrapStyle, wrapClass, viewClass, viewStyle, noresize, tag 这7个 props属性

props: {
    native: Boolean,  // 是否使用本地,设为true则不会启用element-ui自定义的滚动条
    wrapStyle: {},  // 包裹层自定义样式
    wrapClass: {},  // 包裹层自定义样式类
    viewClass: {},  // 可滚动部分自定义样式类
    viewStyle: {},  // 可滚动部分自定义样式
    noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能
    tag: {  // 生成的标签类型,默认使用 `div`标签包裹
      type: String,
      default: 'div'
    }
}

二、在页面中使用 el-scrollbar组件

<template>
	<div>
		<el-scrollbar style="height: 200px;" :native="false" wrapStyle="" wrapClass="" viewClass="" viewStyle="" :noresize="false" tag="section">
			<div>
				<p v-for="(item, index) in 200" :key="index">{{index}} 这里是一些文本。</p>
			</div>
		</el-scrollbar>
	</div>
</template>

以上代码就是对 el-scrollbar 的使用了,属性不需要用的就不用写。

源码

源码在 node_modules 目录下的 element-ui/packages/scrollbar

模块入口index.js,从main导入 scrollbar并提供一个安装方法注册成全局组件
import Scrollbar from './src/main';

/* istanbul ignore next */
Scrollbar.install = function(Vue) {
  Vue.component(Scrollbar.name, Scrollbar);
};

export default Scrollbar;

src/main.js 源码
// reference https://github.com/noeldelgado/gemini-scrollbar/blob/master/index.js

import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event';
import scrollbarWidth from 'element-ui/src/utils/scrollbar-width';
import { toObject } from 'element-ui/src/utils/util';
import Bar from './bar';

/* istanbul ignore next */
export default {
  name: 'ElScrollbar',

  components: { Bar },

  props: {
    native: Boolean,
    wrapStyle: {},
    wrapClass: {},
    viewClass: {},
    viewStyle: {},
    noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能
    tag: {
      type: String,
      default: 'div'
    }
  },

  data() {
    return {
      sizeWidth: '0',
      sizeHeight: '0',
      moveX: 0,
      moveY: 0
    };
  },

  computed: {
    wrap() {
      return this.$refs.wrap;
    }
  },

  render(h) {
    let gutter = scrollbarWidth();
    let style = this.wrapStyle;

    if (gutter) {
      const gutterWith = `-${gutter}px`;
      const gutterStyle = `margin-bottom: ${gutterWith}; margin-right: ${gutterWith};`;

      if (Array.isArray(this.wrapStyle)) {
        style = toObject(this.wrapStyle);
        style.marginRight = style.marginBottom = gutterWith;
      } else if (typeof this.wrapStyle === 'string') {
        style += gutterStyle;
      } else {
        style = gutterStyle;
      }
    }
    const view = h(this.tag, {
      class: ['el-scrollbar__view', this.viewClass],
      style: this.viewStyle,
      ref: 'resize'
    }, this.$slots.default);
    const wrap = (
      <div
        ref="wrap"
        style={ style }
        onScroll={ this.handleScroll }
        class={ [this.wrapClass, 'el-scrollbar__wrap', gutter ? '' : 'el-scrollbar__wrap--hidden-default'] }>
        { [view] }
      </div>
    );
    let nodes;

    if (!this.native) {
      nodes = ([
        wrap,
        <Bar
          move={ this.moveX }
          size={ this.sizeWidth }></Bar>,
        <Bar
          vertical
          move={ this.moveY }
          size={ this.sizeHeight }></Bar>
      ]);
    } else {
      nodes = ([
        <div
          ref="wrap"
          class={ [this.wrapClass, 'el-scrollbar__wrap'] }
          style={ style }>
          { [view] }
        </div>
      ]);
    }
    return h('div', { class: 'el-scrollbar' }, nodes);
  },

  methods: {
    handleScroll() {
      const wrap = this.wrap;

      this.moveY = ((wrap.scrollTop * 100) / wrap.clientHeight);
      this.moveX = ((wrap.scrollLeft * 100) / wrap.clientWidth);
    },

    update() {
      let heightPercentage, widthPercentage;
      const wrap = this.wrap;
      if (!wrap) return;

      heightPercentage = (wrap.clientHeight * 100 / wrap.scrollHeight);
      widthPercentage = (wrap.clientWidth * 100 / wrap.scrollWidth);

      this.sizeHeight = (heightPercentage < 100) ? (heightPercentage + '%') : '';
      this.sizeWidth = (widthPercentage < 100) ? (widthPercentage + '%') : '';
    }
  },

  mounted() {
    if (this.native) return;
    this.$nextTick(this.update);
    !this.noresize && addResizeListener(this.$refs.resize, this.update);
  },

  beforeDestroy() {
    if (this.native) return;
    !this.noresize && removeResizeListener(this.$refs.resize, this.update);
  }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Element-ui之ElScrollBar组件滚动条的使用 的相关文章

  • 隐藏WebView中的滚动条

    当我不滚动页面时 我想在 WebView 中隐藏垂直滚动条 目前来看 是一直显示的 我以编程方式创建 WebView 所以我的问题与以编程方式自定义滚动条有关 谢谢 试试这个代码 webView setVerticalScrollBarEn
  • ScrollBar 值设置不正确

    我正在尝试实现类似于 Excel 的 无限 滚动性的功能 用户可以滚动到文档的 底部 但然后继续滚动 使用滚轮或滚动条上的向下箭头 并且会为它们生成更多空行 我的这个大部分工作正常 当使用鼠标滚轮时它工作得很好 但我在使用 SmallInc
  • 与 React 内联自定义 `::-webkit-scrollbar`

    我怎样才能申请 webkit scrollbar在 React 中使用内联样式将伪元素添加到组件 你不能写pseudo内联选择器 需要在css中添加 参考这个link https developer mozilla org en US do
  • Windows 窗体 ListView 缺少水平滚动条

    我在表单 C VS 2005 中有一个 Windows 窗体 ListView 并将其锚定到表单的所有边缘 以便它完全填充表单 不包括状态栏 ListView 处于详细模式 并且列非常宽 绝对比显示区域宽 我有一个垂直滚动条 但没有水平滚动
  • 滚动条上的灰点[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Visual Studio 2017 中滚动条上的灰点是什么 代码建议 我遇到的一个场景是忘记利用我的方法 我看到的另一个建议是改进我
  • C# tableLayoutPanel 滚动除顶行之外的所有内容

    我正在使用 winforms 和 C 并查看 TableLayoutPanel 是否可以在大桌子上有滚动条 但不能让顶行滚动 这与 Excel 中 冻结窗格 选项的工作方式类似 我只想冻结顶行而不是其他任何东西 另外 我的桌子足够大 我还有
  • 如何检测离子含量是否有滚动条?

    我想在离子内容上有或没有滚动条时隐藏或显示元素 更具体地说 我想在没有滚动条时显示一个按钮 在列表中加载更多项目 并在有滚动条的地方隐藏它 因此更多项目的加载是由 ion infinite scroll 完成的 我的 Ionic 应用程序也
  • 编写 webkit Css 后滚动条中没有箭头按钮

    请参阅此处的表格 http www funkkopfhoerer test com vergleichstabelle funkkopfhoerer http www funkkopfhoerer test com vergleichsta
  • 如何使用javascript在运行时更改滚动条CSS?

    是否可以通过单击按钮在运行时更改滚动条的 css 例如颜色 这只需要在 Google Chrome 中工作 所以我使用 webkit scrollbar width 15px webkit scrollbar thumb backgroun
  • Flex - 将滚动条的位置更改为 Horizo​​ntalList 组件的顶部

    默认情况下 Horizo ntalList 组件的水平滚动条位于底部 有没有办法重新定位它 使其位于顶部 为了清楚起见 我并不是指使用scrollToIndex或horizo ntalScrollPosition或类似的方法移动滚动位置 而
  • 使用 Tiny Scrollbar 自动滚动到 div 底部

    我正在编写一个shoutbox 并使其尽可能用户友好 它使用微型滚动条插件 http plugins jquery com project tinyscrollbar对于 jQuery 我想合并一个额外的函数 让我可以让它到达底部div 它
  • 在列表视图/滚动视图中自动播放视频,类似于 facebook

    如果视图包含视频 我需要视频在列表视图 滚动视图中自动播放 这与 Facebook 非常相似 如果用户向下滚动并且可见区域包含视频 系统将播放视频 如果仍然滚动 则会自动停止该视频 它应该像一次播放一个视频一样工作 有人可以帮我解决这个问题
  • 如何在iframe中隐藏滚动条,但仍然能够滚动

    我的一个页面上有一个 iframe 其中有另一个页面 我想隐藏滚动条 但我找不到任何解决方案 我尝试过overflow hidden 但它不起作用 见下面的代码 CSS代码 iframe overflow hidden 由于您没有指定是否需
  • Facebook iFrame 应用程序 - 摆脱垂直滚动条?

    我已经转换了一个 Facebook 应用程序 http apps facebook com video preferans 从 FBML 到 iFrame 使用 PHP SDK 现在显示的垂直滚动条与我之前显示的内容数量相同 一个徽标 一个
  • 水平滚动条仅出现在页面底部

    我有一个具有以下 HTML 结构的页面 div class wrapper div The wrapper被设置为min width 1100px至于原因我就不多说了 因此 当浏览器大小调整为小于 1100px 时 我希望出现水平滚动条 我
  • 表格底部的粘性滚动条

    我不确定 粘性 是否是这个术语 但是有没有办法使滚动条overflow auto保持可见 我有一个相当大的表格 我希望它可以水平滚动 但是 表格也相当高 因此当页面加载时 水平滚动条不在浏览器的视口内 因此很难判断表格是否可滚动 div s
  • 带滚动条的 HTML 画布

    我正在宽度不等的画布上绘制图表 每个画布可以有自己的滚动条吗 我尝试将所有画布放在一个 div 中并指定最大宽度 但它不起作用 是否有可能所有画布在页面上的可见宽度均为 500 像素 并且每个画布都有其滚动条来查看画布的整个宽度 谢谢 指定
  • 无法使用 CSS 将宽度和高度应用于 -webkit-scrollbar

    webkit scrollbar width 5px height 5px webkit scrollbar thumb background color 808080 为什么宽度和高度属性不起作用 width用于垂直滚动条和height影
  • 使 Java JScrollpane 仅垂直滚动

    我希望我的整个 JFrame 能够垂直滚动 我添加了以下代码 但它只创建了一个水平滚动条 frame setContentPane new JScrollPane new GradeQuickResource 我想做相反的事情 我只想要一个
  • 设置滚动条粗细

    有没有办法调整滚动条的粗细JScrollPane 默认值有点笨拙 一个快速但又肮脏的解决方案是将宽度 高度明确设置为例如10 像素通过 jScrollPane getVerticalScrollBar setPreferredSize ne

随机推荐

  • Linux JAVA环境的搭建tomcat的部署(含多实例)

    tomcat tomcat是Apache软件基金会项目中的一个核心项目由 Apache Sun 和其他一些公司及个人共同开发而成 tomcat 是 Java 语言开发的 Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器 to
  • 快排和归并排序算法的模板及运用

    快排和归并排序算法的模板及运用 一 快速排序 二 快速选择 三 归并排序 四 逆序对的数量 一 快速排序 核心思想 把一个序列分为两部分 左半部分所有数均小于等于或大于等于右半部分所有数 递归处理左右两部分 具体步骤 其中q为一个数组 l为
  • windows下SSH服务的开启

    本人服务安装环境是win7 启动程序是freeSSHd freeSSHd下载链接如下 链接 https pan baidu com s 18ZNS5PvACo30fYjRhI ZPA 提取码 39e7 运行 exe文件 默认安装即可 安装路
  • New Year and Social Network【Hello 2020 F】【拓扑+LCA+贪心】

    题目链接 看到比赛的时候zzq大聚聚用了LCT做的 在线 首先 我们可以发现 两棵大小相同 构造形状不同的树 一定是可以用另一棵树的边来维持这棵树上的每一个点的相互连通性的 我的做法 就是基于这样展开的 我们有T1 T2两棵树 现在我们要去
  • 寻找n以内的亲密数对 python编程

    问题描述 寻找n以内的亲密数对 代码格式如下 def fac n return xxx n int input 此处输入由系统自动完成不需要自己输入 只要写这样一条语句即可 4分 题目内容 对于两个不同的整数A和B 如果整数A的全部因子 包
  • 第三周项目1-(3)ListInsert、ListDelete、InitList、DestroyList函数

    问题及代码 Copyright c 2015 烟台大学计算机学院 All rights reserved 文件名称 test cpp 作者 王敏 完成日期 2015年09月16日 版本号 v1 0 问题描述 ListInsert ListD
  • Redis三种集群模式(主从复制replication、哨兵sentinel、Cluster)

    文章目录 主从复制 哨兵模式 sentinel Cluster集群 Codis https blog csdn net miss1181248983 article details 90056960 主从复制 复制 replication
  • php mysql记录用户行为_用户参与记录存储的演变_PHP教程

    有这样一个应用场景 用户有两个连续的操作A和操作B 必须是操作A完成后才能执行操作B 如果操作A没有完成就触发了操作B 则显示用户需要先执行操作A 即在操作B执行需要查询操作A是否执行过 这里引申出来的问题是 记录用户参与记录 提供针对用户
  • Manifest merger failed : android:exported needs to be explicitly specified for <activity>. Apps targ

    Manifest merger failed android exported needs to be explicitly specified for Apps targeting Android 12 and higher are re
  • pygame入门

    pygame入门 文章目录 pygame入门 说明 一 pygame的安装 二 pygame模块概览 三 pygame的 hello world 四 事件 理解事件 事件检索 处理鼠标事件 处理键盘事件 事件过滤 产生事件 五 显示 全屏显
  • 华为历年机考题收录

    1 前言 华为每年 实习生和校招 的笔试题一般都是三道编程题 大约是因为华为体量太大 岗位太多 如果每个岗位都针对性出题目 成本也高 总的来说 华为的机考题还是比较简单 即使对于我这样偶尔写写leetcode的前端开发者也是如此 华为宣讲会
  • [QT编程系列-10]:C++图形用户界面编程,QT框架快速入门培训 - 4- QT画图与动画

    目录 4 QT画图与动画 4 1 QT的绘图系统 4 2 案例目标 4 3 绘制过程 4 4 更换控件的icon 4 5 案例2 4 6 坐标轴 4 QT画图与动画 4 1 QT的绘图系统 QT 也称为Qt Framework 是一种流行的
  • STM32 Simulink 自动代码生成电机控制:无传感扩展卡尔曼滤波(EKF)仿真和开发板运行

    最近疫情比较严重 居家隔离 突然想要尝试无传感基于卡尔曼滤波器角度速度观测控制自动生成代码生成的实验 有些收获 在这里记录一下 目录 1 模型搭建和仿真 2 自动代码生成和系统验证 3 总结 1 模型搭建和仿真 Q矩阵 系统噪声 R矩阵 测
  • Linux进程处理之ctrl+z挂起和恢复

    Ctrl Z挂起 Ctrl Z暂停进程是把进程放在了shell的后台 进程是挂起的 和普通的进程是一样的 在没执行完的情况下关机 再开机是不能恢复的 除非进程专门的针对Ctrl Z信号编写了保存进度的功能 Ctrl z之后的恢复 1 CTR
  • Hyperledger Fabric专业词汇解释

    Anchor Peer 锚节点 锚节点是通道中能被所有对等节点探测 并能与之进行通信的一种对等节点 通道中的每个成员都有一个 或多个 以防单点故障 锚节点 允许属于不同成员身份的节点来发现通道中存在的其它节点 Block 区块 区块是一组有
  • 【BFS】题目总结与笔记

    简单 矩阵距离 题 第一次到的肯定是最min的 include
  • 2023最新版Python环境安装教程-手把手教你安装

    你可以通过终端窗口输入 python 命令来查看本地是否已经安装Python以及Python的安装版本 python下载 在官网下载Python 下载速率还非常的慢 python安装 什么是环境变量 相当于一个公共的仓库 查找数据的时候先在
  • pandas中DataFrame-mean函数用法

    mean gt 平均数 Pandas中的df mean 函数默认是等价于df mean 0 即按轴方向求平均 得到每列数据的平均值 相反的df mean 1 则代表按行方向求平均 得到每行数据的平均值 举例 我们 首先导入pandas包 i
  • Log4J2漏洞修复方法验证及最终方案

    验证代码准备 在项目登录接口中增加类似如下代码 PostMapping login public R
  • Element-ui之ElScrollBar组件滚动条的使用

    2021 1 6更新 针对评论出现的问题 1 noresize false 属性类型不符 加冒号绑定为动态属性 noresize false 2 代码不生效的问题 可能是没有设置高度导致 为