横向滚动条 css js html

使用css优化页面横向/纵向滚动条样式 第一段是纵向的、第二段是横向的。如果横向纵向都要添加,那么,两个都复制即可。less要不要无所谓,要了就是仅在当前页面生效。 阅读详情

目的:

1. 练习手写滚动条

2. 市面上多是竖向滚动条,横向滚动条较少

3. 横向滚动条,需要滑动到容器底部才能使用,不方便,因此想自己写一个横向滚动条放置在容器内部的视口高度的最低处

3. 问题复现:

如果容器的内容超过了容器的宽度,就会出现横向滚动条(暂不考虑换行),但是如果该容器的高度过高,用户需要滑到容器的底部才能操作横向滚动条(横向滚动条默认在容器的底部,当然我们不考虑使用shift+鼠标左键的方式横向移动)

问题演示视频:

横向滚动条-问题演示

制作横向滚动条

样式:

滚动条包含两个方面:track(滚动轨道) + thumb(滚动块)

最开始是只有content容器的,然后我们在content下面添加横向滚动条容器,并且在最外层添加box容器。

最外层的box是相对定位(没有宽高),滚动条是绝对定位

     .box {
        position: relative;
      }
      .content {
        width: 100px;
        height: 1000px;
        background-color: pink;
        overflow: auto;
      }
      .content::-webkit-scrollbar {
        display: none;
      }
      .track {
        position: absolute;
        left: 0;
        bottom: 0; /*0<=bottom<=1000-10px*/
        width: 100px;
        height: 10px;
        background-color: red;
      }
      .thumb {
        cursor: grab;
        position: absolute;
        left: 0;
        top: 0;
        width: 10px;
        height: 100%;
        background-color: blue;
      }
    

    <div class="box">
      <div class="content">
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
      </div>
      <div class="track" id="scrollbar">
        <div class="thumb" id="scrollbar-thumb"></div>
      </div>
    </div>

逻辑:

监听容器横向滚动,同步滑块位置

监听content容器的滚动动作,同步到滑块的位置

const content = document.querySelector(".content")
const track = document.querySelector(".track")
const thumb = document.querySelector(".thumb") 
function updateScrollbar() {
    const scrollPercentage =
          content.scrollLeft / (content.scrollWidth - content.clientWidth)
    const thumbPosition =
          scrollPercentage * (track.clientWidth - thumb.clientWidth)
    thumb.style.left = thumbPosition + "px"
}
// content(这样还包括了shift+鼠标左键)
content.addEventListener("scroll", updateScrollbar)

拖动滑块

然后,我们再来制作拖动滑块同时横向移动容器的功能,主要用到三个动作,mousedown,mousemove,mouseup

      // 监听滑块拖动事件
      let isDragging = false
      let startX
      let startScrollLeft
      thumb.addEventListener("mousedown", function (e) {
        isDragging = true
        startX = e.clientX
        startScrollLeft = content.scrollLeft

        // 拖动开始时改变鼠标样式为正在抓取
        thumb.style.cursor = "grabbing"

        // 防止在拖动时选择文本
        e.preventDefault()
      })

      document.addEventListener("mousemove", function (e) {
        if (isDragging) {
          const deltaX = e.clientX - startX
          const scrollDelta =
            (deltaX / track.clientWidth) *
            (content.scrollWidth - content.clientWidth)
          content.scrollLeft = startScrollLeft + scrollDelta
        }
      })

      document.addEventListener("mouseup", function () {
        isDragging = false
      })

规定横向滚动条的位置的界限

