React Native định vị tuyệt đối trung tâm ngang


92

Có vẻ như với position:absoluteviệc sử dụng một phần tử không thể được căn giữa bằng cách sử dụng justifyContenthoặc alignItems. Có một giải pháp để sử dụng marginLeftnhưng không hiển thị giống nhau cho tất cả các thiết bị, ngay cả khi sử dụng kích thước để phát hiện chiều cao và chiều rộng của thiết bị.

  bottom: {
    position: 'absolute',
    justifyContent: 'center',
    alignItems: 'center',
    top: height*0.93,
    marginLeft: width*0.18,
  },
  bottomNav: {
    flexDirection: 'row',
  },

Phần tử của bạn có chiều rộng tĩnh hay động?
Ivan Chernykh

Câu trả lời:


250

Đặt con bạn muốn làm trung tâm trong một Chế độ xem và đặt Chế độ xem tuyệt đối.

<View style={{position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, justifyContent: 'center', alignItems: 'center'}}>
  <Text>Centered text</Text>
</View>

28
Rất hữu dụng. Có một shortcut tốt đẹp cho những params phong cách treo tắt của StyleSheetđối tượng: ...StyleSheet.absoluteFillObject. xem github.com/facebook/react-native/blob/master/Libraries/…
wkw Ngày

2
Điều này không làm Viewchiếm TẤT CẢ không gian có thể nhấp trên màn hình? Ví dụ: nếu tôi có một thành phần bên dưới vị trí tuyệt đối này View, tôi sẽ không thể đăng ký các nhấp chuột vào nó.
James111

10
@ James111 Có vẻ như bạn có thể thêm pointerEvents='box-none'để vượt qua các lần chạm qua chế độ xem: github.com/facebook/react-native/issues/12360
Stephen Horvath

Phương pháp này phục hồi toàn bộ hình ảnh nếu văn bản có màu nền: /
DevMultiTech

@codewise vâng, có một cách mới để làm điều đó, hãy kiểm tra câu trả lời của tôi
David Noreña

73

Nếu bạn muốn căn giữa một phần tử, bạn có thể sử dụng alignSelf :

logoImg: {
    position: 'absolute',
    alignSelf: 'center',
    bottom: '-5%'
}

Đây là một ví dụ (Lưu ý biểu tượng cha là một dạng xem có vị trí: tương đối )

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


1
alignSelf đã không làm việc cho tôi (nó không làm gì, trên thực tế). Bạn có thể thêm một chút ngữ cảnh vào mã không?
johnny kehr

1
Bạn cần cha mẹ hiển thị: 'flex' @ wilc0
Travis Delly

12

Bạn có thể căn giữa các mục tuyệt đối bằng cách cung cấp thuộc tính bên trái với chiều rộng của thiết bị chia cho hai và trừ đi một nửa chiều rộng của phần tử bạn muốn căn giữa.

Ví dụ: phong cách của bạn có thể trông giống như thế này.

bottom: {
    position: 'absolute',
    left: (Dimensions.get('window').width / 2) - 25,
    top: height*0.93,
}

này chỉ hoạt động nếu bạn biết các yếu tố chiều rộng trước
Adamski

1
Nếu bạn không biết phần tử không có chiều rộng đã biết, bạn có thể sử dụng onLayout để lấy chiều rộng phần tử measure(layout) { const { width } = layout; this.setState({ width: width }) } ... <View onLayout={(event) => { this.measure(event.nativeEvent.layout) }} ...
Corey

5

tạo ra một toàn chiều rộng Viewvới alignItems: "center"trẻ em sau đó chèn mong muốn bên trong.

import React from "react";
import {View} from "react-native";

export default class AbsoluteComponent extends React.Component {
  render(){
    return(
     <View style={{position: "absolute", left: 0, right: 0, alignItems: "center"}}>
      {this.props.children}
     </View>    
    )
  }
}

bạn có thể thêm các thuộc tính như bottom: 30cho thành phần được căn chỉnh dưới cùng.


2
<View style={{...StyleSheet.absoluteFillObject, justifyContent: 'center', alignItems: 'center'}}>
  <Text>CENTERD TEXT</Text>
</View>

Và thêm cái này

import {StyleSheet} from 'react-native';

Các câu trả lời ngắn gọn, chỉ có mã thường bị đánh giá cao trên Stack Overflow. Để tránh bị gắn cờ là 'chất lượng thấp', hãy cân nhắc thêm một số văn bản giải thích.
Adrian Mole

1

Bạn có thể thử mã

<View
    style={{
      alignItems: 'center',
      justifyContent: 'center'
    }}
  >
    <View
      style={{
        position: 'absolute',
        margin: 'auto',
        width: 50,
        height: 50
      }}
    />
  </View>

Haha. Điều này đang hoạt động đối với tôi, Tuy nhiên, chúng tôi cần thêm `style = {{alignItems: 'center', justifyContent: 'center', flexDirection: 'row'}} '
babie

1

Nó thực sự rất đơn giản. Sử dụng phần trăm cho widthleftthuộc tính. Ví dụ:

logo : {
  position: 'absolute',
  top : 50,
  left: '30%',
  zIndex: 1,
  width: '40%',
  height: 150,
}

widthlà gì , leftbằng(100% - width)/2

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.