小程序开发root-portal弹窗组件

在我们布局的时候经常会遇到以下问题:

在制作一个弹窗的时候会出现因为有元素设置的z-index层级比遮罩层高,导致遮罩层没办法完全遮住页面,下面就是一个例子

wxml:

xml 复制代码
<view>
  <view class="box1"></view>
  <view class="box2">
    <view class="mask"></view>
  </view>
</view>

wxcss:

css 复制代码
.box1{
  position: relative;
  width: 200rpx;
  height: 200rpx;
  background-color: violet;
  z-index: 10;
}
.box2{
  position: relative;
  top: -100rpx;
  left: 100rpx;
  width: 400rpx;
  height: 400rpx;
  background-color: palevioletred;
  z-index: 9;
}
​
.box2 .mask{
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 10000;
}

效果:

那出现这种情况的原因是什么呢?

因为box1的z-index比box2的z-index大,所以不管mask的z-index多大都会被box1压着。

那我们应该怎么解决这个问题呢?

有两种处理方式:

①可以将box2删除层级z-index或者删除box2,但是这种处理方式会改变原来的页面布局

②使用root-portal组件

用root-portal标签把遮罩层包裹住:

xml 复制代码
<view>
  <view class="box1"></view>
  <view class="box2">
    <root-portal>
       <view class="mask"></view>
    </root-portal>
  </view>
</view>

但是要注意,因为root-portal使整个子树从页面中脱离出来,类似于在 CSS 中使用 fixed position 的效果。主要用于制作弹窗、弹出层等。所以现在如果还是在原来的局部页面wxss中设置样式是没有任何效果的,应该在全局的app.wxss中设置样式:

css 复制代码
.mask{
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: rgba(0, 0, 0, 0.5);
  z-index: 10000;
}

现在就实现遮罩层的效果了:

相关推荐
kyriewen114 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5
skywalk81636 小时前
Kotti Next的tinyfrontend前端模仿Kotti 首页布局还是不太好看,感觉比Kotti差一点
前端
RopenYuan8 小时前
FastAPI -API Router的应用
前端·网络·python
走粥8 小时前
clsx和twMerge解决CSS类名冲突问题
前端·css
Purgatory0019 小时前
layui select重新渲染
前端·layui
weixin199701080169 小时前
《中国供应商商品详情页前端性能优化实战》
前端·性能优化
赵孝正11 小时前
学习的本质是一个工程闭环:从模仿到内化的四阶段方法论(附风电实战案例)
前端·数据库·学习
Panzer_Jack13 小时前
easy-live2d v0.4.0 — 全面进化的 Live2D Web 开发体验
前端