ฟังก์ชัน

พอดแคสต์ CSS - 020: ฟังก์ชัน

ที่ผ่านมาในหลักสูตรนี้ คุณได้ลองใช้ฟังก์ชัน CSS หลายอย่างแล้ว ในโมดูลตารางกริด คุณรู้จัก minmax() และ fit-content() ซึ่งจะช่วยในการกำหนดขนาดองค์ประกอบ ในโมดูล color คุณรู้จัก rgb() และ hsl() เพื่อช่วยคุณกำหนดสี

เช่นเดียวกับภาษาโปรแกรมอื่นๆ CSS มีฟังก์ชันในตัวมากมาย ซึ่งคุณสามารถเข้าถึงได้ทุกเมื่อที่ต้องการ

ฟังก์ชัน CSS ทุกรายการมีวัตถุประสงค์เฉพาะ ในบทเรียนนี้ คุณจะได้ภาพรวมระดับสูง ซึ่งจะช่วยให้คุณเข้าใจมากขึ้นว่าจะใช้ที่ไหนและอย่างไร

ฟังก์ชันคืออะไร

ฟังก์ชันคือส่วนของโค้ดซึ่งมีชื่ออยู่ในตัวเอง และทำงานบางอย่างให้เสร็จสิ้นได้ ระบบจะตั้งชื่อฟังก์ชันเพื่อให้คุณเรียกใช้ภายในโค้ดและส่งผ่านข้อมูลไปยังฟังก์ชันได้ วิธีนี้เรียกว่าการส่งอาร์กิวเมนต์

แผนภาพฟังก์ชันตามที่อธิบายไว้ข้างต้น

ฟังก์ชัน CSS จำนวนมากเป็นฟังก์ชันเพียงอย่างเดียว ซึ่งหมายความว่าหากคุณส่งอาร์กิวเมนต์เดียวกันใส่ พวกเขาจะให้ผลการค้นหาเดียวกันกลับมาเสมอ โดยไม่คำนึงว่าจะเกิดอะไรขึ้นในโค้ดที่เหลือของคุณ ฟังก์ชันเหล่านี้มักจะประมวลผลใหม่ เมื่อค่ามีการเปลี่ยนแปลงใน CSS คล้ายกับองค์ประกอบอื่นๆ ในภาษา เช่น ค่าแบบ Cascade ที่คำนวณไว้ เช่น currentColor

ใน CSS คุณจะใช้ฟังก์ชันที่ให้มาได้เท่านั้น แทนที่จะเขียนเอง แต่ฟังก์ชันสามารถฝังไว้ภายในกันและกันได้ในบางบริบท เพื่อให้มีความยืดหยุ่นมากขึ้น เราจะอธิบายเรื่องนี้อย่างละเอียดยิ่งขึ้นในส่วนต่อๆ ไปในโมดูลนี้

ตัวเลือกฟังก์ชัน

.post :is(h1, h2, h3) {
    line-height: 1.2;
}

คุณได้เรียนรู้เกี่ยวกับตัวเลือกฟังก์ชันใน โมดูล Pseudo-class ซึ่งฟังก์ชันแบบละเอียด เช่น :is() และ :not() อาร์กิวเมนต์ที่ส่งผ่านไปยังฟังก์ชันเหล่านี้คือตัวเลือก CSS ซึ่งจะมีการประเมิน หากมีองค์ประกอบที่ตรงกัน และระบบจะบังคับใช้กฎ CSS ที่เหลือกับผู้ใช้รายนั้น

พร็อพเพอร์ตี้ที่กำหนดเองและvar()

:root {
    --base-color: #ff00ff;
}

.my-element {
    background: var(--base-color);
}

พร็อพเพอร์ตี้ที่กำหนดเองคือตัวแปรที่ให้คุณแปลงค่าเป็นโทเค็นในโค้ด CSS ได้ พร็อพเพอร์ตี้ที่กำหนดเองยังได้รับผลกระทบจาก Cascade อีกด้วย ซึ่งหมายความว่าสามารถปรับเปลี่ยนหรือเปลี่ยนแปลงตามบริบทได้ พร็อพเพอร์ตี้ที่กำหนดเองต้องนำหน้าด้วยขีดกลาง 2 ขีด (--) และคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

