กรณีศึกษาเกี่ยวกับภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อน

Swetha Gopalakrishnan
Swetha Gopalakrishnan
Saurabh Rajpal
Saurabh Rajpal

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

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

อย่างไรก็ตาม ในฐานะส่วนหนึ่งของ ฟีเจอร์ CSS และ UI ในเบราว์เซอร์ ตอนนี้ สร้างภาพเคลื่อนไหวแบบเลื่อนตามการประกาศ ใช้ไทม์ไลน์แบบเลื่อนและมุมมอง ไทม์ไลน์ แนวคิดใหม่ที่ผสานรวมกับ Web Animations API (WAAPI) และ CSS Animations API ตอนนี้คุณก็นุ่มนวลละมุนแล้ว ภาพเคลื่อนไหวแบบเลื่อนที่ขับเคลื่อนด้วยการเลื่อนออกจากเทรดหลัก โดยมีเพียง 2-3 บรรทัด โค้ด ในกรณีศึกษานี้ มาดูวิธีที่ Tokopedia, RedBus และ Policybazaar ได้รับประโยชน์จาก ฟีเจอร์ใหม่นี้อยู่แล้ว

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

  • Chrome: 115
  • ขอบ: 115
  • Firefox: อยู่หลังธง
  • Safari: ไม่รองรับ

แหล่งที่มา

Tokopedia

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

เราสามารถลดจำนวนบรรทัดโค้ดได้ถึง 80% เมื่อเทียบกับการใช้ เหตุการณ์การเลื่อน JavaScript แบบทั่วไป และพบว่าการใช้งาน CPU โดยเฉลี่ย ลดลงจาก 50% เป็น 2% ขณะเลื่อน— Andy Wihalim วิศวกรอาวุโสฝ่ายซอฟต์แวร์ของ Tokopedia

การเปิดเผยของแถบติดหนึบด้านบนที่มีการเปลี่ยนแปลงแบบภาพเคลื่อนไหวตามการเลื่อนของผู้ใช้ ตำแหน่ง

รหัส

การใช้งานต่อไปนี้ใช้ฟังก์ชัน scroll() เพื่อตั้งค่าการเลื่อนแบบไม่ระบุชื่อ เส้นควบคุมเวลาความคืบหน้าสำหรับควบคุมความคืบหน้าของภาพเคลื่อนไหว CSS การมองเห็นแถบติดหนึบด้านบนจะเปลี่ยนแปลงไปตามตำแหน่งการเลื่อนภายใน กำหนด animationRange

const toggleBar = keyframes({
  to: { height: 48 },
});

export const cssWrapper = css({
  position: 'fixed',
  left: 0,
  width: '100vw',
  pointerEvents: 'none',
  marginTop: 120,
  height: 0,
  overflow: 'hidden',
  display: 'flex',
  flexDirection: 'column',
  justifyContent: 'flex-end',
  animation: `${toggleBar} linear both`,
  animationTimeline: 'scroll()',
  animationRange: '20px 70px',
});

redBus

RedBus มีภาพเคลื่อนไหวที่ต่างกันสำหรับอุปกรณ์เคลื่อนที่และเดสก์ท็อปใน สิ่งที่จะทำหน้า Landing Page ซึ่งแสดง กับผู้ใช้ทั้งหมดในช่วงต้นของ Conversion Funnel สำหรับภาพเคลื่อนไหวที่เลื่อนได้ สามารถเปลี่ยนการใช้งาน JavaScript ที่กำหนดเองเหล่านี้ด้วย CSS เพื่อให้ แบบเดียวกัน

กรณีการใช้งาน

แกลเลอรีภาพที่มีการเผยรูปภาพ (สำหรับ อุปกรณ์เคลื่อนที่) และขั้นตอนการหน้าปก (สำหรับ เดสก์ท็อป)

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

โค้ด (อุปกรณ์เคลื่อนที่)

ในตัวอย่างก่อนหน้านี้ Tokopedia ใช้ความคืบหน้าในการเลื่อนที่ไม่ระบุตัวตน ไทม์ไลน์ ในโค้ดต่อไปนี้redBus ใช้ความคืบหน้าของมุมมองที่มีชื่อ ไทม์ไลน์ ภาพเคลื่อนไหวจะเปลี่ยน opacity และ clip-path ของ <img> องค์ประกอบภายใน animation-range ที่กำหนดไว้ภายในองค์ประกอบที่ใกล้ที่สุด ตัวเลื่อนระดับบน ซึ่งเป็นตัวเลื่อนแกลเลอรีรูปภาพในกรณีนี้

const reveal = keyframes`
   from {
       opacity: 0;
       clip-path: inset(45% 20% 45% 20%);
   }
   to {
       opacity: 1;
       clip-path: inset(0% 0% 0% 0%);
   }`

