วันนี้ คุณจะได้เรียนรู้วิธีใช้ภาพเคลื่อนไหว CSS เพื่อทำให้ไอคอนลูกศร SVG เด้งขึ้นและลง คุณจะได้เรียนรู้วิธีปรับแต่งประเภทแอนิเมชั่น เวลา และระยะเวลาด้วยคุณสมบัติแอนิเมชั่น CSS มากมาย
ทำไมสิ่งนี้จึงมีประโยชน์
แอนิเมชั่นเมื่อทำถูกต้องแล้วสามารถ:
- แนะนำผู้ใช้ของคุณ
- กระตุ้นให้ผู้ใช้ดำเนินการ
- ดึงดูดความสนใจของผู้ใช้ (ในขณะที่คุณยังมีอยู่)
ข้อกำหนด
คุณจะต้องใช้โปรแกรมแก้ไขข้อความเพื่อติดตาม หากคุณไม่มีสภาพแวดล้อมการพัฒนาในท้องถิ่น ฉันขอแนะนำ CodePen ตั้งแต่นั้นมา เริ่มเขียนโค้ดได้ทันที
เอาล่ะ มาเริ่มกันเลย!
HTML:เพิ่มคอนเทนเนอร์ &ลูกศร
ในการสร้างตัวอย่างการสาธิตใหม่ คุณต้องมีองค์ประกอบ HTML สี่องค์ประกอบ:
- องค์ประกอบรูปภาพสำหรับไอคอนลูกศร
- องค์ประกอบช่วงสำหรับป้ายกำกับข้อความเหนือลูกศร
- องค์ประกอบคอนเทนเนอร์-ส่วนท้ายสำหรับล้อมรอบลูกศรและป้ายกำกับข้อความ
- องค์ประกอบคอนเทนเนอร์ที่ล้อมรอบองค์ประกอบทั้งหมด
ไปที่โปรแกรมแก้ไข HTML ของคุณและเพิ่มมาร์กอัปต่อไปนี้ใน <body></body>
. ของคุณ องค์ประกอบ:
<div class="container">
<div class="container-footer">
<span class="text-label">Explore</span>
<svg
class="arrow-circle-down bounce"
viewbox="0 0 1792 1792"
xmlns="https://www.w3.org/2000/svg"
>
<path
d="M1412 897q0-27-18-45l-91-91q-18-18-45-18t-45 18l-189 189v-502q0-26-19-45t-45-19h-128q-26 0-45 19t-19 45v502l-189-189q-19-19-45-19t-45 19l-91 91q-18 18-18 45t18 45l362 362 91 91q18 18 45 18t45-18l91-91 362-362q18-18 18-45zm252-1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"
fill="#fff"
></path>
</svg>
</div>
</div>
รหัสลูกศรที่เราเพิ่มด้านบนอยู่ในรูปแบบ SVG อิงจากไลบรารีไอคอน Font Awesome CSS
คุณสามารถเลือกไอคอน Font Awesome ได้หลายร้อยไอคอนในรูปแบบ SVG จากที่เก็บ GitHub นี้
ประหยัดทรัพยากรของคุณ!
เว็บไซต์จำนวนมากโหลดไลบรารี Font Awesome ทั้งหมดบนเว็บไซต์ของพวกเขา แต่ใช้ไอคอนเพียงเล็กน้อยเท่านั้น ซึ่งทำให้แบนด์วิดท์เสียเปล่า คุณสามารถประหยัดทรัพยากรได้มากโดยการดาวน์โหลดไอคอน 5-10 ไอคอนที่คุณต้องการจริงๆ ในรูปแบบ SVG
สำหรับตัวอย่างนี้ เรากำลังฝังไฟล์ SVG ในมาร์กอัป HTML โดยตรง วิธีการนี้เรียกว่า SVG แบบอินไลน์ มีวิธีอื่นๆ มากมายในการเพิ่ม SVG เพื่อวัตถุประสงค์ที่แตกต่างกัน — แต่ฉันจะบันทึกไว้ในบทแนะนำอื่น
ฉันใช้ไอคอน SVG นี้ในบทช่วยสอนนี้
หากคุณเปรียบเทียบซอร์ส SVG ดั้งเดิมกับซอร์สที่คุณเห็นในมาร์กอัป HTML ด้านบน คุณจะเห็นว่าเราได้ทำการเปลี่ยนแปลงบางอย่าง:
- ฉันลบคุณสมบัติความกว้างและความสูง (ไฟล์ต้นฉบับใหญ่เกินไป)
- เพิ่มคลาส:
arrow-circle-down
ซึ่งเราต้องการในส่วน CSS
โอเค ต่อไป มาเพิ่มสไตล์กัน จากนั้นเราจะเข้าสู่ส่วนที่สนุกด้วย CSS แอนิเมชั่น!
จัดรูปแบบคอนเทนเนอร์และลูกศรด้วย CSS
ภายในสไตล์ชีต CSS ของคุณ ให้เพิ่มชุดกฎต่อไปนี้ (คลาส คุณสมบัติ และค่า):
* {
margin: 0;
padding: 0;
}
.container {
display: flex;
background-color: #26a1ff;
height: 100vh;
}
.container-footer {
display: flex;
flex-direction: column;
align-items: center;
margin: auto auto 1rem auto;
}
.text-label {
text-transform: uppercase;
font-family: helvetica;
font-size: 0.75rem;
letter-spacing: 0.2em;
color: #fff;
}
.arrow-circle-down {
display: block;
width: 40px;
height: 40px;
margin: 16px 0;
}
ตอนนี้ หากคุณรีเฟรชหน้าต่างเบราว์เซอร์ ควรมีลักษณะดังนี้:
เกิดอะไรขึ้นใน CSS:
- อันดับแรก เราให้
.container
element ขององค์ประกอบ div หลัก ระดับความสูงค่า 100vh. ทำให้ต้องใช้วิวพอร์ตทั้งหมดไม่ว่าจะใช้อุปกรณ์ใดก็ตาม เราใช้display: flex;
คุณสมบัติเพื่อทำให้เป็นคอนเทนเนอร์แบบยืดหยุ่น ซึ่งเราต้องการสำหรับลูกศรและป้ายกำกับข้อความ นอกจากนี้เรายังให้สีพื้นหลังสีฟ้าอ่อนที่สวยงามอีกด้วย - จากนั้นเราก็ให้
.arrow-circle-down
จำแนกความกว้างคงที่และความสูง 40px ดังนั้นจึงไม่ใช้พื้นที่มากเกินไป ควรสังเกตได้ชัดเจนแต่ไม่เสียสมาธิ - The
.text-label
ได้สไตล์เครื่องสำอางเล็กน้อยด้วยคุณสมบัติตัวพิมพ์ใหญ่และระยะห่างระหว่างตัวอักษร คุณสามารถเปลี่ยนการตั้งค่านี้ได้ตามใจชอบ - เราให้
.container-footer
คุณสมบัติมาร์จิ้นอัตโนมัติที่ด้านบน ขวา และซ้าย สิ่งนี้บังคับให้ส่วนท้ายของคอนเทนเนอร์และลูกของมัน (ไอคอน &ข้อความ) ไปที่ด้านล่างของคอนเทนเนอร์หลัก ซึ่งเป็นที่ที่เราต้องการ ระยะขอบด้านล่างเป็น1rem;
ค่าเพื่อให้แน่ใจว่าทุกอย่างอยู่ภายในวิวพอร์ตเมื่อลูกศรเด้ง - The
.container-footer
คลาสยังได้รับคุณสมบัติ flex บางส่วนflex-direction: column;
และalign-items: center;
. คุณสมบัติเหล่านี้ทำให้องค์ประกอบข้อความและไอคอนซ้อนทับกัน และจัดธีมให้ตรงกึ่งกลางของส่วนท้ายของคอนเทนเนอร์
เพื่อความกระจ่าง margin: auto auto 1rem auto
การประกาศเป็นการจดชวเลขที่ดีสำหรับคำที่ละเอียดยิ่งขึ้น:
margin-top: auto;
margin-right: auto;
margin-bottom: 1rem;
margin-left: auto;
ขั้นต่อไป ได้เวลาทำให้ลูกศรของคุณเด้งด้วยภาพเคลื่อนไหว CSS!
การเลื่อนลูกศรลงด้วย CSS
มีหลายวิธีในการสร้างภาพเคลื่อนไหว ทั้งด้วย CSS, JavaScript และการผสมผสาน สำหรับตัวอย่างนี้ เราจะสร้างภาพเคลื่อนไหวใน CSS เท่านั้น
เราได้เพิ่ม .bounce
. แล้ว คลาสไปยังองค์ประกอบรูปภาพที่มีลูกศร SVG จนถึงตอนนี้ก็ยังไม่ได้ทำอะไรเลยเพราะเรายังไม่ได้กำหนดหรือกำหนดรูปแบบคลาสใน CSS
เพิ่มข้อมูลต่อไปนี้ในสไตล์ชีต CSS ของคุณ:
.bounce {
animation: bounce 2s;
}
@keyframes bounce {
0%,
25%,
50%,
75%,
100% {
transform: translateY(0);
}
40% {
transform: translateY(-20px);
}
60% {
transform: translateY(-12px);
}
}
และตอนนี้ คุณมีลูกศรเด้งแล้ว:
เกิดอะไรขึ้นในโค้ด CSS
ในองค์ประกอบ SVG ที่มีลูกศร เรามีคลาสชื่อ.bounce
. คลาสนี้มีคุณสมบัติที่เรียกว่าanimation
.
คุณสมบัติแอนิเมชั่นมีสองค่า bounce
และ2s
.
bounce
value เป็นฟังก์ชันที่ทริกเกอร์แอนิเมชั่น @keyframe@keyframes bounce
ซึ่งฉันจะไปถึงในอีกสักครู่
2s
ค่า (สองวินาที) คือระยะเวลาทั้งหมดที่แอนิเมชั่น @keyframe ของเราควรรัน
แอนิเมชั่น @keyframe:
- มีระยะเวลารวมสองวินาที (กำหนดโดย
animation property.
) - มีคีย์เฟรมที่แตกต่างกันทั้งหมดเจ็ดคีย์เฟรม 0%, 25%, 40% 50%, 60% 75% และ 100%
- มีตำแหน่งพิกัด Y ที่แตกต่างกันสามตำแหน่ง:Y(0), Y(-20px) และ Y(-12px) พิกัดเหล่านี้คือสิ่งที่กำหนดว่าองค์ประกอบลูกศรจะเคลื่อนที่ขึ้นหรือลง ณ จุดต่างๆ (คีย์เฟรม) ในเวลาต่างกันหรือไม่
บล็อก @keyframe แรก {..} กล่าวว่าที่คีย์เฟรมทั้งห้านี้:0%, 25%, 50%, 75% และ 100% — ลูกศรควรอยู่ที่ตำแหน่งเริ่มต้น ซึ่งคือ Y(0px)
0%,
25%,
50%,
75%,
100% {
transform: translateY(0);
}
บล็อก @keyframe ที่สอง บอกว่าที่เครื่องหมาย 40% ลูกศรควรเลื่อนขึ้นโดยกำหนดตำแหน่ง Y(-20px)
40% {
transform: translateY(-20px);
}
บล็อกคีย์เฟรมที่สาม บอกว่าที่เครื่องหมาย 60% ลูกศรควรเลื่อนขึ้นอีกครั้ง ครั้งนี้เราเลื่อนลูกศรขึ้นเพียงครึ่งเดียวของครั้งแรก โดยให้ตำแหน่งเป็น Y(-12px)
60% {
transform: translateY(-12px);
}
สังเกตว่าอยู่ระหว่าง คีย์เฟรมทั้งสองที่ลูกศรเลื่อนขึ้น (40% และ 60%) จะย้ายกลับไปที่ Y(0) ที่คีย์เฟรม 50% นั่นคือสิ่งที่ทำให้ลูกศรเลื่อนขึ้นและลงสองครั้ง ค่อนข้างเร็วภายในระยะเวลาอันสั้น
ฉันตัดสินใจขยับลูกศรเพียง -12px ในตำแหน่งที่สามเพราะมันเลียนแบบลูกบอลกระดอนในชีวิตจริง ครั้งที่สอง ลูกบอลที่กระทบพื้นจะเคลื่อนที่ขึ้นน้อยกว่าครั้งแรก แน่นอนว่าลูกบอลกระดอนได้มากแค่ไหน (และสูงแค่ไหน) นั้นพิจารณาจากปัจจัยหลายประการ เช่น น้ำหนัก ความเร็ว ประเภทของวัสดุ ฯลฯ แต่นั่นทำให้เรามีพื้นที่กระดิกมากขึ้นเท่านั้น เนื่องจากไม่มีทางเดียว ที่จะทำ
หาก CSS สำหรับภาพเคลื่อนไหวสร้างความสับสน ให้ลองใช้ระยะเวลาและ CSSแปลงการแปล คุณสมบัติ. เมื่อฝึกฝนสักหน่อย การเชื่อมต่อจุดต่างๆ จะง่ายขึ้นมาก
- ลองให้คีย์เฟรม 40% เป็นคุณสมบัติการแปลการแปลงเป็น -48px แล้วดูว่าเกิดอะไรขึ้น
- พยายามให้ CSS
animation
คุณสมบัติเป็นระยะเวลา 5 วินาทีแทนที่จะเป็น 2 จากนั้นลองให้ค่า 100ms (คุณสามารถใช้มิลลิวินาทีแทนวินาที)
การขับรถแนวคิดกลับบ้านมักจะง่ายกว่า หากคุณทดลองกับความสุดขั้ว ปกติแล้วฉันจะมีช่วงเวลา "aha" ของฉัน
ทดลอง!
ภาพเคลื่อนไหว CSS มีความเป็นไปได้มากมาย มาดูรูปแบบสั้นๆ ที่เราสามารถสร้างให้กับแอนิเมชั่นที่มีอยู่ของเรากัน
คุณสมบัติการเลื่อนภาพเคลื่อนไหว
ตอนนี้ลูกศรของคุณจะเด้งทันทีที่โหลดหน้าเว็บของคุณแล้ว คุณอาจต้องการหน่วงเวลาเล็กน้อย เพื่อให้ผู้ใช้ของคุณไม่ฟุ้งซ่านภายในไม่กี่วินาทีหลังจากเข้าสู่ไซต์ของคุณ
คุณสามารถทำได้โดยเพิ่มanimation delay
คุณสมบัติไปยัง .bounce
. ของคุณ คลาสเช่นนี้:
.bounce {
animation: bounce 2s;
animation-delay: 5s;
}
ตอนนี้แอนิเมชั่นคีย์เฟรม 2 วินาทีจะไม่เริ่มทำงานจนกว่าจะโหลดหน้าเว็บของคุณครบ 5 วินาที
คุณสมบัติการนับซ้ำของแอนิเมชั่น
บางครั้งคุณต้องการเล่นแอนิเมชั่นซ้ำสองสามครั้ง ในการทำซ้ำภาพเคลื่อนไหวเราใช้animation-iteration-count
คุณสมบัติเช่นนี้:
.bounce {
animation: bounce 2s;
animation-delay: 5s;
animation-iteration-count: 2;
}
ตอนนี้ลูกศรของคุณเริ่มกระเด้งหลังจากผ่านไป 5 วินาที แต่คราวนี้จะเล่นแอนิเมชั่นคีย์เฟรมซ้ำอีกครั้ง
ภาพเคลื่อนไหว CSS ที่ไม่มีที่สิ้นสุด
บางครั้ง ในบางกรณี คุณต้องการให้แอนิเมชั่น CSS ทำงานอย่างไม่สิ้นสุด ในการทำเช่นนั้น คุณต้องเปลี่ยนการวนซ้ำของแอนิเมชันเป็นinfinite;
แบบนี้:
.bounce {
animation: bounce 2s;
animation-iteration-count: infinite;
}
แต่ก้าวอย่างระมัดระวังด้วยแอนิเมชั่นที่ไม่มีที่สิ้นสุด ไม่มีใครชอบแอนิเมชั่นที่หมุนวนไปตลอดกาล
ข้อยกเว้นคือถ้าคุณมีพื้นหลังของพื้นที่อยู่อาศัยบางประเภทที่มีดาวดวงเล็กๆ จำนวนมากที่มีภาพเคลื่อนไหวกะพริบถี่ๆ คุณอาจต้องการวนซ้ำ/เล่นภาพเคลื่อนไหวซ้ำเพื่อจุดประสงค์ประเภทนั้น เพื่อรักษาบรรยากาศให้มีชีวิตชีวา
คำนำหน้าอัตโนมัติ
ในการทำให้โค้ดนี้ใช้ได้กับเบราว์เซอร์รุ่นใหม่ทั้งหมด คุณควรใช้ตัวเติมคำอัตโนมัติ ฉันไม่ได้เพิ่มพวกเขาในโค้ดที่นี่เพราะฉันต้องการทำให้โค้ดสั้นลงและอ่านง่ายขึ้น หากคุณไปที่ CodePen นี้ คุณจะได้รับรหัสทั้งหมด รวมถึงคุณสมบัติที่นำหน้าด้วย
ทรัพยากรอนิเมชั่น CSS
- MDN Web Docs:ภาพเคลื่อนไหว CSS