var() มีอาร์กิวเมนต์ที่จำเป็นหนึ่งรายการ: พร็อพเพอร์ตี้ที่กำหนดเองที่คุณพยายามแสดงเป็นค่า ในตัวอย่างข้างต้น ฟังก์ชัน var() ได้ส่งผ่าน --base-color เป็นอาร์กิวเมนต์ หากมีการกำหนด --base-color แล้ว var() จะแสดงผลค่า

.my-element {
    background: var(--base-color, hotpink);
}

นอกจากนี้คุณยังส่งค่าการประกาศสำรองไปยังฟังก์ชัน var() ได้ด้วย ซึ่งหมายความว่าหากไม่พบ --base-color ระบบจะใช้การประกาศที่ส่งผ่านแทน ซึ่งในกรณีของตัวอย่างนี้คือสี hotpink

ฟังก์ชันที่แสดงผลค่า

ฟังก์ชัน var() เป็นเพียงฟังก์ชันหนึ่งของ CSS ที่แสดงผลค่า ฟังก์ชัน เช่น attr() และ url() มีโครงสร้างคล้ายกับ var() คุณได้ส่งอาร์กิวเมนต์อย่างน้อย 1 รายการและใช้อาร์กิวเมนต์เหล่านั้นในด้านขวาของการประกาศ CSS

a::after {
  content: attr(href);
}

ฟังก์ชัน attr() ที่นี่ กำลังใช้เนื้อหาของแอตทริบิวต์ href ขององค์ประกอบ <a> แล้วตั้งค่าเป็น content ขององค์ประกอบเทียม ::after หากค่าในแอตทริบิวต์ href ขององค์ประกอบ <a> มีการเปลี่ยนแปลง ซึ่งจะแสดงในแอตทริบิวต์ content นี้โดยอัตโนมัติ

.my-element {
    background-image: url('/path/to/image.jpg');
}

ฟังก์ชัน url() จะใช้ URL ของสตริงและใช้เพื่อโหลดรูปภาพ แบบอักษร และเนื้อหา หากไม่มีการส่งผ่าน URL ที่ถูกต้องหรือไม่พบแหล่งข้อมูลที่ URL นั้นชี้ไป จะไม่มีการแสดงผลใดๆ โดยฟังก์ชัน url()

ฟังก์ชันสี

คุณดูข้อมูลทั้งหมดเกี่ยวกับฟังก์ชันสีได้ในโมดูล color เราขอแนะนำให้อ่านหากยังไม่ได้อ่าน

ฟังก์ชันสีบางส่วนที่ใช้ได้ใน CSS ได้แก่ rgb(), rgba(), hsl(), hsla(), hwb(), lab() และ lch() พารามิเตอร์ทั้งหมดนี้อยู่ในรูปแบบที่คล้ายกัน ซึ่งมีการส่งผ่านอาร์กิวเมนต์การกำหนดค่าและมีการส่งคืนสีกลับมา

นิพจน์ทางคณิตศาสตร์

เช่นเดียวกับภาษาโปรแกรมอื่นๆ CSS มีฟังก์ชันทางคณิตศาสตร์ที่เป็นประโยชน์เพื่อช่วยคำนวณประเภทต่างๆ

calc()

การรองรับเบราว์เซอร์

  • Chrome: 26
  • ขอบ: 12.
  • Firefox: 16.
  • Safari: 7.

แหล่งที่มา

calc() จะใช้นิพจน์ทางคณิตศาสตร์เพียงรายการเดียวเป็นพารามิเตอร์ นิพจน์ทางคณิตศาสตร์นี้อาจมีทั้งหลายประเภท เช่น ความยาว ตัวเลข มุม และความถี่ นอกจากนี้ยังสามารถผสมหน่วยต่างๆ ได้

.my-element {
    width: calc(100% - 2rem);
}

ในตัวอย่างนี้ ระบบกำลังใช้ฟังก์ชัน calc() เพื่อกำหนดความกว้างขององค์ประกอบ 100% ขององค์ประกอบระดับบนสุด แล้วนำ 2rem ออกจากค่าที่คำนวณนั้น

