uni-app 固定定位的元素在页面滚动时内容闪烁

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

uni-app 固定定位的元素在页面滚动时内容闪烁

项目信息 详情
产品分类 uniapp/App
PC开发环境 Windows
PC开发环境版本 Windows 11 家庭中文版 22H2
手机系统 Android
手机系统版本 Android 14
手机厂商 华为
手机机型 mate 60pro
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 CLI
CLI版本号 4.5.19

操作步骤:

  • 在1.5k或者2k屏幕下 上滑或下滑页面

预期结果:

  • 固定定位的元素固定在屏幕顶部固定不动

实际结果:

  • 固定定位的元素内容闪烁

bug描述:

  • 在1.5k或者2k屏幕下,页面滚动时 带有position:fixed的元素内容会闪烁

bug.zip


6 回复

确保定位元素和主体是同级的,你试试 <template>
<view class="content">
<view class="header">
定位元素
</view>
<view class="body">
<view class="jdt" v-for="(item,index) in 50 " :key="index">
这是页面内容{{item}}
</view>
</view>
</view>
</template>

<script> export default { components: { }, data() { return { } }, onLoad() { }, methods: { } } </script> <style> .content{ padding: 0 30rpx; } .header{ position: fixed; top: 0; left: 0; width: 750rpx; height: 80rpx; background-color: #666; } .body{ margin-top: 80rpx; background-color: aliceblue; } </style>

你把tabBar加上试试呢

代码贴在下一条评论了 麻烦看看呢

在有tabBar的时候就能复现 改了代码App热更新之后有时候又没得这个问题了 重启app之后这个问题又会出现 <template>
<view class="container">
<view class="fixed">
标题-首页
</view>
<view class="content">
<image class=“logo” src="/static/logo.png" @click=“jump”></image>
<view v-for="(item, idx) in 50" :key="idx">首页-内容{{idx}}</view>
</view>
</view>
</template>

<script> export default { data() { return {} }, onLoad() {}, methods: { jump() { uni.navigateTo({ url: 'detail' }); } } } </script> <style> .fixed { position: fixed; top: 0; left: 0; z-index: 99; box-sizing: content-box; text-align: center; padding-top: var(--status-bar-height); height: 44px; line-height: 44px; background-color: #1e88e5; color: #fff; width: 100%; } .logo { height: 200rpx; width: 200rpx; } .content { padding-top: calc(var(--status-bar-height) + 44px + 32rpx); font-size: 36rpx; color: #8f8f94; line-height: 100rpx; text-align: center; } </style>

pages.json {
“pages”: [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
“path”: “pages/index/index”
},
{
“path”: “pages/index/detail”
},
{
“path”: “pages/center/index”
},
{
“path”: “pages/my/index”
}
],
“globalStyle”: {
“navigationStyle”: “custom”,
“app-plus”: {
“bounce”: “none”,
“softinputNavBar”: “none”
}
},
“tabBar”: {
“color”: “#90A4AE”,
“selectedColor”: “#1e88e5”,
“backgroundColor”: “#FFFFFF”,
“borderStyle”: “rgba(0, 0, 0, 0.2)”,
“blurEffect”: “extralight”,
“list”: [
{
“pagePath”: “pages/index/index”,
“iconPath”: “static/images/tabBar/home.png”,
“selectedIconPath”: “static/images/tabBar/home-1.png”,
“text”: “首页”
},
{
“pagePath”: “pages/center/index”,
“iconPath”: “static/images/tabBar/trade.png”,
“selectedIconPath”: “static/images/tabBar/trade-1.png”,
“text”: “中心”
},
{
“pagePath”: “pages/my/index”,
“iconPath”: “static/images/tabBar/my.png”,
“selectedIconPath”: “static/images/tabBar/my-1.png”,
“text”: “我的”
}
]
}
}

uni-app 中,使用 position: fixed 定位的元素在页面滚动时出现内容闪烁的问题,通常是由于以下几个原因引起的。以下是一些常见的解决方法:

1. 硬件加速

  • 问题原因:在某些情况下,浏览器可能没有启用硬件加速,导致 fixed 定位的元素在滚动时出现渲染问题。
  • 解决方法:尝试通过 transform 属性来启用硬件加速。例如:
    .fixed-element {
        position: fixed;
        top: 0;
        left: 0;
        transform: translateZ(0);
    }
    这可以强制浏览器使用 GPU 进行渲染,减少闪烁。

2. 页面布局复杂

  • 问题原因:如果页面布局过于复杂,浏览器在滚动时可能需要重新计算布局,导致 fixed 元素闪烁。
  • 解决方法:尽量减少页面布局的复杂性,避免过多的嵌套和复杂的 CSS 样式。可以尝试简化页面结构,减少不必要的 DOM 元素。

3. CSS 动画或过渡

  • 问题原因:如果页面中有 CSS 动画或过渡效果,可能会影响 fixed 元素的渲染。
  • 解决方法:检查页面中是否有正在运行的 CSS 动画或过渡效果,尝试禁用这些效果,看看是否解决了闪烁问题。

4. 滚动事件处理

  • 问题原因:如果在滚动事件中执行了复杂的 JavaScript 逻辑,可能会导致页面渲染性能下降,进而引起 fixed 元素闪烁。
  • 解决方法:优化滚动事件处理逻辑,避免在滚动时执行过多的操作。可以使用 requestAnimationFrame 来优化滚动事件的处理。

5. 浏览器兼容性

  • 问题原因:某些浏览器可能对 fixed 定位的支持不够完善,导致滚动时出现闪烁。
  • 解决方法:尝试在不同的浏览器中测试页面,看看是否只有特定浏览器才会出现闪烁问题。如果是浏览器兼容性问题,可以尝试使用其他定位方式或进行浏览器特定的 CSS 调整。

6. 使用 transform 替代 fixed

  • 问题原因:在某些情况下,fixed 定位可能无法很好地处理复杂的滚动场景。
  • 解决方法:可以尝试使用 transformtranslate3d 来模拟 fixed 定位的效果。例如:
    .fixed-element {
        position: absolute;
        top: 0;
        left: 0;
        transform: translate3d(0, 0, 0);
    }

7. 检查 z-index

  • 问题原因:如果 fixed 元素的 z-index 设置不当,可能会导致元素在滚动时与其他元素重叠或闪烁。
  • 解决方法:确保 fixed 元素的 z-index 值足够高,避免与其他元素产生冲突。

8. 避免使用 overflow: hidden

  • 问题原因:在某些情况下,父元素设置了 overflow: hidden 可能会影响 fixed 定位元素的渲染。
  • 解决方法:检查 fixed 元素的父元素是否设置了 overflow: hidden,如果是,尝试移除或调整该属性。

9. 使用 will-change 属性

  • 问题原因:浏览器可能无法正确优化 fixed 元素的渲染。
  • 解决方法:可以尝试使用 will-change 属性来提示浏览器优化渲染:
    .fixed-element {
        position: fixed;
        top: 0;
        left: 0;
        will-change: transform;
    }
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!