uni-app filter: grayscale(1)页面置灰时uni-popup的定位bug

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

uni-app filter: grayscale(1)页面置灰时uni-popup的定位bug

开发环境 版本号 项目创建方式
Windows 22H2 HBuilderX
### 操作步骤:
使用filter: grayscale(1);置灰页面,并且页面列表长度超过页面时,使用uni-popup

### 预期结果:
使用filter: grayscale(1);置灰页面,并且页面列表长度超过页面时,uni-popup会定位到页面最低端

### 实际结果:
使用filter: grayscale(1);置灰页面,并且页面列表长度超过页面时,uni-popup会定位到列表最低端

### bug描述:
使用filter: grayscale(1);置灰页面,并且页面列表长度超过页面时,uni-popup的定位出现问题,uni-popup会定位到列表最低端,而不是页面最低端

5 回复

css filter 与 fixed 有冲突,自己想办法解决吧。


层级分开就行 <template>
<view class="">
<view class="body">
<image src="/static/logo.png" mode=""></image>
<button @click=“showPop”>show</button>
<view class="view" v-for="(item,index) in 20" :key="index">
vview{{item}}
</view>
</view>
<uni-popup ref="popup">
<view class="popup-content">
<image src="/static/logo.png" mode=""></image>
<view class="text">popup 内容</view>
</view>
</uni-popup>
</view>
</template>

<script> export default { data() { return {} }, methods: { showPop() { this.$refs.popup.open() } } } </script> <style> .view { text-align: center; padding: 20rpx; } .body { filter: grayscale(1); } .popup-content { background-color: #fff; filter: grayscale(1); } </style>

可以,非常感谢

回复 3***@qq.com: 不客气

在使用 uni-app 开发时,如果你在页面上应用了 filter: grayscale(1) 来实现页面置灰效果,可能会遇到 uni-popup 组件的定位问题。这是因为 filter 属性会影响元素的渲染层,导致 position: fixedposition: absolute 的元素定位出现异常。

解决方案

1. 使用 transform 替代 filter

filter 属性会创建一个新的层叠上下文,导致 position: fixed 的元素定位失效。你可以尝试使用 transform 属性来实现类似的效果,例如:

.grayscale {
  transform: scale(1);
  filter: grayscale(1);
}

但这种方法可能无法完全替代 filter 的效果,具体效果需要根据实际情况调整。

2. 将 filter 应用到特定元素

如果可能,尽量避免将 filter 应用到整个页面。你可以将 filter 应用到页面的特定元素上,而不是 bodyhtml 元素。例如:

<template>
  <view class="page">
    <view class="content">
      <!-- 页面内容 -->
    </view>
    <uni-popup ref="popup"></uni-popup>
  </view>
</template>

<style>
.page {
  filter: grayscale(1);
}
</style>

这样,uni-popup 不会受到 filter 的影响。

3. 使用 backdrop-filter

如果你的目标是在整个页面上应用灰度效果,并且希望 uni-popup 不受影响,可以尝试使用 backdrop-filterbackdrop-filter 只会影响背景元素,而不会影响 position: fixed 的元素。

.page {
  backdrop-filter: grayscale(1);
}

不过,backdrop-filter 的浏览器兼容性较差,需要根据实际情况测试。

4. 手动调整 uni-popup 的位置

如果上述方法都无法解决问题,你可以手动调整 uni-popup 的位置。通过监听页面滚动或尺寸变化,动态计算并设置 uni-popup 的位置。

onPageScroll(e) {
  const popup = this.$refs.popup;
  if (popup) {
    popup.setStyle({
      top: e.scrollTop + 'px'
    });
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!