SafeAreaView — คืออะไร, เลย์เอาท์กับ Safe Area ใน React Native

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-07-06 เวลาอ่าน: 10 นาที

SafeAreaView เป็นคอมโพเนนต์ React Native สำหรับเลย์เอาท์ที่คำนึงถึงพื้นที่ปลอดภัยของหน้าจอบนอุปกรณ์ที่มีรอยบากและมุมกลม บน iPhone ที่มี Notch และ Dynamic Island เนื้อหาสามารถถูกบดบังโดยกล้องและตัวบ่งชี้ SafeAreaView จะเพิ่ม padding โดยอัตโนมัติ ป้องกันไม่ให้ส่วนติดต่อถูกตัดโดยองค์ประกอบระบบ เรียนรู้เพิ่มเติมเกี่ยวกับ Safe Area ได้ที่ เอกสารอย่างเป็นทางการของ Meta

หัวข้อสำคัญ

  • SafeAreaView — คอมโพเนนต์ที่เพิ่ม padding โดยอัตโนมัติสำหรับพื้นที่ปลอดภัยบนหน้าจอ iOS และ Android
  • Notch และ Dynamic Island ต้องใช้ padding ด้านบน ซึ่ง SafeAreaView คำนวณโดยอัตโนมัติ
  • Android — คอมโพเนนต์คำนึงถึงแถบสถานะและปุ่มนำทางระบบ
  • ทางเลือก: useSafeAreaInsets จาก react-native-safe-area-context สำหรับการควบคุม padding แบบยืดหยุ่น
  • หน้าจอ Edge-to-edge ต้องใช้ SafeAreaView อย่างจำเป็นสำหรับเลย์เอาท์ที่ถูกต้อง

SafeAreaView คืออะไร?

SafeAreaView เป็นคอมโพเนนต์ React Native ที่เพิ่ม padding ภายในโดยอัตโนมัติเพื่อให้เนื้อหาไม่ถูกบดบังโดยองค์ประกอบส่วนติดต่อระบบ: แถบสถานะ, Notch, Dynamic Island และแถบนำทางระบบ คอมโพเนนต์นี้ปรากฏใน React Native 0.50 สำหรับ iOS และต่อมาถูกขยายสำหรับ Android

บน iOS SafeAreaView ใช้ UIView.safeAreaInsets ดั้งเดิม ที่เปิดตัวใน iOS 11 (2017) บน Android คอมโพเนนต์ใช้ WindowInsets — system insets ที่มีตั้งแต่ Android 5.0 (API 21) ตามข้อมูลจาก Apple (2026) 92% ของ iPhone ที่ใช้งานอยู่มีหน้าจอที่มีรอยบากหรือ Dynamic Island

ทำไมต้องใช้ Safe Area

แนวคิด Safe Area เป็นส่วนหนึ่งของคำแนะนำ Apple HIG (Human Interface Guidelines) ก่อน iPhone X (2017) พื้นที่หน้าจอทั้งหมดปลอดภัย เมื่อ Notch มาถึง Apple ได้กำหนดพื้นที่ที่ไม่ควรวางเนื้อหา: รอยตัดกล้อง, ตัวบ่งเวลาและแบตเตอรี่, ตัวบ่งหน้าแรก Android ได้นำแนวคิดที่คล้ายกันมาใช้เมื่อหน้าจอแบบมีรอยบากเกิดขึ้นในปี 2018

Safe Area ทำงานบน iOS และ Android อย่างไร

บน iOS SafeAreaView อ่าน safeAreaInsets จากคำแนะนำเลย์เอาท์ดั้งเดิม ขอบเข้าด้านบนรวมความสูงของแถบสถานะ (โดยปกติ 44 หรือ 50 จุดสำหรับ iPhone ที่มี Notch) ขอบเข้าด้านล่างคือ 34 จุดสำหรับตัวบ่งหน้าแรก Android ใช้ WindowInsets — ขอบเข้าด้านบนสำหรับแถบสถานะและขอบเข้าด้านล่างสำหรับการนำทางระบบ

แพลตฟอร์มขอบบนขอบล่างแหล่งที่มา
iOS (Notch)44-50 pt34 ptsafeAreaInsets.top / .bottom
iOS (ไม่มี Notch)20 pt0 ptsafeAreaInsets.top / .bottom
Android (มีรอยบาก)24-48 dp24-48 dpWindowInsets.systemBarsInsets
Android (ไม่มีรอยบาก)24 dp0 dpWindowInsets.statusBarsInsets

สำคัญ: SafeAreaView ใช้ padding โดยอัตโนมัติ แต่เฉพาะสำหรับคอนเทนเนอร์ราก คอมโพเนนต์ที่ซ้อนกันจะไม่ได้รับการป้องกัน — แต่ละหน้าจอต้องมี SafeAreaView ของตัวเอง สำหรับหน้าต่าง modal และ BottomSheet ให้คำนึงถึง insets แยกต่างหาก

