Como você pode flutuar: direto no React Native?


157

Eu tenho um elemento que eu quero flutuar direito, por exemplo

<View style={{width: 300}}>
  <Text style={{backgroundColor: "#DDD"}}>Hello</Text>
</View>

Como pode Textser flutuado / alinhado à direita? Além disso, por que Textocupam todo o espaço do View, em vez de apenas o espaço para "Olá"?


Gostaria de saber se você encontrou uma resposta, porque as três principais respostas dizem usar três atributos de estilo diferentes! justifyContent, alignItems, alignSelf. Eu me pergunto o que está correto.

Respostas:


275

por que o texto ocupa todo o espaço da tela, em vez de apenas o espaço para "Olá"?

Como o Viewcontainer é flexível e, por padrão, possui flexDirection: 'column'e alignItems: 'stretch', o que significa que seus filhos devem ser esticados para preencher sua largura.

(Observe que, de acordo com os documentos , todos os componentes do React Native são display: 'flex'por padrão e display: 'inline'nem sequer existem. Dessa forma, o comportamento padrão de a Textdentro de um Viewno React Native difere do comportamento padrão de spandentro de um divna Web; neste último caso, a extensão não preencheria a largura do divporque a spané um elemento embutido por padrão. Não existe esse conceito no React Native.)

Como o texto pode ser flutuado / alinhado à direita?

A floatpropriedade não existe no React Native, mas existem muitas opções disponíveis (com comportamentos ligeiramente diferentes) que permitem alinhar corretamente o texto. Aqui estão os que eu consigo pensar:

1. Use textAlign: 'right'no Textelemento

<View>
  <Text style={{textAlign: 'right'}}>Hello, World!</Text>
</View>

(Essa abordagem não altera o fato de que ela Textpreenche toda a largura da View; apenas alinha o texto com a direita Text.)

2. Use alignSelf: 'flex-end'noText

<View>
  <Text style={{alignSelf: 'flex-end'}}>Hello, World!</Text>
</View>

Isso reduz o Textelemento ao tamanho necessário para manter seu conteúdo e o coloca no final da direção da cruz (a direção horizontal, por padrão) do View.

3. Use alignItems: 'flex-end'noView

<View style={{alignItems: 'flex-end'}}>
  <Text>Hello, World!</Text>
</View>

Isso é equivalente à configuração alignSelf: 'flex-end'em todos os Viewfilhos.

4. Use flexDirection: 'row'e justifyContent: 'flex-end'noView

<View style={{flexDirection: 'row', justifyContent: 'flex-end'}}>
  <Text>Hello, World!</Text>
</View>

flexDirection: 'row'define a direção principal do layout como horizontal em vez de vertical; justifyContenté como alignItems, mas controla o alinhamento na direção principal, em vez da direção transversal.

5. Use flexDirection: 'row'no Viewe marginLeft: 'auto'noText

<View style={{flexDirection: 'row'}}>
  <Text style={{marginLeft: 'auto'}}>Hello, World!</Text>
</View>

Essa abordagem é demonstrada, no contexto da Web e do CSS real, em https://stackoverflow.com/a/34063808/1709587 .

6. Use position: 'absolute'e right: 0no Text:

<View>
  <Text style={{position: 'absolute', right: 0}}>Hello, World!</Text>
</View>

Como no CSS real, isso leva o Text"fora de fluxo", o que significa que seus irmãos poderão se sobrepor e sua posição vertical estará na parte superior da Viewpor padrão (embora você possa definir explicitamente uma distância da parte superior da Viewusando a toppropriedade style).


Naturalmente, qual dessas várias abordagens você deseja usar - e se a escolha entre elas importa mesmo - dependerá de suas circunstâncias precisas.


2
Nenhuma dessas soluções funciona. :( Meu objetivo era flutuar uma legenda e, em seguida, o texto vindo da esquerda o contornaria. Assim - stackoverflow.com/q/19179424/1828637 - Então, eu esperava fazer:. <Text><Text>FLOAT TEXT</Text>multi line text here which wraps around float textOu mesmo, mas com imagem como isto: <View><Text><Image />multi line text which wrap around float image</Text>.
Noitidart

Obrigado pela resposta @Mark Amery! Eu realmente gosto da quinta (quinta) abordagem, pois não gosto de definir uma constante para a altura do View / container, pois ela se dimensiona automaticamente.
Monero Jeanniton 19/10/19

O número 4 funcionou para mim. Suspeito que alguém que tenha problemas precise verificar como as exibições estão contidas, isso pode ter influência no layout flexível dos elementos filho.
Tahir Khalid

82

Você pode especificar diretamente o alinhamento do item, por exemplo:

textright: {    
  alignSelf: 'flex-end',  
},

3
@goodniceweb Você está confuso; lá estão há elementos inline em Reagir nativo. Os únicos displayvalores válidos são 'flex'e 'none'.
Mark Amery

34

Para mim, definir alignItemsum pai fez o truque, como:

var styles = StyleSheet.create({
  container: {
    alignItems: 'flex-end'
  }
});

20

Você não deve usar carros alegóricos no React Native. O React Native utiliza o flexbox para lidar com tudo isso.

No seu caso, você provavelmente desejará que o contêiner tenha um atributo

justifyContent: 'flex-end'

E sobre o texto ocupando todo o espaço, novamente, você precisa dar uma olhada no seu contêiner.

Aqui está um link para um ótimo guia sobre o flexbox: Um guia completo para o Flexbox


13
<View style={{ flex: 1, flexDirection: 'row', justifyContent: 'flex-end' }}>
  <Text>
  Some Text
  </Text>
</View>

flexDirection: Se você deseja mover horizontalmente (linha) ou verticalmente (coluna)

justifyContent: a direção que você deseja mover.


1
Um pouco enganador; justifyContentnão escolhe uma direção em si; oferece várias opções sobre como as coisas são posicionadas e espaçadas ao longo da principal direção flexível.
Mark Amery

0

Você pode flutuar: direito em reagir nativo usando flex:

 <View style={{flex: 1, flexDirection: 'row'}}>
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
</View>

para obter mais detalhes: https://facebook.github.io/react-native/docs/flexbox.html#flex-direction


1
Isso apenas repete uma abordagem que eu já havia publicado (é a opção 4 na minha resposta ) e não vejo nenhum valor agregado.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.