(横向滚动条的位置最低不低于容器的边界底部,最高不高于容器的边界顶部)

      let contentRec = content.getBoundingClientRect()//得到content容器的边界
      track.style.bottom =
        content.clientHeight - (window.innerHeight - contentRec.top) + "px"


      let trackBottom = parseInt(track.style.bottom) // 获取轨道的底部位置
      if (
        trackBottom <= 0 ||
        trackBottom >= content.clientHeight - track.clientHeight
      ) {
        track.style.bottom = "0px" // 设置时加上单位
      }


      // 更新 track.style.bottom 的逻辑
      document.addEventListener("scroll", function () {
        let viewHeight = window.innerHeight + scrollY
        contentRec = content.getBoundingClientRect()
        // 计算新的 bottom 值
        let newBottom =
          content.clientHeight - (window.innerHeight - contentRec.top)

        // 确保 newBottom 不小于 0 且不大于 content.clientHeight - track.clientHeight
        newBottom = Math.max(
          0,
          Math.min(newBottom, content.clientHeight - track.clientHeight)
        )

        // 更新 track 的 bottom 样式
        track.style.bottom = `${newBottom}px`
      })

成品

代码:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
      }
      .header {
        width: 100px;
        height: 1000px;
        background-color: skyblue;
      }
      .footer {
        width: 100px;
        height: 300px;
        background-color: green;
      }
      .box {
        position: relative;
      }
      .content {
        width: 100px;
        height: 1000px;
        background-color: pink;
        overflow: auto;
      }
      .content::-webkit-scrollbar {
        display: none;
      }
      .track {
        position: absolute;
        left: 0;
        bottom: 0; /*0<=bottom<=1000-10px*/
        width: 100px;
        height: 10px;
        background-color: red;
      }
      .thumb {
        cursor: grab;
        position: absolute;
        left: 0;
        top: 0;
        width: 10px;
        height: 100%;
        background-color: blue;
      }
    </style>
  </head>
  <body>
    <div class="header"></div>
    <div class="box">
      <div class="content">
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
        asdawdkjaslkdjalkwjdlkasjdlawkldakslldjawlkdjlkasjdkawdasdawes
      </div>
      <!-- 我觉得这个滚动条应该是不能在内容容器内部的 -->
      <div class="track" id="scrollbar">
        <div class="thumb" id="scrollbar-thumb"></div>
      </div>
    </div>
    <div class="footer"></div>

    <script>
      const content = document.querySelector(".content")
      const track = document.querySelector(".track")
      const thumb = document.querySelector(".thumb")

      // console.log("window.innerHeight", window.innerHeight)
      // track.style.bottom = window.innerHeight + "px"
      let contentRec = content.getBoundingClientRect()
      track.style.bottom =
        content.clientHeight - (window.innerHeight - contentRec.top) + "px"

      function updateScrollbar() {
        const scrollPercentage =
          content.scrollLeft / (content.scrollWidth - content.clientWidth)
        const thumbPosition =
          scrollPercentage * (track.clientWidth - thumb.clientWidth)
        thumb.style.left = thumbPosition + "px"
      }
      // content(这样还包括了shift+鼠标左键)
      content.addEventListener("scroll", updateScrollbar)

      // 提取数值进行比较
      let trackBottom = parseInt(track.style.bottom) // 将字符串转换为整数
      if (
        trackBottom <= 0 ||
        trackBottom >= content.clientHeight - track.clientHeight
      ) {
        track.style.bottom = "0px" // 设置时加上单位
      }

      // 更新 track.style.bottom 的逻辑
      document.addEventListener("scroll", function () {
        let viewHeight = window.innerHeight + scrollY
        contentRec = content.getBoundingClientRect()
        // 计算新的 bottom 值
        let newBottom =
          content.clientHeight - (window.innerHeight - contentRec.top)

        // 确保 newBottom 不小于 0 且不大于 content.clientHeight - track.clientHeight
        newBottom = Math.max(
          0,
          Math.min(newBottom, content.clientHeight - track.clientHeight)
        )

        // 更新 track 的 bottom 样式
        track.style.bottom = `${newBottom}px`

        console.log(track.style.bottom)
      })

      // 监听滑块拖动事件
      let isDragging = false
      let startX
      let startScrollLeft
      thumb.addEventListener("mousedown", function (e) {
        isDragging = true
        startX = e.clientX
        startScrollLeft = content.scrollLeft

        // 拖动开始时改变鼠标样式为正在抓取
        thumb.style.cursor = "grabbing"

        // 防止在拖动时选择文本
        e.preventDefault()
      })

      document.addEventListener("mousemove", function (e) {
        if (isDragging) {
          const deltaX = e.clientX - startX
          const scrollDelta =
            (deltaX / track.clientWidth) *
            (content.scrollWidth - content.clientWidth)
          content.scrollLeft = startScrollLeft + scrollDelta
        }
      })

      document.addEventListener("mouseup", function () {
        isDragging = false
      })
    </script>
  </body>
