Search
Duplicate

React Style

React Style

React ์—์„œ ์Šคํƒ€์ผ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

React ์—์„œ ์Šคํƒ€์ผ๋ง ํ•˜๋Š” ๋ฐฉ๋ฒ•

โ€ข
โ€ข
BootStrap
โ€ข
React-BootStrap

inline style

์ปดํฌ๋„ŒํŠธ์— style ์†์„ฑ์— ์ง์ ‘ ์Šคํƒ€์ผ ์†์„ฑ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฌธ๋ฒ•

<์ปดํฌ๋„ŒํŠธ style={ { ์†์„ฑ1 : '๊ฐ’1', ์†์„ฑ2: '๊ฐ’2' } } />
JavaScript
๋ณต์‚ฌ
์ปดํฌ๋„ŒํŠธ์˜ style ์†์„ฑ์„ ์ •์˜ํ•˜์—ฌ { } ํ‘œํ˜„์‹ ์•ˆ์—์„œ, { } ๊ฐ์ฒด์˜ ํ˜•ํƒœ๋กœ ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์Šคํƒ€์ผ ์†์„ฑ : ์ผ๋ฐ˜์ ์œผ๋กœ CSS ์Šคํƒ€์ผ ์‹œํŠธ์—์„œ๋Š” ์Šคํƒ€์ผ ์†์„ฑ์„ ์ผ€๋ฐฅ ์ผ€์ด์Šค(โ€style-propertyโ€) ๋กœ ์ง€์ •ํ•˜์ง€๋งŒ, React ์˜ ์Šคํƒ€์ผ ์†์„ฑ์€ ์นด๋ฉœ ์ผ€์ด์Šค(โ€stylePropertyโ€) ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
โ€ข
์Šคํƒ€์ผ ๊ฐ’ : โ€˜๊ฐ’โ€™ ๋˜๋Š” โ€œ๊ฐ’โ€ ๋”ฐ์˜ดํ‘œ๋กœ ๋ฌถ์–ด์„œ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ

์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด ๋ด…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ฒ„ํŠผ

Button.jsx
import React from 'react' const Button = () => { return ( <button style={{ backgroundColor: 'royalblue', color: 'white', fontWeight: 'bold', outline: 'none', border: 'none', margin: '0 2px', padding: '10px 24px', borderRadius: '6px', cursor: 'pointer', }}>Button</button> ) } export default Button
JavaScript
๋ณต์‚ฌ

์ปค์Šคํ…€ ๋ฒ„ํŠผ

CustomButton.jsx
import React from 'react' const CustomButton = ({ text, btnStyle, btnSize, onClick }) => { let color = 'white'; let backgroundColor = 'black'; let padding = '12px 24px'; let display = 'inline-block'; let fontSize = '14px'; let width = 'auto'; let margin = '0 4px'; switch (btnStyle) { case 'primary': backgroundColor = '#007BFF'; break; case 'secondary': backgroundColor = '#6C757D'; break; case 'success': backgroundColor = '#28A745'; break; case 'danger': backgroundColor = '#DC3545'; break; case 'warning': backgroundColor = '#FFC107'; color = 'black'; break; case 'info': backgroundColor = '#17A2B8'; break; case 'light': backgroundColor = '#F8F9FA'; color = 'black'; break; case 'dark': backgroundColor = '#343A40'; break; default: break; } switch (btnSize) { case 'xs': padding = '2px 8px'; fontSize = '10px'; break; case 'sm': padding = '6px 12px'; fontSize = '12px'; break; case 'md': padding = '12px 24px'; fontSize = '14px'; break; case 'lg': padding = '14px 32px'; fontSize = '16px'; break; case 'xl': padding = '18px 40px'; fontSize = '18px'; break; case 'block': padding = '18px 40px'; display = 'block'; width = '100%'; margin = '10px 6px'; fontSize = '20px'; break; default: break; } let style = { display : display, width: width, backgroundColor : backgroundColor, color : color, fontWeight: 'bold', outline: 'none', border: 'none', margin: margin, padding: padding, fontSize: fontSize, borderRadius: '6px', cursor: 'pointer', } return ( <button style={style} onClick={() => onClick()}>{text}</button> ) } export default CustomButton
JavaScript
๋ณต์‚ฌ

App.js

