SASS และ BEM
บทความนี้อธิบายเกี่ยวกับ SASS และ BEM
เราจะอธิบายแนวคิดและวิธีการนำไปใช้เพื่อป้องกันความสับสนและเปราะบางที่มักเกิดขึ้นเมื่อ CSS มีขนาดใหญ่ขึ้น โดยใช้ SASS และ BEM พร้อมตัวอย่างที่เป็นรูปธรรม
YouTube Video
SASS และ BEM
เมื่อจำนวนไฟล์และหน้าจอเพิ่มขึ้น CSS มักจะเจอปัญหาเช่น 'ไม่รู้ว่าสไตล์นี้ถูกกำหนดไว้ที่ไหน' และ 'แค่เปลี่ยนเล็กน้อยก็ทำให้หน้าตาในหน้าจออื่นเสียได้'
เนื่องจาก CSS โดยพื้นฐานเป็น ภาษาที่ไม่ได้บังคับใช้กฎการออกแบบ ถ้ายังคงเขียนไปเรื่อย ๆ อย่างเดิม ความพึ่งพาซึ่งกันและกันโดยไม่ได้ตั้งใจก็จะเพิ่มขึ้น
SASS และ BEM เป็นเทคนิคที่นำไปใช้ได้จริงเพื่อเปลี่ยน CSS จากการเขียนแบบตามใจ เป็นโค้ดที่ออกแบบและจัดการได้ ช่วยป้องกันปัญหาเหล่านี้ โดยการผสมผสานทั้งสองเข้าด้วยกัน คุณสามารถชี้แจงความหมายของสไตล์ และยังช่วยเพิ่มการอ่าน การใช้งานซ้ำ และการดูแลรักษาได้พร้อมกัน
เหตุผลที่ CSS จัดการได้ยากง่ายมาก
CSS แบบตัวอย่างนี้อาจทำให้ ยากต่อการเข้าใจว่ามันจะทำงานอย่างไร เมื่อต้องย้อนกลับมาดูโค้ดในภายหลัง
1.title {
2 font-size: 16px;
3 color: #333;
4}
5
6.container .title {
7 font-size: 18px;
8}
9
10.sidebar .container .title {
11 color: red;
12}- ในตัวอย่างนี้คลาส
.titleเดียวกัน มีหน้าตาต่างกันขึ้นอยู่กับตำแหน่งที่วางไว้ ทำให้คุณไม่สามารถรู้ได้ทันทีว่าสไตล์แบบไหนจะถูกนำมาใช้กับ.titleนี้ - ในลักษณะนี้ เมื่อ selector ลึกมากขึ้นและขึ้นอยู่กับ element แม่มากขึ้น CSS ก็จะเดายากขึ้นว่ามีผลต่ออะไรบ้าง และเสี่ยงต่อการเสียหายเมื่อมีการแก้ไข
BEM เป็นแนวทางการตั้งชื่อที่ 'แสดงบทบาทของแต่ละส่วนผ่านชื่อ'
BEM ย่อมาจาก Block / Element / Modifier และใส่ชื่อให้เห็นว่าแต่ละคลาสเป็นส่วนไหนของ component และมีสถานะอะไรอยู่
- Block คือ component ที่เป็นอิสระในตัวเอง
- Element คือส่วนประกอบย่อยภายใน Block
- Modifier แทนสถานะหรือการเปลี่ยนแปลงต่าง ๆ
1.card {}
2.card__title {}
3.card--highlighted {}ด้วยแนวทางตั้งชื่อนี้ คุณสามารถ เข้าใจโครงสร้างและบทบาทได้จากโค้ด HTML เลย
รูปแบบพื้นฐานของ HTML ที่ใช้ BEM
นี่คือตัวอย่าง UI แบบบัตร (card) ที่เขียนใน HTML โดยใช้ BEM
1<div class="card card--highlighted">
2 <h2 class="card__title">Title</h2>
3 <p class="card__text">Description</p>
4</div>แค่ดูจากชื่อคลาสก็เข้าใจได้ว่าสิ่งนี้คือ 'component card', 'title ที่อยู่ภายใน' และ 'สถานะที่เน้น' นี่คือข้อดีที่ใหญ่ที่สุดของ BEM
แต่อย่างไรก็ดี BEM เพียงอย่างเดียวสามารถทำให้ CSS ยืดยาวได้
หากเขียน BEM ลงใน CSS ตรง ๆ โค้ดจะมีปริมาณมากขึ้น
1.card {
2 padding: 16px;
3}
4
5.card__title {
6 font-size: 18px;
7}
8
9.card__text {
10 font-size: 14px;
11}
12
13.card--highlighted {
14 border: 2px solid orange;
15}ตรงนี้ถ้าใช้ SASS จะช่วยให้ โค้ดเป็นระเบียบและคงโครงสร้างไว้
แสดงโครงสร้าง BEM ได้อย่างเป็นธรรมชาติด้วย SASS แบบซ้อน
การซ้อนกันของ SASS จะสะท้อนถึงโครงสร้างของ BEM ได้โดยตรงในโค้ด
1.card {
2 padding: 16px;
3
4 &__title {
5 font-size: 18px;
6 }
7
8 &__text {
9 font-size: 14px;
10 }
11
12 &--highlighted {
13 border: 2px solid orange;
14 }
15}& หมายถึง selector แม่และ ใช้ร่วมกับ BEM ได้อย่างดีเยี่ยม
CSS ที่ถูกสร้างขึ้นจาก SASS นี้
SASS ข้างบนเมื่อแปลงแล้วจะได้ CSS ประมาณนี้
1.card {
2 padding: 16px;
3}
4
5.card__title {
6 font-size: 18px;
7}
8
9.card__text {
10 font-size: 14px;
11}
12
13.card--highlighted {
14 border: 2px solid orange;
15}แม้ว่าผลลัพธ์จะเหมือนเดิม แต่ ความซับซ้อนในการทำความเข้าใจของนักพัฒนาได้ลดลงอย่างมาก
ออกแบบการใช้ Modifier ให้ปลอดภัย
เนื่องจาก Modifier ใน BEM แทน 'สถานะ' เคล็ดลับคือควร จำกัดการใช้เฉพาะการเขียนทับ (override) เท่านั้น
1.button {
2 padding: 8px 12px;
3 background: #eee;
4
5 &--primary {
6 background: blue;
7 color: white;
8 }
9
10 &--disabled {
11 opacity: 0.5;
12 pointer-events: none;
13 }
14}การออกแบบจะมั่นคงขึ้นหากใช้ Modifier เป็น 'การเปลี่ยนแปลง' มากกว่าจะเป็น 'การเพิ่มเข้ามา'
จำกัดการซ้อนของ Element ไว้แค่หนึ่งระดับ
ใน BEM สิ่งสำคัญคือต้องไม่ซ้อน Element ลึกเกินไป
1.card {
2 &__header {
3 font-weight: bold;
4 }
5
6 &__body {
7 margin-top: 8px;
8 }
9}Element หลายระดับ เช่น .card__header__title เป็น สัญญาณว่าควรแยก Block ออก
ตัวอย่างโครงสร้างไฟล์ SASS
สุดท้ายนี้ นี่คือตัวอย่างโครงสร้าง SASS ที่ใช้ได้จริงในโปรเจกต์
1styles/
2├── base/
3│ └── reset.scss
4├── components/
5│ ├── card.scss
6│ └── button.scss
7├── layout/
8│ └── header.scss
9└── main.scssถ้าจัดการแต่ละ component แบบ 1 block = 1 ไฟล์ จะมีโอกาสเสียหายน้อยลง
ตัวอย่าง card.scss
1.card {
2 padding: 16px;
3 border: 1px solid #ccc;
4
5 &__title {
6 font-size: 18px;
7 }
8
9 &__text {
10 color: #666;
11 }
12}เพราะทุกอย่างถูกรวมอยู่ในขอบเขตนี้ การลบ เคลื่อนย้าย และนำกลับมาใช้ใหม่จึงง่ายขึ้น
สรุป
SASS และ BEM ไม่ใช่แค่เทคนิคตามกระแส—แต่เป็น วิธีการที่นำไปใช้ได้จริงเพื่อเปลี่ยน CSS ให้เป็นโค้ดที่ออกแบบได้
- BEM ตั้งชื่อเพื่อบอกความหมายและหน้าที่
- SASS ช่วยให้เขียนง่ายขณะรักษาโครงสร้าง
- การใช้ทั้งสองร่วมกันช่วยให้ CSS มีความเสียหายน้อยลง
มาเขียน CSS วันนี้ ให้ตัวคุณเองในอนาคตเข้าใจได้ง่ายกันเถอะ
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย