uni-app 吸顶功能需求 实现特定区域滚动到顶部时元素固定

发布于 1周前 作者 htzhanglong 来自 Uni-App

uni-app 吸顶功能需求 实现特定区域滚动到顶部时元素固定

吸顶 | 特定区域滚动到顶部时固定

alt alt

6 回复

css设置 sticky 就好了


我设置了,还H5可以,安卓app不行,是为什么呢

回复 1***@qq.com: 可能是Android低端机不支持sticky,引入x5内核解决。或者,如果你需要吸顶后,可继续左右拖动长列表,那请参考hello uni-app模板里的swiper-list,从HBuilderX2.6.6+起新建项目选择的hello uni-app模板带有该功能,是nvue实现的。

回复 DCloud_heavensoft: 想要接近原生 还要引入x5内核 这跟写了个h5几乎没区别了吧 效果极差

回复 lbhzfzy: x5内核和原生有什么关系,这个是为了解决浏览器兼容性问题,低端Android自带的Webview版本较低,很多新的css不支持。如果想接近原生,应该用nvue

在uni-app中实现吸顶功能,当特定区域滚动到顶部时元素固定,可以通过监听页面滚动事件结合CSS样式来实现。以下是一个简单的代码示例,展示如何实现这一功能:

1. 页面结构

首先,在页面的模板部分定义一个需要吸顶的元素和其他内容:

<template>
  <view class="container">
    <view class="content" :style="{height: contentHeight + 'px'}">
      <!-- 模拟大量内容 -->
      <view v-for="i in 50" :key="i" class="item">Item {{ i }}</view>
    </view>
    <view ref="stickyElement" class="sticky-element">
      This is a sticky element
    </view>
    <view class="more-content">
      <!-- 更多内容 -->
      <view v-for="i in 20" :key="i" class="item">More Item {{ i }}</view>
    </view>
  </view>
</template>

2. 样式定义

在页面的样式部分定义基础样式和吸顶样式:

<style scoped>
.container {
  padding: 20px;
}
.content, .more-content {
  margin-bottom: 20px;
}
.item {
  height: 50px;
  line-height: 50px;
  border-bottom: 1px solid #ddd;
}
.sticky-element {
  height: 50px;
  line-height: 50px;
  background-color: #f8f8f8;
  text-align: center;
  position: -webkit-sticky; /* Safari */
  position: sticky;
  top: 0;
  transform: translateY(-100%); /* 初始隐藏 */
  transition: transform 0.3s ease;
}
.sticky-element.fixed {
  transform: translateY(0); /* 固定显示 */
}
</style>

3. 逻辑实现

在页面的脚本部分,通过监听页面滚动事件来控制吸顶元素的显示状态:

<script>
export default {
  data() {
    return {
      contentHeight: 800, // 模拟内容高度
      isSticky: false,
    };
  },
  mounted() {
    this.$refs.stickyElement.addEventListener('scroll', this.handleScroll);
  },
  beforeDestroy() {
    this.$refs.stickyElement.removeEventListener('scroll', this.handleScroll);
  },
  methods: {
    handleScroll(e) {
      const scrollTop = uni.getPageScrollOffset().scrollTop;
      const stickyElementTop = this.$refs.stickyElement.offsetTop;
      this.isSticky = scrollTop >= stickyElementTop;
    },
  },
  watch: {
    isSticky(val) {
      this.$refs.stickyElement.classList.toggle('fixed', val);
    },
  },
};
</script>

注意:在uni-app中,通常使用uni.getPageScrollOffset()来获取页面滚动位置,而不是直接监听DOM元素的滚动事件。这里的监听逻辑需要根据实际场景调整,确保在正确的元素或时机触发滚动事件。此外,transformtransition用于平滑过渡效果。

回到顶部