Ich versuche, diese Animation in React mit HTML und CSS unter Verwendung von Inline-Stilen und TypeScript neu zu erstellen. Ich erstelle ein Objekt mit Stilinformationen und verweise im Stilattribut darauf. Unten ist der Code. Es funktioniert nicht, ich bin mir nicht sicher, was ich falsch mache. Ich vermute, dass die Stile nicht richtig definiert und referenziert sind?
Dies ist das ursprüngliche Codepen-Beispiel, das ich neu zu schreiben versucht habe: Apple Animation
Das ist mein Code
import React from 'react'; const styles = { '@keyframes showTopText': { '0%': { transform: 'translate3d(0, 100%, 0)' }, '40%, 60%': { transform: 'translate3d(0, 50%, 0)' }, '100%': { transform: 'translate3d(0, 0, 0)' }, }, '@keyframes showBottomText': { '0%': { transform: 'translate3d(0, -100%, 0)' }, '100%': { transform: 'translate3d(0, 0, 0)' }, }, animatedTitle: { color: '#222', fontFamily: 'Roboto, Arial, sans-serif', height: '90vmin', left: '50%', top: '50%', transform: 'translate(-50%, -50%)', width: '90vmin', }, 'animatedTitle > div': { height: '50%', overflow: 'hidden', position: 'absolute', width: '100%', }, 'animatedTitle > div div': { fontSize: '12vmin', padding: '2vmin 0', position: 'absolute', }, 'animatedTitle > div div span': { display: 'block', }, 'animated-title > div.text-top': { borderBottom: '1vmin solid #000', top: 0, }, 'animatedTitle > div.text-top div': { animation: 'showTopText 1s', animationDelay: '0.5s', animationFillMode: 'forwards', bottom: 0, transform: 'translate(0, 100%)', }, 'animatedTitle > div.text-top div span:first-child': { color: '#767676', }, 'animatedTitle > div.text-bottom': { bottom: 0, }, 'animatedTitle > div.text-bottom div': { animation: 'showBottomText 0.5s', animationDelay: '1.75s', animationFillMode: 'forwards', top: 0, transform: 'translate(0, -100%)', }, }; function Design() { return ( <div style={styles.animatedTitle}> <div style={styles['animatedTitle > div.text-top div']}> <div> <span>mimicking</span> <span>apple's design</span> </div> </div> <div style={styles['animatedTitle > div.text-bottom']}> <div>for the win!</div> </div> </div> ); } export { Design };
您可以尝试使用
styled-components
来使您的组件更灵活和兼容。我使用styled-components
复制了 codepen 的示例,并使其易于扩展。因此,
TopAnimateBlock
和BottomAnimateBlock
都有 numOfLine 属性,表示块内有多少行。在BottomAnimateBlock
中的第二个属性是 delayTopLine,它应该与TopAnimateBlock
中的 numOfLine 数量相同,因为我们需要等待顶部行播放。此外,您可以通过
TextStyle
的 color 属性轻松更改文本颜色,并传递颜色值,HEX 颜色或 rgba() / hsla()。TextAnimation.tsx
如果我们想要动画化3行而不是2行,只需添加/更改:
TextStyle
组件TopAnimateBlock
中将 numOfLine 从2更改为3,在BottomAnimateBlock
中将 delayTopLine 从2更改为3