รู้จัก Utility API ของใหม่ใน Bootstrap 5
Bootstrap 4 มี Utility classes ที่ช่วยให้ตกแต่งอีลีเมนต์ได้ง่าย เช่น เราสามารถใส่คลาสเป็น .text-success
เพื่อให้สีข้อความเป็นสีเขียว หรือใส่ .w-25
เพื่อแทนการใช้ CSS คือ width: 25%
แต่นั่นก็ยังไม่ครอบคลุมถึงการใช้งานจิปาถะทั้งหมด
เช่นถ้าอยากให้แท็ก div ของเราแสดงรูปมือผ่าน cursor: pointer
ตรงจุดนี้ Bootstrap ก็ยังไม่มีคลาสที่เตรียมให้
การมาของ Tailwind ที่มาพร้อมกับ classes จำนวนมหาศาลให้เลือกตกแต่งอีลีเมนต์ได้ตามใจชอบ
นั่นทำให้ Bootstrap ต้องขยับ! จากตัวอย่างของเราเพียงแค่ระบุคลาสเป็น .cursor-pointer
ใน Tailwind ก็ไม่จำเป็นต้องมาสร้าง CSS แยกแล้ว
Utility API คืออะไร
โลกเปลี่ยน Bootstrap เปลี่ยน ตอนนี้ Bootstrap 5 ได้เตรียม API สำหรับสร้างคลาสในลักษณะคล้าย ๆ Tailwind ได้ตามชอบ
ผ่านตัวแปรของ SCSS ที่ชื่อ $utilities
หากเราต้องการสร้างคลาส .cursor-pointer
เพื่อแทน CSS อย่าง cursor: pointer
รวมถึงกำหนดคลาสสำหรับการใช้งาน cursor ประเภทต่าง ๆ ผ่าน Utility API รูปแบบการเขียนจะเป็นดังนี้
1$utilities: (2 'cursor': (3 property: cursor,4 values: auto default pointer wait text move not-allowed,5 ),6);
Bootstrap จะทำการจับคู่ระหว่าง property กับแต่ละค่าของ values เพื่อทำการสร้างคลาสออกมาเป็นผลลัพธ์ดังนี้
1.cursor-auto {2 cursor: auto;3}45.cursor-default {6 cursor: default;7}89.cursor-pointer {10 cursor: pointer;11}1213.cursor-wait {14 cursor: wait;15}1617.cursor-move {18 cursor: move;19}2021.cursor-not-allowed {22 cursor: not-allowed;23}
การกำหนดค่าหลากหลายตามค่า key
หากเราต้องการสร้าง .font-weight-bold
เพื่อแทน CSS คือ font-weight: 700
หรือสร้างคลาส
.font-weight-thin
เพื่อแทน CSS คือ font-weight: 200
จะต้องทำการจับคู่คำว่า bold
เข้ากับ 700
และคำว่า thin
จับคู่กับ 200 ตรงจุดนี้ Bootstrap ก็อนุญาตให้ระบุการจับคู่ผ่าน API เช่นกัน
1$utilities: (2 'font-weight': (3 property: font-weight,4 values: (5 hairline: 100,6 thin: 200,7 light: 300,8 normal: 400,9 medium: 500,10 semibold: 600,11 bold: 700,12 extrabold: 800,13 black: 900,14 ),15 ),16);
ผลลัพธ์การทำงานได้ CSS เป็นผลลัพธ์ดังนี้
1.font-weight-hairline {2 font-weight: 100;3}45.font-weight-thin {6 font-weight: 200;7}89.font-weight-light {10 font-weight: 300;11}1213.font-weight-normal {14 font-weight: 400;15}1617.font-weight-medium {18 font-weight: 500;19}2021.font-weight-semibold {22 font-weight: 600;23}2425.font-weight-bold {26 font-weight: 700;27}2829.font-weight-extrabold {30 font-weight: 800;31}3233.font-weight-black {34 font-weight: 900;35}
ตั้งชื่อคลาสให้สั้นลงด้วย prefix
การกำหนดค่าให้กับ font-weight
ตามตัวอย่างข้างต้นมีข้อเสียคือการกำหนดชื่อที่ยาวเกินไป เพียงแค่อยากได้ font-weight: 600
แต่ต้องใช้คลาสที่ชื่อยาวคือ font-weight-semibold
อย่ากระนั้นเลยข้อชื่อที่สั้นหน่อยตัดคำว่า weight ทิ้งให้เหลือแค่ font-semibold
ดีไหม
ในการใช้ $utilities
เราสามารถกำหนดค่าของ class
ได้ครับ หากใส่ class
เป็น font
ก็ไม่จำเป็นต้องใช้คำว่า font-weight
เต็ม ๆ อีกต่อไป
1$utilities: (2 'font-weight': (3 property: font-weight,4 class: 'font',5 values: (6 hairline: 100,7 thin: 200,8 light: 300,9 normal: 400,10 medium: 500,11 semibold: 600,12 bold: 700,13 extrabold: 800,14 black: 900,15 ),16 ),17);
ผลลัพธ์การทำงานได้ CSS เป็นผลลัพธ์ดังนี้
1.font-hairline {2 font-weight: 100;3}45.font-thin {6 font-weight: 200;7}89.font-light {10 font-weight: 300;11}1213.font-normal {14 font-weight: 400;15}1617.font-medium {18 font-weight: 500;19}2021.font-semibold {22 font-weight: 600;23}2425.font-bold {26 font-weight: 700;27}2829.font-extrabold {30 font-weight: 800;31}3233.font-black {34 font-weight: 900;35}
Responsive กับการทำงานของ Utility API
หลายครั้งเราต้องการคลาสที่ทำงานได้แตกต่างกันตามแต่ขนาดหน้าจอ เราอาจต้องการให้หน้าจอขนาดเล็กแสดง font-wight: 400
ส่วนหน้าจอขนาดกลางขึ้นไปกำหนดให้แสดง font-weight: 700
แทน เหตุนี้เราจึงต้องการใส่ค่ากำหนดขนาดหน้าจอลงไปในคลาสที่เราสร้างด้วย
เพื่อบอกว่าหน้าจอขนาดไหนสมควรแสดงผลอย่างไร
จากตัวอย่างข้างตน คลาสที่เหมาะสมควรเป็น .font-sm-normal
เพื่อให้แสดงผล font-weight: 400
สำหรับหน้าจอขนาดเล็กขึ้นไป
และคลาส .font-md-bold
สำหรับแสดงผล font-weight: 700
ในหน้าจอขนาดกลางขึ้นไปนั่นเอง
ค่าจำเป็นสำหรับการระบุใน $utilities
เพื่อให้เกิดการทำงานแบบ Responsive เช่นนี้คือ responsive: true
1$utilities: (2 'font-weight': (3 property: font-weight,4 class: 'font',5 responsive: true,6 values: (7 hairline: 100,8 thin: 200,9 light: 300,10 normal: 400,11 medium: 500,12 semibold: 600,13 bold: 700,14 extrabold: 800,15 black: 900,16 ),17 ),18);
ผลลัพธ์จากการประมวลผลเป็นดังนี้ (แสดงเฉพาะค่า normal และ bold คลาสอื่นมีการทำงานแบบเดียวกัน)
1.font-normal {2 font-weight: 400;3}45.font-bold {6 font-weight: 700;7}89@media (min-width: 576px) {10 .font-sm-normal {11 font-weight: 400;12 }1314 .font-sm-bold {15 font-weight: 700;16 }17}1819@media (min-width: 768px) {20 .font-md-normal {21 font-weight: 400;22 }2324 .font-md-bold {25 font-weight: 700;26 }27}2829@media (min-width: 992px) {30 .font-lg-normal {31 font-weight: 400;32 }3334 .font-lg-bold {35 font-weight: 700;36 }37}3839@media (min-width: 1200px) {40 .font-xl-normal {41 font-weight: 400;42 }4344 .font-xl-bold {45 font-weight: 700;46 }47}
ตำแหน่งการเรียกใช้ $utilities
$utilities
ถูกประกาศเป็น $utilities: () !default;
ในซอร์จโค้ดของ Bootstrap หากเราต้องการใช้ $utilities
จึงจำเป็นต้องประกาศไว้ก่อนการ import Bootstrap เช่น
1$utilities: (2 'cursor': (3 property: cursor,4 values: auto default pointer wait text move not-allowed,5 ),6 'font-weight': (7 property: font-weight,8 class: 'font',9 responsive: true,10 values: (11 hairline: 100,12 thin: 200,13 light: 300,14 normal: 400,15 medium: 500,16 semibold: 600,17 bold: 700,18 extrabold: 800,19 black: 900,20 ),21 ),22);2324@import 'bootstrap/scss/bootstrap';
สรุป
Utility API เป็นทุกอย่างให้เธอแล้ว ตอนนี้อยากสร้างคลาสอะไรที่ Bootstrap ไม่ได้เตรียมไว้ให้ก็เป็นเรื่องง่ายแล้วครับ
สารบัญ
- Utility API คืออะไร
- การกำหนดค่าหลากหลายตามค่า key
- ตั้งชื่อคลาสให้สั้นลงด้วย prefix
- Responsive กับการทำงานของ Utility API
- ตำแหน่งการเรียกใช้ $utilities
- สรุป