ภาพเคลื่อนไหว CSS: บทนำและตัวอย่าง

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

เอฟเฟกต์ภาพเคลื่อนไหวพื้นฐานที่สุดใน CSS สามารถทำได้ผ่านคุณสมบัติ เช่น transform และ transition อย่างไรก็ตาม แบบร่างการทำงานของ CSS Animations ระดับ 1 ให้สภาพแวดล้อมที่ซับซ้อนมากขึ้นโดยใช้คุณสมบัติ animation และ @keyframes เพื่อให้ได้เอฟเฟกต์แอนิเมชั่นถาวร สิ่งนี้เข้าใจได้ดีที่สุดผ่านตัวอย่างที่ชัดเจน

การระบุกฎแอนิเมชั่นโดยใช้ @keyframes

กฎ @keyframes ใช้เพื่อระบุพฤติกรรมของแอนิเมชันที่เราต้องการนำไปใช้กับตัวระบุแอนิเมชั่นในเลย์เอาต์ของหน้า ตัวระบุถูกระบุผ่าน animation-name หรือโดยใช้ animation: name; ชวเลข

 @keyframes change-color { from { background-color: #fff; } to { background-color: #000; } }

ในบริบทนี้ ตัวอย่างด้านบนจะเปลี่ยน background-color ขาวเป็นสีดำตลอดระยะเวลาของแอนิเมชัน from หมายถึงจุดเริ่มต้น (0%) และหมาย to จุดสิ้นสุด (100%) ดังนั้น กฎสามารถเขียนใหม่ด้วยค่าเปอร์เซ็นต์ได้

 @keyframes change-color { 0% { background-color: #fff; } 50% { background-color: #f3f3f3; } 100% { background-color: #000; } }

ด้วยตัวของมันเอง สิ่งนี้จะไม่ทำอะไรเลยเว้นแต่เราจะระบุองค์ประกอบที่เราต้องการทำให้เคลื่อนไหว นอกจากนี้ คุณต้องระบุ animation-duration เนื่องจากค่าเริ่มต้นคือ 0

 .container { width: 100vh; height: 100vh; animation-name: change-color; animation-duration: 5s; /* we can also rewrite this using a shorthand animation: change-color 5s; */ }

จากนั้นเราสามารถเรียกคอนเทนเนอร์ของเราโดยใช้ div และผลลัพธ์จะเป็นดังนี้:

ตัวอย่างคีย์เฟรมเปลี่ยนสีพื้นหลัง

โดยทั่วไป แอนิเมชั่น CSS ส่วนใหญ่ที่เขียนด้วย CSS ล้วนๆ ใช้ชวเลขเพราะจะช่วยประหยัดการเขียนลอจิกแอนิเมชั่นหลายบรรทัด ดังนั้น นี่คือข้อมูลอ้างอิงสำหรับค่าคุณสมบัติ animation :

 animation-name: name; /* the name of the specific animation (to animate with @keyframes) */ animation-duration: 10s; /* the duration */ animation-timing-function: linear; /* the veolcity curve for the animation */ animation-delay: 1s; /* set a delay for the animation playback */ animation-iteration-count: infinite; /* set it to an infinite loop */ animation-direction: alternate; /* back and forth, use normal for default direction */ animation-fill-mode: both; /* direction to apply the style */ animation-play-state: paused; /* also accepts 'running' */

อ่านเพิ่มเติม

หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับแอนิเมชั่น CSS ในเชิงลึก ต่อไปนี้คือแหล่งข้อมูลที่ฉันแนะนำ:

  • การอ้างอิง CSS ของ Codrops – นี่คือข้อมูลอ้างอิงที่ครอบคลุมซึ่งเขียนและจัดระเบียบโดย Sara Soueidan (@SaraSoueidan) และมีตัวอย่างเชิงลึกเกี่ยวกับวิธีการทำงานของคุณสมบัติ CSS บางอย่าง
  • แอนิเมชั่น CSS ของ MDN – บทแนะนำเกี่ยวกับแอนิเมชั่น CSS ในรูปแบบเอกสารที่ครอบคลุมบนหน้า MDN Web Docs
  • Introduction to cubic-bezier() – บทความเชิงลึกที่เขียนโดย Temani Afif (@ChallengesCss) สำหรับ CSS-Tricks เกี่ยวกับการใช้คุณสมบัติ cubic-bezier() เพื่อสร้างแอนิเมชั่น CSS ขั้นสูง

ตัวอย่างของ CSS Animations

วิธีที่ดีที่สุดในการเรียนรู้ทุกสิ่งคือผ่านตัวอย่าง ส่วนต่อไปนี้ทุ่มเทให้กับเอฟเฟกต์ต่างๆ ที่ทำได้ผ่านคุณสมบัติแอนิเมชั่น CSS

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


คลื่น

ภาพเคลื่อนไหว CSS Wave

แอนิเมชั่นคลื่นถูกสร้างขึ้นโดยการวาดเส้นทาง SVG สำหรับรูปแบบคลื่นก่อน แล้วจึงกำหนด ID ให้กับมัน หลังจากนั้น เราระบุคลาส nth-child สี่คลาสด้วยตัวแปร animation-delay animation-duration และระยะเวลาภาพเคลื่อนไหวที่กำหนดเอง ตัวแปรแต่ละตัวแสดงถึงคลื่นแต่ละอันภายในแอนิเมชั่น และแต่ละคลื่นสามารถกำหนดสไตล์ได้อย่างอิสระ

ข้อดีของการกำหนดรูปแบบด้วย SVG คือโค้ดนี้ใช้ซ้ำได้ง่าย

หากคุณดูเส้นทางที่เราวาด เราจะระบุเลเยอร์ที่แตกต่างกันสี่ชั้นสำหรับ wave (โดยใช้แกนที่กำหนดเอง) จากนั้นอ้างอิง #wave-pattern id ที่เราตั้งค่าสำหรับเส้นทางเริ่มต้น นี่คือที่ที่คุณสามารถเปลี่ยนลักษณะสีของแต่ละคลื่นได้

HTML

 <div class="your-container"> <svg class="css-waves" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto" > <defs> <path id="wave-pattern" d="M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z" ></path> </defs> <g class="animated-waves"> <use href="#wave-pattern" x="48" y="0" fill="rgba(155,255,255,0.7"></use> <use href="#wave-pattern" x="48" y="3" fill="rgba(155,255,255,0.5)"></use> <use href="#wave-pattern" x="48" y="5" fill="rgba(155,255,255,0.3)"></use> <use href="#wave-pattern" x="48" y="7" fill="rgba(155,255,255,0.3)"></use> </g> </svg> </div>

CSS

 .css-waves { position: relative; width: 100%; height: 15vh; margin-bottom: -7px; min-height: 100px; max-height: 150px; } /* Here we declare the SVG node that we wish to animate. */ .animated-waves > use { animation: infinite-waves 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite; } .animated-waves > use:nth-child(1) { animation-delay: -2s; animation-duration: 7s; } .animated-waves > use:nth-child(2) { animation-delay: -3s; animation-duration: 10s; } .animated-waves > use:nth-child(3) { animation-delay: -4s; animation-duration: 13s; } .animated-waves > use:nth-child(4) { animation-delay: -5s; animation-duration: 20s; } @keyframes infinite-waves { 0% { transform: translate3d(-90px, 0, 0); } 100% { transform: translate3d(85px, 0, 0); } } /* Mobile Optimization */ @media (max-width: 768px) { .css-waves { height: 40px; min-height: 40px; } }

กำลังโหลดข้อความ

CSS กำลังโหลดแอนิเมชั่นข้อความ

เอฟเฟกต์การโหลดนี้ค่อนข้างง่ายต่อการใช้งาน เนื่องจากใช้คุณสมบัติแอนิเมชั่นที่ใช้งานได้จริงเพียงไม่กี่อย่าง ขั้นแรก คุณต้องการระบุค่า content: attr() ซึ่งคุณนำไปใช้กับองค์ประกอบข้อความที่คุณต้องการทำให้เคลื่อนไหว หลังจากนั้น คุณระบุแอนิเมชั่นเอง ซึ่งในกรณีของเราคือ animation: loading 5s linear infinite; .

ระยะเวลาของเอฟเฟกต์การโหลดสามารถแก้ไขได้โดยการเปลี่ยนคุณสมบัติ 5s และสุดท้าย เราใช้ @keyframes เพื่อเรียกแอนิเมชั่นการโหลดและเปลี่ยนความกว้างจาก 0% เป็น 100% ในช่วง 5 วินาทีนั้น ยิ่งค่าของระยะเวลาของแอนิเมชั่นสูงเท่าไหร่ เอฟเฟกต์การโหลดก็จะช้าลงเท่านั้น

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

HTML

 <!-- the loading-text class is specified through the content: attr(); property. change the value name to implement multiple design variations, or reuse the same class to show the loading effect in other parts of your design --> <h2 loading-text="Loading...">Loading...</h1>

CSS

 h2 { position: relative; font-size: 5em; color: rgb(199, 255, 110); text-transform: uppercase; border-bottom: 10px solid #ffffff; line-height: initial; } h2::before { content: attr(loading-text); position: absolute; top: 0; left: 0; width: 100%; color: #b0a8e2; overflow: hidden; border-bottom: 10px solid #b0a8e2; animation: loading 5s linear infinite; } @keyframes loading { 0% { width: 0; } 100% { width: 100%; } }

คลื่นข้อความ

ภาพเคลื่อนไหว CSS Text Wave

สิ่งแรกที่คุณจะสังเกตเห็นเกี่ยวกับแอนิเมชั่นนี้คือความ ลื่นไหล สิ่งนี้เป็นไปได้เพราะเราใช้ฟังก์ชัน calc() เพื่อคำนวณการเปลี่ยนแปลงแต่ละครั้งทางคณิตศาสตร์ เนื่องจากเราเขียนแอนิเมชั่นด้วย CSS ล้วนๆ เราจึงต้องใช้อิลิเมนต์ส span นหลายตัวเพื่อระบุตัวอักษรแต่ละตัวต่อเนื่องกันในแอนิเมชั่น

สำหรับการปรับเปลี่ยนความลึกของคลื่น ขั้นแรก คุณสามารถเปลี่ยนระยะเวลาจาก 3s เป็นจำนวนที่น้อยกว่าหรือมากกว่านั้นได้ สูงหมายถึงเอฟเฟกต์คลื่นจะช้าลงและในทางกลับกัน และภายใน @keyframes คุณสามารถเปลี่ยนข้อกำหนด -24px เพื่อเปลี่ยนความสูงของคลื่นได้

ยิ่งค่าลบสูงเท่าใด ผลกระทบของคลื่นก็จะยิ่งเด่นชัดมากขึ้นเท่านั้น

HTML

 <div class="blwb"> <span style="--i:1">O</span> <span style="--i:2">C</span> <span style="--i:3">E</span> <span style="--i:4">A</span> <span style="--i:5">N</span> <span style="--i:6">.</span> <span style="--i:7">.</span> <span style="--i:8">.</span> <span style="--i:9">W</span> <span style="--i:10">A</span> <span style="--i:11">V</span> <span style="--i:12">E</span> <span style="--i:13">S</span> <span style="--i:14">.</span> <span style="--i:15">.</span> <span style="--i:16">.</span> </div>

CSS

 .text-wave { margin: auto; display: flex; align-items: center; justify-content: center; position: relative; } .text-wave span { position: relative; color: rgb(255, 255, 255); font-size: 40px; font-family: monospace; animation: wave 3s ease-in-out infinite; animation-delay: calc(.1s*var(--i)); } @keyframes wave { 0% { transform: translateY(0px); } 20% { transform: translateY(-24px); } 40%, 100% { transform: translateY(0); } }

เอฟเฟกต์พัลส์ / ระลอกคลื่น

ภาพเคลื่อนไหว CSS Pulse Effect

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

คุณสมบัติเด่นสองอย่างที่เราใช้ในคลาสนี้คือ opacity: 0.5; และ animation: ease-out; . ความทึบคือสิ่งที่สร้างภาพลวงตาของการมีคลื่น/ชีพจร และการเปลี่ยนการคลายตัวทำให้ระลอกคลื่นเหล่านั้นคลายออกจากภาชนะเดิม

ต่อไป เราใช้คลาส .circle และนำไปใช้กับคุณสมบัติ nth-of-type() สำหรับตัวอย่างนี้ เราใช้วงกลม 3 วง ซึ่งช่วยให้ออกจากคอนเทนเนอร์เดิมได้ง่ายขึ้น ในการเรียก nth-of-type เราใช้ animation-delay ด้วยค่า -0.5s;-1s;-1.5s ยิ่งค่าลบสูงเท่าไร เอฟเฟกต์ก็จะยิ่งใช้เวลานานขึ้นเท่านั้น

และสุดท้าย เราใช้ @keyframes กับแอนิเมชั่นพัลส์ที่เราระบุ ในตัวอย่างนี้ เราใช้คุณสมบัติ transform: scale() สิ่งนี้กำหนดขนาดของพัลส์สำหรับแอนิเมชั่นแต่ละรายการ ยิ่งค่าสูงเท่าไหร่ ระลอกคลื่นที่ส่งออกก็จะยิ่งมากขึ้นเท่านั้น

HTML

 <div class="pulse-effect"> <div class="circle"></div> <div class="circle"></div> <div class="circle"></div> <div class="circle"></div> </div>

CSS

 .pulse-effect { background-color: #f6efffa1; height: 100px; width: 100px; border-radius: 100%; position: relative; margin: auto; } .circle { position: absolute; background-color: inherit; height: 100%; width: 100%; border-radius: 100%; opacity: 0.5; animation: pulse 3s ease-out infinite; } .circle:nth-of-type(1) { animation-delay: -0.5s; } .circle:nth-of-type(2) { animation-delay: -1s; } .circle:nth-of-type(3) { animation-delay: -1.5s; } @keyframes pulse { 100% { transform: scale(1.75); opacity: 0; } }

เคาน์เตอร์ (ตัวเลข)

CSS เคาน์เตอร์แอนิเมชั่น

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

นอกจากนี้ คุณสามารถรวมตัวนับอัตโนมัติสำหรับหัวข้อโพสต์ในบล็อก เช่น คุณกำลังเขียนรีวิวเกี่ยวกับเครื่องมือต่างๆ และเหนือสิ่งอื่นใด เคาน์เตอร์สามารถจัดสไตล์ให้มีเอกลักษณ์เฉพาะตัว เพื่อให้คุณมีอิสระในการออกแบบมากขึ้น

แต่สำหรับการสาธิตนี้ – เรากำลังมุ่งเน้นไปที่การใช้คุณสมบัติตัว counter เพื่อสร้างเอฟเฟกต์ตัวนับอัตโนมัติ ดังนั้น มาเจาะลึกและทำความเข้าใจว่ามันทำงานอย่างไร สำหรับตัวอย่างนี้ ก่อนอื่นเราสร้างคอนเทนเนอร์ที่จะมีแอนิเมชั่นตัวนับ คุณสามารถปรับแต่งสิ่งนี้ได้ตามที่คุณต้องการ ต่อไป เราสร้าง .count-numbers ซึ่งรวมถึงไวยากรณ์แอนิเมชั่น ในกรณีนี้ มันคือ animation: count-numbers 10s linear infinite forwards; .

ในการแยกย่อย เราระบุชื่อสำหรับแอนิเมชันของเรา เราตั้งระยะเวลาเป็น 10 วินาที และตั้ง ทิศทางของแอนิเมชัน ให้เป็นปกติเพราะเราไม่ต้องการให้นับถอยหลังจาก 10 แม้ว่าคุณสามารถตั้งค่าเป็น ทางเลือก หากคุณต้องการให้ตัวนับของคุณนับถอยหลังเช่นกัน

ต่อไป เราระบุคลาสใหม่ที่เรียกว่า .count-numbers::before ซึ่งเราใช้ตั้งชื่อตัวนับของเรา ในกรณีนี้ content: counter(count); . นี่เป็นสิ่งสำคัญเพราะขั้นตอนต่อไปคือการใช้ counter-name เพื่อทำให้เอฟเฟกต์เคลื่อนไหวผ่าน @keyframes

ขั้นตอนสุดท้ายคือการเขียนข้อกำหนดของเราสำหรับแอนิเมชั่นที่จะแสดง ในการสาธิตของเรา เรานับตั้งแต่ 1 ถึง 10 ดังนั้นเราจึงระบุค่า @keyframes ของเราจาก 0% ถึง 100% โดยเพิ่มขึ้นทีละ 10% การเพิ่มขึ้นแต่ละครั้งประกอบด้วยคำสั่งการเพิ่มขึ้นเคาน์เตอร์ที่ใช้ชื่อนับของเรา: counter-increment: count 0; .

ดังนั้น ที่ 0% การเพิ่มของเราถูกกำหนดเป็น 0 และที่ 10% จะถูกตั้งค่าเป็น 1 เพื่อฉายเอฟเฟกต์ของตัวนับ

นอกจากนี้ ให้ลองเปลี่ยน content: counter(count); ข้อกำหนดสำหรับ เนื้อหา: ตัวนับ (นับ, โรมันบน); และดูว่าเกิดอะไรขึ้น!

HTML

 <main class="counter-container"> <div class="counter-card count-numbers"></div> </main>

CSS

 .counter-container { display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); margin: auto; max-width: 100%; padding: 2rem; } .counter-card { align-items: center; border-radius: 10px; display: flex; height: 15rem; justify-content: center; position: relative; width: 100%; } .count-numbers { animation: count-numbers 10s linear infinite forwards; background-color: #f3f3f3; counter-reset: count 0; } .count-numbers::before { color: #000; content: counter(count); font-size: 5rem; } @keyframes count-numbers { 0% { counter-increment: count 0; } 10% { counter-increment: count 1; } 20% { counter-increment: count 2; } 30% { counter-increment: count 3; } 40% { counter-increment: count 4; } 50% { counter-increment: count 5; } 60% { counter-increment: count 6; } 70% { counter-increment: count 7; } 80% { counter-increment: count 8; } 90% { counter-increment: count 9; } 100% { counter-increment: count 10; } }

ลูกเด้ง

ภาพเคลื่อนไหว CSS Bounce Ball

เราเริ่มต้นด้วยการสร้างคอนเทนเนอร์สำหรับลูกบอลของเรา ในกรณีนี้คือ .ball-container

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

หลังจากที่ดึงลูกบอลและตั้งค่าแอนิเมชั่นแล้ว เราสามารถเขียนกฎ @keyframes ของเราได้ เพื่อให้บรรลุผลการตีกลับ เราใช้ transform: translatey(); โดยเพิ่มขึ้น 50% ดังนั้น 0% ถึง 50% ถึง 100% เน้นที่ 50% เพราะที่นี่เรากำหนดความสูงของการตีกลับโดยการระบุ transform: translatey(-50px); – การเด้ง/ลอยจะมีความสูง 50px (เทียบกับคอนเทนเนอร์) ยิ่งตัวเลขติดลบมากเท่าไหร่ ลูกบอลก็จะยิ่งเด้งสูงขึ้นเท่านั้น

ในทำนองเดียวกัน การระบุจำนวนที่น้อยกว่าจะลดขนาดของการตีกลับ

ส่วนสุดท้ายคือการเพิ่มเงา แม้ว่าคุณสามารถลบส่วนนี้ออกได้เนื่องจากจะไม่มีผลกับแอนิเมชั่นของลูกบอล ความแตกต่างเพียงอย่างเดียวของเงาคือเราใช้คุณสมบัติ transform: scale() เพื่อปรับขนาดเงาในบริบท 2 มิติ เราตั้งค่าตามระดับของผลกระทบที่เราต้องการทำให้สำเร็จ

HTML

 <div class="ball-container"></div> <div class="ball-shadow"></div>

CSS

 .ball-container { margin: auto; animation: floating 5s ease-in-out infinite; height: 100px; width: 100px; border-radius: 50%; position: relative; background: radial-gradient(circle at 75% 30%, rgb(107, 6, 6) 5px, rgb(36, 187, 187) 8%, rgb(228, 26, 26) 60%, rgb(173, 221, 221) 100%); box-shadow: inset 0 0 20px #fff, inset 10px 0 46px #d3f8c8, inset 88px 0px 60px #b4c3dd, inset -20px -60px 100px #5b43e7, inset 0 50px 140px #6bdf7e, 0 0 90px #fff; } @keyframes floating { 0% { transform: translatey(0px); } 50% { transform: translatey(-50px); } 100% { transform: translatey(0px); } } .ball-shadow { width: 95px; height: 30px; top: 50%; animation: expanding 5s infinite; position: relative; border-radius: 50%; margin: auto; background: radial-gradient(circle at 75% 30%, rgb(221 215 243) 5px, rgb(36, 187, 187) 8%, rgb(228, 26, 26) 60%, rgb(173, 221, 221) 100%); box-shadow: inset 0 0 20px #fff, inset 10px 0 46px #3f51b500, inset 88px 0px 60px #ffffff99, inset -20px -60px 100px #5b43e791, inset 0 50px 140px #ffffff, 0 0 90px #39316b; } @keyframes expanding { 0%, 100% { transform: scale(0.5); } 50% { transform: scale(0.75); } }

พลิกเหรียญ

ภาพเคลื่อนไหวพลิกเหรียญ CSS

สิ่งที่ฉันชอบเกี่ยวกับแอนิเมชั่นนี้คือเราสามารถตั้งค่ารัศมีการหมุนที่แม่นยำอย่างเหลือเชื่อเพื่อให้ได้เอฟเฟกต์ที่รู้สึกเหมือนเหรียญกำลังพลิกอย่างแท้จริง ดังนั้น ในการเริ่มต้น คุณจะต้องมี 2 ภาพ (ฉันกำลังใช้ SVG สำหรับการสาธิตนี้ แต่ภาพถ่ายปกติก็ใช้ได้ดีเช่นกัน เพียงตรวจสอบให้แน่ใจว่าได้ใช้คลาสที่ถูกต้องกับแต่ละภาพ) และตั้งค่าเป็น opacity: 0; . เราตั้งค่าเป็น 0 เพราะหลังจากนั้น เราใช้ @keyframes เพื่อเปลี่ยนความทึบเพื่อให้รูปภาพปรากฏในตำแหน่งบางตำแหน่งระหว่างแอนิเมชัน

คลาส . .image-container ใช้เพื่อระบุขนาดของรูปภาพภายในเหรียญ ตรวจสอบให้แน่ใจว่าคุณได้ระบุสิ่งนี้สำหรับรูปภาพจริงตามที่แสดงในตัวอย่างด้านล่าง ต่อไปเราจะระบุ .coin-style ซึ่งเป็นส่วนนอก (ตัวเหรียญเอง) ในทางเทคนิค คุณสามารถตั้งค่านี้ให้โปร่งใสได้ แต่เพื่อการสาธิต เราจะทำให้มองเห็นได้

แนวคิดหลักสำหรับ .coin-style คือวิธีที่เราเพิ่มแอนิเมชั่น ซึ่งในกรณีนี้คือ: แอนิเมชั่น: coin-flip 1.25s ลูกบาศก์เบซิเยร์ (0.93, 0.05, 0.9, 0.71) สลับกันไม่สิ้นสุด .

จุดที่น่าสนใจคือข้อกำหนด cubic-bezier() ซึ่งทำให้เรามีเอฟเฟกต์เส้นโค้งที่หมุนได้สำหรับที่เก็บเหรียญ แทบจะเป็นไปไม่ได้เลยที่จะเขียนด้วยตัวเอง ดังนั้นคำแนะนำของฉันคือการใช้เครื่องมือสร้างใดๆ เพื่อสร้างเอฟเฟกต์เส้นโค้งที่ต้องการ

และสุดท้าย ภายใน @keyframes ของเรา เราใช้ scaleX() เพื่อปรับขนาดรูปลักษณ์ของเหรียญบนพื้นฐาน x-axis แม้แต่การเปลี่ยนแปลงค่าที่ให้มาเพียงเล็กน้อยที่สุด (ในการสาธิตนี้) ก็จะปรับเปลี่ยนลักษณะที่ปรากฏของ "พลิก"

ฉันคิดว่าการใช้งานด้านล่างใกล้จะสมบูรณ์แบบแล้ว แต่บางทีคุณอาจจะทำได้ดีกว่านี้ก็ได้!

HTML

 <div class="coin-style"> <div class="image-container"> <svg class="firstimage" width="88" height="88" viewBox="0 0 32 32" data-name="Layer 1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <path class="cls-1" d="M23.5,2h-12a.47.47,0,0,0-.35.15l-5,5A.47.47,0,0,0,6,7.5v20A2.5,2.5,0,0,0,8.5,30h15A2.5,2.5,0,0,0,26,27.5V4.5A2.5,2.5,0,0,0,23.5,2Z" /> <path class="cls-2" d="M11.69,2a.47.47,0,0,0-.54.11l-5,5A.47.47,0,0,0,6,7.69.5.5,0,0,0,6.5,8h3A2.5,2.5,0,0,0,12,5.5v-3A.5.5,0,0,0,11.69,2Z" /> <path class="cls-3" d="M22.5,11a.5.5,0,0,0-.5.5v4.94l-.51-2.06a.52.52,0,0,0-1,0L20,16.44V11.5a.5.5,0,0,0-1,0v9a.51.51,0,0,0,.44.5.5.5,0,0,0,.55-.38l1-4.06,1,4.06a.5.5,0,0,0,.49.38h.06a.51.51,0,0,0,.44-.5v-9A.5.5,0,0,0,22.5,11Z" /> <path class="cls-3" d="M11.5,11h-2a.5.5,0,0,0-.5.5v9a.5.5,0,0,0,1,0V17h1.11l.9,3.62a.51.51,0,0,0,.49.38h.12a.51.51,0,0,0,.37-.61l-.88-3.51A1.51,1.51,0,0,0,13,15.5v-3A1.5,1.5,0,0,0,11.5,11Zm.5,4.5a.5.5,0,0,1-.5.5H10V12h1.5a.5.5,0,0,1,.5.5Z" /> <path class="cls-3" d="M16,11a.5.5,0,0,0-.49.42l-1.5,9a.49.49,0,0,0,.41.57.5.5,0,0,0,.57-.41L15.26,19h1.48L17,20.58a.49.49,0,0,0,.49.42h.08a.49.49,0,0,0,.41-.57l-1.5-9A.5.5,0,0,0,16,11Zm-.58,7L16,14.54,16.58,18Z" /> </svg> <svg class="secondimage" width="88" height="88" viewBox="0 0 32 32" data-name="Layer 1" id="Layer_1" xmlns="http://www.w3.org/2000/svg"> <defs> <style> .cls-1 { fill: #a08383; } .cls-2 { fill: #e1ebe9; } .cls-3 { fill: #770ba1; } .cls-4 { fill: #0a5097; } </style> </defs> <path class="cls-1" d="M23.5,2h-12a.47.47,0,0,0-.35.15l-5,5A.47.47,0,0,0,6,7.5v20A2.5,2.5,0,0,0,8.5,30h15A2.5,2.5,0,0,0,26,27.5V4.5A2.5,2.5,0,0,0,23.5,2Z" /> <path class="cls-2" d="M15,2h7a1,1,0,0,1,0,2H15a1,1,0,0,1,0-2Z" /> <path class="cls-2" d="M6,13.5v-2a1,1,0,0,1,2,0v2a1,1,0,0,1-2,0Z" /> <path class="cls-2" d="M6,24.5v-8a1,1,0,0,1,2,0v8a1,1,0,0,1-2,0Z" /> <path class="cls-4" d="M21.5,15.5h-1A.5.5,0,0,1,20,15V12.5a.5.5,0,0,1,.5-.5h2a.5.5,0,0,0,0-1h-2A1.5,1.5,0,0,0,19,12.5V15a1.5,1.5,0,0,0,1.5,1.5h1a.5.5,0,0,1,.5.5v2.5a.5.5,0,0,1-.5.5h-2a.5.5,0,0,0,0,1h2A1.5,1.5,0,0,0,23,19.5V17A1.5,1.5,0,0,0,21.5,15.5Z" /> <path class="cls-4" d="M15.5,12h2a.5.5,0,0,0,0-1h-2A1.5,1.5,0,0,0,14,12.5V15a1.5,1.5,0,0,0,1.5,1.5h1a.5.5,0,0,1,.5.5v2.5a.5.5,0,0,1-.5.5h-2a.5.5,0,0,0,0,1h2A1.5,1.5,0,0,0,18,19.5V17a1.5,1.5,0,0,0-1.5-1.5h-1A.5.5,0,0,1,15,15V12.5A.5.5,0,0,1,15.5,12Z" /> <path class="cls-4" d="M11,12a1,1,0,0,1,1,1,.5.5,0,0,0,1,0,2,2,0,0,0-4,0v6a2,2,0,0,0,4,0,.5.5,0,0,0-1,0,1,1,0,0,1-2,0V13A1,1,0,0,1,11,12Z" /> </svg> </div> </div>

CSS

 svg { color: #151516; position: absolute; } svg.firstimage { opacity: 0; animation: logo-flip 2.5s linear infinite alternate; } svg.secondimage { opacity: 0; animation: logo-flip 2.5s linear 2.5s infinite alternate; } .image-container { position: relative; height: 88px; width: 88px; } .coin-style { background: rgb(233, 226, 226); width: 136px; height: 136px; border-radius: 100%; margin: 0 auto; display: flex; justify-content: center; align-items: center; box-shadow: 0px 15px 15px -19px rgb(255, 255, 255); animation: coin-flip 1.25s cubic-bezier(0.93, 0.05, 0.9, 0.71) infinite alternate; } @keyframes coin-flip { 0% { transform: scaleX(0.95); } 100% { transform: scaleX(0.08); border-radius: 50%; } } @keyframes logo-flip { 0% { opacity: 0; } 50% { opacity: 0; } 53% { opacity: 1; } 100% { opacity: 1; } }

สไลด์อิน

ภาพเคลื่อนไหว CSS Slide-In

เพื่อให้แอนิเมชั่นใช้งานได้ เราใช้ animation: ease-out; ทำงานร่วมกับค่าตำแหน่งลบภายใน @keyframes ในตัวอย่างนี้ เราระบุ 0% {opacity: 0;left: -700px;} ซึ่งทำให้องค์ประกอบการเลื่อนเข้าของเรามองไม่เห็นในตอนเริ่มต้น แต่ยังวางตำแหน่ง 700px ไว้นอกคอนเทนเนอร์ด้วย

หลังจากนั้น เราระบุ 100% {opacity: 1;left: 0;} ซึ่งเมื่อภาพเคลื่อนไหวของเราสิ้นสุด (เราตั้งค่าเป็น 2 วินาที) จะกลับมามองเห็นได้ตามปกติ และจัดตำแหน่งองค์ประกอบของเรากลับไปที่ตำแหน่งสัมพัทธ์

สิ่งที่น่าสนใจที่ควรทราบคือเอฟเฟกต์นี้ใช้งานได้ใน ทุก ทิศทาง

หากคุณต้องการเปลี่ยนเอฟเฟกต์การเลื่อนเข้าให้ปรากฏจากด้านขวา คุณต้องเปลี่ยน ทางซ้าย:; ค่าไป ทางขวา:; และในทางกลับกันสำหรับตำแหน่งเช่นบนและล่าง คุณยังสามารถชะลอการเคลื่อนไหวโดยปรับระยะเวลาที่องค์ประกอบจะเลื่อนเข้า

ค่าที่สูงขึ้นจะทำให้แอนิเมชั่นช้าลง

HTML

 <h2 id="slide-in" class="animation"> Slide-In Animation </h2>

CSS

 .animation { position: relative; animation: animation 2s ease-out; } #slide-in { text-align: center; color: #fff; } @keyframes animation { 0% { opacity: 0; left: -700px; } 100% { opacity: 1; left: 0; } }

เอฟเฟกต์หยด

ภาพเคลื่อนไหว CSS Blob Border

ก่อนอื่น Blob คืออะไร? ดังที่ Ian Latchmansingh กล่าวไว้ “The Blob เป็นรูปทรงอสัณฐานเทียมปลอม ซึ่งมักใช้เพื่อยึดหน้าที่เชื่อมโยงไปถึงด้วยสายตา มักจะทำหน้าที่เป็นหน้ากากหรือฉากหลังสำหรับภาพประกอบ ประมาณ 90% ของเวลาที่ Blob เต็มไปด้วยการไล่ระดับสีและอยู่บนเลเยอร์ต่ำสุดของการออกแบบ” . แน่นอนว่ามันเป็นหนึ่งในรูปแบบทั่วไปในการออกแบบเว็บสมัยใหม่ แต่เราจะทำให้เคลื่อนไหวได้อย่างไร

เราเริ่มต้นด้วยการสร้างคอนเทนเนอร์เอฟเฟกต์หยดและระบุองค์ประกอบช่วงแยก 3 รายการภายในคอนเทนเนอร์ เราทำสิ่งนี้เพราะว่าจริงๆ แล้วเรา "วาด" หยดเองโดยใช้คุณสมบัติเส้นขอบและรัศมีเส้นขอบร่วมกัน

เพื่อให้ได้เอฟเฟกต์ที่หลากหลาย เราใช้ nth-child เพื่อจัดรูปแบบแต่ละองค์ประกอบแยกกัน หากคุณต้องการทำตัวให้เก๋ไก๋ อย่าลังเลที่จะเปลี่ยนคุณสมบัติเปอร์เซ็นต์เพื่อปรับลักษณะหยด

แอนิเมชั่นทำได้โดยใช้คุณสมบัติ transform: rotate() ภายในข้อกำหนด @keyframes เราตั้งค่าไว้ที่ 0 ถึง 360 องศา เนื่องจากจะให้ผลถาวร การซ้อนทับสีทำได้ผ่าน :hover และให้เรากำหนดสีพื้นหลังที่กำหนดเองได้ นอกจากนี้ เรายังสร้างคอนเทนเนอร์แยกต่างหากภายใน Blob เองด้วย ซึ่งจะทำให้คุณสามารถจัดรูปแบบส่วนต่างๆ ของเลย์เอาต์หน้าเว็บของคุณเพื่อให้มีเอฟเฟกต์แอนิเมชั่นเฉพาะนี้ได้

HTML

 <div class="blob-effect"> <span></span> <span></span> <span></span> <div class="div-container"> <a href="#">Hover</a> </div> </div>

CSS

 .blob-effect { position: relative; width: 200px; height: 200px; display: flex; justify-content: center; align-items: center; } .blob-effect span:nth-child(1) { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; border: 2px solid #a9ff68; border-radius: 38% 62% 63% 37% / 41% 44% 56% 59%; transition: 0.5s; animation: rotate-blob 5s linear infinite; } .blob-effect:hover span:nth-child(1) { background: #d76bb1; border: none; } .blob-effect span:nth-child(2) { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; border: 2px solid #a9ff68; border-radius: 38% 62% 63% 37% / 41% 44% 56% 59%; transition: 0.5s; animation: rotate-blob 4s linear infinite; } .blob-effect:hover span:nth-child(2) { background: #f192d0; border: none; } .blob-effect span:nth-child(3) { position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; border: 2px solid #a9ff68; border-radius: 38% 62% 63% 37% / 41% 44% 56% 59%; transition: 0.5s; animation: rotate-blob2 10s linear infinite; } .blob-effect:hover span:nth-child(3) { background: #f06ec294; border: none; } @keyframes rotate-blob { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } @keyframes rotate-blob2 { 0% { transform: rotate(360deg); } 100% { transform: rotate(0deg); } } .div-container { position: relative; padding: 40px 60px; color: #fff; text-align: center; transition: 0.5s; z-index: 10000; } .div-container p { color: #fff; } .div-container a { position: relative; display: inline-block; margin-top: 10px; border: 2px solid #fff; padding: 6px 18px; text-decoration: none; color: #fff; font-weight: 600; border-radius: 73% 27% 44% 56% / 49% 44% 56% 51%; } .div-container a:hover { background: #fff; color: #333; }

สลับข้อความ

ภาพเคลื่อนไหว CSS Text Switch

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

สิ่งแรกที่เราทำคือสร้างคอนเทนเนอร์สำหรับเอฟเฟกต์จริง หลังจากนั้น เราระบุคลาส div ใหม่ที่จะมีตรรกะของแอนิเมชัน ในกรณีของเรา เราใช้ความยาวของแอนิเมชัน 8 วินาที รวมกับข้อกำหนด animation-delay 3 แบบแยกกัน

การหน่วงเวลาใช้เพื่อกำหนดว่าคำใดคำหนึ่งจะเข้ามาในมุมมองหลังจากที่เราเพิ่มตรรกะ @keyframes ของเราแล้ว

HTML

 <div class="g-container"> <div class="word">Text</div> <div class="word">Switch</div> <div class="word">Animation</div> </div>

CSS

 .g-container { position: relative; font-family: monospace; color: rgb(255, 255, 255); font-size: 4em; filter: contrast(15); } .word { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); animation: switch 8s infinite ease-in-out; min-width: 100%; margin: auto; } .word:nth-child(1) { animation-delay: -7s; } .word:nth-child(2) { animation-delay: -6s; } .word:nth-child(3) { animation-delay: -5s; } @keyframes switch { 0%, 5%, 100% { filter: blur(0px); opacity: 1; } 50%, 80% { filter: blur(180px); opacity: 0; } }

โฮเวอร์ไฮไลท์

ภาพเคลื่อนไหวไฮไลท์ CSS Hover

เป็นที่ยอมรับว่าเอฟเฟกต์เฉพาะนี้ไม่ได้ใช้คุณสมบัติแอนิเมชั่นที่เป็นรูปธรรม อย่างไรก็ตาม การใช้ฟังก์ชัน attr() และ var() ควรสร้างแรงบันดาลใจมากพอที่จะลองปรับแต่งเอฟเฟกต์นี้เพิ่มเติม

หากคุณดูที่ ul li a::before specification – เราใช้ attr() เพื่อระบุว่าองค์ประกอบใดที่เราต้องการระบุถึงผลกระทบ นอกจากนี้ เรายังเพิ่มตัวแปรที่เรียกว่า –clr ซึ่งคุณใช้กำหนดสีที่กำหนดเองสำหรับแต่ละรายการที่คุณต้องการใช้เอฟเฟกต์โฮเวอร์

สำหรับตัวอย่างนี้ เราได้เพิ่มคุณสมบัติ border-right เพื่อระบุสีที่เราใช้สำหรับแต่ละองค์ประกอบ คุณสามารถลบออกและเอฟเฟกต์จะยังคงทำงานอยู่

HTML

 <ul> <li style="--clr:#a4e935"> <a href="#" hover-text=" Hover"> Hover </a> </li> <li style="--clr:#61cbb7"> <a href="#" hover-text=" Highlight"> Highlight </a> </li> </ul>

CSS

 ul { position: relative; display: flex; flex-direction: inherit; gap: 25px; } ul li { position: relative; list-style: none; } ul li a { font-size: 2em; font-family: monospace; text-decoration: none !important; letter-spacing: 0px; line-height: 1em; color: rgb(255, 255, 255); } ul li a::before { content: attr(hover-text); position: absolute; color: var(--clr); width: 0; overflow: hidden; transition: 1s; border-right: 8px solid var(--clr); -webkit-text-stroke: 1px var(--clr); } ul li a:hover::before { width: 100%; filter: drop-shadow(0 0 25px var(--clr)) }