Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does React Native not offer a justify-self

I want to align an item in the primary axis. For example, I want to have a row with a few children all aligned left, and then one child aligned on the right side.

You could achieve that effect with something like "position: absolute; right: 0", but I'm wondering if theres a better way. It seems like there ought to be a justifySelf property, that only affects one child and affects its alignment on the primary axis, in the same way the alignSelf affects one child's alignment on the secondary axis.

Yet no such justifySelf seems to exist. Why is this?

It's similar to this question but not quite: How can you float: right in React Native?

like image 422
Varun Singh Avatar asked Jun 13 '18 23:06

Varun Singh


People also ask

Why does justify-self not work?

You could use margin-left: auto on right element instead. Also when you use display: flex on parent element display: inline-block on child elements is not going to work. To add to this answer, justify-self is simply not supported in flexbox because it justifies all its items as a group.

What is align self in react native?

alignSelf ​ alignSelf controls how a child aligns in the cross direction, overriding the alignItems of the parent.

How justify content to right in react native?

Use textAlign: 'right' on the Text element (This approach doesn't change the fact that the Text fills the entire width of the View ; it just right-aligns the text within the Text .)


2 Answers

I don't know React Native, but I do know flexbox!

Use the following code as a guide:

<div style="display: flex;">

  <div>
    I'll be on the left side
  </div>
  <div>
    I'll be hugging the guy on the left side
  </div>
  <div>
    I'll be hugging the guy hugging the guy on the left side
  </div>
  <div style="margin-left: auto;">
    I'll be hugging the right side far away from those other guys
  </div>

</div>

The margin set on the last child will push all other children to the left as far as their styles will allow, and push itself as far right as any other styles will allow.

You can test this out by also adding margin-right: auto; to the last child, and you will see the last child centered perfectly in the remaining space of the parent div, after the first three children take up their allotted space. This is because the competing "margin autos" will both share equally whatever space remains, since they can't cancel each other out and won't override each other.

Flex box was designed to handle margin spacing like this, so take advantage of it, as well as the other unique spacing options available under the justify-content property.

Helpful article: https://hackernoon.com/flexbox-s-best-kept-secret-bd3d892826b6

like image 148
Ben Steward Avatar answered Oct 17 '22 16:10

Ben Steward


I believe you want to achieve something like this: enter image description here

You can implement this by nesting views which share the same justifyContent property.

  <View style={{
    flex: 1,
    flexDirection: 'column',
    justifyContent: 'space-between',
  }}>
    <View>
      <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
      <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} />
    </View>
    <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
  </View>
like image 31
db42 Avatar answered Oct 17 '22 17:10

db42