首页 > 其他分享 >横向滚动条 css js html

横向滚动条 css js html

时间:2024-08-11 18:52:45浏览次数:8  
标签:content style bottom track clientHeight 滚动条 html css

目的:

1. 练习手写滚动条

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

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

3. 问题复现:

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

问题演示视频:

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="gkPmxp3y-1723084633429" src="https://live.csdn.net/v/embed/415892"></iframe>

横向滚动条-问题演示

制作横向滚动条

样式:

滚动条包含两个方面: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>

 演示视频:

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="pVXaJowX-1723080648922" src="https://live.csdn.net/v/embed/415737"></iframe>

横向滚动条

标签:content,style,bottom,track,clientHeight,滚动条,html,css
From: https://blog.csdn.net/Java_Coder2021/article/details/140945223

相关文章

  • 大学生HTML期末大作业——HTML+CSS+JavaScript学校网站(学生信息管理系统)
    HTML+CSS+JS【学校网站】网页设计期末课程大作业web前端开发技术web课程设计网页规划与设计......
  • HTML 引用
    HTML中用于引文、引用和定义的几个重要元素。这些元素不仅帮助改善文档的可读性和结构,还提供了额外的语义信息,有助于搜索引擎优化(SEO)和辅助技术(如屏幕阅读器)的理解。以下是您提到的每个元素的简要回顾和额外说明:<q>元素用途:定义短的行内引用。浏览器表现:通常会自动在引用的......
  • 深入了解HTML链接:从基础到进阶——WEB开发系列06
    超链接是互联网中最有趣的创新之一,自互联网诞生起,它们就一直是互联网的一个核心特性,使网络成为一个互联的系统。超链接允许我们将文档连接到其他文档或资源,甚至是文档中的特定部分。通过一个简单的网址,可以提供应用程序。几乎所有网络内容都可以被转换为链接,点击或激活这些超链......
  • 前端:CSS选择器(级联/层叠样式单)--用作装饰
    1.选择器:给谁加样式三种样式如果对于不同的方面,效果叠加,如果是相同的方面,行内样式的优先级最高,外部样式和内部样式的优先级相等,谁在上面先用谁2.css的语法规则:selector{property:value;property:value;}/*基本选择器*//*1.元素选择器根据元素名称做......
  • CSS3 边框(包含border-radius、border-image与box-shadow)
    CSS3边框样式border-radius作用:设置圆角值的个数及其效果简记:左上开始顺时针,值不够的对角来凑。值的个数效果1四个角一致2左上角和右下角一致,右上角和左下角一致3左上角、右上角和左下角一致、右下角4左上角、右上角、右下角、左下角圆角与椭圆角语法:border-radi......
  • css子元素、兄弟元素、直接子元素如何表示
    在CSS中,选择器用于指定你想要样式化的HTML元素。关于子元素、兄弟元素和直接子元素的表示,我们可以使用不同类型的选择器。以下是一些基本的概念和示例:子元素(DescendantSelector)子元素选择器,或者更准确地说是后代选择器,使用空格来指定一个元素内部的另一个元素,无论它们之间隔了......
  • 425.响应式的境外旅游私人订制网站 大学生期末大作业 Web前端网页制作 html+css+js
    目录一、网页概述二、网页文件 三、网页效果四、代码展示1.html2.CSS3.JS五、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强六、更多推荐欢迎光临仙女的网页世界!这里有Web前端网页制作的各行各业的案例,样式齐全新颖,并持续更新!感谢CSDN,提供了这......
  • HTML 文本格式化
    HTML提供了丰富的元素来格式化文本和展示内容,这些元素不仅让网页内容更加丰富多彩,还提高了内容的可读性和表达力。下面是对您提到的一些文本格式化标签和“计算机输出”标签的进一步解释和说明:文本格式化标签<b>和<strong>:两者都用于加粗文本,但<strong>在语义上更强调文本......
  • HTML5 拖放(附带源码及动画演示)
    HTML5拖放效果概述拖放是一种常见的特性,即抓取对象以后拖到另一个位置,在HTML5中,拖放是标准的一部分,任何元素都能够拖放。实例如下是实现从左侧容器中拖拽图片到右侧的容器:实现方法:<!--以下代码实现图片可以从第一个容器拖放到第二个容器--><!DOCTYPEhtml><ht......
  • 使用HTML一键打包工具模拟其他浏览器 - User-Agent的起源到应用
    最近经常有一些朋友对于HTML一键打包工具中的User-Agent不太理解是什么意思,以及它到底有什么用途, 本篇文章会介绍一下User-Agent的起源,发展历程,以及它的使用场景,帮助你更好的了解和使用它User-Agent的起源与发展历程User-Agent最早出现在1990年代初期,随着NCSAMosaic......