กฎ CSS `@`
บทความนี้อธิบายกฎ @
ของ CSS
คุณสามารถเรียนรู้เกี่ยวกับการใช้งานและวิธีเขียนกฎ @
เช่น @import
และ @media
YouTube Video
HTML สำหรับการแสดงตัวอย่าง
css-at-rule.html
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>CSS At Rules</title>
7 <link rel="stylesheet" href="css-base.css">
8 <link rel="stylesheet" href="css-at-rule.css">
9</head>
10<body>
11 <!-- Header -->
12 <header>
13 <h1>CSS At(@) Rules</h1>
14 </header>
15
16 <!-- Main content -->
17 <main>
18 <header><h2>CSS At(@) Rules</h2></header>
19 <article>
20 <h3>@import</h3>
21 <section>
22 <header><h4>CSS</h4></header>
23<pre class="sample">
24@import url('styles.css');
25</pre>
26 </section>
27 </article>
28 <article>
29 <h3>@media</h3>
30 <section>
31 <header><h4>CSS</h4></header>
32<pre class="sample">
33@media screen and (max-width: 600px) {
34 body {
35 background-color: lightblue;
36 }
37}
38</pre>
39 </section>
40 </article>
41 <article>
42 <h3>@media Example(Screen Width)</h3>
43 <section>
44 <header><h4>CSS</h4></header>
45<pre class="sample">
46@media (min-width: 600px) {
47 body {
48 background-color: lightblue;
49 }
50}
51@media (max-width: 599px) {
52 body {
53 background-color: lightpink;
54 }
55}
56</pre>
57 </section>
58 </article>
59 <article>
60 <h3>@media Example(Orientation)</h3>
61 <section>
62 <header><h4>CSS</h4></header>
63<pre class="sample">
64@media (orientation: portrait) {
65 body {
66 font-size: 18px;
67 }
68}
69@media (orientation: landscape) {
70 body {
71 font-size: 16px;
72 }
73}
74</pre>
75 </section>
76 </article>
77 <article>
78 <h3>@media Example(Resolution)</h3>
79 <section>
80 <header><h4>CSS</h4></header>
81<pre class="sample">
82@media (min-resolution: 2dppx) {
83 body {
84 background-image: url('high-res-image.png');
85 }
86}
87</pre>
88 </section>
89 </article>
90 <article>
91 <h3>@media Example(AND Condition)</h3>
92 <section>
93 <header><h4>CSS</h4></header>
94<pre class="sample">
95@media (min-width: 600px) and (orientation: portrait) {
96 body {
97 background-color: lightgreen;
98 }
99}
100</pre>
101 </section>
102 </article>
103 <article>
104 <h3>@media Example(OR Condition)</h3>
105 <section>
106 <header><h4>CSS</h4></header>
107<pre class="sample">
108@media (max-width: 400px), (orientation: landscape) {
109 body {
110 color: gray;
111 }
112}
113</pre>
114 </section>
115 </article>
116 <article>
117 <h3>@media Example(NOT Condition)</h3>
118 <section>
119 <header><h4>CSS</h4></header>
120<pre class="sample">
121@media not all and (min-width: 600px) {
122 body {
123 font-size: 14px;
124 }
125}
126</pre>
127 </section>
128 </article>
129 <article>
130 <h3>@font-face</h3>
131 <section>
132 <header><h4>CSS</h4></header>
133<pre class="sample">
134@font-face {
135 font-family: 'CustomFont';
136 src: url('customfont.woff2') format('woff2'),
137 url('customfont.woff') format('woff');
138}
139</pre>
140 </section>
141 </article>
142 <article>
143 <h3>@keyframes</h3>
144 <section>
145 <header><h4>CSS</h4></header>
146<pre class="sample">
147@keyframes slidein {
148 from {
149 transform: translateX(100%);
150 }
151 to {
152 transform: translateX(0%);
153 }
154}
155
156div {
157 animation: slidein 2s ease-in-out;
158}
159</pre>
160 </section>
161 </article>
162 <article>
163 <h3>@supports</h3>
164 <section>
165 <header><h4>CSS</h4></header>
166<pre class="sample">
167@supports (display: grid) {
168 .container {
169 display: grid;
170 }
171}
172</pre>
173 </section>
174 </article>
175 <article>
176 <h3>@page</h3>
177 <section>
178 <header><h4>CSS</h4></header>
179<pre class="sample">
180@page {
181 size: A4;
182 margin: 2cm;
183}
184</pre>
185 </section>
186 </article>
187 <article>
188 <h3>@charset</h3>
189 <section>
190 <header><h4>CSS</h4></header>
191<pre class="sample">
192@charset "UTF-8";
193</pre>
194 </section>
195 </article>
196 <article>
197 <h3>@layer</h3>
198 <section>
199 <header><h4>CSS</h4></header>
200<pre class="sample">
201@layer reset {
202 h1 {
203 margin: 0;
204 }
205}
206@layer base {
207 h1 {
208 font-size: 24px;
209 color: blue;
210 }
211}
212@layer theme {
213 h1 {
214 color: red;
215 }
216}
217</pre>
218 <header><h4>HTML</h4></header>
219<pre>
220<h1>CSS Layer Test</h1>
221<p>
222 This page demonstrates how to apply styles to
223 the <code>&lt;h1&gt;</code> element using CSS layers.
224</p>
225</pre>
226 <header><h4>HTML+CSS</h4></header>
227 <section class="sample-view">
228 <h1>CSS Layer Test</h1>
229 <p>
230 This page demonstrates how to apply styles to
231 the <code><h1></code> element using CSS layers.
232 </p>
233 </section>
234 </section>
235 </article>
236 <article>
237 <h3>@layer with order</h3>
238 <section>
239 <header><h4>CSS</h4></header>
240<pre class="sample">
241@layer theme, base, reset;
242
243@layer reset {
244 h1 {
245 margin: 0;
246 }
247}
248@layer base {
249 h1 {
250 font-size: 24px;
251 color: blue;
252 }
253}
254@layer theme {
255 h1 {
256 color: red;
257 }
258}
259</pre>
260 <header><h4>HTML</h4></header>
261<pre>
262<h1>CSS Layer Test</h1>
263<p>
264 This page demonstrates how to apply styles to
265 the <code>&lt;h1&gt;</code> element using CSS layers.
266</p>
267</pre>
268 <header><h4>HTML+CSS</h4></header>
269 <section class="sample-view">
270 <h1>CSS Layer Test</h1>
271 <p>
272 This page demonstrates how to apply styles to
273 the <code><h1></code> element using CSS layers.
274 </p>
275 </section>
276 </section>
277 </article>
278 <article>
279 <h3>@import & @layer</h3>
280 <section>
281 <header><h4>CSS</h4></header>
282<pre class="sample">
283@import url('css/reset.css') layer(reset);
284@import url('css/base.css') layer(base);
285@import url('css/theme.css') layer(theme);
286</pre>
287 <header><h4>HTML</h4></header>
288<pre>
289<h1>CSS Layer Test</h1>
290<p>
291 This page demonstrates how to apply styles to
292 the <code>&lt;h1&gt;</code> element using CSS layers.
293</p>
294</pre>
295 <header><h4>HTML+CSS</h4></header>
296 <section class="sample-view">
297 <h1>CSS Layer Test</h1>
298 <p>
299 This page demonstrates how to apply styles to
300 the <code><h1></code> element using CSS layers.
301 </p>
302 </section>
303 </section>
304 </article>
305 </main>
306</body>
307</html>
กฎ CSS @
กฎ @
ของ CSS (at-rules) เป็นคำสั่งพิเศษที่ใช้ควบคุมพฤติกรรมและเงื่อนไขการใช้งานของสไตล์ชีต ไม่เหมือนกับคุณสมบัติ CSS ปกติ กฎ @
จะนำสไตล์ไปใช้หรือดึงทรัพยากรภายนอกมาใช้งานตามเงื่อนไข ตัวอย่างกฎ @
ได้แก่ @media
, @import
, และ @keyframes
ประเภทของกฎ @
ตัวอย่าง
@import
1@import url('styles.css');
@import
ใช้เพื่อดึงไฟล์ CSS อื่นเข้ามาในสไตล์ชีตปัจจุบัน ช่วยให้การนำไฟล์ CSS ภายนอกมาใช้ซ้ำได้ง่ายขึ้น
จุดสังเกต:
@import
ต้องถูกเขียนไว้ที่จุดเริ่มต้นของสไตล์ชีต- ควรหลีกเลี่ยงในการใช้งานกับโปรเจกต์ใหญ่เนื่องจากส่งผลต่อประสิทธิภาพการทำงาน
@media
1@media screen and (max-width: 600px) {
2 body {
3 background-color: lightblue;
4 }
5}
@media
ใช้คำสั่ง media query เพื่อกำหนดสไตล์ตามเงื่อนไขเฉพาะ (เช่น ความกว้างของหน้าจอ, ความละเอียด เป็นต้น) มักถูกใช้ในการพัฒนาออกแบบเว็บไซต์ให้ตอบสนองต่ออุปกรณ์ต่าง ๆ (responsive design)
เงื่อนไขที่ใช้บ่อย
ต่อไปนี้คือเงื่อนไขทั่วไปที่ใช้บ่อยใน media queries
เงื่อนไขตามความกว้าง
1@media (min-width: 600px) {
2 body {
3 background-color: lightblue;
4 }
5}
6@media (max-width: 599px) {
7 body {
8 background-color: lightpink;
9 }
10}
- ความกว้างขั้นต่ำ (
min-width
) ใช้สไตล์เมื่อความกว้างเท่ากับหรือมากกว่าค่าที่กำหนด - ความกว้างสูงสุด (
max-width
) ใช้สไตล์เมื่อความกว้างเท่ากับหรือน้อยกว่าค่าที่กำหนด
ลักษณะการวางแนวของอุปกรณ์ (orientation
)
1@media (orientation: portrait) {
2 body {
3 font-size: 18px;
4 }
5}
6@media (orientation: landscape) {
7 body {
8 font-size: 16px;
9 }
10}
- ลักษณะการวางแนวของอุปกรณ์ (
orientation
) สามารถตั้งค่าเป็น แนวตั้ง หรือ แนวนอน
ความละเอียด (resolution
)
1@media (min-resolution: 2dppx) {
2 body {
3 background-image: url('high-res-image.png');
4 }
5}
- สไตล์สามารถถูกใช้งานได้ตาม ความละเอียด (
resolution
) - ในตัวอย่างนี้ มีการกำหนดภาพพื้นหลังความละเอียดสูงสำหรับหน้าจอที่มีความละเอียดสูง
การรวมเงื่อนไข
Media queries สามารถรวมเงื่อนไขหลายอย่างเข้าด้วยกัน
เงื่อนไข AND (and
)
1@media (min-width: 600px) and (orientation: portrait) {
2 body {
3 background-color: lightgreen;
4 }
5}
- เงื่อนไข AND ใช้สไตล์เมื่อเงื่อนไขทั้งหมดตรงตามที่กำหนด
- ในตัวอย่างนี้ เมื่อความกว้างของหน้าจอเป็น
600px
หรือมากกว่าและอยู่ในแนวตั้ง สีพื้นหลังของbody
จะถูกตั้งค่าเป็นสีเขียวอ่อน
เงื่อนไข OR (,
)
1@media (max-width: 400px), (orientation: landscape) {
2 body {
3 color: gray;
4 }
5}
- เงื่อนไข OR ใช้สไตล์เมื่อมีเงื่อนไขใดเงื่อนไขหนึ่งที่ตรงตามที่กำหนด
- ในตัวอย่างนี้ เมื่อความกว้างของหน้าจอเป็น
400px
หรือน้อยกว่าหรืออยู่ในแนวนอน สีข้อความของbody
จะถูกตั้งค่าเป็นสีเทา
เงื่อนไข NOT (not
)
1@media not all and (min-width: 600px) {
2 body {
3 font-size: 14px;
4 }
5}
- เงื่อนไข NOT ใช้สไตล์เมื่อเงื่อนไขไม่ตรงตามที่กำหนด
- ในตัวอย่างนี้ สำหรับอุปกรณ์ทั้งหมด เมื่อความกว้างของหน้าจอไม่ใช่
600px
หรือมากกว่า ขนาดตัวอักษรของbody
จะถูกตั้งค่าเป็น14px
@font-face
1@font-face {
2 font-family: 'CustomFont';
3 src: url('customfont.woff2') format('woff2'),
4 url('customfont.woff') format('woff');
5}
@font-face
ใช้เพื่อกำหนดฟอนต์สำหรับเว็บ ด้วยกฎนี้สามารถดาวน์โหลดฟอนต์จากภายนอกและนำมาใช้กับหน้าเว็บได้
- สามารถใช้ฟอนต์ที่กำหนดเองแทนการใช้ฟอนต์มาตรฐานได้
- ควรใส่ใจกับขนาดไฟล์ของฟอนต์
@keyframes
1@keyframes slidein {
2 from {
3 transform: translateX(100%);
4 }
5 to {
6 transform: translateX(0%);
7 }
8}
9
10div {
11 animation: slidein 2s ease-in-out;
12}
@keyframes
ใช้เพื่อสร้างแอนิเมชันใน CSS สามารถกำหนดสไตล์ที่แต่ละขั้นตอนของแอนิเมชันได้
- ช่วยให้ควบคุมรายละเอียดของแอนิเมชันได้
- ใช้ควบคู่กับคุณสมบัติ
animation
@supports
1@supports (display: grid) {
2 .container {
3 display: grid;
4 }
5}
@supports
ใช้เพื่อตรวจสอบว่าบราวเซอร์รองรับคุณสมบัติ CSS บางอย่างหรือไม่ และกำหนดสไตล์ตามผลลัพธ์
- ช่วยรักษาความเข้ากันได้ระหว่างบราวเซอร์เวอร์ชันเก่าและใหม่
- สามารถกำหนด fallback ได้ผ่านการตรวจสอบคุณสมบัติ
@page
1@page {
2 size: A4;
3 margin: 2cm;
4}
@page
ใช้เพื่อควบคุมสไตล์สำหรับงานพิมพ์ เป็นประโยชน์สำหรับการตั้งค่าขนาดหน้ากระดาษและระยะขอบ
จุดสังเกต:
- ใช้สำหรับตั้งค่ารูปแบบสำหรับสื่อสิ่งพิมพ์
- คุณยังสามารถปรับแต่งรูปแบบของส่วนต่าง ๆ บนหน้า เช่น ส่วนหัวและส่วนท้ายหน้าได้
@charset
1@charset "UTF-8";
@charset
กำหนดการเข้ารหัสตัวอักษรในไฟล์ CSS โดยส่วนใหญ่จะกำหนดเป็น UTF-8
- ต้องระบุไว้ในตอนเริ่มต้นของไฟล์สไตล์ชีต
- ใช้โดยเฉพาะกับเว็บไซต์ที่มีหลายภาษา
@layer
@layer
เป็นกฎ @
ใหม่ที่ใช้สำหรับจัดระเบียบลำดับของสไตล์ชีตใน CSS โดยอนุญาตให้กฎ CSS หลายตัวถูกรวมเข้าด้วยกันและจัดการด้วยเลเยอร์ กฎนี้มีประโยชน์เป็นพิเศษในสไตล์ชีตขนาดใหญ่หรือโครงการที่รวมถึงสไตล์ชีตภายนอกหลายชุด เพื่อให้ง่ายต่อการหลีกเลี่ยงความขัดแย้งของ CSS
ในสไตล์ชีต CSS ลำดับความสำคัญมักจะถูกกำหนดโดย 'cascade' แต่ด้วยการใช้ @layer
คุณสามารถควบคุมลำดับความสำคัญของสไตล์ได้ยืดหยุ่นและชัดเจนยิ่งขึ้น
ไวยกรณ์พื้นฐาน
1@layer <layer-name> {
2 /* Styles within this layer */
3}
- เมื่อกำหนดสไตล์โดยใช้
@layer
ไวยากรณ์จะเป็นประมาณนี้
1@layer reset {
2 h1 {
3 margin: 0;
4 }
5}
6@layer base {
7 h1 {
8 font-size: 24px;
9 color: blue;
10 }
11}
12@layer theme {
13 h1 {
14 color: red;
15 }
16}
- ตัวอย่างเช่น คุณสามารถกำหนดสไตล์ในชั้นต่างๆดังนี้:
- ในกรณีนี้จะมีการกำหนดเลเยอร์
reset
,base
และtheme
ตามลำดับ และสไตล์สุดท้ายของh1
จะถูกกำหนดจากเนื้อหาในเลเยอร์theme
ทำให้color: red;
ถูกนำมาใช้
ลำดับความสำคัญของชั้นหลายชั้น
คุณสมบัติอันทรงพลังของ @layer
คือช่วยให้สามารถจัดการลำดับความสำคัญของสไตล์ระหว่างเลเยอร์ได้ ในตัวอย่างข้างต้น เนื่องจากเลเยอร์ theme
ถูกกำหนดไว้สุดท้าย จึงทำให้ครอบคลุมสไตล์ที่ถูกกำหนดในเลเยอร์อื่น
นอกจากนี้ @layer
ยังสามารถใช้เพื่อจัดการลำดับความสำคัญในสไตล์ชีตภายนอกหรือไฟล์ CSS ที่โหลดมาจากไลบรารีอื่น ๆ
ลำดับความสำคัญรวม
1@layer theme, base, reset;
2
3@layer reset {
4 h1 {
5 margin: 0;
6 }
7}
8@layer base {
9 h1 {
10 font-size: 24px;
11 color: blue;
12 }
13}
14@layer theme {
15 h1 {
16 color: red;
17 }
18}
- ลำดับของเลเยอร์จะถูกจัดลำดับความสำคัญใน CSS cascade โดยสไตล์ที่กำหนดในภายหลังจะมีลำดับสูงกว่า ตัวอย่างเช่น คุณสามารถกำหนดลำดับของเลเยอร์โดยชัดเจนได้โดยการเขียนแบบนี้
- สิ่งนี้ช่วยให้มั่นใจว่าสไตล์จะถูกนำมาใช้ตามลำดับ
theme
,base
, และreset
แม้ว่าชั้นtheme
จะถูกกำหนดขึ้นก่อน
การใช้ @import
ร่วมกับ @layer
1@import url('css/reset.css') layer(reset);
2@import url('css/base.css') layer(base);
3@import url('css/theme.css') layer(theme);
- โดยการผสมผสาน
@import
และ@layer
ทำให้สามารถจัดการเลเยอร์ในสไตล์ชีตภายนอกได้เช่นกัน - สิ่งนี้อนุญาตให้สไตล์ชีตภายนอกถูกวางในเลเยอร์ต่าง ๆ และจัดการลำดับความสำคัญของมัน
ประเด็นสำคัญของ @layer
@layer
เป็นเครื่องมือที่ทรงพลังในการจัดการสไตล์ CSS โดยมอบวิธีที่สะดวกในการหลีกเลี่ยงความขัดแย้งของสไตล์ในโครงการขนาดใหญ่ มันน่าสังเกตเป็นพิเศษในการจัดการลำดับความสำคัญของสไตล์อย่างกระชับเมื่อจัดการกับแหล่งที่มาของสไตล์หลายแหล่ง ควรพิจารณาประเด็นต่อไปนี้
- โดยการแยกสไตล์ออกเป็นเลเยอร์ คุณสามารถควบคุมลำดับความสำคัญของการ cascade ได้
- โดยการใช้งานร่วมกับ
@import
คุณสามารถรวมไฟล์ CSS ภายนอกเข้ากับการจัดการเลเยอร์ได้ - การกำหนดหลายเลเยอร์สามารถป้องกันความขัดแย้งของสไตล์ได้
สิ่งนี้ช่วยลดการชนกันของสไตล์และช่วยให้การออกแบบมีประสิทธิภาพ แม้ในโครงการที่ต้องการการจัดการสไตล์ที่ซับซ้อน
ตัวอย่างการใช้งาน @layer
เมื่อใช้งาน @layer
คุณสามารถพิจารณาประเด็นต่างๆ เช่น การตั้งชื่อเลเยอร์ ลำดับการนำเข้า และจำนวนเลเยอร์ที่เหมาะสมกับขนาดของโครงการ
การตั้งชื่อเลเยอร์
ชื่อเลเยอร์ถูกกำหนดตามโครงสร้างและวัตถุประสงค์ของโครงการ ตัวอย่างทั่วไปของการตั้งชื่อเลเยอร์มีดังนี้:
1@layer base, layout, components, utilities;
base
: เลเยอร์ที่กำหนดสไตล์พื้นฐาน เช่น การรีเซ็ตและรูปแบบตัวอักษรlayout
: เลเยอร์ที่กำหนดสไตล์สำหรับการจัดรูปแบบหน้าและระบบกริดcomponents
: เลเยอร์ที่กำหนดสไตล์สำหรับส่วนประกอบ UI ที่ใช้ซ้ำได้ เช่น ปุ่มและการ์ดutilities
: เลเยอร์ที่กำหนดสไตล์สำหรับคลาสยูทิลิตี้ (เช่นmargin
,padding
,text-center
)
ลำดับการนำเข้าที่ชัดเจน
1@import url('base.css') layer(base);
2@import url('layout.css') layer(layout);
3@import url('components.css') layer(components);
4@import url('utilities.css') layer(utilities);
- เมื่อจัดการไฟล์ CSS หลายไฟล์ ควรกำหนดลำดับที่ชัดเจนโดยใช้
@import
ลำดับนี้ช่วยให้มั่นใจว่าลำดับความสำคัญที่ต้องการสามารถคงอยู่ได้
การรวบรวมและทำให้เลเยอร์เรียบง่าย
1@layer common {
2 body {
3 margin: 0;
4 padding: 0;
5 box-sizing: border-box;
6 }
7
8 .container {
9 max-width: 1200px;
10 margin: 0 auto;
11 }
12}
- ในโครงการขนาดเล็ก การจำกัดจำนวนเลเยอร์สามารถลดความซับซ้อนลงได้
สรุป
กฎ @
ของ CSS เป็นเครื่องมือที่ทรงพลังที่สนับสนุนการใช้งานสไตล์ที่ยืดหยุ่นและเพิ่มประสิทธิภาพในงานออกแบบเว็บไซต์ @media
, @keyframes
และ @supports
ช่วยให้ง่ายต่อการปรับสไตล์โดยคำนึงถึงความแตกต่างของอุปกรณ์และความเข้ากันได้ของเบราว์เซอร์ นอกจากนี้ @import
และ @font-face
ยังช่วยให้การนำเข้าทรัพยากรภายนอกเพื่อการแสดงออกที่หลากหลายทำได้อย่างมีประสิทธิภาพ
การเข้าใจและการใช้กฎ @
เหล่านี้อย่างถูกต้อง ช่วยให้การเขียน CSS มีประสิทธิภาพมากยิ่งขึ้น
คุณสามารถติดตามบทความข้างต้นโดยใช้ Visual Studio Code บนช่อง YouTube ของเรา กรุณาตรวจสอบช่อง YouTube ด้วย