Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Position absolute not working inside ScrolView in React native

Tags:

react-native

I was trying to position a button on the bottom right of the screen like the picture below:

What I wanted

So, basically I had a Scrollview with the button inside like so:

import React, { Component } from 'react'
import { ScrollView, Text, KeyboardAvoidingView,View,TouchableOpacity } from 'react-native'
import { connect } from 'react-redux'
import { Header } from 'react-navigation';
import CreditCardList from '../Components/credit-cards/CreditCardList';
import Icon from 'react-native-vector-icons/Ionicons';
import Button from '../Components/common/Button';

// Styles
import styles from './Styles/CreditCardScreenStyle'
import CreditCardScreenStyle from './Styles/CreditCardScreenStyle';

class CreditCardScreen extends Component {

  render () {
    return (
        <ScrollView style={styles.container}>         
          <CreditCardList />
          <TouchableOpacity  style={CreditCardScreenStyle.buttonStyle}>
              <Icon name="md-add"  size={30} color="#01a699" />
          </TouchableOpacity>

        </ScrollView>
    )
  }
}

My styles:

import { StyleSheet } from 'react-native'
import { ApplicationStyles } from '../../Themes/'

export default StyleSheet.create({
  ...ApplicationStyles.screen,
  container:{
    marginTop: 50,
    flex: 1,
    flexDirection: 'column'
  },
  buttonStyle:{
    width: 60,  
    height: 60,   
    borderRadius: 30,  
    alignSelf: 'flex-end',          
  //  backgroundColor: '#ee6e73',                                    
    position: 'absolute',                                          
    bottom: 0,                                                    
  //  right: 10, 
  }
})


The problem is that the absolute positioning does not work at all when the button is inside the ScrollView. But...If I change the code to look like this:

import CreditCardScreenStyle from './Styles/CreditCardScreenStyle';

class CreditCardScreen extends Component {

  render () {
    return (

      <View style={styles.container}>
        <ScrollView >         
          <CreditCardList />
        </ScrollView>

        <TouchableOpacity  style={CreditCardScreenStyle.buttonStyle}>
              <Icon name="md-add"  size={30} color="#01a699" />
        </TouchableOpacity>

      </View>
    )
  }
}


Then it works !! Whaat? Why? How? I don't understand why this is happening and I would appreciate any information about it.

like image 783
Tiago Conceiçao Avatar asked May 17 '26 07:05

Tiago Conceiçao


1 Answers

This might be inconvenient but is just how RN works.

Basically anything that's inside the ScrollView (in the DOM/tree) will scroll with it. Why? Because <ScrollView> is actually a wrapper over a <View> that implements touch gestures.

When you're using position: absolute on an element inside the ScrollView, it gets absolute positioning relative to its first relative parent (just like on the web). Since we're talking RN, its first relative parent is always its first parent (default positioning is relative in RN). First parent, which in this case is the View that's wrapped inside the ScrollView.

So, the only way of having it "fixed" is taking it outside (in the tree) of the ScrollView, as this is what's actually done in real projects and what I've always done.

Cheers.

like image 200
iuliu.net Avatar answered May 20 '26 02:05

iuliu.net



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!