Element-ui 滚动条美化

news2024/6/30 1:26:19

目录

1、缘起

2、实际示例

3、美化滚动条

4、Element-plus中的滚动条

5、关于实现方式的思考


 

1、缘起

之前在做项目时,发现一个项目中,各个子应用项目的UI表现不一致,看了下式Vue项目滚动条和其他的子应用项目表现明显不一致。

有时候为了使界面滚动条,各个浏览器的滚动条能保持一致,这样我们的项目避免在各个浏览器存在差异导致UI界面的不一致,这时候我们就可以考虑使用通用组件的方式,对各个需要滚动的页面,或者弹出窗口添加统一的组件进行包裹,来保证滚动效果在各个浏览器中能有更好的体验效果。

2、实际示例

我们以element-ui官网为例,看下默认滚动条实际效果。

在firefox 浏览器中,如下所示:

在Chrome 浏览器中,如下所示:                                                                             

在Edge浏览器中,如下所示: 

在以上各个浏览器中展示的效果来说,默认滚动条在各个浏览器中的表现都不一致,firefox浏览器和chrome浏览器相差就比较小,而与Edge浏览器相比相差就比较大了。

我们以element-ui官网为例,看下添加通用组件之后,滚动条实际效果。

在firefox 浏览器中,如下所示:

在chrome浏览器中,如下所示:

在Edge浏览器中,如下所示: 

 最后我们看到各个浏览器中滚动条的效果,基本上各个浏览器的表现效果是一致的,添加通用组件,默认情况下滚动条是不显示的,只有鼠标移动过去才会进行显示,整体上效果和用户体验会更好。

3、美化滚动条

我们打开这个网址(Create a New Pen (codepen.io))进行示例代码的编写。

我们对HTML 稍微改变以下,看下Dialog。

<script src="//unpkg.com/vue@2/dist/vue.js"></script>
<script src="//unpkg.com/element-ui@2.15.13/lib/index.js"></script>
<div id="app">
  <el-button type="text" @click="dialogVisible = true">点击打开 Dialog</el-button>
  <el-dialog title="提示" :visible.sync="dialogVisible" width="30%" :before-close="handleClose">
    <el-scrollbar class="test">
      <div>这是一段信息</div>
      <div>这是一段信息</div>
      <div>这是一段信息</div>
      <div>这是一段信息</div>
      <div>这是一段信息</div>
      <div>这是一段信息</div>
      <div>这是一段信息</div>
      <div>这是一段信息</div>
    </el-scrollbar>
    <span slot="footer" class="dialog-footer">
      <el-button @click="dialogVisible = false">取 消</el-button>
      <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
    </span>
  </el-dialog>
</div>
<style>
  .test {
    height: 100px;
  }
  .el-scrollbar__wrap{
    overflow-x: hidden;
  }
</style>

我们看下效果: 

 

我们可以看到垂直滚动条的样式已经发生变化了,我们引用了element-ui的组件<el-scrollbar></el-scrollbar>这个组件对超过高度的内容进行了包裹。

在element-ui(2.xx.xx)官网上,并没有找到有这个组件,实际上是有的,没有给出对应组件对应的文档,可能组件在设计的时候没有更好的完善吧。下载对应源码,看到是有这个组件的。

打开对应主文件,传递的属性有几个: 

 props: {
    native: Boolean, // 是否使用原生方式
    wrapStyle: {},  // 包裹容器的自定义样式
    wrapClass: {},  // 包裹容器的自定义类名
    viewClass: {},  // 视图的自定义样式
    viewStyle: {},  // 视图的自定义类名
    noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能
    tag: {              // 视图的元素标签,默认为 div 标签
      type: String,
      default: 'div'
    }
  },

在源码顶部,看到有一个链接地址,是参考另一个插件的实现,如下所示

// reference https://github.com/noeldelgado/gemini-scrollbar/blob/master/index.js

