100% ширина в React Native Flexbox


203

Я вже прочитав декілька навчальних посібників з флешбоксу, але все ще не можу змусити цю просту задачу працювати.

Як я можу зробити червоне поле на 100% ширини?

введіть тут опис зображення

Код:

  <View style={styles.container}>
    <Text style={styles.welcome}>
      Welcome to React Natives
    </Text>
    <Text style={styles.line1}>
      line1
    </Text>
    <Text style={styles.instructions}>
      Press Cmd+R to reload,{'\n'}
      Cmd+D or shake for dev menu
    </Text>
  </View>

стиль:

container: {
  flex: 1,
  justifyContent: 'center',
  alignItems: 'center',
  backgroundColor: '#F5FCFF',
  borderWidth: 1,
  flexDirection: 'column',
},
welcome: {
  fontSize: 20,
  textAlign: 'center',
  margin: 10,
  borderWidth: 1,
},
line1: {
    backgroundColor: '#FDD7E4',
},
instructions: {
  textAlign: 'center',
  color: '#333333',
  marginBottom: 5,
  borderWidth: 1,
},

Дякую!

Оновлення 1: Пропозиція Nishanth Shankar, додавши flex: 1 для обгортки, flexDirection: 'рядок'

Вихід:

введіть тут опис зображення

Код:

  <View style={styles.container}>
    <View style={{flex:1}}>
      <Text style={styles.welcome}>
        Welcome to React Natives
      </Text>
    </View>
    <View style={{flex:1}}>
      <Text style={styles.line1}>
        line1
      </Text>
    </View>
    <View style={{flex:1}}>
      <Text style={styles.instructions}>
        Press Cmd+R to reload,{'\n'}
        Cmd+D or shake for dev menu
      </Text>
    </View>
  </View>

  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
    borderWidth: 1,
    flexDirection: 'row',
    flexWrap: 'wrap',
  },
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
    borderWidth: 1,
  },
  line1: {
      backgroundColor: '#FDD7E4',
  },
  instructions: {
    textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
    borderWidth: 1,
  },

Відповіді:


414

Просто додайте alignSelf: "stretch"до таблиці стилів вашого елемента.

line1: {
    backgroundColor: '#FDD7E4',
    alignSelf: 'stretch',
    textAlign: 'center',
},

9
Посилання розірвано.
Лукаш Кнут

2
Використовуючи alignSelf stretch, у мене виникла проблема з Android - у мене було зображення з "абсолютним" положенням, і в цьому випадку, навіть використовуючи "stretch", таке поле стає застелене до краю елементів, що містяться всередині. Dimensions.get ("вікно"). Ширина працювала як на iOS, так і на Android в моєму випадку.
st_bk

Це один спосіб вирішив усі мої проблеми "на повну ширину", перевірте це: snack.expo.io/S1PWQqkcZ
webdevinci

1
Здається, так само width: "100%"має працювати, але це не так. Я думаю, я не розумію, коли alignSelf: "stretch"працює проти width: "100%". @Corentin якісь ідеї? Дякую!
Джоель

4
@st_bk там був рятувальником життя! Однак я знайшов краще рішення для події, в якій ви абсолютно позиціонуєтесь і вам потрібно розтягнутись:position: absolute, top: 0, bottom: 0, left: 0, right: 0
lance.dolan

119

Ви повинні використовувати параметри

Спочатку визначте параметри.

import { Dimensions } from "react-native";

var width = Dimensions.get('window').width; //full width
var height = Dimensions.get('window').height; //full height

потім змініть line1стиль, як показано нижче:

line1: {
    backgroundColor: '#FDD7E4',
    width: width,
},

3
THX Меліх Мукук! alignSelf: "розтягнутий", запропонований Corentin S., є найпростішим і простим, тому я прийняв цю відповідь. Однак наявність "Параметри" приводить мене до нового способу грати навколо макета. У деяких випадках ми могли б коригувати елементи програмно, дякую!
франфран

1
@Melih Я вважаю, що ширина повертається неправильно на моєму пристрої Android. Права ширина повинна бути 720px, але 360px повертається.
миролюбність

4
@peacepassion, у вас 360, тому що ваш dpi на пристрої масштабується в 2 рази. Спробуйте Dimensions.get('window').scale- це має повернути 2 у вашому випадку.
матусалем

Дякую за вашу відповідь, я маю справу з контейнером з фоном, і ваша пропозиція ідеально підходить.
clarenswd

7
Це не спрацює при поверненні пристрою. Краще використовувати адаптивний макет.
лайнемоселей

26

Відредаговано:

Для згинання лише центрального тексту можна застосувати інший підхід - Розгорніть інші погляди.

  • Нехай flexDirection залишається у "стовпці"
  • вийміть alignItems : 'center'контейнер з контейнера
  • додайте alignSelf:'center'до текстових переглядів, які ви не хочете згинати

Ви можете обернути компонент Text у компонент View і надати View перегляд 1.

Згинання дасть:

100% ширина, якщо flexDirection:'row'в стилях.контейнер

100% висота, якщо flexDirection:'column'в стилях.контейнер