:root {
  --root-height: 5rem;
}

.my-element {
  width: calc(calc(10% + 2rem) * 2);
  height: calc(var(--root-height) * 3);
}

ฟังก์ชัน calc() สามารถฝังไว้ในฟังก์ชัน calc() อื่นได้ คุณยังส่งผ่านคุณสมบัติที่กำหนดเองในฟังก์ชัน var() โดยเป็นส่วนหนึ่งของนิพจน์ได้ด้วย

min() และ max()

การรองรับเบราว์เซอร์

  • Chrome: 79
  • ขอบ: 79
  • Firefox: 75
  • Safari: 11.1

แหล่งที่มา

min() จะแสดงผลค่าที่คำนวณน้อยที่สุดของอาร์กิวเมนต์ที่ส่งผ่านอย่างน้อยหนึ่งอาร์กิวเมนต์ max() จะดำเนินการตรงกันข้าม: รับค่ามากที่สุดของอาร์กิวเมนต์ที่ส่งผ่านมาอย่างน้อยหนึ่งอาร์กิวเมนต์

.my-element {
  width: min(20vw, 30rem);
  height: max(20vh, 20rem);
}

ในตัวอย่างนี้ ความกว้างควรเป็นค่าที่น้อยที่สุดระหว่าง 20vw ซึ่งเท่ากับ 20% ของความกว้างของวิวพอร์ต และ 30rem ความสูงควรเป็นค่าที่มากที่สุดระหว่าง 20vh ซึ่งเท่ากับ 20% ของความสูงของวิวพอร์ต และ 20rem

แคลมป์

การรองรับเบราว์เซอร์

  • Chrome: 79
  • ขอบ: 79
  • Firefox: 75
  • Safari: 13.1

แหล่งที่มา

clamp() จะใช้อาร์กิวเมนต์ 3 ตัว ได้แก่ ขนาดต่ำสุด ขนาดที่เหมาะสมและสูงสุด

h1 {
  font-size: clamp(2rem, 1rem + 3vw, 3rem);
}

ในตัวอย่างนี้ font-size จะเป็นแบบไหลโดยอิงตามความกว้างของวิวพอร์ต เพิ่มหน่วย vw ลงใน rem เพื่อช่วยในการซูมหน้าจอ เพราะไม่ว่าระดับการซูมจะเป็นอย่างไร หน่วย vw จะมีขนาดเท่ากัน คูณด้วยหน่วย rem ตามขนาดแบบอักษร จะทำให้ฟังก์ชัน clamp() มีจุดการคำนวณแบบสัมพัทธ์

คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน min(), max() และ clamp() ใน บทความนี้

รูปร่าง

clip-path offset-path และ shape-outside พร็อพเพอร์ตี้ CSS ใช้รูปร่างต่างๆ เพื่อตัดภาพของกล่องหรือใส่รูปร่างให้เนื้อหาไหลลื่น

มีฟังก์ชันรูปร่างที่สามารถใช้กับพร็อพเพอร์ตี้ทั้ง 2 รายการนี้ รูปทรงง่ายๆ เช่น circle() ellipse() และ inset() สร้างขนาดอาร์กิวเมนต์การกำหนดค่า รูปร่างที่ซับซ้อนมากขึ้น เช่น polygon() ใช้ค่าที่คั่นด้วยคอมมาของแกน X และ Y เพื่อสร้างรูปร่างที่กำหนดเอง

.circle {
  clip-path: circle(50%);
}

.polygon {
  clip-path: polygon(0% 0%, 100% 0%, 100% 75%, 75% 75%, 75% 100%, 50% 75%, 0% 75%);
}

นอกจากนี้ยังมีฟังก์ชัน path() ที่ใช้กฎการเติม SVG เป็นอาร์กิวเมนต์เช่นเดียวกับ polygon() ทำให้วาดรูปร่างที่ซับซ้อนได้ด้วยเครื่องมือกราฟิก เช่น Illustrator หรือ Inkscape แล้วคัดลอกลงใน CSS

การแปลง

