react-native icon indicating copy to clipboard operation
react-native copied to clipboard

[Android] position: absolute shouldn't be cut off within a container with border

Open linmic opened this issue 7 years ago • 63 comments

Description

If you have an element position: absolute with negative offset within a container with a border, it's going to be cut off, it's like overflow: hidden of the container is suddenly enabled by the border. But if you remove the border of the container, it works well. This issue only happens on Android.

#3198 is a similar issue, and was reported with lots of discussions. However, I believe they are not exactly the same.

Reproduction

I've made an example on rnplay to reproduce the issue.

Solution

TBD

Additional Information

  • React Native version: 0.33 (rnplay), 0.39 (the version I currently use)
  • Platform: Android
  • Operating System: MacOS

linmic avatar Feb 23 '17 03:02 linmic

Same here. This is really frustrating

jakallergis avatar May 05 '17 17:05 jakallergis

Yeah this is currently happening with me even when the containing view has no border nor border-radius. This is definitely an issue because, for example, I want to show a circular icon on the top + middle area of my modal window. You can see it getting cut off below:

image

kylanhurt avatar May 31 '17 16:05 kylanhurt

Any solution for this issue? I have also experience it on android development.

renso3x avatar Jun 14 '17 00:06 renso3x

I can't find any way around this, guess we are just stuck with different styling for Android.

olliekav avatar Jul 24 '17 21:07 olliekav

Same issue here, view with absolute positioning and negative top works on iOS but got cut off on Android

jinqiupeter avatar Jul 26 '17 06:07 jinqiupeter

  • 1 for this, how to fix it?

scriptfans avatar Aug 28 '17 05:08 scriptfans