Notch, Dynamic Island และแถบระบบ

Notch คือรอยตัดฮาร์ดแวร์ที่ด้านบนของหน้าจอที่มีกล้องและเซ็นเซอร์ ปรากฏใน iPhone X (2017) Dynamic Island คือพื้นที่ซอฟต์แวร์-ฮาร์ดแวร์ของ iPhone 14 Pro และใหม่กว่า แทนที่ Notch ด้วยองค์ประกอบแบบโต้ตอบ ทั้งสองต้องใช้ขอบเข้าด้านบน 50-56 pt

บน Android รอยบากมีหลายรูปแบบ: หยดน้ำ, punch-hole, แถบใต้กล้อง SafeAreaView บน Android ใช้ WindowInsets ซึ่งคำนึงถึงรูปร่างของรอยบาก สำหรับแอปในแนวนอน จะเพิ่มขอบเข้าด้านข้างเพื่อป้องกันเนื้อหาทับซ้อนกับองค์ประกอบระบบ

js
import React from 'react';
import { SafeAreaView, View, Text } from 'react-native';

const App = () => (
  <SafeAreaView style={{ flex: 1 }}>
    <View style={styles.content}>
      <Text>Content is safe from Notch and system bars</Text>
    </View>
  </SafeAreaView>
);

แนวทาง Edge-to-edge (Android 15+) แนะนำให้วาดเนื้อหาใต้แถบระบบ แต่คำนึงถึง insets สำหรับองค์ประกอบแบบโต้ตอบ SafeAreaView ช่วยรักษาสมดุลนี้: พื้นหลังถูกวาดใต้แถบ ในขณะที่ปุ่มและข้อความยังคงอยู่ในโซนปลอดภัย

การใช้งานและทางเลือกของ SafeAreaView

SafeAreaView เป็นวิธีที่ง่ายที่สุดในการป้องกันเนื้อหา แต่ไม่ยืดหยุ่นเสมอไป คอมโพเนนต์ใช้ padding เดียวกันกับทุกด้าน ซึ่งไม่สะดวกเมื่อต้องการ padding ต่างกันสำหรับขอบต่างกัน ตัวอย่างเช่น padding ด้านข้างอาจไม่จำเป็น ในขณะที่ padding ด้านล่างอาจจำเป็นเฉพาะสำหรับปุ่ม

ทางเลือกหลัก: useSafeAreaInsets จาก react-native-safe-area-context (โซลูชันที่ยืดหยุ่นที่สุด), StatusBar.currentHeight บน Android, Platform.OS ด้วยการตรวจสอบรุ่นอุปกรณ์ด้วยตนเอง สำหรับกรณีที่ซับซ้อน ให้ใช้ SafeAreaView สำหรับคอนเทนเนอร์ทั่วไปและ useSafeAreaInsets สำหรับองค์ประกอบแต่ละตัว

js
import { useSafeAreaInsets } from 'react-native-safe-area-context';

const CustomHeader = () => {
  const insets = useSafeAreaInsets();

  return (
    <View style={{ paddingTop: insets.top }}>
      <Header />
    </View>
  );
};

ไลบรารี react-native-safe-area-context เป็นมาตรฐานโดยพฤตินัยสำหรับการทำงานกับ Safe Area ใน React Native รองรับโดย Expo, React Navigation และชุด UI ส่วนใหญ่ ไลบรารีนี้มีทั้ง hook และคอมโพเนนต์ Consumer สำหรับแนวทางเชิงฟังก์ชันและเชิงคลาส

react-native-safe-area-context สำหรับการควบคุมอย่างสมบูรณ์

react-native-safe-area-context เป็นไลบรารีที่ให้ API ที่ยืดหยุ่นกว่า SafeAreaView ในตัว ข้อได้เปรียบหลักคือการเข้าถึงค่า insets แต่ละค่า (top, bottom, left, right) ผ่าน hook useSafeAreaInsets ทำให้สามารถใช้ insets แบบเลือกได้

ไลบรารียังมี SafeAreaProvider — คอมโพเนนต์ที่จำเป็นที่ระดับบนสุดของแอปพลิเคชัน มันสมัครรับการเปลี่ยนแปลง insets ระบบเมื่อหมุนหน้าจอหรือเปิดแป้นพิมพ์ React Navigation ใช้ไลบรารีนี้โดยค่าเริ่มต้น

SafeAreaView จาก react-native-safe-area-context แตกต่างจากในตัว: มันทำงานบนอุปกรณ์มากกว่าและรองรับแอนิเมชันการเปลี่ยนแปลง insets สำหรับโปรเจกต์ใหม่ แนะนำให้ติดตั้งไลบรารีนี้เป็น dependencies และใช้ SafeAreaView ของมันแทนของในตัว

ข้อผิดพลาดทั่วไปเมื่อทำงานกับ SafeAreaView

