Як можна плавати: прямо в React Native?


157

У мене є, наприклад, елемент, який я хочу плавати правильно

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

Як Textплаваючий / вирівняний праворуч? Крім того, чому він Textзаймає повний простір View, а не просто місце для "Привіт"?


Цікаво, чи ви знайшли відповідь, оскільки всі 3 найкращі відповіді говорять про використання 3 різних атрибутів стилю! justifyContent, alignItems, alignSelf. Цікаво, що правильно.

Відповіді:


278

чому текст займає повний простір Перегляду, а не просто місце для "Привіт"?

Оскільки Viewє ємним гнучким контейнером і за замовчуванням має, flexDirection: 'column'і alignItems: 'stretch'це означає, що його дітей слід розтягнути, щоб заповнити його ширину.

(Зауважте, згідно з документами , що всі компоненти в React Native display: 'flex'за замовчуванням є , а їх display: 'inline'взагалі не існує. Таким чином, поведінка за замовчуванням Textв a Viewв "React Native" відрізняється від поведінки за замовчуванням spanв мережі divв Інтернеті; в останньому випадку проміжок не заповнюватиме ширину, divтому що а spanє вбудованим елементом за замовчуванням. У React Native такого поняття немає.)

Як Текст можна плавати / вирівнювати праворуч?

floatВластивість не існує в React Native, але є навантаження варіантів , доступні для вас (з трохи різним поведінкою) , які дозволять вам право вирівняти текст. Ось які я можу придумати:

1. Використовуйте textAlign: 'right'на Textелементі

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

(Цей підхід не змінює факту, що Textзаповнює всю ширину Viewтексту; він просто вирівнює текст у праві Text.)

2. Використовуйте alignSelf: 'flex-end'наText

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

Це зменшує Textелемент на розмір, необхідний для утримання його вмісту, і ставить його в кінці напряму хреста (горизонтальний напрямок, за замовчуванням)View .

3. Використовуйте alignItems: 'flex-end'наView

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

Це еквівалентно встановленню alignSelf: 'flex-end'на всіView дітей.

4. Використовуйте flexDirection: 'row'і justifyContent: 'flex-end'наView

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

flexDirection: 'row'встановлює головний напрямок компонування горизонтальним замість вертикального; justifyContentтак само, якalignItems , але контролює вирівнювання в основному напрямку замість поперечного напрямку.

5. Використовуйте flexDirection: 'row'на Viewі marginLeft: 'auto'наText

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

Цей підхід продемонстровано в Інтернеті та реальній CSS за адресою https://stackoverflow.com/a/34063808/1709587 .

6. Використання position: 'absolute'і right: 0на Text:

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

Як і в реальному CSS, це сприймає Text"витік з потоку", тобто його побратими зможуть перекривати його, а його вертикальне положення буде за Viewверсією за замовчуванням (хоча ви можете чітко встановити відстань від вершини Viewвикористовуючи topвластивість стилю).


Природно, який з цих різних підходів ви хочете використовувати - і чи взагалі має значення вибір між ними - залежатиме від ваших точних обставин.


2
Жодне з цих рішень не працює. :( Моя мета полягала у надписі, і тоді текст, що прийшов зліва, обходив би її. Ось так - stackoverflow.com/q/19179424/1828637 - Так я сподівався зробити:. <Text><Text>FLOAT TEXT</Text>multi line text here which wraps around float textАбо те саме, але із зображенням, як це: <View><Text><Image />multi line text which wrap around float image</Text>.
Noitidart

Дякую за відповідь @Mark Amery! Мені дуже подобається п’ятий (5-й) підхід, оскільки мені не подобається встановлювати константу для висоти View / контейнера, оскільки він автоматично визначає розмір.
Монеро Жаннітон

№4 працював для мене частуванням. Я підозрюю, що хтось із проблем повинен перевірити, як містяться представлення даних, це може вплинути на гнучку компонування дочірніх елементів.
Тахір Халід

82

Ви можете безпосередньо вказати вирівнювання елемента, наприклад:

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

3
@goodniceweb Ви збентежені; там немає жодного інлайн елементів в React Адаптивне. Єдиними дійсними displayзначеннями є 'flex'і 'none'.
Марк Амері

34

Для мене налаштування alignItemsна батька зробило таке завдання, як:

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

20

Ви не повинні використовувати поплавці в React Native. React Native використовує Flexbox, щоб обробляти всі ці речі.

У вашому випадку, ймовірно, ви хочете, щоб контейнер мав атрибут

justifyContent: 'flex-end'

А щодо тексту, який займає весь простір, знову ж таки, вам потрібно поглянути на ваш контейнер.

Ось посилання на справді чудовий путівник по flexbox: Повне керівництво по Flexbox


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

flexDirection: Якщо ви хочете рухатись горизонтально (рядок) або вертикально (стовпець)

justifyContent: напрямок, який потрібно рухати.


1
Трохи оману; justifyContentне вибирає напрямок сам по собі; він пропонує безліч варіантів того, як речі розташовуються та розташовані вздовж основного напрямку гнучкості.
Марк Амері

0

Ви можете плавати: прямо у реагуванні на рідну, використовуючи 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>

для більш детальної інформації: https://facebook.github.io/react-native/docs/flexbox.html#flex-direction


1
Це просто повторює підхід, який я вже публікував (це варіант 4 у моїй відповіді ), і я не бачу додаткової вартості.
Марк Амері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.