在我们布局的时候经常会遇到以下问题:
在制作一个弹窗的时候会出现因为有元素设置的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;
}
现在就实现遮罩层的效果了: