গাইড · 07
React Native থেকে আসছেন কী একই থাকে, কী বদলায় আর ওয়েব কী যোগ করে।
একই কল কন্ট্রোলার, গ্রাফ আর কনফিগারেশন React Native-এর Animated অনুসরণ করে। React Native যেখানে Animated.View রেন্ডার করে, সেখানে Animated.div-এর মতো DOM হোস্ট রেন্ডার করুন। useAnimatedValue React Native-এর মতোই পাওয়া যায়।
JavaScript বন্ধ আছে। নিচের কোডই পুরো উদাহরণ।
App.jsx import { useEffect } from 'react' ;
import { Animated , Easing , useAnimatedValue } from '@kkwaenggwari/animated' ;
import './styles.css' ;
export default function App ({ duration = 1200 } ) {
const spin = useAnimatedValue (0 );
const pulse = useAnimatedValue (0 );
const scrollY = useAnimatedValue (0 );
useEffect (() => {
const animation = Animated .parallel ([
Animated .loop (
Animated .timing (spin, {
toValue : 1 ,
duration,
easing : Easing .linear ,
useNativeDriver : true ,
}),
),
Animated .loop (
Animated .sequence ([
Animated .timing (pulse, { toValue : 1 , duration : duration / 2 , useNativeDriver : true }),
Animated .timing (pulse, { toValue : 0 , duration : duration / 2 , useNativeDriver : true }),
]),
),
]);
animation.start ();
return () => animation.stop ();
}, [duration]);
const rotate = spin.interpolate ({ inputRange : [0 , 1 ], outputRange : ['0deg' , '360deg' ] });
const scale = pulse.interpolate ({ inputRange : [0 , 1 ], outputRange : [1 , 1.25 ] });
const headerScale = scrollY.interpolate ({
inputRange : [0 , 120 ],
outputRange : [1 , 0.6 ],
extrapolate : 'clamp' ,
});
return (
<div className ="stage" >
<div className ="row" >
<Animated.div className ="spinner" style ={{ transform: [{ rotate }] }} />
<Animated.div className ="dot" style ={{ transform: [{ scale }] }} />
</div >
<div
className ="scroll"
onScroll ={Animated.event([{ nativeEvent: { contentOffset: { y: scrollY } } }], {
useNativeDriver: false ,
})}
>
<Animated.div className ="header" style ={{ transform: [{ scale: headerScale }] }}>
Scroll this list
</Animated.div >
{Array.from({ length: 12 }, (_, index) => (
<div key ={index} className ="item" >
Row {index + 1}
</div >
))}
</div >
</div >
);
}styles.css .stage {
display : grid;
gap : 18px ;
padding : 28px ;
}
.row {
display : flex;
align-items : center;
gap : 28px ;
}
.spinner {
width : 56px ;
height : 56px ;
border : 6px solid #eef2ff ;
border-top-color : #2854ff ;
border-radius : 50% ;
}
.dot {
width : 40px ;
height : 40px ;
border-radius : 50% ;
background : #5c7cff ;
}
.scroll {
height : 220px ;
max-width : 420px ;
border : 1px solid #e4e6ef ;
border-radius : 16px ;
overflow-y : auto;
}
.header {
position : sticky;
top : 0 ;
padding : 18px ;
background : #2854ff ;
color : #fff ;
font-weight : 700 ;
transform-origin : left top;
}
.item {
padding : 14px 18px ;
border-top : 1px solid #f0f1f7 ;
}জানা দরকার এমন পার্থক্য এই খুঁটিনাটিগুলো আনা কোডকে ডিভাইসে যেমন চলত তেমনই চালায়।
useNativeDriver আর isInteraction গ্রহণ করা হয়। তার বদলে প্লেব্যাক প্রতিটি আউটপুটের জন্য বাছা হয়: যোগ্য আউটপুট ব্রাউজারে চলে, বাকিগুলো JavaScript-এ।spring stiffness/damping/mass, bounciness/speed বা tension/friction নেয়, কিছু না দিলে React Native-এর ডিফল্ট।interpolate easing আর তিনটি এক্সট্রাপোলেশন মোড সমর্থন করে।Easing React Native-এর সঙ্গে মেলে, elastic-সহ। Easing.exp 0.1% পুনর্মাপ করা হয়েছে যাতে ঠিক 0 থেকে শুরু হয় এবং ব্রাউজার প্লেব্যাক ব্যবহার করতে পারে।decay-র বেগ প্রতি মিলিসেকেন্ডে একক আর spring-এর বেগ প্রতি সেকেন্ডে একক, React Native-এর মতো। Animated.createAnimatedComponent ref এগিয়ে দেওয়া কম্পোনেন্ট মোড়ে।Spinner.jsx কোড কপি করুন
<Animated .View style={{ transform : [{ rotate }] }} />
<Animated.div style ={{ transform: [{ rotate }] }} />
const spin = useAnimatedValue (0 );
const rotate = spin.interpolate ({ inputRange : [0 , 1 ], outputRange : ['0deg' , '360deg' ] });
Animated .loop (
Animated .timing (spin, { toValue : 1 , duration : 900 , easing : Easing .linear , useNativeDriver : true }),
).start ();ওয়েব যা যোগ করে সাধারণ React style সরাসরি হুকের মান নেয়, seed/pose/respond লক্ষ্য আর জেসচার বর্ণনা করে, আর Animated.Keep ও Animated.Scene প্রস্থান আর লেআউট সামলায়।