การตกแต่งด้วย StyleSheet API และ Flexbox
เขียนสไตล์สำหรับมือถือด้วย StyleSheet.create และ Flexbox โดยไม่ใช้ชื่อคลาส CSS
การตกแต่งด้วย StyleSheet API และ Flexbox เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ไม่มี CSS ใน React Native
React Native ใช้ส่วนติดต่อการจัดสไตล์ด้วย JavaScript โดยไม่มีไฟล์ CSS ไม่มีชื่อคลาส และไม่มีการใช้สไตล์แบบลำดับชั้น สไตล์เป็นออบเจ็กต์ JavaScript ที่นำไปใช้ผ่านพร็อพ style
StyleSheet.create()
ห่อออบเจ็กต์สไตล์ด้วย StyleSheet.create() เพื่อประสิทธิภาพที่ดีขึ้น (สไตล์จะได้รับการตรวจสอบและปรับให้เหมาะสมเพียงครั้งเดียว) และเพื่อให้ IDE เติมโค้ดอัตโนมัติ
import { StyleSheet, View, Text } from 'react-native';
function Card() {
return (
<View style={styles.card}>
<Text style={styles.title}>Hello</Text>
</View>
);
}
const styles = StyleSheet.create({
card: { padding: 16, backgroundColor: '#fff', borderRadius: 8, shadowColor: '#000', shadowOpacity: 0.1, elevation: 2 },
title: { fontSize: 18, fontWeight: 'bold', color: '#111' },
});สไตล์แบบอินไลน์
ใช้สไตล์โดยตรงผ่านพร็อพ style ไวยากรณ์แบบอาร์เรย์จะรวมออบเจ็กต์สไตล์หลายรายการเข้าด้วยกัน โดยสไตล์ที่อยู่ถัดไปจะแทนที่สไตล์ก่อนหน้า
<View style={{ padding: 16, backgroundColor: '#f5f5f5' }} />
// Array merging:
<Text style={[styles.base, isActive && styles.active, { marginTop: 8 }]} />เฟล็กซ์บ็อกซ์ใน React Native
React Native ใช้เฟล็กซ์บ็อกซ์เป็นค่าเริ่มต้นสำหรับการจัดเลย์เอาต์ แต่มีค่าเริ่มต้นแตกต่างจากเว็บ โดย flexDirection มีค่าเริ่มต้นเป็น 'column' (ไม่ใช่ 'row') และ flex: 1 จะขยายเต็มพื้นที่ที่มีอยู่
const styles = StyleSheet.create({
container: {
flex: 1, // fill available space
flexDirection: 'column', // default in RN (web default is 'row')
justifyContent: 'center', // main axis alignment
alignItems: 'center', // cross axis alignment
},
});เลย์เอาต์แบบแถว
ใช้ flexDirection: 'row' เพื่อจัดองค์ประกอบลูกในแนวนอน ซึ่งทำงานคล้ายกับ CSS display: flex; flex-direction: row
const styles = StyleSheet.create({
row: {
flexDirection: 'row',
alignItems: 'center',
gap: 12, // gap is supported in RN 0.71+
},
});
<View style={styles.row}>
<Image source={avatar} />
<Text>{username}</Text>
</View>เฟล็กซ์เทียบกับความกว้างและความสูง
ใช้ flex: N เพื่อกำหนดขนาดตามสัดส่วน flex: 1 จะใช้พื้นที่ที่เหลือทั้งหมด ส่วน flex: 2 จะได้รับพื้นที่เป็นสองเท่าขององค์ประกอบพี่น้องที่มี flex: 1
// Sidebar takes 1/3, content takes 2/3:
<View style={{ flexDirection: 'row', flex: 1 }}>
<View style={{ flex: 1, backgroundColor: '#eee' }}>Sidebar</View>
<View style={{ flex: 2 }}>Content</View>
</View>การจัดตำแหน่งแบบสัมบูรณ์
ใช้ position: 'absolute' ร่วมกับ top, right, bottom และ left สำหรับองค์ประกอบแบบซ้อนทับ ซึ่งเหมือนกับการจัดตำแหน่งแบบสัมบูรณ์ของ CSS ภายในองค์ประกอบแม่แบบสัมพัทธ์
const badge = StyleSheet.create({
badge: {
position: 'absolute',
top: -4,
right: -4,
width: 16,
height: 16,
borderRadius: 8,
backgroundColor: 'red',
},
});สไตล์เฉพาะแพลตฟอร์ม
ใช้ Platform.OS หรือ Platform.select() เพื่อใช้สไตล์ที่แตกต่างกันบน iOS และ Android
import { Platform } from 'react-native';
const styles = StyleSheet.create({
shadow: {
...Platform.select({
ios: { shadowColor: '#000', shadowOpacity: 0.2, shadowRadius: 4 },
android: { elevation: 4 },
}),
},
});สี
React Native รองรับสตริงสีแบบ CSS (เลขฐานสิบหก, rgb และชื่อสี) รวมถึงส่วนติดต่อ PlatformColor สำหรับสีของระบบ
import { PlatformColor } from 'react-native';
// System color — adapts to dark mode automatically:
const labelColor = PlatformColor('label', '#000'); // iOS 'label' semantic colorสไตล์แบบไดนามิกด้วยพร็อพ
คำนวณสไตล์จากพร็อพภายในคอมโพเนนต์ ส่งฟังก์ชันให้กับ StyleSheet หรือคำนวณออบเจ็กต์สไตล์แบบอินไลน์
function Badge({ color, size = 16 }: { color: string; size?: number }) {
return (
<View
style={[
styles.badge,
{ backgroundColor: color, width: size, height: size, borderRadius: size / 2 },
]}
/>
);
}
const styles = StyleSheet.create({ badge: { position: 'absolute' } });ตรวจสอบความเข้าใจ
ค่าเริ่มต้นของ flexDirection ใน React Native คืออะไร (ซึ่งแตกต่างจากเว็บ)
สรุปทบทวน
ใช้ StyleSheet.create() สำหรับสไตล์ที่ได้รับการปรับให้เหมาะสม และนำไปใช้ผ่านพร็อพ style เฟล็กซ์บ็อกซ์ของ React Native มีค่าเริ่มต้นเป็น flexDirection: 'column' และ flex: 1 จะใช้พื้นที่ที่เหลือ ใช้ Platform.select() สำหรับสไตล์เงาเฉพาะ OS
คำถามที่พบบ่อย
บทเรียน “การตกแต่งด้วย StyleSheet API และ Flexbox” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การตกแต่งด้วย StyleSheet API และ Flexbox” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การตกแต่งด้วย StyleSheet API และ Flexbox”
เขียนสไตล์สำหรับมือถือด้วย StyleSheet.create และ Flexbox โดยไม่ใช้ชื่อคลาส CSS คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การตกแต่งด้วย StyleSheet API และ Flexbox” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คอมโพเนนต์หลักของ React Native เทียบกับ DOM บนเว็บ
- การตกแต่งด้วย StyleSheet API และ Flexbox
- การนำทางด้วย Expo Router
- การเข้าถึง API ของอุปกรณ์: กล้อง ตำแหน่ง และการแจ้งเตือนแบบพุช