React Native Android端absolute定位上层视图按钮点击穿透问题
问题原因
这个问题是React Native Android端特有的触摸事件分发逻辑导致的:
- Android端父元素设置的
zIndex不会同步作用于超出父容器边界的绝对定位子元素的触摸优先级,只会作用于视觉渲染层级 - 触摸事件分发时,超出父元素边界的绝对定位元素,默认会按JSX的书写顺序判断优先级,后渲染的元素优先级更高。你代码中蓝盒的JSX书写顺序在红盒之后,所以绿盒和蓝盒重叠的区域触摸事件会被蓝盒捕获。
解决方案
方案1:给绝对定位的绿盒自身设置更高的zIndex
直接在styles.green的样式中添加zIndex属性,且值大于蓝盒的zIndex即可,这个方案最稳妥,不会影响其他元素的布局和渲染顺序:
const styles=StyleSheet.create({ // 其他样式保持不变 green: { justifyContent: 'center', alignItems: 'center', height: 100, width: 100, backgroundColor: 'green', position: 'absolute', left: 30, top: 50, zIndex: 6, // 新增这行,值大于蓝盒的zIndex:1即可 }, });
方案2:调整JSX元素的渲染顺序
把红盒的JSX代码放到蓝盒之后,利用React Native默认后渲染元素触摸优先级更高的特性解决问题:
return ( <View style={styles.container}> {/* 把蓝盒移到红盒前面 */} <View style={styles.blue}> <TouchableOpacity onPress={()=>console.log('blue')}> <View style={styles.yellow} /> </TouchableOpacity> </View> <View style={styles.red}> <TouchableOpacity onPress={()=>console.log('red')}> <View style={styles.yellow} /> </TouchableOpacity> <View style={styles.green}> <TouchableOpacity onPress={()=>console.log('green')}> <View style={styles.yellow} /> </TouchableOpacity> </View> </View> </View> )
注意事项
Android端如果同时使用elevation和zIndex属性,elevation的优先级高于zIndex,如果修改zIndex无效可以检查是否有设置elevation导致冲突。
内容的提问来源于stack exchange,提问作者bgcodes
相关产品推荐
相关产品推荐

