React Native Styling - ParkEunwoo/seoul-smart-app GitHub Wiki

React Native Styling

์‹œ์ž‘ํ•˜๊ธฐ

React Native์—์„œ css๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ StyleSheet๋ฅผ importํ•ด์•ผํ•œ๋‹ค. ์Šคํƒ€์ผ์„ ์ ์šฉํ•ด์•ผํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ์ƒ๋‹จ์— import๋ฅผ ํ•ด์ค€๋‹ค.

import { StyleSheet } from 'react-native';

์ด์ œ style๋“ค์„ ํ•œ๊ณณ์— ๋ชจ์•„ ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. css์™€๋Š” ๋‹ค๋ฅธ ์ ์ด ์žˆ๋Š”๋ฐ ์ด๋Š” ๊ฐ์ฒด๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ธ๋‹ค.

css์™€ ์ฐจ์ด์ 

  1. ์†์„ฑ์˜ ์ด๋ฆ„์ด css๋Š” -๋กœ ๊ตฌ๋ถ„์ด ๋˜์–ด์žˆ๋Š”๋ฐ StyleSheet๋Š” camelCase๋กœ ์ง€์ •ํ•œ๋‹ค.
  2. ๊ฐ ์†์„ฑ๋ณ„ ๊ตฌ๋ถ„์ž๊ฐ€ css๋Š” ;์œผ๋กœ StyleSheet๋Š” ,๋กœ ๊ตฌ๋ถ„ํ•ด์ค€๋‹ค.
.container {
    border-radius: 20px;
}
container: {
    borderRadius: 20,
},
  1. shorthand๊ฐ€ ์ ์šฉ์ด ์•ˆ๋œ๋‹ค.
.container {
    border: 1px solid black; 
}
container: {
    borderWidth: 1,
    borderStyle: 'solid',
    borderColor: 'black',
}
  1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•๋Œ€๋กœ ๊ธ€์ž๋Š” string์œผ๋กœ ์ˆซ์ž๋Š” numberํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
  2. ํฌ๊ธฐ์˜ ๋‹จ์œ„๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ ค๋ฉด string์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ์— ์ ์šฉํ•˜๊ธฐ

css์—์„œ class๋ฅผ ์ง€์ •ํ•ด์ค€ ๊ฒƒ ์ฒ˜๋Ÿผ style์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋กœ return์œผ๋กœ html๊ณผ ๋น„์Šทํ•œ jsx๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ๊ทธ๊ณณ์—์„œ ์ ์šฉํ•ด์ค€๋‹ค.

export default function App(){
    return(
        <View style={{
            flex:1,
            justifyContent: 'center',
            alignItems: 'center'
        }}>
            <Text>์•ˆ๋…•ํ•˜์„ธ์š”</Text>
        </View>
    )
}

ํ•ด๋‹น ํƒœ๊ทธ์— style ์†์„ฑ์„ ๋ถ€์—ฌํ•œ๋‹ค. ๊ทธ ๊ฐ’์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด {}๋กœ ๊ฐ์‹ธ์ค€๋‹ค. ๊ทธ ํ›„ ์‹ค์ œ ๊ฐ’์ด ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ {}๋กœ ๊ฐ์‹ธ์ค€๋‹ค.

ํ•˜์ง€๋งŒ ์ €๋ ‡๊ฒŒ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด์ง€๊ณ  ๋ณด๊ธฐ ๋ถˆํŽธํ•œ ๋‹จ์ ์ด ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ style์„ ํ•œ๊ณณ์— ๋ชจ์•„ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•œ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜ ์„ ์–ธ ์œ—๋ถ€๋ถ„์— ์ž‘์„ฑํ•œ๋‹ค.

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
    },
});

export default App(){
    return (
        <View style={styles.container}>
            <Text>ใ…Žใ…‡ใ…Žใ…‡</Text>
        </View>
    )
}

์ ์šฉํ•˜๋Š” ๊ณณ์— ์•Œ๋งž๋Š” ์ด๋ฆ„์„ ์ง€์–ด์ฃผ์—ˆ์œผ๋ฉด ํ•œ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๊ธฐ๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ์Šคํƒ€์ผ์ ์šฉ์„ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šคํƒ€์ผ์„ ๋ฐฐ์—ด๋กœ ๋ฌถ์–ด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํฐํŠธ, ์ƒ‰์ƒ, ํฌ๊ธฐ

  1. ํฐํŠธ ์‚ฌ์šฉ๋ฒ• components/StyledText.js๋ฅผ importํ•ฉ๋‹ˆ๋‹ค. ์ด ์•ˆ์—๋Š” NanumGothic, NanumGothicBold, NanumGothicExtraBold๊ฐ€ ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ค‘ ์‚ฌ์šฉํ•  ํฐํŠธ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ ํ›„์—” Text์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉํ•˜์‹ค ๋•Œ์™€ ๋™์ผํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
import { NanumGothic, NanumGothicBold, NanumGothicExtraBold } from '../components/StyledText';

export default function App(){
    return (
        <View>
            <Text>์ผ๋ฐ˜ ๊ธ€์”จ</Text>
            <NanumGothic>๋‚˜๋ˆ”๊ณ ๋”• ์ ์šฉ ๊ธ€์”จ</NanumGothic>
        </View>
)}
  1. ์ƒ‰์ƒ ์‚ฌ์šฉ๋ฒ• constants/Colors.js์— ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ƒ‰์ƒ๋“ค์ด ์ €์žฅ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    • mainColor: '#0287cb'
    • tintColor: '#bfe1f2'
    • pauseColor: '#bd1138'
    • ongoingColor: '#7c192f' importํ•ด์„œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