打开它对应的网站(https://noeldelgado.github.io/gemini-scrollbar/),我们可以看到官网本身也进行了对应实现。

开发chrome开发工具,在元素标签页中,我们可以看到通过自定义节点,然后给节点添加对应的事件去进行实现的。

4、Element-plus中的滚动条

我们Element-plus 的官网,发现有滚动条组件对应的说明文档,如下所示:

 通过文档给定的属性,发现和element-ui中的滚动条类型,只不过增加了宽、高等部分属性,使用起来和element-ui的滚动条没什么太大区别。

我们看一下如下示例:

<template>
  <el-scrollbar height="400px">
    <p v-for="item in 20" :key="item" class="scrollbar-demo-item">{{ item }}</p>
  </el-scrollbar>
</template>

<style scoped>
.scrollbar-demo-item {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  margin: 10px;
  text-align: center;
  border-radius: 4px;
  background: var(--el-color-primary-light-9);
  color: var(--el-color-primary);
}
</style>

 效果如下所示:

5、关于实现方式的思考

 首先,我们检查滚动条的大小, 如果滚动条大小等于零(这意味着当前区域不需要滚动条) 那么我们什么都不做,否则我们“隐藏”本机滚动条(保留其功能 完整),并创建一对新的“滚动条”,由div组成,您可以完全自定义 用CSS这些“滚动条”将更新其位置,而 滚动以获得视觉反馈,如果您单击或拖动它们,也会做出响应。

例如,我们可以创建如下节点添加到html中。

.scrollbar-measure {
	width: 100px;
	height: 100px;
	overflow: scroll;
	position: absolute;
	top: -9999px;
}

滚动条宽度,我们可以动态进行计算。

// Create the measurement nodevar scrollDiv = document.createElement("div");
scrollDiv.className = "scrollbar-measure";
document.body.appendChild(scrollDiv);
// Get the scrollbar widthvar scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;
console.warn(scrollbarWidth); // Mac:  15
// Delete the DIV 
document.body.removeChild(scrollDiv);

使用页面中的元素,从clientWidth中减去offsetWidth即可得到滚动条的大小! 最后一步是从DOM中删除DIV,完成了!

实际上很多其他组件的实现,基本上都是基于这样的方式去进行实现的。

 

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

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

相关文章

《网络安全0-100》网络安全前沿

1-人工智能和网络安全 人工智能和网络安全是两个不同的领域&#xff0c;但它 们之间存在着千丝万缕的联系和相互影响。下 面是一些人工智能和网络安全的联系和应用&#xff1a; 威胁检测和预测&#xff1a;人工智能可以利用机器学习 和深度学习等技术&#xff0c;对网络数据…

Golang每日一练(leetDay0103) 区域和检索1~3 Range Sum Query

目录 303. 区域和检索 - 数组不可变 Range Sum Query Immutable &#x1f31f; 304. 二维区域和检索 - 矩阵不可变 Range Sum Query 2d Immutable &#x1f31f;&#x1f31f; 307. 区域和检索 - 数组可修改 Range Sum Query Mutable &#x1f31f;&#x1f31f; &#…

kali配置静态IP地址

修改网络配置 执行命令&#xff1a; vim /etc/network/interfaces 文件末尾添加如下内容&#xff1a; auto eth0 iface eth0 inet static address 192.168.133.66 netmask 255.255.255.0 gateway 192.168.133.2其中&#xff0c;iface eth0 inet static 指配置eth0使用静态ip…

chatgpt赋能python:Python数据建模:从数据预处理到机器学习建模

Python数据建模&#xff1a;从数据预处理到机器学习建模 Python已经成为了数据建模与分析的主要工具之一&#xff0c;因为它的语法简单易懂&#xff0c;有许多数据科学库可以使用&#xff0c;支持各种各样的数据预处理和建模技术。在本文中&#xff0c;我们将重点介绍使用Pyth…

十五周算法训练营——普通动态规划(下)

今天是十五周算法训练营的第十二周&#xff0c;主要讲普通动态规划&#xff08;下&#xff09;专题。&#xff08;欢迎加入十五周算法训练营&#xff0c;与小伙伴一起卷算法&#xff09; 最长递增子序列 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。…

基于Java网上医院预约挂号系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Java:不支持发行版本5

错误 Java&#xff1a;不支持发行版本5 详细错误 同学在github上找到一个微服务项目&#xff08;基于maven进行构建&#xff09;&#xff0c;进行二开&#xff0c;导入项目运行控制台报错 Java&#xff1a;不支持发行版本5&#xff0c;笔者修改项目结构&#xff08; F i l e…

chatgpt赋能python:使用Python自动备份数据库

使用Python自动备份数据库 数据库是企业中非常重要的组成部分&#xff0c;里面存储着大量的数据和业务逻辑。为了避免数据库丢失或损坏可能带来的灾难性后果&#xff0c;我们通常需要定期备份数据库。而使用Python自动备份数据库是一种快捷高效的方式&#xff0c;今天我们将介…

基于Java助学贷款系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

chatgpt赋能python:Python数据库备份脚本

Python数据库备份脚本 数据库备份是保障数据安全的重要手段。Python作为一种简单易学、高效稳定的编程语言&#xff0c;被广泛应用于数据库备份脚本的编写。本文将介绍如何使用Python编写一个简单的数据库备份脚本。 准备工作 在开始编写脚本之前&#xff0c;需要安装Python…

读发布!设计与部署稳定的分布式系统(第2版)笔记07_线程阻塞

1. 通过增加复杂性解决一个问题&#xff0c;会产生全新系统失效方式的风险 2. 多线程技术使应用程序服务器具有足够的容量扩展能力&#xff0c;来满足Web上最大站点的需求 2.1. 产生并发错误的可能性 3. 服务器的进程正在运行 3.1. 并不能帮助用户完成工作 3.2. 模拟客户端…

RK3588平台开发系列讲解(导读篇)旗舰芯片RK3588介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 视频了解二、特性说明三、性能比较沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍旗舰芯片RK3588。 自瑞芯微RK3588最初的发布时间已经过去了两年多,如今RK3588终于进入了落地阶段,搭载RK3…

电脑添加夏普(sharp)打印机 从磁盘安装驱动过程

今天打算连实验室的打印机&#xff0c;是夏普的&#xff0c;但是我不知道具体的型号。不过有一个word文档说明怎么连&#xff0c;大概率需要自己下载驱动&#xff0c;下面就开始吧&#xff01; 控制面板的操作 前面都是一样的&#xff0c;控制面板–>设备和打印机–>添…

Oracle-高版本SQL优化分析(bind mismatch)

背景: 接到用户报障说一套Oracle19c数据库近期出现insert语句执行变慢的情况&#xff0c;执行一次数据插入需要1秒的时间&#xff0c;而且问题发生的数据库是跑在一体机上面&#xff0c;数据插入正常不应该这么慢&#xff0c;需要分析插入慢的原因 问题: 数据库近期出现insert…

chatgpt赋能python:使用Python绘制散点图:了解基本语法,数据可视化。

使用Python绘制散点图&#xff1a;了解基本语法&#xff0c;数据可视化。 数据是任何研究的基石&#xff0c;因此对于从事各种数据处理工作的人员来说&#xff0c;数据可视化是一个非常重要的工具。Python作为一种非常受欢迎的编程语言&#xff0c;具有广泛的应用&#xff0c;…

centos7虚拟机安装

提前创建好一个非系统盘的文件路径&#xff0c;存放centos虚拟机的系统文件 下载centos 7 centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 (aliyun.com) 先创建新的虚拟机 点击下一步 点击下一步 点击下一步 选择Linux(L)和CentOS 7 64位&#xff0c;然后点击下一步 位置…

编译原理笔记5:从正规式到词法分析器(2):NFA 记号识别、确定化、并行算法、子集法构造DFA

目录 NFA 识别记号的并行方法NFA 上识别记号的确定化方法状态集 T 的 ε-闭包(T)ε-闭包算法 NFA 并行算法NFA 并行算法例&#xff1a;识别 abb 和 abab 从 NFA 到 DFA&#xff08;子集法构造 DFA &#xff09; NFA 识别记号的并行方法 之前的文章中写过的 “用一个输入字符串…

【八大排序(八)】归并排序高阶篇-非递归版

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:八大排序专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习排序知识   &#x1f51d;&#x1f51d; 归并非递归版 1. 前情回顾2. 归并非递归基…

JVM的内容

0、Java基础考点 1、谈谈你对Java的理解 平台无关性(一次编译&#xff0c;到处运行)GC(垃圾清理)语言特性(泛型、反射)面向对象(封装、继承、多态)类库异常处理 2、Java是如何实现平台无关性的(一处编译&#xff0c;到处运行) 编译时&#xff08;语法和语义进行检测&#xf…

0012-TIPS-pawnyable : Use-After-Free

原文 Linux Kernel PWN | 040203 Pawnyable之UAF https://pawnyable.cafe/linux-kernel/LK01/use_after_free.html 题目下载 漏洞代码 #include <linux/module.h> #include <linux/kernel.h> #include <linux/cdev.h> #include <linux/fs.h> #includ…