สุดท้ายในภาพรวมของฟังก์ชัน CSS นี้คือฟังก์ชันการเปลี่ยนรูปแบบ ซึ่งเอียง ปรับขนาด หรือแม้กระทั่งเปลี่ยนความลึกขององค์ประกอบ ฟังก์ชันต่อไปนี้ทั้งหมดจะใช้กับพร็อพเพอร์ตี้ transform

การหมุน

การรองรับเบราว์เซอร์

  • Chrome: 1.
  • ขอบ: 12.
  • Firefox: 3.5.
  • Safari: 3.1

แหล่งที่มา

คุณสามารถหมุนองค์ประกอบโดยใช้ rotate() ซึ่งจะหมุนองค์ประกอบบนแกนกลาง คุณยังสามารถใช้ rotateX() rotateY() และ rotateZ() เพื่อหมุนองค์ประกอบบนแกนที่เฉพาะเจาะจงแทน คุณสามารถส่งผ่านหน่วยองศา การหมุน และเรเดียน เพื่อกำหนดระดับของการหมุน

.my-element {
  transform: rotateX(10deg) rotateY(10deg) rotateZ(10deg);
}

rotate3d() มี 4 อาร์กิวเมนต์

การรองรับเบราว์เซอร์

  • Chrome: 12.
  • ขอบ: 12.
  • Firefox: 10.
  • Safari: 4.

แหล่งที่มา

อาร์กิวเมนต์ 3 รายการแรกคือตัวเลขที่กำหนดพิกัด X, Y และ Z อาร์กิวเมนต์ที่ 4 คือการหมุน เช่นเดียวกับฟังก์ชันการหมุนอื่นๆ ยอมรับองศา มุมและการหมุน

.my-element {
  transform: rotate3d(1, 1, 1, 10deg);
}

ปรับขนาด

การรองรับเบราว์เซอร์

  • Chrome: 1.
  • ขอบ: 12.
  • Firefox: 3.5.
  • Safari: 3.1

แหล่งที่มา

คุณเปลี่ยนการปรับขนาดขององค์ประกอบได้ด้วย transform และ scale() ฟังก์ชันนี้จะยอมรับตัวเลข 1 หรือ 2 ตัวเป็นค่าที่กำหนดการปรับขนาดเป็นบวกหรือลบ หากกำหนดอาร์กิวเมนต์ตัวเลขเพียงรายการเดียว ทั้งแกน X และ Y จะได้รับการปรับขนาดเท่ากันและการกำหนดทั้งแกน X และ Y เป็นชวเลขสำหรับ X และ Y เช่นเดียวกับ rotate() เรามี scaleX(), scaleY() และ scaleZ() เพื่อปรับขนาดองค์ประกอบบนแกนที่เฉพาะเจาะจงแทน

.my-element {
  transform: scaleX(1.2) scaleY(1.2);
}

และเช่นเดียวกับฟังก์ชัน rotate ยังมี scale3d() ค่านี้คล้ายกับ scale() แต่มีอาร์กิวเมนต์ 3 อาร์กิวเมนต์ คือ ค่าตัวคูณมาตราส่วน X, Y และ Z

แปล

การรองรับเบราว์เซอร์

  • Chrome: 1.
  • ขอบ: 12.
  • Firefox: 3.5.
  • Safari: 3.1

แหล่งที่มา

translate() ฟังก์ชันจะย้ายองค์ประกอบขณะที่รักษาตำแหน่งในโฟลว์เอกสาร โดยจะยอมรับค่าความยาวและค่าเปอร์เซ็นต์เป็นอาร์กิวเมนต์ ฟังก์ชัน translate() จะแปลองค์ประกอบตามแกน X ถ้ากำหนดอาร์กิวเมนต์ไว้หนึ่งรายการ และแปลองค์ประกอบตามแกน X และ Y หากกำหนดอาร์กิวเมนต์ทั้งสองไว้

.my-element {
  transform: translatex(40px) translatey(25px);
}

คุณสามารถใช้ฟังก์ชันเฉพาะสำหรับแกนที่ต้องการ เช่นเดียวกับฟังก์ชันการแปลงอื่นๆ โดยใช้ translateX translateY และ translateZ คุณยังสามารถใช้ translate3d ซึ่งช่วยให้คุณกำหนดการแปล X, Y และ Z ได้ในฟังก์ชันเดียว