import Colors from '../../constants/Colors';

const styles = StyleSheet.create({
    button: {
        backgroundColor: Colors.mainColor,
    }
})
  1. ํฌ๊ธฐ ์‚ฌ์šฉ๋ฒ• constants/Layout.js์— ํฐ์˜ ๊ฐ€๋กœ๊ธธ์ด์™€ ์„ธ๋กœ๊ธธ์ด๊ฐ€ ์ €์žฅ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. flex๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์—†์–ด ๋ถ€๋“์ดํ•˜๊ฒŒ width์™€ height๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•  ๊ฒฝ์šฐ ์‹ค์ œ ํฐ์˜ ๊ฐ€๋กœ๊ธธ์ด์—์„œ ๋น„์œจ์„ ๋งž์ถ”์–ด ์ ์šฉํ•ด์ฃผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. font๋Š” 16px์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žก์•„๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ํฐํŠธํฌ๊ธฐ๋‚˜ ์ˆซ์ž๊ฐ€ ์ง์ ‘ ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์—” ํœด๋Œ€ํฐ ๋ณ„๋กœ normalize๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.
import {width, height, font, normalize} from '../../constants/Layout';

const styles = StyleSheet.create({
    button: {
        width: width/3,
        height: height/10
    },
    text: {
        fontSize: normalize(font*2),
    }
})

์ด๋ฏธ์ง€

์ด๋ฏธ์ง€๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฏธ์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. assets/images์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ requireํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

import {Image} from 'react-native';

export default function App(){
    return(
        <Image source={require('./../assets/images/MainPage.png')} />
)} 

์ด๋ฏธ์ง€์˜ source์—๋Š” ์•ฑ ํด๋”์•ˆ์— ์ž์ฒด์ ์œผ๋กœ ์ด๋ฏธ ๊ฐ–๊ณ  ์žˆ๋Š” ์ด๋ฏธ์ง€๋‚˜ ์›น์ด๋‚˜ ์„œ๋ฒ„์— ์กด์žฌํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค. ์ด๋ฏธ ๊ฐ–๊ณ  ์žˆ๋Š” ์ด๋ฏธ์ง€๋Š” require('์œ„์น˜')๋ฅผ ํ†ตํ•ด ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์™ธ๋ถ€์˜ ์ด๋ฏธ์ง€๋Š” {uri:'์ฃผ์†Œ'}๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ์ง€๋Š” ๋ฐ˜๋“œ์‹œ ํฌ๊ธฐ ์†์„ฑ์„ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ ๋ฐ˜๋“œ์‹œ width์™€ ๊ฐ™์€ ์†์„ฑ์ด ์•„๋‹ˆ์–ด๋„ flex๋ฅผ ์ด์šฉํ•ด์„œ๋„ ์ ์šฉํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

Tip

๋ชจ๋“  ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ์žˆ๋‹ค. ์ด ํƒœ๊ทธ์˜ display ์†์„ฑ์˜ ๊ธฐ๋ณธ๊ฐ’์€ flex์ด๋‹ค. flexbox๋ฅผ ์ด์šฉํ•ด ํฌ๊ธฐ๋ฅผ ์ž˜ ์ง€์ •ํ•ด์ฃผ์—ˆ์œผ๋ฉด ํ•œ๋‹ค.

  1. ํฌ๊ธฐ๋Š” ์ ˆ๋Œ€ ์ˆ˜์น˜๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. width์™€ height์˜ ์‚ฌ์šฉ์„ ์ ˆ๋Œ€์ ์œผ๋กœ ์ž์ œํ•ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๋ฅผ 100%๋กœ ๋Š˜๋ฆฌ๊ณ  ์‹ถ๋‹ค๋ฉด flex(grow์ƒ๋žต)์†์„ฑ๊ณผ alignSelf์†์„ฑ์„ ์ด์šฉํ•ด๋ด…์‹œ๋‹ค.
  2. ํฌ๊ธฐ๊ฐ€ ๋งž๊ฒŒ ๋‚˜์˜ค๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์„ ๋•Œ borderWidth: 1์„ ์ถ”๊ฐ€ํ•ด์„œ ์–ด๋Š์ •๋„ ํฌ๊ธฐ์ธ์ง€ ์ง์ ‘ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค.
  3. ๋ ˆ์ด์•„์›ƒ์€ flex๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ณ  ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์˜ ํฌ๊ธฐ๋Š” margin๊ณผ padding์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด๋ฏธ์ง€์˜ ํฌ๊ธฐ์กฐ์ ˆ์€ resizeMode๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’์œผ๋กœ๋Š” contain ๋˜๋Š” cover๊ฐ€ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  5. ํฐํŠธ, ๋ฉ”์ธ ํ…Œ๋งˆ ์ƒ‰์ƒ, ํ™”๋ฉด์‚ฌ์ด์ฆˆ๋Š” components/StyledText.js, constants/Color.js, constants/Layout.js์— ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ ์šฉ์•ˆ๋˜์—ˆ์œผ๋‚˜ ์ ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