关于模拟一个滚动条的实现------横向滚动条 原生 html css js

本文介绍了如何使用HTML,CSS和JavaScript来模拟一个横向滚动条,以解决原生滚动条在移动端不美观且不易定制的问题。通过监听滚动事件,动态更新模拟滚动条的位置,以反映当前滚动位置。示例代码提供了一个基本的实现,实际应用时需隐藏原生滚动条。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于模拟一个滚动条的实现------横向滚动条 原生 html css js

在日常开发中会遇到一些时候,在实现内部滚动的同时,也希望用户看到当前的滚动位置

但是 overflow: auto; 的滚动条太难看了,尽管可以重些一些样式,但是移动端仍不支持。

无奈只能做出妥协,遂想 可否实现自定义模拟一个滚动指示器出来,以求满足业务要求。

以下是实例
在这里插入图片描述

下面附详细代码不再过多赘述,直接运行即可 注释中有说明

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    main {
      width: 100%;
      height: 200px;
      background-color: #ffcdcd;
      overflow-x: auto;
    }

    main>div {
      width: 120vw;
    }

    footer {
      width: 100px;
      height: 10px;
      background-color: #d1eff8;
      margin: 20px auto;
      border-radius: 5px;
    }

    footer>div {
      width: 50px;
      height: 10px;
      background-color: #38616d;
      border-radius: 5px;
    }
  </style>
</head>

<body>
  <!-- 滚动元素的父盒子 -->
  <main>
    <!-- 内部滚动的盒子 该元素内容超出 -->
    <div>
      dasdasgddddddddddddddddddddddddddddddddddddddddddd
    </div>
  </main>
  <!-- 用来模拟滚动条区域 -->
  <footer>
    <!-- 模拟当前滚动的位置 -->
    <div class="thisDiv">
    </div>
  </footer>

  <!-- 显示滚动的百分比 -->
  <p id="jindu">0.00%</p>

  <script>
    // 获取滚动元素的父元素
    let mainBox = document.querySelector('main')

    let scollAllWidth = document.querySelector('footer').offsetWidth
    let scollWidth = document.querySelector('footer>div').offsetWidth

    let thisScolljd = scollAllWidth - scollWidth  // 代表模拟滚动条的滚动大小

    // 给元素添加scoll事件,方便获取滚动的具体数据
    mainBox.addEventListener('scroll', (e) => {
      // console.log(e)
      const { target } = e
      // console.log(target.offsetWidth);  // 可视的宽度
      // console.log(target.scrollLeft);  // 当前滚动的宽度
      // console.log(target.scrollWidth); // 滚动区域总宽度
      // console.log(target.scrollWidth - target.offsetWidth);  // 总滚动的长度
      let thisJd = target.scrollLeft / (target.scrollWidth - target.offsetWidth)   // 当前滚动的距离 / 代表滚动的总距离
      document.querySelector('#jindu').innerHTML = (thisJd * 100).toFixed(2) + '%'   // 滚动的百分比
      document.querySelector('.thisDiv').style.marginLeft = `${thisScolljd* thisJd}px`  // 根据上放计算进度,改变下方模拟的位置
      // console.log((thisJd * 100).toFixed(2), '%');  // 当前滚动的百分比
    });
  </script>
</body>

</html>

以上案例是一个基本的效果,实际使用须隐藏原生滚动条即可。 隐藏滚动条百度很多, 可以在父元素添加 overflow:hidden, 只要高度或者宽度小于子元素,即可隐藏 纵/横向滚动条了。
想必各位都懂,就未出现在代码中。

