小程序开发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;
}

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

相关推荐
竹林8181 分钟前
从ethers.js迁移到Viem:我在一个DeFi项目前端重构中踩过的坑
前端·javascript
像我这样帅的人丶你还21 分钟前
从交稿到甩锅预防:AI 前端流水线
前端·ai编程
想想弹幕会怎么做22 分钟前
如何构建一颗可交互的ui树?
前端
程序员陆业聪27 分钟前
我见过的最反直觉的 Android 架构问题:UseCase 越多,项目越烂
前端
Arya_aa34 分钟前
网络:前端向后端发送网络请求渲染在页面上,将EasyMock中的信息用前端vue框架编写代码,最终展示在浏览器
前端·vue.js
LlNingyu35 分钟前
文艺复兴,什么是CSRF,常见形式(一)
前端·安全·web安全·csrf
晓131338 分钟前
React篇——第三章 状态管理之 Redux 篇
前端·javascript·react.js
子兮曰43 分钟前
🚀24k Star 的 Pretext 为何突然爆火:它不是排版库,而是在重写 Web 文本测量
前端·javascript·github
@大迁世界1 小时前
11.在 React.js 中,state 与 props 的差异体现在哪里?
前端·javascript·react.js·前端框架·ecmascript
Giant1001 小时前
🔥前端跨域封神解法:Vite Proxy + Express CORS,一篇搞定所有跨域坑!
前端·javascript·面试