- กฎ
@property รองรับแล้วในเบราว์เซอร์สมัยใหม่ทั้งหมด และมอบความสามารถในการกำหนดไวยากรณ์ ค่าเริ่มต้น และการสืบทอดของ CSS custom properties อย่างชัดเจน
- เวลาผ่านไปนานมากแล้วนับตั้งแต่มีการเปิดตัว CSS Houdini และ CSS Properties and Values API ครั้งแรก
- บทความนี้พาชมเดโมที่สำรวจความเป็นไปได้ของ
@property เพื่อดูว่า CSS ยุคถัดไปสามารถมอบอะไรได้บ้าง
Calls to action (องค์ประกอบกระตุ้นการกระทำ)
- CTA ที่ดึงดูดสายตาบนหน้าเว็บถูกใช้งานในหลายเว็บไซต์
- ผู้เขียนได้ลองทำสไตล์นี้ด้วยตัวเอง และสามารถดูผลลัพธ์ได้บน CodePen
- หากเปิดแผง CSS ของเดโม จะเห็นกฎ
@property ที่เกี่ยวข้องกับ custom properties ซึ่งต้องใช้ในการทำแอนิเมชัน
@property --gradient-angle {
syntax: "";
initial-value: 0deg;
inherits: false;
}
- กฎ
@property ทำให้เบราว์เซอร์ยอมรับไวยากรณ์นี้และตั้งค่าเริ่มต้นเป็น 0deg
- สิ่งนี้ช่วยให้เบราว์เซอร์เปลี่ยนจาก
0deg ไปเป็น 360deg ได้อย่างลื่นไหล และแสดงผลกราเดียนต์ที่หมุนอยู่ได้
@keyframes rotate-gradient {
to {
--gradient-angle: 360deg;
}
}
.rotate-gradient {
background: conic-gradient(from var(--gradient-angle), transparent, black);
animation: rotate-gradient 10s linear infinite;
}
- เดโมการหมุนกราเดียนต์แบบเรียบง่ายนี้แสดงให้เห็นว่าต้องใช้โค้ดเพียงไม่กี่บรรทัดเพื่อทำแนวคิดนี้ให้เกิดขึ้นจริง
การเปลี่ยนผ่านเมื่อโฮเวอร์แบบลื่นไหล
- เมื่อองค์ประกอบถูกโฮเวอร์ จำเป็นต้องมีรายละเอียดพิเศษบางอย่างเพื่อให้เกิดการเปลี่ยนกราเดียนต์อย่างลื่นไหล
- custom property แต่ละตัวที่ต้องทำแอนิเมชันจะประกาศไวยากรณ์ไว้ในนิยาม
@property เพื่อให้เบราว์เซอร์เปลี่ยนค่าต่าง ๆ ได้อย่างต่อเนื่อง
.shiny-cta {
background: linear-gradient(var(--shiny-cta-bg), var(--shiny-cta-bg)) padding-box,
conic-gradient(from calc(var(--gradient-angle) - var(--gradient-angle-offset)),
transparent, var(--shiny-cta-highlight) var(--gradient-percent),
var(--gradient-shine) calc(var(--gradient-percent) * 2),
var(--shiny-cta-highlight) calc(var(--gradient-percent) * 3),
transparent calc(var(--gradient-percent) * 4)) border-box;
}
- ค่า
--gradient-percent เป็นตัวกำหนดขนาดของบริเวณที่ส่องประกาย และเมื่อโฮเวอร์จะเพิ่มเปอร์เซ็นต์ให้สูงขึ้นเพื่อยืดแสงออก
- ค่า
--gradient-angle-offset ใช้ปรับมุมของกราเดียนต์ใหม่ เพื่อไม่ให้แสงย้อนกลับเมื่อโฮเวอร์
การปรับความเร็วการหมุน
- ทริก CSS สำหรับทำให้การหมุนช้าลงเมื่อโฮเวอร์นั้นมีประโยชน์มาก
- วิธีคือประกาศแอนิเมชันการหมุนเดียวกันสองครั้ง โดยตัวที่สองตั้งให้ย้อนทิศทาง, หยุดชั่วคราว และลดระยะเวลาลงครึ่งหนึ่ง
- เมื่อโฮเวอร์ที่องค์ประกอบ
animation-play-state: running จะเขียนทับค่าหยุดชั่วคราวและทำให้การหมุนช้าลงเหลือครึ่งความเร็ว
จุดแสงเล็ก ๆ
- เพิ่มเอฟเฟกต์จุดเล็ก ๆ ที่เปล่งประกายอยู่ภายในปุ่ม
- ทำได้โดยสร้างพื้นหลังแบบ
radial-gradient
.shiny-cta::before {
--position: 2px;
--space: calc(var(--position) * 2);
background: radial-gradient(circle at var(--position) var(--position),
white calc(var(--position) / 4),
transparent 0) padding-box;
background-size: var(--space) var(--space);
background-repeat: space;
}
- custom property
--gradient-angle ถูกนำไปใช้ในมาสก์ conic-gradient เพื่อเผยให้เห็นบางส่วนของแพตเทิร์นจุดขณะหมุน
เพิ่มความโดดเด่นของสีเมื่อโฮเวอร์
- ปรับปรุงสไตล์ตอนโฮเวอร์ให้มีมิติและสะดุดตามากขึ้น
- ห่อข้อความบนปุ่มด้วยองค์ประกอบ
span แล้วใช้ box-shadow แบบเบลอ เพื่อให้มันขยายและย่อเมื่อโฮเวอร์
นำสไตล์ใหม่มาใช้
- หลายเทคนิคข้างต้นแทบเป็นไปไม่ได้เลยเมื่อไม่นานมานี้
- การกำหนด custom properties อย่างชัดเจนเปิดโอกาสใหม่ ๆ ได้มากมาย
- น่าจับตาว่า
@property จะถูกนำไปใช้ในแอปพลิเคชันขนาดใหญ่และ design system อย่างไรบ้าง
สรุปโดย GN⁺
- กฎ
@property มอบความสามารถในการกำหนดไวยากรณ์ ค่าเริ่มต้น และการสืบทอดของ CSS custom properties อย่างชัดเจน
- ความสามารถนี้ช่วยให้นักพัฒนาเว็บสร้างแอนิเมชันและสไตล์ที่ซับซ้อนและประณีตยิ่งขึ้นได้
- โดยเฉพาะในแอปพลิเคชันขนาดใหญ่และ design system มีแนวโน้มว่าจะใช้งานได้อย่างมีประโยชน์มาก
- โปรเจ็กต์อื่นที่มีความสามารถคล้ายกัน ได้แก่ CSS Houdini และ CSS Properties and Values API
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
รู้สึกเหมือนสมองต่อต้านเมื่อได้เจอแนวคิดใหม่
@propertyด้วยตัวเองเพื่อให้เข้าใจไม่ใช่นักพัฒนาเว็บ แต่ใช้งานเว็บเฟรมเวิร์กพื้นฐานได้
ช่วงหลังสนใจงาน CSS โดยเฉพาะ Houdini
แค่ทำได้ ไม่ได้แปลว่าควรทำเสมอไป
สิ่งที่ทำได้ด้วย CSS animation ให้ความรู้สึกเหมือนเวทมนตร์
เป็นเดโมที่น่าสนใจในเชิงเทคนิค แต่ไม่ควรทำ animation ปุ่มแบบนี้
งานส่งก่อนหน้านี้ไม่ได้รับความสนใจมากนัก แต่ก็น่าสนใจและให้ความรู้
เว็บไซต์นี้ทำให้มีความสุข
สนุกกับการทำงาน CSS แต่ก็เห็นเพื่อนร่วมงานเจอความยากลำบาก
ไม่ได้ทำเว็บมาสักพัก และใช้เวลาพอสมควรกว่าจะเข้าใจว่าฟีเจอร์นี้ทำอะไร
@property --gradient-angle {...}ได้inherits: false;นั้นเห็นชัดว่าทำอะไร แต่ไม่เข้าใจว่าทำไมถึงจำเป็น@property@propertyแล้วอนุมาน type เองไม่ได้หรือ