-
reset
- ใช้ preflight styles ของ Tailwind โดยคัดลอกมาจาก
tailwind.css ช่วงแรกประมาณ 200 บรรทัด
- ผู้เขียนคุ้นกับ Tailwind reset มานาน และกฎที่ใส่
box-sizing: border-box ให้ทุก element ก็ทำให้ความกว้างของ element รวม padding อยู่ด้วย
* { box-sizing: border-box; }
- อาจมีการพึ่งพากฎ reset อื่น ๆ แบบไม่รู้ตัว เช่น
html {line-height: 1.5;} และถ้าจะเขียน CSS โดยไม่มีกฎพวกนี้ ก็ดูเหมือนต้องใช้เวลาปรับตัวมาก
-
components
- CSS ส่วนใหญ่ถูกจัดเก็บเป็น ไฟล์ตามคอมโพเนนต์ คล้ายกับคอมโพเนนต์ใน Vue หรือ React
- แต่ละคอมโพเนนต์มีคลาสเฉพาะของตัวเอง และจัดให้ CSS ของคอมโพเนนต์หนึ่งไม่ไปเขียนทับ CSS ของอีกคอมโพเนนต์
- ในทางปฏิบัติ CSS ที่อยากแก้จริง ๆ ราว 80% อยู่ในไฟล์คอมโพเนนต์ ดังนั้นเวลาแก้คอมโพเนนต์ 100 บรรทัด ก็คิดแค่ 100 บรรทัดนั้นพอ
- ตัวอย่างเช่น คอมโพเนนต์
.zine อาจมี HTML แบบนี้
<figure class="zine horizontal">
<img src="whatever.jpg">
</figure>
- ฝั่ง CSS จะใช้ nested selectors เพื่อรวมสถานะอย่าง
.horizontal, .vertical และ :hover ไว้ภายในคอมโพเนนต์
.zine {
...
&.horizontal {
...
}
&.vertical {
...
}
&:hover {
...
}
}
- แม้จะยังไม่ได้ใช้วิธีแบบ Web Components หรือ
@scope เพื่อกันการรบกวนกันระหว่างคอมโพเนนต์ในเชิงโปรแกรม แต่แค่ตั้งธรรมเนียมและยึดตามนั้นก็ช่วยได้มากแล้ว
-
colours
- ใน
colours.css จะรวม CSS variables ที่หยิบมาใช้ได้เมื่อจำเป็น
- สีเป็นเรื่องยาก และในการรีแฟกเตอร์ครั้งนี้ผู้เขียนไม่อยากกลับไปทบทวนการใช้สีใหม่ จึงยังคงแนวทางเดิมไว้
- กฎเดียวคือให้ระบุสีทั้งหมดที่ใช้ในเว็บไซต์ไว้ในไฟล์นี้
:root {
--pink: #fea0c2;
--pink-light: #F9B9B9;
--red: #f91a55;
--orange: rgb(222, 117, 31);
...
}
-
font sizes
- ใน Tailwind แค่เลือกขั้นขนาดอย่าง
text-lg, xl, 2xl ก็พอ จึงไม่ต้องจำว่าจะใช้ em, px หรือ rem
- เพื่อคงประสบการณ์แบบนั้นใน vanilla CSS ผู้เขียนจึงนิยามตัวแปรขนาดที่นำมาจาก Tailwind
--size-xs: 0.75rem;
--line-height-xs: 1rem;
--size-sm: 0.875rem;
--line-height-sm: 1.25rem;
- ขนาดฟอนต์ถูกกำหนดผ่านตัวแปร ซึ่งแม้จะยืดยาวกว่า Tailwind เล็กน้อย แต่ตอนนี้ก็ยังเป็นวิธีที่น่าพอใจ
h3 {
font-size: var(--size-lg);
line-weight: var(--line-weight-lg);
}
-
utilities
- องค์ประกอบที่ซ้ำข้ามหลายคอมโพเนนต์ เช่น ปุ่ม จะถูกจัดไว้ในหมวด utilities
- utility classes บางตัว เช่น
.sr-only สำหรับ element ที่ควรให้ผู้ใช้ screen reader เห็นเท่านั้น ถูกคัดลอกมาจาก Tailwind
- ผู้เขียนพยายามคงส่วนนี้ให้เล็ก และระมัดระวังเวลาแก้ไข
-
base
- สไตล์ “base” คือสไตล์ที่ใช้กับทั้งเว็บไซต์โดยตรง
- เพราะยังไม่มั่นใจพอจะบังคับสไตล์จำนวนมากทั้งไซต์ จึงตั้งใจให้ส่วนนี้เล็กมาก
- ตอนนี้มีกฎที่รู้สึกว่าโอเคอยู่ 2 อย่างสำหรับ
<section> และ a โดยกฎของ <section> อาจเปลี่ยนในภายหลัง
/* put a 950px column in the middle of each <section> */
section {
--inner-width: 950px;
padding: 3rem max(1rem, (100% - var(--inner-width))/2);
}
a {
color: var(--orange);
}
- สำหรับ base styles วิธีที่ดูง่ายที่สุดคือเริ่มจากเกือบว่างไว้ก่อน แล้วค่อยย้ายสิ่งที่พบว่าอยากใช้ร่วมกันจากคอมโพเนนต์ขึ้นมาไว้ใน base แบบ bottom-up
-
spacing
- วิธีจัดการ padding และ margin ยังไม่ได้ถูกกำหนดลงตัวทั้งหมด
- ตอนใช้ Tailwind ผู้เขียนมักใส่ padding กับ margin แบบเฉพาะหน้าไปเรื่อย ๆ จนกว่าจะได้หน้าตาที่ต้องการ และตอนนี้กำลังมองหาวิธีที่มีหลักการกว่านั้น
- ตอนนี้พยายามให้คอมโพเนนต์ layout ชั้นนอกเป็นผู้รับผิดชอบเรื่องระยะห่างให้มากที่สุด
- ถ้าอยากเว้นระยะเท่ากันระหว่างลูกใน
<section> ที่มีลูกหลายตัว ก็อาจใช้กฎแบบนี้
section > *+* {
margin-top: 1rem;
}
-
responsive design
- ใน Tailwind ผู้เขียนใช้ ไวยากรณ์แบบ media query เยอะ เช่น
md:text-xl ที่จะใช้สไตล์ text-xl เมื่อเกินขนาดที่กำหนด
- ตอนนี้พยายามสร้าง layout ด้วย CSS grid ที่ยืดหยุ่นกว่าและไม่ต้องพึ่ง breakpoint มากนัก
- การใช้
auto-fit ช่วยให้บนหน้าจอใหญ่เป็น 2 คอลัมน์ และบนหน้าจอเล็กเป็น 1 คอลัมน์โดยอัตโนมัติ
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), max-content));
justify-content: center;
-
build system
- ระหว่างพัฒนาไม่จำเป็นต้องมี build system แยก
- CSS มี
@import ในตัวอยู่แล้ว จึงสามารถแยกไฟล์แล้วนำเข้ามาใช้ได้
@import "reset.css";
@import "typography.css";
@import "colors.css";
- CSS ยังมี nested selectors ในตัวด้วย
.page {
h2 { ...}
}
- ถ้าอยาก bundle ไฟล์ CSS สำหรับ production ก็สามารถใช้
esbuild ได้
esbuild style.css --bundle --loader:.svg=dataurl --loader:.woff2=file --outfile=/tmp/out.css
- โดยทั่วไปผู้เขียนพยายามเลี่ยงการใช้ระบบ build สำหรับ CSS และ JS แต่สำหรับ
esbuild มองว่าโอเค เพราะอิงเว็บมาตรฐานและเป็น static Go binary
- ผู้เขียนเคยเขียน บทความเกี่ยวกับ esbuild และ Vue ไว้เมื่อปี 2021
1 ความคิดเห็น
ความเห็นจาก Lobste.rs
สำหรับโปรเจกต์ส่วนตัว เดี๋ยวนี้แทบไม่ใช้ เฟรมเวิร์ก CSS/JavaScript แล้ว
เพราะถ้าไม่มี dependency ก็จะไม่มีช่องโหว่ในซัพพลายเชนเกิดขึ้นได้ แน่นอนว่าช่องโหว่ไม่ได้มีแค่นั้น แต่ก็ช่วยได้
เป็นผลรวมของความล้าจากเฟรมเวิร์ก, ภาระจาก
npm auditและการที่มี LLM ทำให้ไม่ต้องสนใจคำตัดสินของคนอื่นเรื่องวิธี implement มากเท่าเดิม เช่นคำถามประมาณว่า “ทำไมไม่ใช้ React กับ Tailwind”นี่ก็เป็นแค่ วิธีการทำงานของ CSS เอง
เวลาเห็นคนไม่รู้เรื่องนี้แล้วใช้ Tailwind แบบไม่ลืมหูลืมตา ก็อยากออกไปตะโกนใส่ก้อนเมฆเลย สำหรับฉัน Tailwind 90% ก็คือ inline style ที่เปลี่ยนแค่ไวยากรณ์ และอาจมองได้ว่าแค่ดีกว่าแท็ก
<FONT>ขึ้นมาขั้นหนึ่งบล็อกโพสต์นี้อธิบายในสิ่งที่ฉันจำเป็นต้องรู้จริงๆ
Tailwind ทำงานต่างจาก inline style มาก และจริงๆ แล้วคล้าย CSS มากกว่ามาก อย่างที่บทความชี้ไว้ นิสัยที่ดีหลายอย่างซึ่งทำให้ใช้ Tailwind ได้เก่ง ก็เป็นนิสัยเดียวกับที่จำเป็นต่อการเขียน CSS อย่างมีประสิทธิภาพ Tailwind ใกล้เคียงกับการแนบ บล็อก CSS ที่มีสโคปโดยนัย ให้ทุกองค์ประกอบ โดยใช้ DSL ที่มีลักษณะเฉพาะมากกว่า
ฉันเข้าใจการทำงานของ CSS ดี แต่ CSS แบบเพียวๆ ยังรู้สึกหนักมือ และฉันก็ไม่ค่อยเก่งด้านกราฟิกดีไซน์ เลยยังใช้ Tailwind อยู่ บทความนี้ให้ไอเดียในการจัดโครงสร้าง CSS โดยอิงจาก Tailwind
สำหรับคนที่ตามกระแสล่าสุดไม่ค่อยทัน บทความนี้ดูเหมือนจะแสดงให้เห็น แนวปฏิบัติ CSS สมัยใหม่ ได้ค่อนข้างดี
ชอบตรงที่มีลิงก์ต่อไปยังบทความที่เป็นแรงบันดาลใจหลายชิ้นด้วย เหมาะจะเก็บไว้อ่าน ตอนนี้ฉันเพิ่งอ่านแค่ "no outer margin"
แต่ก็ยังแอบสงสัยเล็กน้อยกับแนวทางตั้ง default style แบบ “จากล่างขึ้นบน” ไม่รู้ว่าควรทำอย่างอื่นแทนไหม และมันก็ดูน่าลองอยู่ แต่ default style โดยธรรมชาติก็เป็นเรื่องที่จัดการยากอยู่แล้ว
บทความนี้ดีมากจริงๆ
ฉันเองก็ค่อยๆ เรียน CSS ไปพร้อมกับทำเว็บเล็กๆ หลายแบบ และคิดว่าถ้าเริ่มต้นมาพร้อม วิธีคิดเชิงระบบ แบบนี้ก็น่าจะช่วยได้มาก แม้จะค่อนข้างไม่ชอบเฟรมเวิร์ก แต่พอไม่ได้ใช้ ก็ถึงจะทำสิ่งที่ต้องการได้ก็จริง ทว่ามักรู้สึกเหมือนลอยอยู่กลางอากาศแบบไร้โครงสร้าง
ชอบตรงที่ไม่ได้พูดว่า “Tailwind ไม่ดี ก็ไปใช้ CSS เถอะ” แต่เป็นแนวว่า “Tailwind ยอดเยี่ยม แต่ตอนนี้อาจไม่จำเป็นแล้วก็ได้”
ฉันมีปัญหากับการจัดโครงสร้าง CSS ด้วยมือตลอด และบทความนี้ทำให้เริ่มคิดมันในมุมที่ต่างออกไปมาก
ตอนจัดระเบียบ CSS ฉันพบว่า เทคนิคการจัดโครงสร้าง นี้มีประโยชน์มาก: https://rstacruz.github.io/rscss/
โดยรวมแล้วมันเข้ากันได้ดีกับสิ่งที่ jvns อธิบายในบทความต้นทาง และช่วยเติมเรื่องโครงสร้างกับความเป็นระเบียบเข้าไปอีกหน่อย