原生 js、html 滑动窗口

原生 js、html 写一个有固定列滚动的 table
像 element-ui 和 ant-ui 这些 UI 库他们提供的 table 组件都是可以设置固定列的,比如左边固定则滚动的时候左边不会随着滚动而看不见,右边固定则右侧一列是固定住不动的。

接下来直接用 html 和 js 来尝试一下这种 table 的效果。

一:固定列
这里我想使用position: sticky;直接达到相对 table 列的固定效果,不需要改变 dom 的结构。

二:阴影
阴影的效果是,当 table 往右边滚,则左固定列显示阴影效果;当 table 往左边滚,则右固定列显示阴影;如果同时设置左右列都固定,则临界边不显示阴影而滚动到中间两侧固定列都显示阴影。
这里我打算通过监听 table 的滚动来控制阴影的展示。

三:高度
因为直接对 table 进行样式更改,不会改变 table 的 dom 结构,会保留 table 原有的“一列行高变化其它列行高也变化”效果。

四:border 样式
不使用 table 自带样式(太丑了),随便写几句美化一下。

左边列固定滚动的table

<!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>
      .table {
        width: 700px;
      }
      .table-container {
        position: relative;
        overflow: scroll;
      }
      .table .table-container table {
        width: max-content;
      }
      .table table tr {
        position: relative;
      }

      .table table td {
        border-bottom: 1px solid #ebeef5;
        height: 38px;
        font-size: 14px;
        color: #666;
      }
      .table .table-container .fixed {
        position: sticky;
        left: 0;
        background-color: #fff;
      }

      .table .table-container .fixed::after {
        position: absolute;
        top: 0;
        right: 0;
        bottom: -1px;
        width: 30px;
        transform: translateX(100%);
        transition: box-shadow 0.3s;
        content: "";
        pointer-events: none;
      }

      .table .table-container .box-shadow::after {
        box-shadow: rgba(0, 0, 0, 0.12) 10px 0px 8px -8px inset;
      }
    </style>
  </head>
  <body>
    <div class="table">
      <div class="table-container">
        <table border="0" cellspacing="0" cellpadding="0">
          <thead>
            <tr>
              <td width="150" class="fixed">姓名</td>
              <td width="150">类别</td>
              <td width="150">年龄</td>
              <td width="150">身高</td>
              <td width="150">体重</td>
              <td width="150">肤色</td>
              <td width="150">牙齿</td>
              <td width="150">健康</td>
            </tr>
          </thead>

          <tbody>
            <tr>
              <td class="fixed">张三</td>
              <td>人</td>
              <td>12</td>
              <td>136</td>
              <td>136</td>
              <td>黑</td>
              <td>白</td>
              <td>良好</td>
            </tr>
            <tr>
              <td class="fixed">张三</td>
              <td>人</td>
              <td>12</td>
              <td>136</td>
              <td>136</td>
              <td>黑</td>
              <td>白</td>
              <td>良好</td>
            </tr>
          </tbody>
        </table>
      </div>
    </div>
    <script>
      window.onload = function () {
        let doc = document.getElementsByClassName("table-container")[0];
        let leftFixs = doc.getElementsByClassName("fixed");

        doc.addEventListener(
          "scroll",
          function (e) {
            if (e.target.scrollLeft > 0) {
              [...leftFixs].forEach((item) => {
                item.classList.add("box-shadow");
              });
            } else {
              [...leftFixs].forEach((item) => {
                item.classList.remove("box-shadow");
              });
            }
          },
          true
        );
      };
    </script>
  </body>
</html>

在这里插入图片描述

右边列固定滚动的table

<!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>
    .table {
      width: 700px;      
    }
    .table-container {
      position: relative;
      overflow: scroll;

    }
    .table .table-container table {
      width: max-content;
    }
    .table table tr{
      position: relative;
    }

    .table table td{
      border-bottom: 1px solid #ebeef5;
      height: 38px;
      font-size: 14px;
      color: #666;
      padding: 2px;
    }
    .table .table-container .fixed {
      position: sticky;
      right: 0;
      background-color: #fff;
    }

    .table .table-container .fixed::before {
      position: absolute;
      top: 0;
      bottom: -1px;
      left: 0;
      width: 30px;
      transform: translateX(-100%);
      transition: box-shadow .3s;
      content: '';
      pointer-events: none;
    }

    .table .table-container .box-shadow::before {
      box-shadow: rgba(0,0,0,0.12) -10px 0 8px -8px inset;
    }

  </style>