import './App.css'; import Button from './components/Button'; import CustomButton from './components/CustomButton'; function App() { const onClick = () => { alert('Clicked!') } return ( <div className='container'> <h1>inline style</h1> <hr/> <h2>๊ธฐ๋ณธ ๋ฒ„ํŠผ</h2> <Button /> <hr/> <h2>์ปค์Šคํ…€ ๋ฒ„ํŠผ</h2> <h2>xs</h2> <CustomButton text='primary' btnStyle='primary' btnSize='xs' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xs' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xs' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xs' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xs' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xs' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xs' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xs' onClick={onClick} /> <h2>sm</h2> <CustomButton text='primary' btnStyle='primary' btnSize='sm' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='sm' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='sm' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='sm' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='sm' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='sm' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='sm' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='sm' onClick={onClick} /> <h2>md</h2> <CustomButton text='primary' btnStyle='primary' btnSize='md' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='md' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='md' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='md' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='md' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='md' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='md' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='md' onClick={onClick} /> <h2>lg</h2> <CustomButton text='primary' btnStyle='primary' btnSize='lg' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='lg' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='lg' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='lg' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='lg' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='lg' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='lg' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='lg' onClick={onClick} /> <h2>xl</h2> <CustomButton text='primary' btnStyle='primary' btnSize='xl' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xl' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xl' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xl' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xl' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xl' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xl' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xl' onClick={onClick} /> <h2>block</h2> <CustomButton text='primary' btnStyle='primary' btnSize='block' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='block' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='block' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='block' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='block' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='block' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='block' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='block' onClick={onClick} /> </div> ); } export default App;
JavaScript
๋ณต์‚ฌ

import CSS

์™ธ๋ถ€์— ์Šคํƒ€์ผ ์‹œํŠธ(CSS) ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋ฌธ๋ฒ•

import './ํŒŒ์ผ๋ช….css';
JavaScript
๋ณต์‚ฌ
<์ปดํฌ๋„ŒํŠธ id="๊ณ ์œ ํ•œ์•„์ด๋””" className="ํด๋ž˜์Šค์ด๋ฆ„" />
JavaScript
๋ณต์‚ฌ

์˜ˆ์‹œ์ฝ”๋“œ

import CSS ์„ ์ ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด ๋ด…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ฒ„ํŠผ

Button.jsx
import React from 'react'; import './Button.css'; const Button = ({ id }) => { return ( <button id={id} className='btn'>Button</button> ) } export default Button
JavaScript
๋ณต์‚ฌ
Button.css
.btn { background-color: royalblue; color: white; font-weight: bold; outline: none; border: none; margin: 0 2px; padding: 10px 24px; border-radius: 6px; cursor: pointer; } #btn { background-color: red; color: white; font-weight: bold; outline: none; border: none; margin: 0 2px; padding: 10px 24px; border-radius: 6px; cursor: pointer; }
CSS
๋ณต์‚ฌ

์ปค์Šคํ…€ ๋ฒ„ํŠผ