SafeAreaView มักถูกใช้ไม่ถูกต้อง ข้อผิดพลาดแรกคือการห่อทุกคอมโพเนนต์ใน SafeAreaView ซึ่งสร้าง padding ซ้ำซ้อน กฎ: หนึ่ง SafeAreaView ต่อ View รากของหน้าจอ คอมโพเนนต์ที่ซ้อนกันสืบทอด insets ผ่านเลย์เอาท์ Flex

ข้อผิดพลาดที่สองคือการละเลย Android บน Android SafeAreaView ใช้ WindowInsets ซึ่งอาจแตกต่างกันระหว่างเวอร์ชัน OS บน Android 15+ แถบระบบอาจโปร่งใสและ insets เปลี่ยนแปลง ทดสอบ SafeAreaView บนอุปกรณ์จริงเสมอ ไม่ใช่แค่ในอีมูเลเตอร์

ข้อผิดพลาดที่สามคือ padding แบบตายตัว อย่าใช้ Platform.OS === 'ios' ? 44 : 24 — ค่า insets แตกต่างกันระหว่างรุ่นและเวอร์ชัน OS ใช้ API ระบบเสมอ: safeAreaInsets หรือ useSafeAreaInsets Dynamic Island บน iPhone 15 Pro มี insets ต่างจาก Notch บน iPhone X

คำถามที่พบบ่อย

SafeAreaView ทำงานบนทุกอุปกรณ์หรือไม่?

SafeAreaView ทำงานบน iOS 11+ และ Android 5+ บนอุปกรณ์เก่า insets จะเป็นศูนย์ ซึ่งไม่ทำให้เกิดข้อผิดพลาดแต่อาจต้องปรับด้วยตนเอง สำหรับความเข้ากันได้สูงสุด ให้ใช้ react-native-safe-area-context

วิธีใช้ SafeAreaView เฉพาะด้านบน โดยไม่มี padding ด้านล่าง?

SafeAreaView ในตัวไม่อนุญาตให้เลือกด้าน ใช้ useSafeAreaInsets จาก react-native-safe-area-context: รับ insets.top และใช้ paddingTop หรือห่อ SafeAreaView ใน View ที่มี margin ติดลบเพื่อชดเชยขอบเข้าด้านล่าง

ทำไม SafeAreaView ไม่เพิ่ม padding บน Android?

บนอุปกรณ์ Android บางรุ่น SafeAreaView อาจไม่ทำงานเนื่องจากการตั้งค่าของผู้ผลิต ตรวจสอบว่าใช้ React Native 0.64+ สำหรับการทำงานที่รับประกัน ให้ติดตั้ง react-native-safe-area-context และห่อแอปใน SafeAreaProvider

การวางแนวหน้าจอมีผลต่อ SafeAreaView หรือไม่?

ใช่ เมื่อหมุนหน้าจอ SafeAreaView คำนวณ insets ใหม่ ในแนวนอนบน iPhone ที่มี Notch ขอบเข้าด้านข้างอาจเป็น 0 ในขณะที่ขอบเข้าด้านบนยังคงอยู่ คอมโพเนนต์ react-native-safe-area-context สมัครรับการเปลี่ยนแปลงการวางแนวโดยอัตโนมัติ

ความแตกต่างระหว่าง SafeAreaView และ StatusBar คืออะไร?

SafeAreaView จัดการ insets เนื้อหาจากองค์ประกอบระบบทั้งหมด (แถบสถานะ, Notch, ตัวบ่งหน้าแรก) StatusBar เป็นคอมโพเนนต์สำหรับควบคุมสี สไตล์ และการมองเห็นของแถบสถานะ ทั้งสองแก้ไขงานต่างกันและสามารถใช้ร่วมกันได้

สรุป

  • SafeAreaView — คอมโพเนนต์ React Native สำหรับการคำนวณ insets ระบบโดยอัตโนมัติบน iOS (Notch, Dynamic Island) และ Android (แถบสถานะ, การนำทาง)
  • หลักการทำงาน — อ่าน safeAreaInsets (iOS) หรือ WindowInsets (Android) และใช้เป็น padding กับคอนเทนเนอร์ราก
  • Notch และ Dynamic Island ต้องใช้ขอบเข้าด้านบน 44-56 pt, ขอบเข้าด้านล่าง 34 pt สำหรับตัวบ่งหน้าแรก iPhone
  • react-native-safe-area-context — ทางเลือกที่ยืดหยุ่นกว่าด้วย hook useSafeAreaInsets สำหรับการใช้ insets แบบเลือก
  • ข้อผิดพลาดทั่วไป: padding ซ้ำซ้อน, padding ตายตัวแทน API ระบบ, ไม่สนใจคุณสมบัติของ Android
  • หน้าจอ Edge-to-edge ต้องใช้ SafeAreaView สำหรับการวางตำแหน่งองค์ประกอบแบบโต้ตอบที่ถูกต้อง
  • หนึ่ง SafeAreaView ต่อหน้าจอ — การห่อซ้อนกันสร้าง padding ซ้ำซ้อนที่ทำลายเลย์เอาท์

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม