ความกว้าง 100% ใน React Native Flexbox


203

ฉันได้อ่านการสอน flexbox หลายครั้งแล้ว แต่ฉันยังไม่สามารถทำงานง่าย ๆ นี้ได้

ฉันจะทำให้กล่องสีแดงกว้างถึง 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 สำหรับ wrapper, flexDirection: 'row'

เอาท์พุท:

ป้อนคำอธิบายรูปภาพที่นี่

รหัส:

  <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
ลิงก์เสีย
Lukas Knuth

2
เมื่อใช้ alignSelf stretch ฉันมีปัญหากับ Android - ฉันมีรูปภาพที่มีตำแหน่ง 'แน่นอน' และในกรณีนี้แม้ใช้ 'stretch' กล่องดังกล่าวจะมีขนาดพอดีกับขอบขององค์ประกอบภายใน Dimensions.get ('หน้าต่าง') ทำงานได้ทั้งบน iOS และ Android ในกรณีของฉัน
st_bk

วิธีนี้แก้ไขปัญหา 'ความกว้างทั้งหมด' ของฉันลองดูได้ที่: อาหารว่าง.expo.io/S1PWQqkcZ
webdevinci

1
ดูเหมือนว่าwidth: "100%"ควรจะใช้งานได้ แต่ไม่ได้ผล ฉันคิดว่าฉันไม่เข้าใจเมื่อalignSelf: "stretch"ทำงาน width: "100%"VS @Corentin ความคิดใด ๆ ขอบคุณ!
Joel

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
ขอบคุณ Melih Mucuk! alignSelf: "stretch" ที่ Corentin S. แนะนำนั้นเป็นวิธีที่ง่ายและง่ายที่สุดดังนั้นฉันจึงยอมรับคำตอบนั้น อย่างไรก็ตามการมี Dimensions ทำให้ฉันเป็นวิธีใหม่ในการเล่นเลย์เอาต์ ในบางกรณีเราสามารถปรับรายการโดยทางโปรแกรมขอขอบคุณ!
franfran

1
@Melih ฉันพบว่าความกว้างที่ส่งคืนนั้นไม่ถูกต้องบนอุปกรณ์ Android ของฉัน ความกว้างที่เหมาะสมควรเป็น 720px แต่ส่งกลับได้ 360px
สงบสุข

4
@peacepassion คุณมี 360 เนื่องจาก dpi ของอุปกรณ์ของคุณถูกย่อขนาด 2x ลองDimensions.get('window').scale- นี่ควรกลับ 2 ในกรณีของคุณ
กรุงเยรูซาเล็ม

ขอบคุณสำหรับคำตอบของคุณฉันกำลังติดต่อกับคอนเทนเนอร์ที่มีพื้นหลังและคำแนะนำของคุณเหมาะสมอย่างสมบูรณ์แบบ
clarenswd

7
สิ่งนี้จะไม่ทำงานเมื่ออุปกรณ์หมุน มันเป็นการดีกว่าที่จะใช้รูปแบบการปรับตัว
laynemoseley

26

editted:

เพื่อที่จะงอเฉพาะข้อความกลางคุณสามารถใช้วิธีการที่แตกต่าง - ย่อมุมมองอื่น

  • ให้ flexDirection คงที่ 'คอลัมน์'
  • ลบออกalignItems : 'center'จากภาชนะ
  • เพิ่ม alignSelf:'center'ใน textviews ที่คุณไม่ต้องการดิ้น

คุณสามารถล้อมองค์ประกอบข้อความในองค์ประกอบมุมมองและให้มุมมองที่ยืดหยุ่น 1

ความยืดหยุ่นจะให้:

ความกว้าง 100% ถ้า flexDirection:'row'อยู่ใน styles.container

ความสูง 100% ถ้าflexDirection:'column'อยู่ใน styles.container


ใช่ฉันพยายามตั้งค่า flexDirection: 'row' และ flex: 1 เพื่อให้ความกว้างไปถึง 100% อย่างไรก็ตามส่วนประกอบทั้งหมดเป็นแบบอินไลน์และไม่สามารถไปที่บรรทัดถัดไปได้ แม้ฉันใช้ flexWrap: 'wrap'
franfran

มีโชคกับวิธีการใหม่ franfran หรือไม่?
Nishanth Shankar

alignSelf: 'ยืด' แนะนำโดย Corentin S. ทำงาน
franfran

8

ไปเลย:

เพียงเปลี่ยนสไตล์ line1 ตามด้านล่าง:

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

6

ใช้จาวาสคริปต์เพื่อรับความกว้างและความสูงและเพิ่มในสไตล์ของมุมมอง ในการรับความกว้างและความสูงแบบเต็มให้ใช้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()]}>

โอ้ฉันชอบสิ่งนี้ อาจไม่ใช่ทางออกที่ดีที่สุด แต่ก็แก้ปัญหาของฉันได้ ไม่ต้องพูดถึงว่ามันเป็นฟังก์ชั่นที่ค่อนข้างดี
Kevin Østerkilde

5

เพิ่มองค์ประกอบมิติแรก:

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ไม่ตรงกับงานของฉันเพราะฉันต้องทำงานในมุมมองที่ซ้อนกันอย่างลึกล้ำ นี่คือสิ่งที่ใช้ได้กับฉันถ้าฉันเขียนรหัสของคุณใหม่ ฉันเพิ่งเพิ่มคุณสมบัติเพิ่มเติมViewและใช้งานบางส่วน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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.