</html>

 演示视频:

横向滚动条

鼠标横向滚动条和鼠标滚动方向 通过上述示例,我们可以看到如何有效地实现鼠标横向滚动条和检测鼠标滚动方向,并将其应用于实际项目中。在 Web 页面设计中,横向滚动条是指当页面的内容宽度超出视口宽度时出现的滚动条。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,当检测到向下滚动时,可以触发一个动画效果,并在动画完成后移除动画类。通过媒体查询,可以在不同的屏幕尺寸下显示横向滚动条。 阅读详情

相关推荐

CSS - 实现横向滚动(横向滚动布局)

CSS - 实现横向滚动(横向滚动布局),css横向滚动布局,css实现元素横向滚动的方法css中如何实现横向滚动布局,纯CSS实现横向滚动条,横向不间断滚动DIV CSS代码,纯CSS3横向滚动条实现。

🏆 前端领域优质创作者 3万+

css实现横向滚动条

第一种 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" /> <title&gt

WeiflR10的博客 9201

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 710

干死该死的横向滚动条

一、情景描述 开发者小蒋按照1920*1080的分辨率进行开发,他写的所有元素的宽度都没有超过1920,但是却出现横向滚动条,小蒋百思不得其解,最终求教程序员大尤。 可能的问题原因: 任务栏左置,实际横向宽度只有1918 浏览器的竖向滚动条占了20px,横向宽度实际只有1900 二、解决办法 问题1:任务栏左置,实际横向宽度只有1918 当任务栏居左时,横向只有1918px。 2px被操作系统拿去做侧边栏感应了。 所以少了2px。 实践解决 右键—>任务栏设置-----> 调整至底部

夏2同学的博客 1814

Cadence IC5141保姆级教程:Bandgap电路四大仿真(稳定性/噪声/启动/PSRR)完整流程与调参心得

本文提供Cadence IC5141中Bandgap电路的四大仿真(稳定性仿真、噪声仿真、启动仿真、PSRR仿真)的完整流程与调参心得。从原理图检查到ADE L配置,详细解析各仿真步骤的关键参数设置与优化策略,帮助工程师高效完成电路设计与性能调优。

weixin_30399821的博客 1654

FMEA-MSR步骤三:功能分析

目的 FMEA-MSR功能分析的主要目标: ● 功能及各功能之间的关系的可视化 ● 功能树/网络或等效功能矩阵参数图(P图) ● 顾客(外部和内部)功能与相关要求的关联 ● 要求或特性与功能的关联 ● 工程团队(系统、安全和组件)之间的协作 ● 失效分析步骤的基础 (点击链接进入官网领取软件试用) 在监视及系统响应的补充FMEA中,对失效探测和失效响应的监视视为其具有的功能。硬件和软件功能可能包括监视控制状态的功能。 故障/失效的监视和探测功能可能包括超出范围的探测、循环冗余校验、真实性检查和序列计数器检查

Infomass的博客 2392

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

但是 overflow: auto;的滚动条太难看了,尽管可以重些一些样式,但是移动端仍不支持。无奈只能做出妥协,遂想 可否实现自定义模拟一个滚动指示器出来,以求满足业务要求。在日常开发中会遇到一些时候,在实现内部滚动的同时,也希望用户看到当前的滚动位置。

