js基础编程-题目24 滚动吸顶

本文分享了四种实现滚动吸顶效果的方法:使用原生offsetTop、JQuery的offset().top、position:sticky及getBoundingClientRect().top。并详细介绍了如何通过原生JS实现该效果,包括HTML、CSS和JS的具体实现。

整理下初学时做过的js基础编程题目和大家分享以下,如果大家觉得有用,别忘了点一下赞哦

滚顶吸顶

滚动吸顶有几种方式?
1.	使用原生的 offsetTop 实现
2.	使用 JQuery 的 offset().top 实现
3.	使用 position:sticky 实现
4.	使用 obj.getBoundingClientRect().top 实现

效果:滚动吸顶效果视频链接
这里详细说一下用 原生js实现

  • 原生js实现
    html部分
<nav>
  <h1>导航</h1>
  <div id="scrollDom">滚动吸顶的元素</div>
</nav>
<section>
  p{内容$}*40
</section>

js部分

<script>
  let scrollDom = document.querySelector('#scrollDom')
  // 确定元素与上窗口的距离
  let offsetTop = getPosition(scrollDom).top
  window.addEventListener('scroll', function () {
    // 滚动条到达使,给滚动吸顶的元素设置固定定位
    if (getScrollOffset().y >= offsetTop) {
      scrollDom.className = 'fixed'
      // 没达到则取消固定定位
    } else {
      scrollDom.className = ''
    }
  })
  //封装获取滚动条的滚动距离方法
  function getScrollOffset() {
    if (window.pageXOffset !== null) {//IE8及IE8以下不兼容
      return {
        x: window.pageXOffset,
        y: window.pageYOffset
      }
    } else if (docuemnt.compatMode === 'CSS1Compat') {
      //标准模式  W3C
      return {
        x: document.documentElement.scrollLeft,
        y: document.documentElement.scrollTop
      }
    } else {
      //混杂模式  BackCompat   
      return {
        x: document.body.scrollLeft,
        y: document.body.scrollTop
      }
    }
  }
	// 封装获取元素相对文档的位置方法
  function getPosition(dom) {
    let offsetLeft = dom.offsetLeft
    let offsetTop = dom.offsetTop
    let parent = dom.offsetParent
    while (parent) {
      offsetLeft += parent.offsetLeft
      offsetTop += parent.offsetTop
      parent = parent.offsetParent
    }
    return {
      top: offsetTop,
      left: offsetLeft
    }
  }
</script>

css部分

* {
  margin: 0;
  padding: 0;
}
nav {
  width: 100vw;
  height: 20vh;
  text-align: center;
  background-color: pink;
}
h1 {
  width: 100vw;
  height: 10vh;
}
#scrollDom {
  width: 100vw;
  height: 10vh;
  line-height: 10vh;
  background-color: blue;
}
.fixed {
  position: fixed;
  left: 0;
  top: 0;
}
section {
  height: 70vh;
}
### 实现 vxe-table 滚动吸顶的方式 在前端开发中,`vxe-table` 是一个功能强大的表格组件库,支持多种复杂场景。要实现滚动时的吸顶,可以通过结合 CSS JavaScript 的方式来完成。以下是具体的实现方法[^1]: #### 1. 使用 `position: sticky` 通过为表格的表头设置 `position: sticky` 样式,可以轻松实现吸顶。这种方法不需要额外的 JavaScript 代码,并且兼容性较好(现代浏览器支持)。 ```html <vxe-table :scroll-y="{ enabled: true }" class="sticky-header"> <vxe-column field="name" title="Name"></vxe-column> <vxe-column field="age" title="Age"></vxe-column> </vxe-table> ``` ```css .sticky-header .vxe-header--row { position: sticky; top: 0; background-color: white; /* 确保背景颜色与表格一致 */ z-index: 1; /* 防止被其他内容遮挡 */ } ``` 此方法适用于简单的吸顶需求,但需要注意浏览器对 `position: sticky` 的支持情况[^2]。 #### 2. 使用 JavaScript 动态调整 如需要更复杂的吸顶(如固定到页面顶部或其他容器内),可以通过监听滚动事件动态调整表头的位置。 ```javascript const tableContainer = document.querySelector('.table-container'); const tableHeader = document.querySelector('.vxe-header--row'); function handleScroll() { if (window.scrollY > tableContainer.offsetTop) { tableHeader.style.position = 'fixed'; tableHeader.style.top = '0'; tableHeader.style.left = `${tableContainer.offsetLeft}px`; tableHeader.style.width = `${tableContainer.offsetWidth}px`; tableHeader.style.backgroundColor = 'white'; // 确保背景颜色与表格一致 } else { tableHeader.style.position = ''; tableHeader.style.top = ''; tableHeader.style.left = ''; tableHeader.style.width = ''; } } window.addEventListener('scroll', handleScroll); ``` 此方法适用于需要动态调整吸顶位置或范围的场景,但需要注意性能优化,避免频繁触发滚动事件导致性能问题[^3]。 #### 3. 使用第三方插件或工具 如项目中已经使用了类似 `vue-sticky-directive` 的插件,可以直接利用这些工具简化吸顶实现。例如: ```html <div v-sticky="{ zIndex: 100, stickyTop: 0 }" class="table-header"> <vxe-table :scroll-y="{ enabled: true }"> <vxe-column field="name" title="Name"></vxe-column> <vxe-column field="age" title="Age"></vxe-column> </vxe-table> </div> ``` 这种方法适合需要快速集成吸顶功能的场景,但可能增加项目的依赖负担[^4]。 --- ### 注意事项 - **兼容性**:确保目标浏览器支持所选方案中的特性(如 `position: sticky`)。 - **性能优化**:对于 JavaScript 实现吸顶,建议使用 `requestAnimationFrame` 或节流/防抖技术优化滚动事件处理。 - **样式一致性**:吸顶后需保证表头样式(如背景色、宽度等)与表格主体一致,避免视觉突兀。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳晓黑胡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值