iT邦幫忙

2022 iThome 鐵人賽

DAY 30
0

來到 framer-motion useScroll 小單元的最後一篇,也是鐵人挑戰的最後一天,最後用華麗的 parallax 來做收尾。會使用到 useScroll 與 useTransform 這兩個 hook。useScroll 可以看前兩篇的介紹。

useTransform

useTransform 最常被運用來產生有串聯關係對應變化的 motion value。
提供一組 motion value 的變化,來產生一組新的 motion value

useTransform(value, input, output, options)

https://ithelp.ithome.com.tw/upload/images/20221013/20151365AhkiSh8rLr.jpg


想做出滾動視差效果需要藉由 useScroll 得到的 scrollYProgress 當作 value 帶入去產生一組新的y(translateY),藉此產生滑動時不一要滑動速度的效果,達成 parallax scroll。
在下列範例中我選擇包住 MotionImage 的 Flex 當作參考,其 ref 帶入 useScroll,並以 offset: ['start end', 'end start'],來得到 scrollYProgress 當作要去改變 MotionImage 的 translateY。 等於是利用進入 viewport 的變化 0 到 1 當作參考去輸出 translateY

https://ithelp.ithome.com.tw/upload/images/20221013/20151365DdYvFEFY5X.jpg

  const ref = useRef(null); 
  
  const { scrollYProgress } = useScroll({
    target: ref,
    offset: ['start end', 'end start'],
  });
  
  const y1 = useTransform(scrollYProgress, [0.2, 0.8], [-200, 300]); //垂直變化量大 速度較快
  const y2 = useTransform(scrollYProgress, [0.2, 0.8], [-100, 100]); //垂直變化量大 速度較慢
  
  
   <Flex
       ref={ref}
   >
     <MotionImage
       style={{ y: y1, x: 20 }}
    <MotionImage
     style={{ y: y2, x: 20 }}
    <MotionImage
     style={{ y: y1, x: 20 }}
    >
   </Flex>
  

效果如下

Yes


最後很開心組隊參加了這是 2022 鐵人賽,藉此挑戰自己過去想嘗試但沒時間實作的項目!
如果你也是 Chakra UI 與 framer-motion 的前端愛好者,歡迎交流討論~~


上一篇
framer-motion: useScroll、Element scroll、Element position
系列文
產品設計師的 Chakra UI & framer-motion 實作筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
Charlie
iT邦新手 5 級 ‧ 2022-10-14 00:17:39

灑花完結

我要留言

立即登入留言