เอียง

การรองรับเบราว์เซอร์

  • Chrome: 1.
  • ขอบ: 12.
  • Firefox: 3.5.
  • Safari: 3.1

แหล่งที่มา

คุณสามารถเอียงองค์ประกอบได้โดยใช้ skew() ซึ่งยอมรับมุมเป็นอาร์กิวเมนต์ ฟังก์ชัน skew() ทำงานในลักษณะที่คล้ายกันมากกับ translate() ถ้าคุณกำหนดอาร์กิวเมนต์เพียง 1 รายการ ฟังก์ชันจะมีผลกับแกน X เท่านั้น และถ้าคุณกำหนดทั้ง 2 อาร์กิวเมนต์ จะส่งผลต่อแกน X และ Y คุณยังสามารถใช้ skewX และ skewY เพื่อให้ส่งผลต่อแกนแต่ละแกนแยกกัน

.my-element {
  transform: skew(10deg);
}

มุมมอง

การรองรับเบราว์เซอร์

  • Chrome: 36
  • ขอบ: 12.
  • Firefox: 16.
  • Safari: 9.

แหล่งที่มา

สุดท้าย คุณสามารถใช้ พร็อพเพอร์ตี้ perspective ซึ่งเป็นส่วนหนึ่งของกลุ่มพร็อพเพอร์ตี้ เพื่อเปลี่ยนระยะห่างระหว่างผู้ใช้และระนาบ Z ซึ่งทำให้รู้สึกถึงระยะห่างและสามารถใช้เพื่อสร้างระยะชัดลึกในการออกแบบของคุณ

ตัวอย่างโดย David Desandro จากบทความที่มีประโยชน์มากนี้ แสดงให้เห็นถึงวิธีการใช้งาน รวมถึงพร็อพเพอร์ตี้ perspective-origin-x และ perspective-origin-y เพื่อสร้างประสบการณ์ 3 มิติอย่างแท้จริง

ฟังก์ชันภาพเคลื่อนไหว การไล่ระดับสี และฟิลเตอร์

CSS ยังมีฟังก์ชันที่ช่วยคุณทำให้องค์ประกอบเคลื่อนไหว ให้ใช้การไล่ระดับสี และใช้ตัวกรองแบบกราฟิกเพื่อปรับแต่งรูปลักษณ์ของรูปภาพ เพื่อให้โมดูลนี้กระชับที่สุด ซึ่งกล่าวถึงในโมดูลที่ลิงก์ ทุกเครื่องมือมีโครงสร้างคล้ายกับฟังก์ชันที่แสดงในโมดูลนี้

ตรวจสอบความเข้าใจ

ทดสอบความรู้ของคุณเกี่ยวกับฟังก์ชัน

ฟังก์ชัน CSS ระบุด้วยอักขระใดได้บ้าง

[]
อักขระเหล่านี้ใช้สำหรับอาร์เรย์ใน JavaScript
{}
อักขระเหล่านี้จะรวมกฎใน CSS
()
ฟังก์ชันใช้อักขระเหล่านี้ในการตัดอาร์กิวเมนต์ ใช่แล้ว!
::
อักขระเหล่านี้มีไว้สำหรับองค์ประกอบจำลองใน CSS
:
อักขระเหล่านี้มีไว้สำหรับ Pseudo-class ใน CSS

CSS มีฟังก์ชันคณิตศาสตร์ในตัวไหม

จริง
ซึ่งมีทั้งฟีเจอร์หลายรายการและอีกมากมายในสเปคและเบราว์เซอร์
เท็จ
ลองอีกครั้งนะ

คุณวางฟังก์ชัน calc() ไว้ใน calc() อื่น เช่น font-size: calc(10px + calc(5px * 3)); ได้

จริง
🎉
เท็จ
ลองอีกครั้งนะ

ข้อใดต่อไปนี้คือฟังก์ชันรูปร่าง CSS

ellipse()
🎉
square()
ลองอีกครั้งนะ
circle()
🎉
rect()
ลองอีกครั้งนะ
inset()
🎉
polygon()
🎉