uni-app nvue 中picker-view mask-style的bug

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

uni-app nvue 中picker-view mask-style的bug

开发环境 版本号 项目创建方式
Windows win10 CLI

产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:win10

HBuilderX版本号:3.4.11

手机系统:全部

页面类型:nvue

vue版本:vue3

打包方式:云端

CLI版本号:3.0.0-alpha-3041120220520001

测试过的手机:iphone11

示例代码:

<picker-view  
:mask-style="maskStyle"  
>  

</picker-view>  

maskStyle='background-image: linear-gradient(to bottom,rgba(30, 30, 30, 0.9),rgba(104, 104, 104, 0.6))'  

非nvue  
maskStyle='background-image:linear-gradient(rgba(17, 17, 17, 1.0),rgba(106, 106, 106, 0.2)),linear-gradient(rgba(106, 106, 106, 0.2),rgba(17, 17, 17, 1.0))'  
`

31 回复

alpha 3.6.7 已修复 详情


什么时候正式版更新啊

貌似3.6.15 使用 mask-top-style 修改 background-color 也是没效果哦

可以换一种方式实现,用定位盖在蒙层上 <view class="picker">
<picker-view class="pickerView" :indicator-style="indicatorStyle" :value="[0]">
<picker-view-column class="pickerViewColumn">
<view class="item">
<text class="itemText">苹果</text>
</view>
<view class="item">
<text class="itemText">香蕉</text>
</view>
<view class="item">
<text class="itemText">梨子</text>
</view>
</picker-view-column>
</picker-view>
<view class="pickerMaskTop" :style="{height: `${maskHeight + 1}px`}"></view>
<view class="pickerMaskBottom" :style="{height: `${maskHeight + 1}px`}"></view>
</view>

indicatorStyle: height: 50px;,
maskHeight: (uni.upx2px(500) - 50) / 2,

.picker {
&View {
width: 750rpx;
height: 500rpx;
&Column {
width: 750rpx;
height: 500rpx;
background-color: #333;
}
}
&Mask {
&Top {
width: 750rpx;
background-image: linear-gradient(to bottom,rgba(17, 17, 17, 0.9),rgba(17, 17, 17, 0.5));
position: absolute;
top: 0;
left: 0;
}
&Bottom {
width: 750rpx;
background-image: linear-gradient(to top,rgba(17, 17, 17, 0.9),rgba(17, 17, 17, 0.5));
position: absolute;
left: 0;
bottom: 0;
}
}
}
.item {
height: 50px;
align-items: center;
justify-content: center;
&Text {
color: #fff;
}
}

这种方式会不会影响上下滑动,视觉上应该可以满足,我晚上回去测试一下

回复 上码: 不会影响滑动

回复 1***@qq.com: 好的 谢谢

回复 上码: 不客气

回复 1***@qq.com: 这种定位式的覆盖,应该是可以用。就是底部的文字变得暗淡了,因为被盖了二层。免费可以用吧。官方未修复前只能这么用了。

回复 tmui: 嗯嗯,效果上还是可以的

回复 1***@qq.com: 提醒 下各位 :在ios下需要把遮罩事件改为fase会阻止滑动功能。

遇到同样问题 nvue暗色主题下 这个组件完全不能用

试试下面的方法

由于 nvue 无法使用一个 background-image 属性,因此现增加两个属性 maskTopStyle、maskBottomStyle 来分别设置 mask。预计下版修复

回复 4***@qq.com: 这两个 style 的书写格式就是 web 的 style 标签的格式。不是填写类名

好像还是不支持background-image,并没有修复…

回复 大良造: 支持啊,你碰到什么问题了?

回复 DCloud_UNI_LXH: 回复到下面了,我现在怀疑是mask-style在nvue下都没有生效,因为不止设置background 其它属性 opacity width都不会生效

就写一个最基本的picker-view
nvue页面 <picker-view class="popupCon" :indicator-style="indicatorStyle" :value="[3]" mask-style="background:red;opacity:0.1">
<picker-view-column class="popupConColumn">
<view class="popupItem" v-for="(item,index) in 10" :key="index">
{{item}}
</view>
</picker-view-column>
</picker-view> .popupCon{ width: 750rpx; height: 440rpx; .popupConColumn{ width: 750rpx; height: 440rpx;}
} indicatorStyle: height: 88rpx,
在模拟器上和真机上不一致,模拟器不支持nvue,所以表现正常,真机感觉mask-style就完全没有生效,还是默认的渐变色背景,给mask-style 设置 background 没有生效


使用 mask-top-style、mask-bottom-style 这两个属性

回复 DCloud_UNI_LXH: 这个属性 是不是 有问题呀 怎么现在还是没作用

nvue 页面还是没有作用呀


你试试这么写有没有效果

回复 DCloud_UNI_LXH:这样好像可以

回复 9***@qq.com: 颜色值都换换,可能透明不支持。多换换写法

回复 DCloud_UNI_LXH: border能去掉吗 怎么用border:0 没有用

n回复 DCloud_UNI_LXH: 黑色主题 中间的白色线 能去掉不

回复 9***@qq.com: 哪个白线?截图看看

使用 indicator-style 或 indicator-class

uni-appnvue 环境中,picker-view 组件的 mask-style 属性可能会遇到一些 bug 或兼容性问题。以下是一些常见的问题及其可能的解决方案:

1. mask-style 不生效

  • 问题描述:在 nvue 中,picker-viewmask-style 属性可能无法正确应用样式,导致遮罩层没有按照预期显示。
  • 解决方案
    • 确保 mask-style 的样式属性是支持的。mask-style 支持的样式属性可能有限,通常包括 backgroundColoropacity 等。
    • 尝试使用内联样式或直接在 style 标签中定义样式,而不是通过 mask-style 属性。
    • 如果问题依然存在,可以考虑使用 view 组件手动实现遮罩层,并通过 z-index 控制层级。

2. 遮罩层样式错乱

  • 问题描述:遮罩层的样式可能在某些设备或系统版本上显示异常,例如颜色不正确、透明度不生效等。
  • 解决方案
    • 检查 mask-style 中的样式属性是否在所有目标平台上都支持。例如,某些平台可能不支持 rgba 颜色格式。
    • 尝试使用简单的颜色值(如 #000000)和透明度(如 opacity: 0.5)来测试遮罩层样式。
    • 如果问题依然存在,可以考虑使用 view 组件手动实现遮罩层,并通过 position: fixedz-index 控制其显示。

3. 遮罩层无法覆盖整个屏幕

  • 问题描述:遮罩层可能无法覆盖整个屏幕,导致部分内容仍然可见。
  • 解决方案
    • 确保 picker-view 的父容器具有正确的尺寸和定位。例如,父容器可以使用 position: relativeposition: absolute
    • 检查 mask-style 中的 widthheight 属性是否设置为 100%,以确保遮罩层覆盖整个屏幕。
    • 如果问题依然存在,可以考虑使用 view 组件手动实现遮罩层,并通过 position: fixedz-index 控制其显示。

4. 遮罩层与 picker-view 的交互问题

  • 问题描述:遮罩层可能会阻止用户与 picker-view 的交互,例如无法滚动选择项。
  • 解决方案
    • 确保 mask-style 中的 pointer-events 属性设置为 none,以允许用户与 picker-view 交互。
    • 如果问题依然存在,可以考虑使用 view 组件手动实现遮罩层,并通过 pointer-events: none 控制其交互行为。

5. 平台兼容性问题

  • 问题描述mask-style 在某些平台(如 iOS 或 Android)上可能表现不一致。
  • 解决方案
    • 使用条件编译(如 #ifdef APP-PLUS)为不同平台编写不同的样式代码。
    • 测试并调整 mask-style 中的样式属性,以确保在所有目标平台上都能正确显示。

示例代码

<template>
  <view>
    <picker-view :mask-style="maskStyle">
      <picker-view-column>
        <view v-for="item in items" :key="item">{{ item }}</view>
      </picker-view-column>
    </picker-view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      items: ['Item 1', 'Item 2', 'Item 3'],
      maskStyle: {
        backgroundColor: 'rgba(0, 0, 0, 0.5)',
        opacity: 0.5,
        pointerEvents: 'none'
      }
    };
  }
};
</script>

<style>
/* 手动实现遮罩层 */
.mask {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 999;
  pointer-events: none;
}
</style>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!