Facing this as well :(

image

Works great on iOS:

image

brunolemos avatar Sep 11 '17 19:09 brunolemos

This is an issue for me as well.

aforty avatar Sep 19 '17 16:09 aforty

@grabbou @bvaughn know any android dev that could help us with this bug?

brunolemos avatar Sep 19 '17 18:09 brunolemos

If some have a solution for that it's should be great. My java android skill is not good enough to make a PR :(

yelkamel avatar Sep 20 '17 14:09 yelkamel

+1 also having this issue.

Maximell avatar Oct 08 '17 03:10 Maximell

Has been a big problem here too. Anybody found a fix?

felipap avatar Oct 21 '17 10:10 felipap

Also having this problem with Android, neither overflow: hidden, nor zIndex: 1000 seem to fix the problem!

chrispcode avatar Nov 05 '17 09:11 chrispcode

Same here. Needs a fix! What are you doing to positioning elements in relationship to another one? E.g. for tooltips etc.?

mtin79 avatar Nov 28 '17 18:11 mtin79

Workaround

Use an extra container and fake the overflow with it: https://snack.expo.io/@designorant/overflow-visible-android-workaround

import React, { Component } from "react";
import { View, Text, StyleSheet } from "react-native";

export default class App extends Component {
  render() {
    return (
      <View style={styles.mainContainer}>

        <View style={styles.componentContainer}>
          <View style={[styles.element, styles.element1]} />
          <Text style={styles.text}>overflow: "visible"</Text>
        </View>

        <View style={styles.extraComponentContainer}>
          <View style={[styles.element, styles.element2]} />
          <View style={styles.componentContainer}>
            <Text style={styles.text}>extra container workaround</Text>
          </View>
        </View>

      </View>
    );
  }
}

const styles = StyleSheet.create({
  mainContainer: {
    flex: 1,
    alignItems: "center",
    justifyContent: "space-around"
  },
  componentContainer: {
    backgroundColor: "#d3d3d3",
    borderWidth: 1,
    borderColor: "grey",
    width: 200,
    height: 200,
    position: "relative",
    overflow: "visible" // doesn't do anything
  },
  extraComponentContainer: {
    // fakes overflow but requires more markup
    backgroundColor: "#ffff00",
    paddingTop: 20,
    paddingLeft: 20,
    paddingBottom: 20,
    paddingRight: 20,
    position: "relative"
  },
  element: {
    backgroundColor: "#ff0000",
    width: 40,
    height: 40
  },
  element1: {
    position: "absolute",
    top: -20,
    left: -20
  },
  element2: {
    position: "absolute",
    top: 0,
    left: 0,
    zIndex: 100,
    elevation: 100
  },
  text: {
    textAlign: "right",
    backgroundColor: "transparent"
  }
});

overflowvisible

designorant avatar Nov 28 '17 20:11 designorant

@designorant Thanks Michal for your advice! One question remains: Wouldn't the "extraComponentContainer" prevent clicks/actions/events to elements/components below it?

I know in css there is "pointer-events". When its set to "none" (e.g. pointer-events: none; ) The elements lets all events pass through to other elements below it. Anything like that in react-native?

mtin79 avatar Nov 29 '17 09:11 mtin79

Yes, react native has the pointerEvents prop.

brunolemos avatar Nov 29 '17 10:11 brunolemos

I have this problem too in rn 0.51.0.

stefanedberg avatar Dec 21 '17 14:12 stefanedberg

after some testing, it also happened when container has these styles

  • backgroundColor
  • borderColor
  • zIndex

kyoyadmoon avatar Jan 05 '18 03:01 kyoyadmoon

Thank you @brunolemos !! I had so much stupid layouts to try and get this to work. A full page 'container' View with pointerEvents='none' was all I needed!

MorganIsBatman avatar Jan 15 '18 05:01 MorganIsBatman

@brunolemos thanks! We did manage to fix out issue with poitnerEvents="box-none" and position absolute

jpudysz avatar Jan 15 '18 11:01 jpudysz

      <View style={ styles.container }>
        <TouchableOpacity style={ styles.menuButton } onPress={ this.toggleMenu }>
          <Ionicons name="ios-menu" size={ 32 } color="#fff" />
        </TouchableOpacity>

        <Text style={ styles.headerTitle }>VERUS</Text>

        <View style={ styles.menu } pointerEvents="box-none">
          <Fade visible={ this.state.menuVisible }>
            { menuItems.map( this.renderMenuitem ) }
          </Fade>
        </View>
      </View>
import EStyleSheet from 'react-native-extended-stylesheet';

const styles = EStyleSheet.create( {
  $headerHeight: 50,

  container: {
    flexDirection: 'row',
    alignItems: 'center',
    // backgroundColor: '#0050aa',
    paddingHorizontal: 10,
    height: '$headerHeight',
    position: 'relative',
  },

  menuButton: {
    marginTop: 3,
  },

  headerTitle: {
    marginLeft: 10,
    color: '#fff',
    fontSize: 16,
    fontWeight: '700',
  },

  menu: {
    position: 'absolute',
    top: '$headerHeight',
    left: 10,
  },

  menuItem: {
    padding: 10,
    backgroundColor: '#0050aa',
    borderBottomWidth: 1,
    borderBottomColor: '#eee',
  },

  menuItemName: {
    color: '#fff',
    fontWeight: '700',
  },
} );

export default styles;

I am still facing this issue. If I do not add backgroundColor to the container, then it works perfectly fine. It only happens on Android.

shettayyy avatar Feb 06 '18 16:02 shettayyy

To overcome this issue you can render a absolute positioned view with your background color on Android. Following code will work on android :)

      <View style={{ flex: 1, backgroundColor: 'red' }}>
        <View style={{ height: 200, backgroundColor: 'green' }} />
        <View style={{ height: 200 }}>
          <View style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, backgroundColor: 'yellow' }} />
          <View style={{ height: 50, width: 50, backgroundColor: 'aqua', position: 'absolute', top: -20 }} />
        </View>
      </View>

ifours avatar Mar 05 '18 10:03 ifours

I was working on an order summary page in which I need to show all orders made by user. Facing similar issue on android. Tried workaround @designorant suggested and it works fine. Here is the sample code if it helps anyone :) https://snack.expo.io/@harkiratsaluja/timeline

salujaharkirat avatar Mar 12 '18 13:03 salujaharkirat

Did anyone find a fix? This issue still exists. I am trying to create a hamburger menu (vertical dropdown) and the container with menu items gets clipped inside the header rendered by react-navigation. This only happens on Android.

shettayyy avatar Mar 14 '18 21:03 shettayyy

check if this helps https://medium.com/@sibelius/solving-view-overflow-in-android-reactnative-f961752a75cd

sibelius avatar Apr 17 '18 03:04 sibelius

Hey there, it looks like there has been no activity on this issue recently. Has the issue been fixed, or does it still require the community's attention? This issue may be closed if no further activity occurs. You may also label this issue as "For Discussion" or "Good first issue" and I will leave it open. Thank you for your contributions.

stale[bot] avatar Jul 16 '18 04:07 stale[bot]

the issue hasn't yet been fixed. @stale don't close the issue

gianpaj avatar Jul 16 '18 08:07 gianpaj

I am still facing this issue.

jianjiade avatar Aug 07 '18 06:08 jianjiade

Still an issue 😭

scottwio avatar Aug 09 '18 08:08 scottwio