CustomButton.jsx
import React from 'react' import './CustomButton.css' const CustomButton = ({ text, btnStyle, btnSize, onClick }) => { return ( <button className={`btn ${btnStyle} ${btnSize}`} onClick={() => onClick()}>{text}</button> ) } export default CustomButton
JavaScript
๋ณต์‚ฌ
CustomButton.css
.btn { display: inline-block; width: auto; background-color: black; color: white; font-weight: bold; outline: none; border: none; margin: 0 4px; padding: 12px 24px; font-size: 14px; border-radius: 6px; cursor: pointer; } .btn:hover { box-shadow: 2px 2px 2px rgba(0,0,0,0.5); filter: brightness(80%) contrast(100%) saturate(100%); } .btn:active { box-shadow: none; } .btn.xs { padding: 2px 8px; font-size: 10px; } .btn.sm { padding: 6px 12px; font-size: 12px; } .btn.md { padding: 12px 24px; font-size: 14px; } .btn.lg { padding: 14px 32px; font-size: 16px; } .btn.xl { padding: 18px 40px; font-size: 18px; } .btn.block { padding: 18px 40px; display: block; width: 100%; margin: 10px 6px; font-size: 20px; } /* Color variations */ .btn.primary { background-color: #007BFF; } .btn.secondary { background-color: #6C757D; } .btn.success { background-color: #28A745; } .btn.danger { background-color: #DC3545; } .btn.warning { background-color: #FFC107; color: black; } .btn.info { background-color: #17A2B8; } .btn.light { background-color: #F8F9FA; color: black; } .btn.dark { background-color: #343A40; }
CSS
๋ณต์‚ฌ

App.js

import './App.css'; import Button from './components/Button/Button'; import CustomButton from './components/CustomButton/CustomButton'; function App() { const onClick = () => { alert('Clicked!') } return ( <div className='container'> <h1>import css</h1> <hr/> <h2>๊ธฐ๋ณธ ๋ฒ„ํŠผ</h2> <Button /> <Button id='btn' /> <hr/> <h2>์ปค์Šคํ…€ ๋ฒ„ํŠผ</h2> <h2>xs</h2> <CustomButton text='primary' btnStyle='primary' btnSize='xs' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xs' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xs' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xs' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xs' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xs' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xs' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xs' onClick={onClick} /> <h2>sm</h2> <CustomButton text='primary' btnStyle='primary' btnSize='sm' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='sm' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='sm' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='sm' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='sm' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='sm' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='sm' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='sm' onClick={onClick} /> <h2>md</h2> <CustomButton text='primary' btnStyle='primary' btnSize='md' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='md' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='md' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='md' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='md' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='md' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='md' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='md' onClick={onClick} /> <h2>lg</h2> <CustomButton text='primary' btnStyle='primary' btnSize='lg' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='lg' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='lg' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='lg' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='lg' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='lg' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='lg' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='lg' onClick={onClick} /> <h2>xl</h2> <CustomButton text='primary' btnStyle='primary' btnSize='xl' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xl' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xl' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xl' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xl' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xl' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xl' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xl' onClick={onClick} /> <h2>block</h2> <CustomButton text='primary' btnStyle='primary' btnSize='block' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='block' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='block' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='block' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='block' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='block' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='block' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='block' onClick={onClick} /> </div> ); } export default App;
JavaScript
๋ณต์‚ฌ

์ฃผ์˜์‚ฌํ•ญ

์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ๋‹ค๋ฅธ CSS ๋ฅผ import ํ•˜๋”๋ผ๋„, ์Šคํƒ€์ผ์ด ์ „์—ญ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ฐœ๋ณ„์ ์ธ ์ปดํฌ๋„ŒํŠธ์—์„œ, ๊ฐ๊ฐ์˜ CSS import ํ•˜๋”๋ผ๊ณ  ์‹ค์ œ๋กœ๋Š” ํ•˜๋‚˜์˜ html ์— ๊ฐ๊ฐ์˜ <style> ์— ๋žœ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ import ํ•œ CSS ํŒŒ์ผ์ด ๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ €์„œ ์ ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Button.jsx ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ™์€ ๊ฒฝ๋กœ์˜ Button.css ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
CustomButton.jsx ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ™์€ ๊ฒฝ๋กœ์˜ CustomButton.css ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ, ๊ฐ ์ปดํฌ๋„ŒํŠธ์—์„œ import ํ•œ CSS ๋Š” index.html ํŒŒ์ผ์— <style> ํƒœ๊ทธ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ๋žœ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.
โ€ข
<style> : index.css
โ€ข
<style> : App.css
โ€ข
<style> : Button.css
โ€ข
<style> : CustomButton.css
์ด๋ ‡๊ฒŒ ๊ฐœ๋ณ„๋กœ import ํ•œ css ํŒŒ์ผ์ผ ํ•˜๋‚˜์˜ html ๋กœ ์ „์—ญ์—์„œ ์„ค์ •๋˜๋‹ค๋ณด๋‹ˆ, ๋‹ค๋ฅธ css ํŒŒ์ผ์—์„œ ์ง€์ •ํ•œ ์„ ํƒ์ž๊ฐ€ ๊ฐ™์œผ๋ฉด, ์Šคํƒ€์ผ๋ง ์ค‘๋ณต๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ์„œ๋Š”, Button.css ์—์„œ๋„ .btn ์„ ํƒ์ž๋ฅผ ์ง€์ •ํ•˜๊ณ , CustomButton.css ์—์„œ๋Š” .btn ์„ ํƒ์ž๋ฅผ ์ง€์ •ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ง€์ •ํ•  ๋•Œ๋Š”, ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์˜ CSS ๋ผ๋ฉด ๊ฐ™์€ ์ด๋ฆ„์˜ ์„ ํƒ์ž์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ, ์„ ํƒ์ž๊ฐ€ ์ค‘๋ณต๋˜๋”๋ผ๋„, ๊ฐ ์ปดํฌ๋„ŒํŠธ ๋ณ„๋กœ CSS ๋ฅผ ์ ์šฉ์‹œ์ผœ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜๋Š” ์—†์„๊นŒ์š”?
์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ CSS Module ์ž…๋‹ˆ๋‹ค.

import CSS Module

CSS๋ฅผ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ค€์—์„œ ์Šคํƒ€์ผ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ธฐ์ˆ 
CSS Module์€ ํด๋ž˜์Šค ์„ ํƒ์ž์— ๋Œ€ํ•œ ์ง€์—ญ ๋ฒ”์œ„๋กœ์˜ ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ปดํฌ๋„ŒํŠธ๋ณ„ ํด๋ž˜์Šค ์„ ํƒ์ž๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•จ
ํด๋ž˜์Šค ์„ ํƒ์ž๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์Šค์ฝ”ํ”„๊ฐ€ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. id๋‚˜ ํƒœ๊ทธ ์„ ํƒ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ์Šคํƒ€์ผ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ „์—ญ ์Šคํƒ€์ผ๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
1.
๊ณ ์œ ํ•œ ์Šค์ฝ”ํ”„: CSS Modules์€ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ง€์—ญ์ ์œผ๋กœ ์Šค์ฝ”ํ”„ํ™”ํ•˜์—ฌ ์ „์—ญ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ์˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ์€ ์ž์ฒด ๊ณ ์œ ํ•œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
2.
ํด๋ž˜์Šค ์ด๋ฆ„ ๋ณ€ํ™˜: CSS Modules์€ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ "camelCase"๋กœ ์ž‘์„ฑ๋œ ํด๋ž˜์Šค ์ด๋ฆ„์€ ํ•˜์ดํ”ˆ์„ ํฌํ•จํ•˜๋Š” "kebab-case"๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
3.
ํด๋ž˜์Šค ์ด๋ฆ„ ์‚ฌ์šฉ: JavaScript ์ฝ”๋“œ์—์„œ CSS Modules์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ•ด๋‹น ๋ชจ๋“ˆ์—์„œ ๋‚ด๋ณด๋‚ธ ํด๋ž˜์Šค๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ style ํƒœ๊ทธ์— ๋žœ๋”๋ง ๋  ๋•Œ, ๊ฐ CSS ๋ชจ๋“ˆ์—์„œ ์ง€์ •ํ•œ .btn ์„ ํƒ์ž๊ฐ€ ๊ณ ์œ ํ•œ ์ด๋ฆ„์œผ๋กœ ์ง€์ •๋˜์–ด์„œ ๋žœ๋”๋ง ๋ฉ๋‹ˆ๋‹ค.

๋ฌธ๋ฒ•

{ํŒŒ์ผ๋ช…}.module.css ํ˜•์‹์œผ๋กœ ํŒŒ์ผ ์ƒ์„ฑ
import styles from './ํŒŒ์ผ๋ช….module.css';
JavaScript
๋ณต์‚ฌ
<์ปดํฌ๋„ŒํŠธ className={styles.ํด๋ž˜์Šค์†์„ฑ} />
JavaScript
๋ณต์‚ฌ

๊ด€๋ก€

CSS module ์˜ ํด๋ž˜์Šค ์„ ํƒ์ž๋Š” ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ๊ด€๋ก€ (์ผ€๋ฐฅ ์ผ€์ด์Šค๋„ ๊ฐ€๋Šฅ)
์นด๋ฉœ์ผ€์ด์Šค : .formInput โžก { styles.formInput } ์ผ€๋ฐฅ์ผ€์ด์Šค : .form-input โžก { styles['form-input']}
JavaScript
๋ณต์‚ฌ

๊ธฐ๋ณธ ๋ฒ„ํŠผ

Button.jsx
import React from 'react'; // import './Button.css'; import styles from './Button.module.css'; const Button = ({ id }) => { return ( <button id={id} className={styles.btn}>Button</button> ) } export default Button
JavaScript
๋ณต์‚ฌ
Button.module.css
.btn { background-color: royalblue; color: white; font-weight: bold; outline: none; border: none; margin: 0 2px; padding: 10px 24px; border-radius: 6px; cursor: pointer; } #btn { background-color: red; color: white; font-weight: bold; outline: none; border: none; margin: 0 2px; padding: 10px 24px; border-radius: 6px; cursor: pointer; }
CSS
๋ณต์‚ฌ

์ปค์Šคํ…€ ๋ฒ„ํŠผ

CustomButton.jsx
import React from 'react' // import './CustomButton.css' import styles from './CustomButton.module.css'; const CustomButton = ({ text, btnStyle, btnSize, onClick }) => { return ( <button className={`${styles.btn} ${styles[btnStyle]} ${styles[btnSize]}`} onClick={() => onClick()}>{text}</button> ) } export default CustomButton
JavaScript
๋ณต์‚ฌ
CustomButton.module.css
.btn { display: inline-block; width: auto; background-color: black; color: white; font-weight: bold; outline: none; border: none; margin: 0 4px; padding: 12px 24px; font-size: 14px; border-radius: 6px; cursor: pointer; } .btn:hover { box-shadow: 2px 2px 2px rgba(0,0,0,0.5); filter: brightness(80%) contrast(100%) saturate(100%); } .btn:active { box-shadow: none; } .btn.xs { padding: 2px 8px; font-size: 10px; } .btn.sm { padding: 6px 12px; font-size: 12px; } .btn.md { padding: 12px 24px; font-size: 14px; } .btn.lg { padding: 14px 32px; font-size: 16px; } .btn.xl { padding: 18px 40px; font-size: 18px; } .btn.block { padding: 18px 40px; display: block; width: 100%; margin: 10px 6px; font-size: 20px; } /* Color variations */ .btn.primary { background-color: #007BFF; } .btn.secondary { background-color: #6C757D; } .btn.success { background-color: #28A745; } .btn.danger { background-color: #DC3545; } .btn.warning { background-color: #FFC107; color: black; } .btn.info { background-color: #17A2B8; } .btn.light { background-color: #F8F9FA; color: black; } .btn.dark { background-color: #343A40; }
CSS
๋ณต์‚ฌ

App.js

import './App.css'; import Button from './components/Button/Button'; import CustomButton from './components/CustomButton/CustomButton'; function App() { const onClick = () => { alert('Clicked!') } return ( <div className='container'> <h1>import css</h1> <hr/> <h2>๊ธฐ๋ณธ ๋ฒ„ํŠผ</h2> <Button /> <Button id='btn' /> <hr/> <h2>์ปค์Šคํ…€ ๋ฒ„ํŠผ</h2> <h2>xs</h2> <CustomButton text='primary' btnStyle='primary' btnSize='xs' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xs' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xs' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xs' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xs' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xs' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xs' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xs' onClick={onClick} /> <h2>sm</h2> <CustomButton text='primary' btnStyle='primary' btnSize='sm' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='sm' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='sm' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='sm' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='sm' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='sm' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='sm' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='sm' onClick={onClick} /> <h2>md</h2> <CustomButton text='primary' btnStyle='primary' btnSize='md' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='md' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='md' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='md' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='md' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='md' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='md' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='md' onClick={onClick} /> <h2>lg</h2> <CustomButton text='primary' btnStyle='primary' btnSize='lg' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='lg' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='lg' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='lg' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='lg' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='lg' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='lg' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='lg' onClick={onClick} /> <h2>xl</h2> <CustomButton text='primary' btnStyle='primary' btnSize='xl' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xl' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xl' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xl' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xl' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xl' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xl' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xl' onClick={onClick} /> <h2>block</h2> <CustomButton text='primary' btnStyle='primary' btnSize='block' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='block' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='block' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='block' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='block' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='block' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='block' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='block' onClick={onClick} /> </div> ); } export default App;
JavaScript
๋ณต์‚ฌ

styled-components

React ์—์„œ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์„ค์น˜

npm install styled-components
Shell
๋ณต์‚ฌ

๋ฌธ๋ฒ•

import styled from 'styled-components'; const ์ปดํฌ๋„ŒํŠธ๋ช… = styled.ํƒœ๊ทธ๋ช…` ์†์„ฑ1 : ๊ฐ’1; ์†์„ฑ2 : ๊ฐ’2; `;
JavaScript
๋ณต์‚ฌ
1.
styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ import ํ•ฉ๋‹ˆ๋‹ค.
2.
styled.ํƒœ๊ทธ๋ช… - ์‚ฌ์šฉํ•  ํƒœ๊ทธ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
3.
` ` ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ€์ผ ์†์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
a.
์†์„ฑ์€ ์ผ€๋ฐฅ ์ผ€์ด์Šค(โ€™style-propertyโ€™)๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
b.
๊ฐ’์€ ๋”ฐ์˜ดํ‘œ(โ€™โ€™) ์—†์ด ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ

styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด ๋ด…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ฒ„ํŠผ

Button.jsx
import React from 'react' import styled from 'styled-components'; // ๋ฒ„ํŠผ ์Šคํƒ€์ผ const buttonStyles = ` font-weight: bold; outline: none; border: none; margin: 0 2px; padding: 10px 24px; border-radius: 6px; cursor: pointer; `; // ์ผ๋ฐ˜ ๋ฒ„ํŠผ ์Šคํƒ€์ผ const standard = ` background-color: royalblue; color: white; `; // ID๊ฐ€ "btn"์ธ ๋ฒ„ํŠผ ์Šคํƒ€์ผ const unique = ` background-color: red; color: white; `; // ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ const StyledButton = styled.button` ${buttonStyles} ${props => props.id === 'btn' ? unique : standard} `; // Button ์ปดํฌ๋„ŒํŠธ const Button = ({ id }) => { return <StyledButton id={id}>Button</StyledButton>; } export default Button;
JavaScript
๋ณต์‚ฌ

์ปค์Šคํ…€ ๋ฒ„ํŠผ

CustomButton.jsx
import React from 'react'; import styled from 'styled-components'; const StyledButton = styled.button` display: ${props => props.display || 'inline-block'}; width: ${props => props.width || 'auto'}; background-color: ${props => props.backgroundColor || 'black'}; color: ${props => props.color || 'white'}; font-weight: bold; outline: none; border: none; margin: ${props => props.margin || '0 4px'}; padding: ${props => props.padding || '12px 24px'}; font-size: ${props => props.fontSize || '14px'}; border-radius: 6px; cursor: pointer; `; const CustomButton = ({ text, btnStyle, btnSize, onClick }) => { let backgroundColor = 'black'; let color = 'white'; let padding = '12px 24px'; let display = 'inline-block'; let fontSize = '14px'; let width = 'auto'; let margin = '0 4px'; switch (btnStyle) { case 'primary': backgroundColor = '#007BFF'; break; case 'secondary': backgroundColor = '#6C757D'; break; case 'success': backgroundColor = '#28A745';break; case 'danger': backgroundColor = '#DC3545'; break; case 'warning': backgroundColor = '#FFC107'; color = 'black'; break; case 'info': backgroundColor = '#17A2B8'; break; case 'light': backgroundColor = '#F8F9FA'; color = 'black'; break; case 'dark': backgroundColor = '#343A40'; break; default: break; } switch (btnSize) { case 'xs': padding = '2px 8px'; fontSize = '10px'; break; case 'sm': padding = '6px 12px'; fontSize = '12px'; break; case 'md': padding = '12px 24px'; fontSize = '14px'; break; case 'lg': padding = '14px 32px'; fontSize = '16px'; break; case 'xl': padding = '18px 40px'; fontSize = '18px'; break; case 'block': padding = '18px 40px'; display = 'block'; width = '100%'; margin = '10px 6px'; fontSize = '20px'; break; default: break; } return ( <StyledButton backgroundColor={backgroundColor} color={color} padding={padding} display={display} fontSize={fontSize} width={width} margin={margin} onClick={onClick} > {text} </StyledButton> ); }; export default CustomButton;
JavaScript
๋ณต์‚ฌ

App.js

import './App.css'; import Button from './components/Button'; import CustomButton from './components/CustomButton'; function App() { const onClick = () => { alert('Clicked!') } return ( <div className='container'> <h1>styled components</h1> <hr/> <h2>๊ธฐ๋ณธ ๋ฒ„ํŠผ</h2> <Button /> <Button id='btn' /> <hr/> <h2>์ปค์Šคํ…€ ๋ฒ„ํŠผ</h2> <h2>xs</h2> <CustomButton text='primary' btnStyle='primary' btnSize='xs' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xs' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xs' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xs' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xs' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xs' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xs' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xs' onClick={onClick} /> <h2>sm</h2> <CustomButton text='primary' btnStyle='primary' btnSize='sm' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='sm' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='sm' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='sm' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='sm' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='sm' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='sm' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='sm' onClick={onClick} /> <h2>md</h2> <CustomButton text='primary' btnStyle='primary' btnSize='md' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='md' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='md' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='md' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='md' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='md' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='md' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='md' onClick={onClick} /> <h2>lg</h2> <CustomButton text='primary' btnStyle='primary' btnSize='lg' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='lg' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='lg' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='lg' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='lg' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='lg' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='lg' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='lg' onClick={onClick} /> <h2>xl</h2> <CustomButton text='primary' btnStyle='primary' btnSize='xl' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xl' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xl' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xl' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xl' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xl' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xl' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xl' onClick={onClick} /> <h2>block</h2> <CustomButton text='primary' btnStyle='primary' btnSize='block' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='block' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='block' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='block' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='block' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='block' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='block' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='block' onClick={onClick} /> </div> ); } export default App;
JavaScript
๋ณต์‚ฌ

BootStrap

๋ฐ˜์‘ํ˜• ์›น ๋””์ž์ธ ๋ฐ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ HTML, CSS ๋ฐ JavaScript ํ”„๋ ˆ์ž„์›Œํฌ

๋ฌธ๋ฒ•

<์ปดํฌ๋„ŒํŠธ className="๋ฏธ๋ฆฌ์ •์˜๋œ ํด๋ž˜์Šค์†์„ฑ" />
JavaScript
๋ณต์‚ฌ

์˜ˆ์‹œ

<button className="btn btn-primary">Button</button>
JavaScript
๋ณต์‚ฌ

์˜ˆ์‹œ ์ฝ”๋“œ

bootstrap ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด ๋ด…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ฒ„ํŠผ

Button.jsx
import React from 'react'; import 'bootstrap/dist/css/bootstrap.min.css'; // โœ… Bootstrap CSS๋ฅผ ์ถ”๊ฐ€ const Button = () => { return ( <button className="btn btn-primary">Button</button> ); } export default Button;
JavaScript
๋ณต์‚ฌ

์ปค์Šคํ…€ ๋ฒ„ํŠผ

CustomButton.jsx
import React from 'react'; import 'bootstrap/dist/css/bootstrap.min.css'; // โœ… Bootstrap CSS๋ฅผ ์ถ”๊ฐ€ const CustomButton = ({ text, btnStyle, btnSize, onClick }) => { let buttonClasses = 'btn'; switch (btnStyle) { case 'primary': buttonClasses += ' btn-primary'; break; case 'secondary': buttonClasses += ' btn-secondary'; break; case 'success': buttonClasses += ' btn-success'; break; case 'danger': buttonClasses += ' btn-danger'; break; case 'warning': buttonClasses += ' btn-warning'; break; case 'info': buttonClasses += ' btn-info'; break; case 'light': buttonClasses += ' btn-light'; break; case 'dark': buttonClasses += ' btn-dark'; break; default: break; } switch (btnSize) { case 'xs': buttonClasses += ' btn-xs'; break; case 'sm': buttonClasses += ' btn-sm'; break; case 'md': buttonClasses += ' btn-md'; break; case 'lg': buttonClasses += ' btn-lg'; break; case 'xl': buttonClasses += ' '; break; // bootstrap5 ๋ฒ„์ „ btn-xl โŒ deprecated case 'block': buttonClasses += ' '; break; // bootstrap5 ๋ฒ„์ „ btn-block โŒ deprecated default: break; } return ( <button className={buttonClasses} onClick={() => onClick()}>{text}</button> ); } export default CustomButton;
JavaScript
๋ณต์‚ฌ

App.js

import './App.css'; import Button from './components/Button'; import CustomButton from './components/CustomButton'; function App() { const onClick = () => { alert('Clicked!') } return ( <div className='container'> <h1>bootstrap</h1> <hr/> <h2>๊ธฐ๋ณธ ๋ฒ„ํŠผ</h2> <Button /> <hr/> <h2>์ปค์Šคํ…€ ๋ฒ„ํŠผ</h2> <h2>xs</h2> <div className='d-flex justify-content-between align-items-center'> <CustomButton text='primary' btnStyle='primary' btnSize='xs' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xs' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xs' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xs' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xs' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xs' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xs' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xs' onClick={onClick} /> </div> <h2>sm</h2> <div className='d-flex justify-content-between align-items-center'> <CustomButton text='primary' btnStyle='primary' btnSize='sm' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='sm' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='sm' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='sm' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='sm' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='sm' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='sm' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='sm' onClick={onClick} /> </div> <h2>md</h2> <div className='d-flex justify-content-between align-items-center'> <CustomButton text='primary' btnStyle='primary' btnSize='md' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='md' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='md' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='md' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='md' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='md' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='md' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='md' onClick={onClick} /> </div> <h2>lg</h2> <div className='d-flex justify-content-between align-items-center'> <CustomButton text='primary' btnStyle='primary' btnSize='lg' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='lg' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='lg' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='lg' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='lg' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='lg' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='lg' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='lg' onClick={onClick} /> </div> <h2>xl</h2> <div class="d-grid gap-2 col-6 mx-auto"> <CustomButton text='primary' btnStyle='primary' btnSize='xl' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xl' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xl' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xl' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xl' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xl' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xl' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xl' onClick={onClick} /> </div> <h2>block</h2> <div class="d-grid gap-2"> <CustomButton text='primary' btnStyle='primary' btnSize='block' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='block' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='block' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='block' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='block' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='block' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='block' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='block' onClick={onClick} /> </div> </div> ); } export default App;
JavaScript
๋ณต์‚ฌ

React-BootStrap

Bootstrap์„ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก React ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
React์™€ Bootstrap์„ ์กฐํ•ฉํ•˜์—ฌ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉฐ, React์˜ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ Bootstrap์„ ๋”์šฑ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์น˜

npm install react-bootstrap bootstrap
Shell
๋ณต์‚ฌ

๋ฌธ๋ฒ•

// ๋ฐฉ๋ฒ• 1๏ธโƒฃ import ์ปดํฌ๋„ŒํŠธ from 'react-bootstrap/์ปดํฌ๋„ŒํŠธ'; // ๋ฐฉ๋ฒ• 2๏ธโƒฃ import { ์ปดํฌ๋„ŒํŠธ} from 'react-bootstrap'; <์ปดํฌ๋„ŒํŠธ ์˜ต์…˜="๊ฐ’" ์˜ต์…˜2="๊ฐ’" />
JavaScript
๋ณต์‚ฌ

์˜ˆ์‹œ

import Button from 'react-bootstrap/Button'; <Button variant='primary' onClick={onClick}>Button</Button>
JavaScript
๋ณต์‚ฌ

์˜ˆ์‹œ ์ฝ”๋“œ

react-bootstrap ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด ๋ด…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๋ฒ„ํŠผ

ReactButton.jsx
import React from 'react'; import Button from 'react-bootstrap/Button'; const ReactButton = () => { return ( <Button variant='primary'>Button</Button> ); } export default ReactButton;
JavaScript
๋ณต์‚ฌ

์ปค์Šคํ…€ ๋ฒ„ํŠผ

CustomButton.jsx
import 'bootstrap/dist/css/bootstrap.min.css'; import Button from 'react-bootstrap/Button'; const CustomButton = ({ text, btnStyle, btnSize, onClick }) => { let variant = 'primary'; switch (btnStyle) { case 'secondary': variant = 'secondary'; break; case 'success': variant = 'success'; break; case 'danger': variant = 'danger'; break; case 'warning': variant = 'warning'; break; case 'info': variant = 'info'; break; case 'light': variant = 'light'; break; case 'dark': variant = 'dark'; break; default: break; } let size = ''; switch (btnSize) { case 'xs': size = 'sm'; break; case 'sm': size = 'sm'; break; case 'md': size = ''; break; case 'lg': size = 'lg'; break; default: break; } return ( <Button variant={variant} size={size} onClick={() => onClick()}>{text}</Button> ); } export default CustomButton;
JavaScript
๋ณต์‚ฌ

App.js

import './App.css'; import CustomButton from './components/CustomButton'; import ReactButton from './components/ReactButton'; function App() { const onClick = () => { alert('Clicked!') } return ( <div className='container'> <h1>react-bootstrap</h1> <hr/> <h2>๊ธฐ๋ณธ ๋ฒ„ํŠผ</h2> <ReactButton /> <hr/> <h2>์ปค์Šคํ…€ ๋ฒ„ํŠผ</h2> <h2>xs</h2> <div className='d-flex justify-content-between align-items-center'> <CustomButton text='primary' btnStyle='primary' btnSize='xs' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xs' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xs' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xs' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xs' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xs' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xs' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xs' onClick={onClick} /> </div> <h2>sm</h2> <div className='d-flex justify-content-between align-items-center'> <CustomButton text='primary' btnStyle='primary' btnSize='sm' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='sm' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='sm' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='sm' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='sm' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='sm' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='sm' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='sm' onClick={onClick} /> </div> <h2>md</h2> <div className='d-flex justify-content-between align-items-center'> <CustomButton text='primary' btnStyle='primary' btnSize='md' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='md' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='md' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='md' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='md' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='md' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='md' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='md' onClick={onClick} /> </div> <h2>lg</h2> <div className='d-flex justify-content-between align-items-center'> <CustomButton text='primary' btnStyle='primary' btnSize='lg' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='lg' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='lg' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='lg' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='lg' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='lg' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='lg' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='lg' onClick={onClick} /> </div> <h2>xl</h2> <div class="d-grid gap-2 col-6 mx-auto"> <CustomButton text='primary' btnStyle='primary' btnSize='xl' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='xl' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='xl' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='xl' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='xl' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='xl' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='xl' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='xl' onClick={onClick} /> </div> <h2>block</h2> <div class="d-grid gap-2"> <CustomButton text='primary' btnStyle='primary' btnSize='block' onClick={onClick} /> <CustomButton text='secondary' btnStyle='secondary' btnSize='block' onClick={onClick} /> <CustomButton text='success' btnStyle='success' btnSize='block' onClick={onClick} /> <CustomButton text='danger' btnStyle='danger' btnSize='block' onClick={onClick} /> <CustomButton text='warning' btnStyle='warning' btnSize='block' onClick={onClick} /> <CustomButton text='info' btnStyle='info' btnSize='block' onClick={onClick} /> <CustomButton text='light' btnStyle='light' btnSize='block' onClick={onClick} /> <CustomButton text='dark' btnStyle='dark' btnSize='block' onClick={onClick} /> </div> </div> ); } export default App;
JavaScript
๋ณต์‚ฌ