100% chiều rộng trong React Native Flexbox


203

Tôi đã đọc một số hướng dẫn flexbox, nhưng tôi vẫn không thể thực hiện tác vụ đơn giản này để làm việc.

Làm thế nào tôi có thể làm cho hộp màu đỏ đến chiều rộng 100%?

nhập mô tả hình ảnh ở đây

Mã số:

  <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>

Phong cách:

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,
},

Cảm ơn bạn!

Cập nhật 1: Gợi ý của Nishanth Shankar, thêm flex: 1 cho trình bao bọc, flexDirection: 'row'

Đầu ra:

nhập mô tả hình ảnh ở đây

Mã số:

  <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,
  },

Câu trả lời:


414

Chỉ cần thêm alignSelf: "stretch"vào biểu định kiểu của mục của bạn.

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

9
Liên kết bị hỏng.
Lukas Knuth

2
Khi sử dụng alignSelf, tôi gặp vấn đề với Android - Tôi có một Hình ảnh với vị trí 'tuyệt đối' và trong trường hợp này, ngay cả khi sử dụng 'độ căng', hộp như vậy được đệm vào cạnh của các thành phần có trong. Dimensions.get ('window'). Chiều rộng hoạt động cả trên iOS và Android trong trường hợp của tôi.
st_bk

Cách này giúp giải quyết tất cả các vấn đề 'toàn chiều rộng' của tôi, kiểm tra xem: snack.expo.io/S1PWQqkcZ
webdevinci

1
Có vẻ như width: "100%"cũng nên làm việc nhưng nó không. Tôi nghĩ rằng tôi không hiểu khi alignSelf: "stretch"làm việc so với width: "100%". @Corentin có ý kiến ​​gì không? Cám ơn!
Joel

4
@st_bk là một vị cứu tinh ở đó! Tuy nhiên, tôi đã tìm thấy một giải pháp tốt hơn cho sự kiện mà bạn hoàn toàn định vị và cần kéo dài:position: absolute, top: 0, bottom: 0, left: 0, right: 0
lance.dolan

119

Bạn nên sử dụng Kích thước

Đầu tiên, xác định kích thước.

import { Dimensions } from "react-native";

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

Sau đó, thay đổi line1phong cách như dưới đây:

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

3
Melx Mucuk! alignSelf: "kéo dài" được đề xuất bởi Corentin S. là cách dễ nhất và đơn giản nên tôi chấp nhận câu trả lời đó. Tuy nhiên, việc có Kích thước dẫn tôi đến một cách mới để chơi xung quanh bố cục. Trong một số trường hợp, chúng tôi có thể điều chỉnh các mục theo chương trình, cảm ơn bạn!
franfran

1
@Melih Tôi thấy chiều rộng được trả về là sai trên thiết bị Android của tôi. Chiều rộng bên phải phải là 720px, nhưng trả về 360px.
hòa bình

4
@peacepassion, bạn có 360, vì dpi thiết bị của bạn được chia tỷ lệ gấp 2 lần. Hãy thử Dimensions.get('window').scale- điều này sẽ trả lại 2 trong trường hợp của bạn.
mat Jerusalem

Cảm ơn câu trả lời của bạn, tôi đang xử lý một container có nền và đề xuất của bạn hoàn toàn phù hợp.
Clarenswd 22/03/2016

6
Điều này sẽ không hoạt động khi thiết bị được xoay. Tốt hơn là sử dụng bố trí thích ứng.
laynemoseley

26

Đã chỉnh sửa:

Để chỉ uốn cong văn bản trung tâm, có thể thực hiện một cách tiếp cận khác - Hủy bỏ các chế độ xem khác.

  • Đặt flexDirection vẫn ở 'cột'
  • loại bỏ alignItems : 'center'khỏi container
  • thêm alignSelf:'center'vào các bài phỏng vấn mà bạn không muốn uốn cong

Bạn có thể bọc thành phần Văn bản trong thành phần Xem và cung cấp cho Chế độ xem 1.

Các flex sẽ cung cấp cho:

100% chiều rộng nếu flexDirection:'row' trong style.container

100% chiều cao nếu flexDirection:'column'trong style.container


có, tôi đã cố gắng đặt flexDirection: 'row' và flex: 1 để chiều rộng đạt 100%. Tuy nhiên, các thành phần là tất cả nội tuyến và không thể đi đến dòng tiếp theo. ngay cả tôi đã sử dụng flexWrap: 'quấn'
franfran

Bất kỳ may mắn với phương pháp mới franfran?
Nishanth Shankar

alignSelf: 'căng' được đề xuất bởi Corentin S. hoạt động.
franfran

8

Ở đây bạn đi:

Chỉ cần thay đổi kiểu line1 theo bên dưới:

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

6

Sử dụng javascript để có chiều rộng và chiều cao và thêm chúng theo kiểu Xem. Để có được chiều rộng và chiều cao đầy đủ, hãy sử dụng 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
    }
}

và sau đó,

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

Ồ, tôi thích cái này Có thể không phải là giải pháp tốt nhất nhưng nó đã giải quyết vấn đề của tôi. Chưa kể rằng đó là một chức năng khá gọn gàng nói chung.
Kevin sterkilde

5

Đầu tiên thêm thành phần Dimension:

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

Biến xác định thứ hai:

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

Thứ ba đặt nó trong biểu định kiểu của bạn:

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

Trên thực tế trong ví dụ này tôi muốn tạo chế độ xem phản hồi và chỉ muốn xem 0,25 lượt xem màn hình nên tôi đã nhân nó với 0,25, nếu bạn muốn 100% màn hình không nhân nó với bất kỳ điều gì như thế này:

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

2

Lưu ý: Cố gắng hiểu đầy đủ về khái niệm flex.

       <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

chỉ cần loại bỏ alignItems: 'center'trong các kiểu container và thêm textAlign: "center"vàoline1 kiểu như được đưa ra dưới đây.

Nó sẽ hoạt động tốt

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

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

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

thử cái này:

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
  }
}

Vui lòng cung cấp một câu trả lời thích hợp cho câu hỏi. Không cung cấp một liên kết mà không giải thích trước về nó.
Akaisteph7

-1

width: '100%'alignSelf: 'stretch'đã không làm việc cho tôi. Dimensionskhông đặt ra nhiệm vụ của tôi vì tôi cần phải hoạt động trên một cái nhìn sâu sắc. Đây là những gì làm việc cho tôi, nếu tôi viết lại mã của bạn. Tôi chỉ cần thêm một số thuộc tính Viewvà sử dụng flexđể đạt được bố cục cần thiết:

  {/* 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.