так, я спробував встановити flexDirection: 'рядок' і flex: 1, щоб ширина перейшла на 100%. Однак всі компоненти вбудовані і не можуть перейти до наступного рядка. навіть я використовував flexWrap: 'wrap'
франфран

якась удача з новим методом франфран?
Нішант Шанкар

alignSelf: 'stretch', запропонований Корентіном С., працює.
франфран

8

Ось вам:

Просто змініть стиль line1, як зазначено нижче:

line1: {
    backgroundColor: '#FDD7E4',
    width:'100%',
    alignSelf:'center'
}

6

Використовуйте javascript для отримання ширини та висоти та додайте їх у стилі View. Щоб отримати повну ширину та висоту, використовуйте Dimensions.get('window').width https://facebook.github.io/react-native/docs/dimensions.html

getSize() {
    return {
        width: Dimensions.get('window').width, 
        height: Dimensions.get('window').height
    }
}

і потім,

<View style={[styles.overlay, this.getSize()]}>

Ой, мені це подобається. Можливо, не найкраще рішення, але це вирішило мою проблему. Не кажучи вже про те, що це взагалі досить акуратна функція.
Кевін Østerkilde

5

Спочатку додайте компонент Dimension:

import { AppRegistry, Text, View,Dimensions } from 'react-native';

Друге визначення змінних:

var height = Dimensions.get('window').height;
var width = Dimensions.get('window').width;

По-третє, помістіть його у свій таблицю стилів:

textOutputView: {
    flexDirection:'row',
    paddingTop:20,
    borderWidth:1,
    borderColor:'red',
    height:height*0.25,
    backgroundColor:'darkgrey',
    justifyContent:'flex-end'
}

Насправді в цьому прикладі я хотів зробити чуйний вигляд і хотів переглянути лише 0,25 екрана, тому я помножив його на 0,25, якщо ви хочете, щоб 100% екрана не помножували його ні на що подібне:

textOutputView: {
    flexDirection:'row',
    paddingTop:20,
    borderWidth:1,
    borderColor:'red',
    height:height,
    backgroundColor:'darkgrey',
    justifyContent:'flex-end'
}

2

Помічено: Постарайтеся повністю зрозуміти концепцію флексу.

       <View style={{
          flex: 2,
          justifyContent: 'center',
          alignItems: 'center'
        }}>
          <View style ={{
              flex: 1,
              alignItems: 'center, 
              height: 50, 
              borderWidth: 1, 
              borderColor: '#000' 
          }}>
               <Text>Welcome to React Nativ</Text>
           </View>
           <View style={{
              flex: 1,
              alignItems: 'center,
              borderWidth: 1, 
              borderColor: 'red ', 
              height: 50
            }}
            >
              <Text> line 1 </Text>
            </View>
          <View style={{
            flex: 1,
            alignItems: 'center, 
            height: 50, 
            borderWidth: 1,                     
            borderColor: '#000'
          }}>
             <Text>
              Press Cmd+R to reload,{'\n'}
              Cmd+D or shake for dev menu
             </Text>
           </View>
       </View>

1

просто видаліть alignItems: 'center'стилі контейнера та додайте textAlign: "center"до line1стилю, як наведено нижче.

Це буде добре працювати

container: {
  flex: 1,
  justifyContent: 'center',
  backgroundColor: '#F5FCFF',
  borderWidth: 1,
}

line1: {
    backgroundColor: '#FDD7E4',
    textAlign:'center'
},

1
Style ={{width : "100%"}}

спробуйте це:

StyleSheet generated: {
  "width": "80%",
  "textAlign": "center",
  "marginTop": 21.8625,
  "fontWeight": "bold",
  "fontSize": 16,
  "color": "rgb(24, 24, 24)",
  "fontFamily": "Trajan Pro",
  "textShadowColor": "rgba(255, 255, 255, 0.2)",
  "textShadowOffset": {
    "width": 0,
    "height": 0.5
  }
}

Будь ласка, надайте належну відповідь на питання. Не надайте посилання без попереднього пояснення тут про що йдеться.
Akaisteph7

-1

width: '100%'і alignSelf: 'stretch'не працювали для мене. Dimensionsне відповідав моєму завданню, тому що мені потрібно було працювати над глибоко вкладеним видом. Ось що для мене спрацювало, якщо я перепишу ваш код. Я просто додав ще декілька Views і використав flexвластивості для досягнення потрібної верстки:

  {/* a column */}
  <View style={styles.container}>
    {/* some rows here */}
    <Text style={styles.welcome}>
      Welcome to React Natives
    </Text>
    {/* this row should take all available width */}
    <View style={{ flexDirection: 'row' }}>
      {/* flex 1 makes the view take all available width */}
      <View style={{ flex: 1 }}>
        <Text style={styles.line1}>
          line1
        </Text>
      </View>
      {/* I also had a button here, to the right of the text */}
    </View>
    {/* the rest of the rows */}
    <Text style={styles.instructions}>
      Press Cmd+R to reload,{'\n'}
      Cmd+D or shake for dev menu
    </Text>
  </View>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.