<think>我们参考用户提供的站内引用和用户的问题:用户想调整el-table横向滚动条的长度。根据引用[1]中的代码,他们通过修改elementui表格的默认样式来隐藏滚动条,但现在用户希望调整滚动条的长度或样式,而不是完全隐藏。引用[1]中提到了如何隐藏滚动条和占位列,但用户现在需要的是调整滚动条的长度(可能是指滚动条的宽度,或者滚动条滑块的长度)。在CSS中,我们可以通过修改::-webkit-scrollbar相关属性来调整滚动条的样式。根据引用[2],他们提到了表格出现横向滚动条时可能导致错位,以及如何通过CSS调整边框和隐藏滚动条。但是用户现在希望调整滚动条的长度,也就是滚动条滑块的水平长度。由于横向滚动条是出现在表格的底部,我们可以通过以下CSS伪元素选择器来设置:-`::-webkit-scrollbar`:整个滚动条-`::-webkit-scrollbar-thumb`:滚动条滑块注意:这些只适用于WebKit内核的浏览器(如Chrome、Safari)。用户的需求是调整横向滚动条的长度,实际上横向滚动条的长度通常是自动适应容器宽度的,但我们可以通过设置滚动条的高度(因为横向滚动条的高度决定了它的厚度)和滑块的宽度(实际上滑块的长度是自动计算的,但我们可以调整滑块的高度来改变滚动条的厚度,以及通过滑块的背景色等样式)。但是,用户想要调整的是“长度”,通常我们调整横向滚动条的“高度”(因为横向滚动条的垂直方向上是高度,水平方向上是长度),但用户可能指的是滑块的长度。然而,在CSS中,我们无法直接设置滑块的长度,因为它的长度是根据内容的长度和容器的宽度自动计算的。不过,我们可以设置滚动条的高度(即横向滚动条的垂直厚度)和滑块的圆角、颜色等。如果用户想要调整滚动条的整体宽度(即横向滚动条占据的高度,也就是滚动条的厚度),我们可以设置:```css.el-table__body-wrapper::-webkit-scrollbar{height:10px;/*设置横向滚动条的高度,也就是厚度*/}```如果用户想要调整滑块的长度,实际上滑块的长度是自动计算的,但我们可以通过设置`::-webkit-scrollbar-thumb`的宽度来调整?实际上,在横向滚动条中,设置`width`属性对滑块是无效的,因为滑块的长度是根据滚动条轨道的长度和内容的可滚动范围自动计算的。所以通常我们只能调整滚动条整体的高度(厚度)和滑块的背景等样式。因此,我们可以提供如下样式代码来修改横向滚动条的高度(厚度)和滑块的样式:```css/*设置横向滚动条整体样式*/.el-table__body-wrapper::-webkit-scrollbar{height:8px;/*设置滚动条高度(厚度)*/background:#f5f5f5;/*滚动条背景色*/}/*设置横向滚动条滑块*/.el-table__body-wrapper::-webkit-scrollbar-thumb{background:#aaa;/*滑块颜色*/border-radius:4px;/*滑块圆角*/}```注意:这些样式只影响横向滚动条,因为用户只调整横向滚动条。另外,如果用户想要调整滚动条的位置,可能无法直接通过CSS设置滑块的长度,但可以通过调整滚动条容器的宽度间接影响滑块的自动计算长度。另外,由于ElementUI的表格结构,滚动条是包含在`.el-table__body-wrapper`这个div中的。因此,我们只需要针对这个元素的横向滚动条进行样式设置。如果用户想要改变滚动条滑块的长度,实际上无法直接设置,因为它是根据内容可滚动距离和滚动条轨道的长度自动计算的。但是,我们可以通过改变滚动条轨道(也就是滚动条的背景区域)的宽度来间接影响滑块的长度吗?实际上,滚动条轨道的宽度就是`.el-table__body-wrapper`的宽度,而这个宽度是表格的宽度减去可能存在的垂直滚动条的宽度。所以,调整滚动条轨道的宽度并不直接通过CSS属性设置,而是由容器宽度决定。因此,我们只能调整滚动条的外观,如高度(厚度)、颜色等,无法直接设置滑块的长度(除非我们改变容器的宽度,但容器的宽度通常由表格内容决定,且用户可能不希望改变表格的布局)。如果用户的需求是让横向滚动条只占表格的一部分宽度(比如居中或者只占据中间区域),这在实际中非常困难,因为浏览器原生滚动条并不支持这种样式。我们可能需要自己模拟一个滚动条,但这会非常复杂。根据用户的问题,我们理解的是调整滚动条的样式,包括滚动条的高度(厚度)和滑块的样式。因此,提供上述CSS样式修改。另外,注意这些样式只适用于WebKit内核的浏览器,对于其他浏览器(如火狐),需要使用不同的CSS属性(如`scrollbar-width`和`scrollbar-color`),但用户可能只需要考虑Chrome。综上所述,我们给出如下解决方案:</think> 要调整 Element UI el-table 组件中横向滚动条的长度和样式,可以通过 CSS 定制化实现。以下是具体解决方案: ### 1. 调整横向滚动条长度 横向滚动条长度默认等于表格宽度。要缩短滚动条,需要通过**容器尺寸控制**实现: ```css /* 外层容器设置宽度 */ .table-container { width: 80%; /* 控制滚动条显示区域宽度 */ overflow: hidden; } /* 实际滚动区域 */ .el-table__body-wrapper { width: 100%; /* 滚动条自适应容器宽度 */ } ``` ### 2. 修改滚动条样式 使用 `::-webkit-scrollbar` 伪类定制滚动条样式: ```css /* 横向滚动条整体样式 */ .el-table__body-wrapper::-webkit-scrollbar { height: 8px; /* 滚动条厚度 */ background: #f1f1f1; /* 轨道颜色 */ } /* 滚动条滑块 */ .el-table__body-wrapper::-webkit-scrollbar-thumb { background: #888; /* 滑块颜色 */ border-radius: 4px; /* 圆角 */ width: 50% !important; /* 滑块长度(相对滚动条) */ } /* 鼠标悬停滑块样式 */ .el-table__body-wrapper::-webkit-scrollbar-thumb:hover { background: #555; } ``` ### 3. 解决内容错位问题 若调整后出现表头/内容错位,需同步修改: ```css /* 隐藏默认占位列 */ .el-table th.gutter, .el-table colgroup col[name='gutter'] { display: none; width: 0; } /* 强制表格宽度适应 */ .el-table__body { width: 100% !important; } ``` ### 完整实现示例 ```html <div class="table-container"> <el-table :data="tableData"> <!-- 表格列配置 --> </el-table> </div> <style> .table-container { width: 80%; /* 控制滚动条显示区域 */ margin: 0 auto; } .el-table__body-wrapper::-webkit-scrollbar { height: 8px; background: #f1f1f1; } .el-table__body-wrapper::-webkit-scrollbar-thumb { background: #409EFF; /* 主题蓝色 */ border-radius: 4px; width: 30% !important; /* 缩短滑块 */ } /* 隐藏滚动条空白列 */ .el-table th.gutter, .el-table colgroup col[name='gutter'] { display: none; width: 0; } </style> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值