嵌套文本,垂直对齐不起作用 - React Native
Nested Text, Vertical Align not working - React Native
好的,让我们简单点。我有两个 Text
组件,一个在另一个里面。第一个 Text
有 fontSize
个 60
,嵌套有 fontSize
个 20
。随着字体大小的变化,嵌套的 Text
基本对齐。我希望嵌套的 Text
与父对象垂直居中对齐。
代码
// @flow
import React, { Component } from 'react';
import { Text } from 'react-native';
type PropTypes = {}
export default class SampleVC extends Component<PropTypes> {
render() {
return (
<Text style={{ fontSize: 60 }}>
Big Text
<Text style={{ fontSize: 20 }}>Small Text</Text>
</Text>
);
}
}
当前输出
需要输出
我知道这是一个简单的场景,但作为 React Native 的新手,我无法理解。我在网上搜索过,但找不到任何有用的资源。
您可以将 Text 添加到 View。
<View style={{alignItems: 'center', justifyContent: 'center'}}>
<Text style={{ fontSize: 60, height:'100%' }}>Big Text</Text>
<Text style={{ fontSize: 20, height:'100%' }}>Small Text</Text>
</View>
您可以在视图中包裹嵌套文本,但嵌套视图必须具有宽度和高度。如果您对此约束没有任何问题,这是一个很好的解决方案。
<Text style={{ fontSize: 60 }}>
Big Text
<View style={{ height:40, width:100, justifyContent: 'center', alignItems: 'center' }}>
<Text style={{ fontSize: 20 }}>Small Text</Text>
</View>
</Text>
仅使用嵌套文本无法实现您正在尝试的效果。
唯一选项,使用视图来包装您的文本,例如,
<View style={{ flexDirection: 'row', alignItems: 'center' }} >
<Text style={{ fontSize: 60 }}>Big Text</Text>
<Text style={{ fontSize: 20 }}>Small Text</Text>
</View>
如果您想经常使用它,请为上面的内容创建您自己的自定义组件,
function CustomNextedText (props) {
return (
<View style={{ flexDirection: 'row', alignItems: 'center' }} >
<Text style={{ fontSize: 60 }}>{props.bigText}</Text>
<Text style={{ fontSize: 20 }}>{props.smallText}</Text>
</View>
);
}
像任何其他 react-native 组件一样在任何地方使用它,
<CustomNextedText bigText='Big Text' smallText='Small Text'/>
希望对您有所帮助。
< View style={{flexDirection:'column'}}>
<View style={{alignContent:'center'}}>
<Text style={{fontSize:60}}>{props.bigText}</Text>
</View>
<View style={{alignContent:'center'}} >
<Text style={{fontSize:20}}>{props.smallText}</Text>
</View>
< /View>
您还可以定义小文本 lineHeight
来匹配大文本:
render() {
return (
<Text style={{ fontSize: 60 }}>
Big Text
<Text style={{ fontSize: 20, lineHeight:60 }}>
Small Text
</Text>
</Text>
);
}
自 React-Native v0.63 起,您可以在 <Text/>
内呈现 <View/>
,而无需为视图提供明确的尺寸。 Release Notes
对于已接受的答案,如果您的大文本足够长以跨越多行,则小文本将垂直居中到整个大文本块,而不是特定行。
因此,这是使用新功能对@Ali S 的回答进行的更新。为了使嵌套文本垂直居中,高度仍然是必需的,因此它被设置为大文本的 fontSize。宽度可以省略,所以小文本的长度现在可以是动态的。
function BigSmallText(props) {
let bigFontSize = 40;
return (
<Text
style={{
fontSize: bigFontSize,
lineHeight: bigFontSize,
}}>
A very long sentence that spans multiple lines
<View
style={{
flexDirection: 'row',
alignItems: 'center',
height: bigFontSize,
}}>
<Text
style={{
fontSize: 14,
paddingLeft: 10,
}}>
SMALL TEXT
</Text>
<Text
style={{
fontSize: 6,
paddingLeft: 10,
}}>
TINY TEXT
</Text>
</View>
</Text>
);
}
这看起来很奇怪,但这似乎对我有用(使用@Ali SabziNezhad 的 )。它允许共享文本道具(如 color
)和对齐(在这种特殊情况下为 center
)
function Component() {
return (
<CenterText style={{color: 'red'}}>
Centered <Text style={{fontSize: 50}}>text</Text>
</CenterText>
);
}
export function CenterText({children, ...otherProps}: Text['props']) {
return (
<Text {...otherProps}>
<View
style={{flexDirection: 'row', alignItems: 'center'}}
children={children}
/>
</Text>
);
}
我们可以有一个更通用的对齐文本组件:
export function AlignedText({children, alignItems, ...otherProps}: AlignedTextProps) {
return (
<Text {...otherProps}>
<View
style={{flexDirection: 'row', alignItems: alignItems}}
children={children}
/>
</Text>
);
}
type Alignment = 'baseline' | 'center' | 'flex-end' | 'flex-start' | 'stretch';
type AlignedTextProps = Text['props'] & {alignItems: Alignment};
然后我们可以用它来定义CenterText
:
export function CenterText(props: TextProps) {
return <AlignedText alignItems='center' {...props} />;
}
或直接如:
function Component() {
return (
<AlignedText style={{color: 'red'}} alignItems='center'>
Centered <Text style={{fontSize: 50}}>text</Text>
</AlignedText>
);
}
好的,让我们简单点。我有两个 Text
组件,一个在另一个里面。第一个 Text
有 fontSize
个 60
,嵌套有 fontSize
个 20
。随着字体大小的变化,嵌套的 Text
基本对齐。我希望嵌套的 Text
与父对象垂直居中对齐。
代码
// @flow
import React, { Component } from 'react';
import { Text } from 'react-native';
type PropTypes = {}
export default class SampleVC extends Component<PropTypes> {
render() {
return (
<Text style={{ fontSize: 60 }}>
Big Text
<Text style={{ fontSize: 20 }}>Small Text</Text>
</Text>
);
}
}
当前输出
需要输出
我知道这是一个简单的场景,但作为 React Native 的新手,我无法理解。我在网上搜索过,但找不到任何有用的资源。
您可以将 Text 添加到 View。
<View style={{alignItems: 'center', justifyContent: 'center'}}>
<Text style={{ fontSize: 60, height:'100%' }}>Big Text</Text>
<Text style={{ fontSize: 20, height:'100%' }}>Small Text</Text>
</View>
您可以在视图中包裹嵌套文本,但嵌套视图必须具有宽度和高度。如果您对此约束没有任何问题,这是一个很好的解决方案。
<Text style={{ fontSize: 60 }}>
Big Text
<View style={{ height:40, width:100, justifyContent: 'center', alignItems: 'center' }}>
<Text style={{ fontSize: 20 }}>Small Text</Text>
</View>
</Text>
仅使用嵌套文本无法实现您正在尝试的效果。
唯一选项,使用视图来包装您的文本,例如,
<View style={{ flexDirection: 'row', alignItems: 'center' }} >
<Text style={{ fontSize: 60 }}>Big Text</Text>
<Text style={{ fontSize: 20 }}>Small Text</Text>
</View>
如果您想经常使用它,请为上面的内容创建您自己的自定义组件,
function CustomNextedText (props) {
return (
<View style={{ flexDirection: 'row', alignItems: 'center' }} >
<Text style={{ fontSize: 60 }}>{props.bigText}</Text>
<Text style={{ fontSize: 20 }}>{props.smallText}</Text>
</View>
);
}
像任何其他 react-native 组件一样在任何地方使用它,
<CustomNextedText bigText='Big Text' smallText='Small Text'/>
希望对您有所帮助。
< View style={{flexDirection:'column'}}>
<View style={{alignContent:'center'}}>
<Text style={{fontSize:60}}>{props.bigText}</Text>
</View>
<View style={{alignContent:'center'}} >
<Text style={{fontSize:20}}>{props.smallText}</Text>
</View>
< /View>
您还可以定义小文本 lineHeight
来匹配大文本:
render() {
return (
<Text style={{ fontSize: 60 }}>
Big Text
<Text style={{ fontSize: 20, lineHeight:60 }}>
Small Text
</Text>
</Text>
);
}
自 React-Native v0.63 起,您可以在 <Text/>
内呈现 <View/>
,而无需为视图提供明确的尺寸。 Release Notes
对于已接受的答案,如果您的大文本足够长以跨越多行,则小文本将垂直居中到整个大文本块,而不是特定行。
因此,这是使用新功能对@Ali S 的回答进行的更新。为了使嵌套文本垂直居中,高度仍然是必需的,因此它被设置为大文本的 fontSize。宽度可以省略,所以小文本的长度现在可以是动态的。
function BigSmallText(props) {
let bigFontSize = 40;
return (
<Text
style={{
fontSize: bigFontSize,
lineHeight: bigFontSize,
}}>
A very long sentence that spans multiple lines
<View
style={{
flexDirection: 'row',
alignItems: 'center',
height: bigFontSize,
}}>
<Text
style={{
fontSize: 14,
paddingLeft: 10,
}}>
SMALL TEXT
</Text>
<Text
style={{
fontSize: 6,
paddingLeft: 10,
}}>
TINY TEXT
</Text>
</View>
</Text>
);
}
这看起来很奇怪,但这似乎对我有用(使用@Ali SabziNezhad 的 color
)和对齐(在这种特殊情况下为 center
)
function Component() {
return (
<CenterText style={{color: 'red'}}>
Centered <Text style={{fontSize: 50}}>text</Text>
</CenterText>
);
}
export function CenterText({children, ...otherProps}: Text['props']) {
return (
<Text {...otherProps}>
<View
style={{flexDirection: 'row', alignItems: 'center'}}
children={children}
/>
</Text>
);
}
我们可以有一个更通用的对齐文本组件:
export function AlignedText({children, alignItems, ...otherProps}: AlignedTextProps) {
return (
<Text {...otherProps}>
<View
style={{flexDirection: 'row', alignItems: alignItems}}
children={children}
/>
</Text>
);
}
type Alignment = 'baseline' | 'center' | 'flex-end' | 'flex-start' | 'stretch';
type AlignedTextProps = Text['props'] & {alignItems: Alignment};
然后我们可以用它来定义CenterText
:
export function CenterText(props: TextProps) {
return <AlignedText alignItems='center' {...props} />;
}
或直接如:
function Component() {
return (
<AlignedText style={{color: 'red'}} alignItems='center'>
Centered <Text style={{fontSize: 50}}>text</Text>
</AlignedText>
);
}