uni-app中app使用position: sticky;无法一直固定在顶部

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

uni-app中app使用position: sticky;无法一直固定在顶部

信息类别 详细信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 windows11
HBuilderX类型 正式
HBuilderX版本号 4.29
手机系统 Android
手机系统版本号 Android 10
手机厂商 模拟器
手机机型 Pixel
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

操作步骤:

固定顶部无效代码

<template>  
  <view style="position: sticky; top: 0"></view>  
  <view style="height: 2000px"></view>  
</template>

固定顶部有效代码

<template>  
  <view>  
     <view style="position: sticky; top: 0"></view>  
     <view style="height: 2000px"></view>  
  </view>  
</template>

预期结果:

最外层不使用view包裹能固定在顶部

实际结果:

需要包裹view才能固定在顶部

bug描述:

如果position: sticky;所在的元素没有父元素存在的话,那么该布局只会在一块屏幕高度区域内滑动有效,若滑动区域超过当前屏幕高度sticky属性的元素会出现跟随移出屏幕外面


4 回复

确实如此 可能是页面上多个根标签影响到了 page的高度 只有一屏高度 当page设置跟内容一样高时 又可以固定上了 page {
min-height: 2000px;
} 或者

page {
height: auto;
}


治标不治本 还得他们自己解决

回复 coderH: 是的 根源上的问题还是得官方的人改

在uni-app中,position: sticky; 的表现可能会受到不同平台和设备的影响,尤其是在移动设备上。这是因为 position: sticky; 依赖于用户的滚动行为,而不同的浏览器引擎或WebView可能对这一特性的实现有所不同。如果你发现 position: sticky; 在某些情况下不能一直固定在顶部,可以考虑使用其他方法来实现固定布局,比如使用 CSS Flexbox 或 JavaScript 动态控制元素的位置。

以下是一个使用 Flexbox 实现固定顶部导航栏的示例:

<template>
  <view class="container">
    <view class="navbar">
      <!-- 导航栏内容 -->
      <text>固定顶部导航栏</text>
    </view>
    <scroll-view scroll-y="true" class="content">
      <!-- 可滚动内容 -->
      <view v-for="i in 50" :key="i" class="item">
        内容 {{ i }}
      </view>
    </scroll-view>
  </view>
</template>

<script>
export default {
  data() {
    return {};
  }
};
</script>

<style scoped>
.container {
  display: flex;
  flex-direction: column;
  height: 100vh;
}

.navbar {
  background-color: #fff;
  padding: 16px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  position: sticky; /* 仍然保留,但在某些情况下可能不起作用 */
  top: 0;
  z-index: 1000; /* 确保导航栏在其他内容之上 */
  /* 如果 position: sticky 不起作用,可以考虑使用以下替代方案 */
  /* position: fixed;
  width: 100%; */
}

.content {
  flex: 1;
  padding-top: 64px; /* 根据导航栏的高度调整,以确保内容不被遮挡 */
  overflow-y: auto;
}

.item {
  padding: 16px;
  border-bottom: 1px solid #eee;
}
</style>

在这个例子中,我们使用了 flex 布局来确保 .navbar 始终位于顶部,并通过 padding-top.content 中为导航栏留出空间。如果 position: sticky; 在你的特定环境中不起作用,你可以尝试将 .navbarposition 改为 fixed 并设置 width: 100%; 来确保它覆盖整个屏幕宽度。注意,使用 fixed 定位可能会影响页面的其他布局,特别是在需要适配不同屏幕尺寸和方向的场景下。

此外,如果你需要更复杂的布局控制或跨平台兼容性,考虑使用 JavaScript 或框架特定的方法(如uni-app提供的API)来动态调整元素的位置。

回到顶部