qq_46634851的博客 1117

DOA估计算法从原理到仿真——CBF、Capon、MUSIC算法

从原理出发理解并实现经典的DOA估计算法

m0_55845774的博客 1万+

html css 水平滚动条,html/css/js-横向滚动条的实现

在前端UI设计时,网页的制作很麻烦,深有感悟!碰到太多的不懂,或是第一次见,就要去网上找资料!横向滚动条就是我遇到麻烦中其中的一个,其实也 很简单,只是在几次项目中都用到了这个横向滚动条所以就拿出来说一下。需求界面---如下图: 就是一个div里面放很多button,超出div宽度,下方出现横向滚动条。实际情况中,肯定不止几个button,它是可以动态的添加进去,所以父div的宽度肯定不够...

weixin_29826413的博客 2634

立创星火计划:基于STM32H743VIH6的Maverick_H743_MK1.0高性能开源飞控硬件全解析

本文详细解析了基于STM32H743VIH6核心的Maverick_H743_MK1.0高性能开源飞控硬件设计。重点阐述了采用双IMU冗余设计、高精度气压计、多路独立电源管理以及丰富接口(如CAN总线)的考量,旨在为穿越机、科研无人机等平台提供强大、可靠的飞行控制解决方案。

weixin_28787801的博客 200

Windows 11“此应用已被管理员阻止运行”解决方案

通过本文介绍的两种方法,你应该能够解决Windows 11中“此应用已被管理员阻止运行”的问题。无论你选择创建新管理员账户还是禁用管理员批准模式,都请确保了解相关操作的风险,并根据你的实际需求做出选择。通过禁用“用户账户控制:以管理员批准模式运行所有管理员”设置,可以解决因系统安全设置导致的应用程序被阻止运行的问题。这种方法适用于那些希望简化管理员账户操作流程的用户,但需要注意可能带来的安全风险。通过创建并登录具有管理员权限的新账户,可以解决因系统安全设置导致的应用程序被阻止运行的问题。

mmoo_python的博客 1万+

鼠标滚轮滚动横向下拉框移动