const CardImage = styled.div`
   width: 100%;
   height: 100%;
   img {
       border-top-left-radius: 0.75rem;
       border-top-right-radius: 0.75rem;
       height: 100%;
       width: 100%;
       object-fit: cover;
       view-timeline-name: --revealing-image;
       view-timeline-axis: block;
  
       /* Attach animation, linked to the  View Timeline */
       animation: linear ${reveal} both;
       animation-timeline: --revealing-image;
  
       /* Tweak range when effect should run*/
       animation-range: entry 25% cover 50%;
   }
`;

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

ตลาดนโยบาย

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

ภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อนช่วยให้เราขยายพื้นที่วิวพอร์ตได้สูงสุด ผู้ใช้มาเปรียบเทียบแผนต่างๆ ได้ ทำให้การอ่านมีจุดมุ่งเน้นและไม่ยุ่งเหยิง ของเรา—ริซาบห์ Mehrotra หัวหน้า Design for Life Insurance BU, PolicyBazaar

ภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อน animate-timeline ในตารางเปรียบเทียบแผนด้านการลงทุนและชีวิต LOB (สายธุรกิจ)

รหัส

เช่นเดียวกับตัวอย่างก่อนหน้านี้จาก Tokopedia Policybazaar จะใช้ ฟังก์ชัน scroll() สำหรับตั้งค่าลำดับเวลาของความคืบหน้าในการเลื่อนที่ไม่ระบุตัวตนสำหรับ ที่ควบคุมความคืบหน้าของภาพเคลื่อนไหว CSS ในกรณีนี้ การย่อขนาดแบบอักษร ขนาดและทำให้ส่วนหัวจางลงตามตำแหน่งการเลื่อนภายในที่กำหนดไว้ animation-range

@supports (animation-timeline: scroll()) {
.plan-comparison .inner-header {
animation: move-and-fade-header linear both;
}
.plan-comparison .left-side {
animation: shrink-name linear both;
}
.plan-comparison .inner-header, .plan-comparison .left-side {
animation-timeline: scroll();
animation-range: 0 150px;
}
}

@keyframes move-and-fade-header {
  to {
    translate: 0% -5%;
    top:103px;
}
}

@keyframes shrink-name {
  to {
    font-size: 1.5rem;
  }
}

ภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อนซึ่งเป็นรูปแบบที่พบได้ทั่วไปตลอดเส้นทางของผู้ใช้

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

@keyframes animate-in {
 0% { opacity: 0; transform: translateY(10%); }
 100% { opacity: 1; transform: translateY(0); }
}

@keyframes animate-out {
 0% { opacity: 1; transform: translateY(0); }
 100% { opacity: 0; transform: translateY(-10%); }
}

.flyin_animate {
   animation: animate-in linear forwards;
   animation-timeline: view();
   animation-range: entry;
}

redBus (หน้าแรก)

เอฟเฟกต์แบบเลื่อนเข้าไปของภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อนสำหรับการโหลดการ์ดผลิตภัณฑ์บน "กิจกรรมน่าสนใจ" ของ RedBus หน้า Landing Page

Policybazaar (หน้าข้อมูลผลิตภัณฑ์ที่แสดง)

ภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อนแบบเฟดอิน เฟดออกของการ์ดผลิตภัณฑ์ในแวดวงการลงทุนและ Life LOB (สายธุรกิจ)

Tokopedia (หน้ารายละเอียดผลิตภัณฑ์)

ภาพเคลื่อนไหวแบบเฟดอินและเฟดออกขณะเลื่อนดูผลิตภัณฑ์ อยู่ในรายการ

สิ่งที่ต้องพิจารณาเมื่อใช้ Scroll-driven Animations API

คุณอาจสร้างภาพเคลื่อนไหวที่ขับเคลื่อนด้วยการเลื่อนแบบ Polyfill สำหรับเบราว์เซอร์ที่ไม่รองรับ ตัวอย่างเช่น Scroll-Timeline Polyfill หากคุณทำเช่นนั้น การดำเนินการนี้จะ และต้องอาศัยการทดสอบเพิ่มเติม เพื่อให้แน่ใจว่าโฆษณาได้ผลดีควบคู่กับ และเบราว์เซอร์ที่ใช้ Polyfill ไม่พบภาพเคลื่อนไหว ล้มเหลวหรือแย่

จาก CSS คุณจะใช้ @supports เพื่อทดสอบการรองรับไทม์ไลน์ของภาพเคลื่อนไหวได้ ก่อนใช้ภาพเคลื่อนไหวแบบเลื่อน เช่น

@supports (animation-timeline: scroll()) {

}

แหล่งข้อมูล

อ่านบทความอื่นๆ ในชุดนี้ ซึ่งกล่าวถึงประโยชน์ที่บริษัทอีคอมเมิร์ซได้รับจากการใช้ฟีเจอร์ใหม่ของ CSS และ UI เช่น ดูการเปลี่ยนภาพ, ป๊อปอัป, การค้นหาคอนเทนเนอร์ และตัวเลือก has()