</head>
<body>
  <div class="table">

    <div class="table-container">

        <table border="0" cellspacing="0" cellpadding="0">
          <thead>
            <tr>
              <td width="150">姓名</td>
              <td width="150">类别</td>
              <td width="150">年龄</td>
              <td width="150">身高</td>
              <td width="150">体重</td>
              <td width="150">肤色</td>
              <td width="150">牙齿</td>
              <td width="150" class="fixed">健康</td>
            </tr>
          </thead>
    
          <tbody>
            <tr>
              <td>张三</td>
              <td>人</td>
              <td>12</td>
              <td>136</td>
              <td>136</td>
              <td>黑</td>
              <td>白</td>
              <td class="fixed">良好</td>
            </tr>
            <tr>
              <td>张三</td>
              <td>人</td>
              <td>12</td>
              <td>136</td>
              <td>136</td>
              <td>黑</td>
              <td>白</td>
              <td class="fixed">良好</td>
            </tr>
          </tbody>
        </table>

    </div>
   
  </div>
  <script>
    window.onload = function () {
      let doc = document.getElementsByClassName('table-container')[0]

      let rightFixs = doc.getElementsByClassName('fixed')

      let table = doc.getElementsByTagName('table')[0]
	
		{
	        [...rightFixs].forEach(item => {
	          item.classList.add('box-shadow')
	        })
	     }

      doc.addEventListener('scroll', function(e) {

        if (e.target.scrollLeft < table.clientWidth - doc.clientWidth) {
          [...rightFixs].forEach(item => {
            item.classList.add('box-shadow')
          })
        } else {
          [...rightFixs].forEach(item => {
            item.classList.remove('box-shadow')
          })
        }
      }, true)
    }
  </script>
</body>
</html>

 在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的 HTML 代码,实现一个滑动窗口的效果: ``` <div class="slider-container"> <div class="slider"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <img src="image3.jpg" alt="Image 3"> </div> <button class="slider-prev">Prev</button> <button class="slider-next">Next</button> </div> ``` 解释: 1. `slider-container` 类指定了容器的宽度和 `overflow` 属性,用于限制滑动窗口的宽度和隐藏超出容器宽度的内容。 2. `slider` 类指定了包含所有图片的 `div` 元素的宽度为三倍容器宽度,因为滑动窗口中同时显示三张图片。 3. `slider-prev` 和 `slider-next` 类为切换按钮,用于手动切换图片。 JavaScript 代码: ``` const slider = document.querySelector('.slider'); const sliderWidth = slider.offsetWidth; let currentSlide = 0; function moveSlider(direction) { if (direction === 'prev') { currentSlide -= 1; if (currentSlide < 0) { currentSlide = 2; } } else if (direction === 'next') { currentSlide += 1; if (currentSlide > 2) { currentSlide = 0; } } slider.style.transform = `translateX(-${currentSlide * sliderWidth}px)`; } const prevButton = document.querySelector('.slider-prev'); prevButton.addEventListener('click', () => moveSlider('prev')); const nextButton = document.querySelector('.slider-next'); nextButton.addEventListener('click', () => moveSlider('next')); ``` 解释: 1. `slider` 变量获取 `div` 元素,`sliderWidth` 变量获取其宽度。 2. `currentSlide` 变量用于记录当前显示图片的索引。 3. `moveSlider` 函数用于切换图片。`direction` 参数指定切换方向,当点击 `prev` 按钮时,`currentSlide` 减 1,如果小于 0,则重置为最后一张图片的索引 2;当点击 `next` 按钮时,`currentSlide` 加 1,如果超过最后一张图片的索引 2,则重置为 0。然后根据当前图片的索引计算出 `slider` 元素的 `transform` 属性值,将其向左移动当前索引乘以容器宽度的距离。 4. `prevButton` 和 `nextButton` 变量分别获取 `slider-prev` 和 `slider-next` 类的按钮元素,并添加点击事件监听器,调用 `moveSlider` 函数,传入不同的参数值,实现手动切换图片的效果。 这样就完成了一个简单的滑动窗口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值