鼠标滚轮滚动横向下拉框移动html代码css样式js代码 当文本过长溢出时,想要将溢出的文本隐藏起来单仍然可以滚动查看文本,但不需要显示下拉框时可以使用以下方法 html代码 <div> <span>超长文本超长文本超长文本</span> </div> css样式 span{ display: block;/*flex等*/ width: 100px; white-space: nowrap;/*文本显示在一行不换行*/ overf

wang_Fan1_1的博客 667

基于simulink创建一个针对双馈异步风力发电机并网运行的仿真模型

摘要:本文详细介绍了基于Simulink的双馈异步风力发电机(DFIG)并网运行仿真建模方法。系统包含风速输入、风力机、双馈发电机、电力电子变换器、控制器和并网接口等模块,通过8个步骤完整呈现了建模流程,包括风速模拟、机械功率计算、发电机特性建模、变流器控制策略设计等关键环节。仿真可评估系统在不同风速条件下的动态响应、最大功率跟踪能力和发电效率,为风力发电系统的优化设计提供有效验证手段。模型可根据实际需求扩展环境因素和电网交互等细节,提高仿真精度。

amy_mhd的博客 335

vue 自己写个横向滚动列表吧

手动写个横向滚动列表吧

唯心所现,唯识所变 4863

【经验&技巧】DDR仿真中的挑战与解决方案

由于DDR的数据总线具备双向数据传输功能,需要对读写模式进行独立仿真环境的创建,并且分为连续和突发模式,再加之有单端和差分信号、有数据总线和地址总线,需要在数据传输过程中额外注意串扰的影响,并选择合适的驱动和负载以找寻设计裕量与串扰强度之间的平衡,因此,实际操作步骤和分析过程还是较为繁琐耗时的,需要设计者具有足够的耐心。

一只豌豆象的博客 1643

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

html/js 标签横向移动

html/js 标签横向移动,类似于显示分类,可以左右拖动显示

407

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jQuery 模拟横向滚动条

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> html xmlns="http://www.w3.org/1999/xhtml"> head> meta http-equiv="Content-Typ

shan1774965666的专栏 1978

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

el-scrollbar+el-tree超出宽度出现横向滚动条

CSS部分,给el-scrollbar__view设置display: inline-block是重中之重!再结合overflow-x:auto,横向滚动条自然而然就出来啦~1、HTML部分,在el-scrollbar元素上添加 view-style="height:100%;

hunantai的博客 1068

如何控制滚轮横向滑动(原生JS实现方法)

控制滚轮横向滑动 解决思路如下 `1.如何在页面中展示横向滚动条` `2.如何获取鼠标的【滚动轮】` `3.通过什么Api去实现滚动效果 ` 一、如何创建横向滚动条 1.代码如下(HTML和CSS) 2.效果如下图所示: 二、鼠标滚动轮事件(mousewheel和wheel事件) 1.wheel鼠标滚轮(完美支持所有浏览器) JS代码如下所示: `*&*需要注意的事项(wheel滚动方向)*&*`: 2.mousewheel支持该鼠标事件的浏览器如下(生产环境不可使用,应该使用wheel) 测试效果图如下

weixin_46022934的博客 8763

android 横向分页滚动条,小程序实现手写左右翻页和动态修改横向滚动条位置

timg.jpg首先看效果图image.pngimage.pngimage.pngimage.pngimage.pngimage.png注意:也可以通过手指左右进行滑动到指定的页数进行点击展示数据具体实现思路1.首先用css和html进行页面的布局2.因为考虑到总的页数是一个不确认的值,所以我这里用了小程序中横向滚动方式展示所有的数据3.接下来在js中声明了一个数组,专门存储总页数,通过遍历后进行...

weixin_36397191的博客 455

jquery横向滚动条

此代码献给wendy 由于工作太忙,下次再整理成插件调用,先记录下来,欢迎同学们提意见。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="htt...

weixin_30815427的博客 850

VUE3使用mock模拟表格日期筛选与条件保存

【代码】VUE3表格筛选日期 来回跳转保存筛选日期条件。

m0_53912016的博客 3382

鼠标滚轮控制浏览器横向滚动条

鼠标滚轮控制浏览器的横向滚动条,并且兼容火狐浏览器。

GodV_666的博客 755

java 弹性碰撞_JS实现小球的弹性碰撞效果

一、HTML代码(body部分)上面body部分这样就算是完成了,下面我们给body中的div做一些小样式。二、CSS小球样式部分/*将body默认的margin和padding部分去掉*/*{margin: 0px;padding: 0px;}/*采用定位的方式,让小球运动起来*/#main{margin: 0px auto;position: relative;}/*小球的样式*/#main ...

weixin_35578211的博客 246

element的滚动去掉横向_【请教高手】在页面下面出现横向滚动条,如何去掉??

kefu=function(id,_top,_right){varme=id.charAt?document.getElementById(id):id,d1=document.body,d2=document.documentElement;me.style.top=_top?_top+'px':0;me.style.right=_ri...kefu=function (id,_top,_rig...

weixin_39884078的博客 1066

html页面适应手机不用滑动,html页面调到手机自适应之后html,body的overflow=‘hidden’不起作用了。...

html页面调到手机自适应之后html,body的overflow=‘hidden’不起作用了。经过调试看见overflow='hidden'是生效的,但是网页有横向滚动条,可以拖动。就像下面的图片:相关代码MenuHomeDating SitesBi-StoriesForums Bicurious DatingDating TipsBlogSubscribehtml,body{ma...

weixin_39583751的博客 211
上一篇: useState 原来是异步更新
下一篇: React 自定义hook函数
前端开发洋洋
博客等级 码龄3年 77粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值