5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

Animation เปƒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ React เป€เบ›เบฑเบ™เบซเบปเบงเบ‚เปเป‰เบ—เบตเปˆเบ™เบดเบเบปเบกเปเบฅเบฐเบชเบปเบ™เบ—เบฐเบ™เบฒ. เบ„เบงเบฒเบกเบˆเบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบตเบซเบผเบฒเบเบงเบดเบ—เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เบกเบฑเบ™. เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบšเบฒเบ‡เบ„เบปเบ™เปƒเบŠเป‰ CSS เป‚เบ”เบเบเบฒเบ™เป€เบžเบตเปˆเบกเปเบ—เบฑเบเปƒเบชเปˆเบซเป‰เบญเบ‡เบฎเบฝเบ™ HTML. เป€เบ›เบฑเบ™โ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบ”เบตโ€‹เป€เบฅเบตเบ”โ€‹, เบ„เบธเป‰เบกโ€‹เบ„เปˆเบฒโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹. เปเบ•เปˆเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ›เบฐเป€เบžเบ”เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ—เบตเปˆเบชเบฑเบšเบชเบปเบ™, เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเป€เบžเบทเปˆเบญเบฎเบฝเบ™เบฎเบนเป‰ GreenSock, เบกเบฑเบ™เป€เบ›เบฑเบ™เป€เบงเบ—เบตเบ—เบตเปˆเบ™เบดเบเบปเบกเปเบฅเบฐเบกเบตเบญเปเบฒเบ™เบฒเบ”. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰เบเบฑเบ‡เบกเบตเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบˆเปเบฒเบ™เบงเบ™เบซเบฅเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™.

เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เป„เบ”เป‰โ€‹เบ›เบถเบโ€‹เบชเบฒโ€‹เบซเบฒโ€‹เบฅเบทโ€‹เบซเป‰เบฒโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบกเบตโ€‹เบŠเบตโ€‹เบงเบดเบ”โ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰ Reactโ€‹:

  • css;
  • ReactTransitionGroup;
  • เบ›เบฐเบ•เบดเบเบดเบฅเบดเบเบฒ-เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง;
  • เบ›เบฐเบ•เบดเบเบดเบฅเบดเบเบฒ-เป€เบ›เบตเบ”เป€เบœเบตเบ;
  • TweenOne เปเบฅเบฐ Ant Design.

Skillbox เปเบ™เบฐเบ™เปเบฒ: เบซเบผเบฑเบเบชเบนเบ”เบเบฒเบ™เบชเบถเบเบชเบฒเบญเบญเบ™เป„เบฅเบ™เปŒ "เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ Java เบกเบทเบญเบฒเบŠเบตเบš".
เบžเบงเบเป€เบฎเบปเบฒเป€เบ•เบทเบญเบ™: เบชเปเบฒเบฅเบฑเบšเบœเบนเป‰เบญเปˆเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡ "Habr" - เบชเปˆเบงเบ™เบซเบผเบธเบ” 10 rubles เป€เบกเบทเปˆเบญเบฅเบปเบ‡เบ—เบฐเบšเบฝเบ™เปƒเบ™เบซเบผเบฑเบเบชเบนเบ” Skillbox เป‚เบ”เบเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบชเบปเปˆเบ‡เป€เบชเบตเบก "Habr".

เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบกเบตเบขเบนเปˆเปƒเบ™ เบ„เบฑเบ‡เป€เบเบฑเบšเบกเป‰เบฝเบ™ (เบˆเบฒเบเบ—เบตเปˆเบ™เบตเป‰, เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เป„เบ”เป‰เบ–เบทเบเปƒเบชเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบฎเบนเบšเบžเบฒเบš, เบ„เบทเบเบฑเบšเบšเบปเบ”เบ„เบงเบฒเบกเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš).

CSS

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเปƒเบ™เบ•เบญเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปเบฅเบฐเบกเบฑเบ™เบเปเปˆเบ”เบต. เบ–เป‰เบฒ, เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเบ™เปเบฒเป€เบ‚เบปเป‰เบฒเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ” JavaScript, เบ—เปˆเบฒเบ™เปƒเบŠเป‰เบกเบฑเบ™, เบเบฒเบ™เบ›เบฐเบเบญเบšเบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ, เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบซเบผเบฒเบ. เปเบฅเบฐเบ™เบตเป‰, เปเบ™เปˆเบ™เบญเบ™, เบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ. เบ–เป‰เบฒเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ, เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰.

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบ™เบตเป‰เปเบกเปˆเบ™เป€เบกเบ™เบนเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง:

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เบกเบฑเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ, เบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” CSS เปเบฅเบฐเบ•เบปเบงเบเบฐเบ•เบธเป‰เบ™เป€เบŠเบฑเปˆเบ™ className="is-nav-open" เปƒเบ™เปเบ—เบฑเบ HTML.

เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบงเบดเบ—เบตเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเป‰เบฒเบ‡ wrapper เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบเบฒเบ™เบ™เปเบฒเบ—เบฒเบ‡เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เป€เบฎเบฑเบ”เปƒเบซเป‰เป€เบเบตเบ”เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบ™เปเบฒเบ—เบฒเบ‡เบกเบตเบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡เบ„เบปเบ‡เบ—เบตเปˆเบ‚เบญเบ‡ 250px, เบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡เบ‚เบญเบ‡ wrapper เบ—เบตเปˆเบกเบตเบ‚เบญเบšเบŠเป‰เบฒเบเบซเบผเบทเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” translateX เบ„เบงเบ™เบกเบตเบ„เบงเบฒเบกเบเบงเป‰เบฒเบ‡เบ”เบฝเบงเบเบฑเบ™. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบเบฒเบ™เบ™เปเบฒเบ—เบฒเบ‡, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบก className = "is-nav-open" เปƒเบชเปˆ wrapper เปเบฅเบฐเบเป‰เบฒเบ wrapper เป„เบ› margin-left / translateX: 0;.

เปƒเบ™เบ—เบตเปˆเบชเบธเบ”, เปเบซเบผเปˆเบ‡เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบˆเบฐเบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ™เบตเป‰:

export default class ExampleCss extends Component {
    handleClick() {
        const wrapper = document.getElementById('wrapper');
        wrapper.classList.toggle('is-nav-open')
    }
    render() {
        return (
            <div id="wrapper" className="wrapper">
                <div className="nav">
                    <icon
                        className="nav__icon"
                        type="menu-fold"
                        onClick={() => this.handleClick()}/>
                    <div className="nav__body">
                        Lorem ipsum dolor sit amet, consectetur adipisicing elit.
                        Beatae ducimus est laudantium libero nam optio repellat
                        sit unde voluptatum?
                    </div>
                </div>
            </div>
        );
    }
}

เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบฎเบนเบšเปเบšเบš CSS:

.wrapper {
    display: flex;
    width: 100%;
    height: 100%;
    transition: margin .5s;
    margin: 0 0 0 -250px;
}
 
.wrapper.is-nav-open {
    margin-left: 0;
}
 
.nav {
    position: relative;
    width: 250px;
    height: 20px;
    padding: 20px;
    border-right: 1px solid #ccc;
}
.nav__icon {
    position: absolute;
    top: 0;
    right: -60px;
    padding: 20px;
    font-size: 20px;
    cursor: pointer;
    transition: color .3s;
}
 
.nav__icon:hover {
    color: #5eb2ff;
}

เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡, เบ–เป‰เบฒเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเป‰เบ™เบ•เป. เบœเบนเป‰เปƒเบŠเป‰เบˆเบฐเบžเปเปƒเบˆเบเบฑเบšเบ„เบงเบฒเบกเป„เบงเบ‚เบญเบ‡เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš.

ReactTransitionGroup

เบญเบปเบ‡เบ›เบฐเบเบญเบš ReactTransitionGroup เป„เบ”เป‰เบ–เบทเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ”เบเบ—เบตเบกเบ‡เบฒเบ™เบŠเบธเบกเบŠเบปเบ™ ReactJS. เบ”เป‰เบงเบเบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบกเบฑเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง CSS เบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเบฐเบเบฒเบ™เบซเบฑเบ™เบ›เปˆเบฝเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบ.

ReactTransitionGroup เบ–เบทเบเบญเบญเบเปเบšเบšเบกเบฒเป€เบžเบทเปˆเบญเบ›เปˆเบฝเบ™เบŠเบฑเป‰เบ™เบฎเบฝเบ™เป€เบกเบทเปˆเบญเบงเบปเบ‡เบˆเบญเบ™เบŠเบตเบงเบดเบ”เบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ›เปˆเบฝเบ™เปเบ›เบ‡. เบกเบฑเบ™เบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเปเบฅเบฐเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ•เบดเบ”เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบ™เบŠเบธเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบ React, เป€เบŠเบดเปˆเบ‡เบˆเบฐเป€เบžเบตเปˆเบกเบ‚เบฐเบซเบ™เบฒเบ”เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เป‚เบ”เบเบฅเบงเบกเป€เบฅเบฑเบเบ™เป‰เบญเบ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰ CDN.

ReactTransitionGroup เบกเบตเบชเบฒเบกเบญเบปเบ‡เบ›เบฐเบเบญเบš, Transition, CSSTransition เปเบฅเบฐ TransitionGroup. เป€เบžเบทเปˆเบญเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบซเปเปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ™เบžเบงเบเบกเบฑเบ™. เบฎเบนเบšเปเบšเบš, เปƒเบ™เบ—เบฒเบ‡เบเบฑเบšเบเบฑเบ™, เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™เปƒเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™ CSS.

เบ™เบตเป‰เปเบกเปˆเบ™เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ - เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฑเบ™.

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเป€เบ‚เบปเป‰เบฒ CSSTransitionGroup เบˆเบฒเบ react-transition-group. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบซเปเปˆเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเปเบฅเบฐเบเปเบฒเบ™เบปเบ”เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” transitionName. เบ—เบธเบเป†เบ„เบฑเป‰เบ‡เบ—เบตเปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเป€เบ”เบฑเบเบ™เป‰เบญเบเบขเบนเปˆเปƒเบ™ CSSTransitionGroup เบ–เบทเบเป€เบžเบตเปˆเบก เบซเบผเบทเบฅเบถเบšเบญเบญเบ, เบกเบฑเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเบšเปเบšเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง.

<CSSTransitionGroup
    transitionName="example">
    {items}
</CSSTransitionGroup>

เป‚เบ”เบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” transitionName = "เบ•เบปเบงเบขเปˆเบฒเบ‡", classes เปƒเบ™ style sheets เบ•เป‰เบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบŠเบทเปˆเบ•เบปเบงเบขเปˆเบฒเบ‡.

.example-eneter {
    opacity: 0.01;
}
 
.example-enter.example-enter-active {
    opacity: 1;
    transition: opacity 300ms ease-in;
}
 
.example-leave {
    opacity: 1;
}
 
.example-leave.example-leave-active {
    opacity: 0.01;
    transition: opacity 300ms ease-in;

เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰เปเบกเปˆเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ ReactTransitionGroup.

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบซเบ”เบœเบปเบ™, เปเบฅเบฐเบชเบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เป€เบžเบตเปˆเบกเบฅเบฒเบเบŠเบทเปˆเบ•เบดเบ”เบ•เปเปˆ.

เบงเบดเบ—เบตเบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™ handleAdd - เบกเบฑเบ™เป€เบžเบตเปˆเบกเบเบฒเบ™เบ•เบดเบ”เบ•เปเปˆเปƒเบซเบกเปˆ, เป„เบ”เป‰เบฎเบฑเบšเบŠเบทเปˆเปเบšเบšเบชเบธเปˆเบก, เป€เบŠเบดเปˆเบ‡เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบกเบฑเบ™เบงเบฒเบ‡เป„เบงเป‰เปƒเบ™ state.items array.

เป€เบžเบทเปˆเบญเป€เบญเบปเบฒเบฅเบฒเบเบŠเบทเปˆเบ•เบดเบ”เบ•เปเปˆเบญเบญเบเป‚เบ”เบเบ”เบฑเบ”เบชเบฐเบ™เบตเปƒเบ™เบญเบฒเป€เบฃ state.items, handleRemove เบ–เบทเบเปƒเบŠเป‰.

import React, { Component, Fragment } from 'react';
import { CSSTransitionGroup } from 'react-transition-group'
import random from 'random-name'
import Button from './button'
import Item from './item'
import './style.css';
export default class ReactTransitionGroup extends Component {
    
    constructor(props) {
        super(props);
        this.state = { items: ['Natividad Steen']};
        this.handleAdd = this.handleAdd.bind(this);
    }
 
    handleAdd() {
        let newItems = this.state.items;
        newItems.push(random());
        this.setState({ items: newItems });
    }
 
    render () {
        const items = this.state.items.map((item, i) => (
            <Item
            item={item}
            key={i}
            keyDelete={i}
            handleRemove={(i) => this.handleRemove(i)}
            />
        ));
 
    return (
        <Fragment>
            <Button onClick={this.handleAdd}/>
                <div className="project">
                    <CSSTransitionGroup
                    transitionName="example"
                    transitionEnterTimeout={500}
                    transitionLeaveTimeout={300}
                    >
                        {items}
                    </CSSTransitionGroup>
                </div>
        </Fragment>
    );
}
};

เบ›เบฐเบ•เบดเบเบดเบฅเบดเบเบฒ-เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง

เบ›เบฐเบ•เบดเบเบดเบฅเบดเบเบฒ-เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง เปเบกเปˆเบ™เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบ—เบตเปˆเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เปƒเบ™ animate.css. เบ™เบฒเบ‡เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเปเบฅเบฐเบกเบตเบเบฒเบ™เป€เบเบฑเบšเบเปเบฒเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบ. เบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เปเบกเปˆเบ™เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเปเบธเบ”เบ—เบตเปˆเบกเบตเบฎเบนเบšเปเบšเบšเปƒเบ™เปเบ–เบงเปƒเบ”เบ™เบถเปˆเบ‡เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบšเบเบฒเบ™เปƒเบŠเป‰เบงเบฑเบ”เบ–เบธเป€เบžเบทเปˆเบญเบเบณเบ™เบปเบ”เบเบญเบšเบญเบฐเบ™เบดเป€เบกเบŠเบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™, เบฅเบงเบกเบ—เบฑเบ‡ Radium, Aphrodite เบซเบผเบทเบญเบปเบ‡เบ›เบฐเบเบญเบšเบชเบฐเป„เบ•เบฅเปŒ.

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เบ‚เป‰เบญเบเบฎเบนเป‰เบงเปˆเบฒเป€เบˆเบปเป‰เบฒเบเบณเบฅเบฑเบ‡เบ„เบดเบ”เบซเบเบฑเบ‡:

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบเบงเบ”เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง bouncing.

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เบเปˆเบญเบ™เบญเบทเปˆเบ™เปเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบ™เบณเป€เบ‚เบปเป‰เบฒเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบˆเบฒเบ react-animation.

const Bounce = styled.div`animation: 2s ${keyframes`${bounce}`} infinite`;

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบชเป‰เบฒเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบš, เบžเบงเบเป€เบฎเบปเบฒเบซเปเปˆเบฅเบฐเบซเบฑเบ” HTML เบซเบผเบทเบญเบปเบ‡เบ›เบฐเบเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง.

<bounce><h1>Hello Animation Bounce</h1></bounce>

เบ•เบปเบงเบขเปˆเบฒเบ‡:

import React, { Component } from 'react';
import styled, { keyframes } from 'styled-components';
import { bounce } from 'react-animations';
import './style.css';
 
const Bounce = styled.div`animation: 2s ${keyframes`${bounce}`} infinite`;
 
export default class ReactAnimations extends Component {
    render() {
        return (
            <Bounce><h1>Hello Animation Bounce</h1></bounce>
        );
    }
}

เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบ, เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบตเบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เป€เบฅเบทเปˆเบญเบ™เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง - react-animate-on-scroll.

เบ›เบฐเบ•เบดเบเบดเบฅเบดเบเบฒเป€เบ›เบตเบ”เป€เบœเบตเบ

เปƒเบ™เบเบญเบšเบเบฒเบ™เป€เบ›เบตเบ”เป€เบœเบตเบ React เบกเบตเบญเบฐเบ™เบดเป€เบกเบŠเบฑเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบฅเบงเบกเบ—เบฑเบ‡เบเบฒเบ™เบˆเบฒเบ‡, เบžเบดเบ, เบ›เบฑเบšเบ‚เบฐเปœเบฒเบ”, เบเบฒเบ™เบซเบกเบธเบ™ เปเบฅเบฐเบญเบทเปˆเบ™เป†เบญเบตเบ. เบกเบฑเบ™เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ—เบฑเบ‡เบซเบกเบปเบ”เป‚เบ”เบเปƒเบŠเป‰ props. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบฅเบงเบกเบ—เบฑเบ‡เบ•เปเบฒเปเบซเบ™เปˆเบ‡, เบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒ, เป„เบฅเบเบฐเบซเปˆเบฒเบ‡, cascade เปเบฅเบฐเบญเบทเปˆเบ™เป†. เบœเบปเบ™เบเบฐเบ—เบปเบš CSS เบญเบทเปˆเบ™เป†เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰, เบฅเบงเบกเบ—เบฑเบ‡เบเบฒเบ™เบชเบฐเปเบ”เบ‡เบœเบปเบ™เบ‚เป‰เบฒเบ‡เป€เบŠเบตเบšเป€เบงเบตเปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเบกเบตเบ„เปเบฒเบชเบฑเปˆเบ‡เบชเบนเบ‡. เป‚เบ”เบเบฅเบงเบกเปเบฅเป‰เบง, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เป€เบฅเบทเปˆเบญเบ™เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง, เบเบญเบšเบ™เบตเป‰เปเบกเปˆเบ™เบ„เบธเป‰เบกเบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰.

import Fade from 'react-reveal/Fade';
 
<Fade top>
    <h1>Title</h1>
</Fade>

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เบกเบตเบซเป‰เบฒเบ—เปˆเบญเบ™เป„เบกเป‰เบขเบนเปˆเปƒเบ™เบˆเปเบฒเบ™เบงเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบ•เปˆเบฅเบฐเบ„เบปเบ™เบกเบตเบซเบ™เป‰เบฒเป€เบ•เบฑเบกเบซเบ™เป‰เบฒเบˆเปเปเบฅเบฐเบชเปˆเบงเบ™เบซเบปเบง.

import React, { Component, Fragment } from 'react';
import Fade from 'react-reveal/Fade';
 
const animateList = [1, 2, 3, 4, 5];
 
export default class ReactReveal extends Component {
    render() {
        return (
            <Fragment>
                {animateList.map((item, key) => (
                    <div style={styles.block} key={key}>
                        <Fade top>
                            <h1 style={styles.title}>{`block ${item}`}</h1>                       
                        </Fade>
                    </div>
                ))}
            </Fragment>
        );
    }
}
 
const styles = {
    block: {
        display: 'flex',
        alignItems: 'center',
        justifyContent: 'center',
        width: '100%',
        height: '100%',
        background: '#000',
        borderBottom: '1px solid rgba(255,255,255,.2)',
    },
    title: {
        textAlign: 'center',
        fontSize: 100,
        color: '#fff',
        fontFamily: 'Lato, sans-serif',
        fontWeight: 100,
    },
};

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบงเบเป€เบฎเบปเบฒเปเบ™เบฐเบ™เปเบฒ animateList เบ„เบปเบ‡เบ—เบตเปˆ. array เบกเบตเบซเป‰เบฒเบญเบปเบ‡เบ›เบฐเบเบญเบš. เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ array เปเบœเบ™เบ—เบตเปˆ, เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบชเบฐเปเบ”เบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ”เป†เปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบš Fade เป‚เบ”เบเบเบฒเบ™เปƒเบชเปˆเบญเบปเบ‡เบ›เบฐเบเบญเบšเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบชเปˆเบงเบ™เบซเบปเบง. เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบ–เบทเบเบเปเบฒเบ™เบปเบ”เป„เบงเป‰เปƒเบ™เบ„เปเป€เบ•เบปเป‰เบฒเป„เบ‚เปˆเบ—เบตเปˆเบ„เบปเบ‡เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเบšเปเบšเบš CSS เบชเบฑเป‰เบ™เบชเปเบฒเบฅเบฑเบšเบ—เบฑเบ‡เบšเบฅเบฑเบญเบเปเบฅเบฐเบชเปˆเบงเบ™เบซเบปเบง. เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบกเปˆเบ™เบซเป‰เบฒเบ—เปˆเบญเบ™เป„เบกเป‰เบ—เบตเปˆเบกเบตเบญเบฐเบ™เบดเป€เบกเบŠเบฑเบ™ Fade.

TweenOne เปเบฅเบฐเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปƒเบ™ Ant Design

เบเบฒเบ™เบญเบญเบเปเบšเบš Ant โ€” React UI เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบˆเปเบฒเบ™เบงเบ™เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆเบ‚เบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เปเบฅเบฐเบ‡เปˆเบฒเบเบ—เบตเปˆเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰. เบกเบฑเบ™เป€เบซเบกเบฒเบฐเบชเบปเบกเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเป‰เบฒเบ‡เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบชเบฐเบซเบ‡เปˆเบฒเบ‡เบฒเบก. เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเป‚เบ”เบ Alibaba, เป€เบŠเบดเปˆเบ‡เปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปƒเบ™เบซเบผเบฒเบเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ•เบปเบ™.

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เบ•เบปเบงเบขเปˆเบฒเบ‡เบกเบตเบญเบปเบ‡เบ›เบฐเบเบญเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบซเบผเบฒเบ. เบžเบงเบเบกเบฑเบ™เบชเปˆเบงเบ™เปƒเบซเบเปˆเบกเบตเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡เบˆเบฐเบ‡เปˆเบฒเบเบ”เบฒเบเบเบงเปˆเบฒเบญเบฑเบ™เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เบ™เบตเป‰เบˆเบฐเบ›เบฐเบเบญเบšเบกเบตเบžเบฝเบ‡เปเบ•เปˆเบšเบฒเบ™, เบšเบฒเบ™เบชเบตเบ‚เบฝเบงเปเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเป€เบžเบตเปˆเบกเป€เบ•เบตเบก, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบชเบตเปˆเบซเบฅเปˆเบฝเบกเบชเบตเปเบ”เบ‡.

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปƒเบŠเป‰เบญเบปเบ‡เบ›เบฐเบเบญเบš TweenOne, เป€เบŠเบดเปˆเบ‡เบ•เป‰เบญเบ‡เบเบฒเบ™ PathPlugin เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡. เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบžเบฝเบ‡เปเบ•เปˆเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบงเบฒเบ‡
PathPlugin เปƒเบ™ TweenOne.plugins.

TweenOne.plugins.push(PathPlugin);

เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

  • เป„เบฅโ€‹เบเบฐโ€‹เป€เบงโ€‹เบฅเบฒ โ€” เป€เบงโ€‹เบฅเบฒโ€‹เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹เปƒเบ™ msโ€‹;
  • เบ‡เปˆเบฒเบ - เบเป‰เบฝเบ‡ เบชเบฑเบ”;
  • yoyo - เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป„เบ›เบ‚เป‰เบฒเบ‡เบซเบ™เป‰เบฒเปเบฅเบฐเบ–เบญเบเบซเบผเบฑเบ‡เบ”เป‰เบงเบเบเบฒเบ™เบ„เป‰เบฒเบ‡เบซเป‰เบญเบ‡;
  • repeat - เป€เบฎเบฑเบ”โ€‹เป€เบฅโ€‹เบทเป‰เบกโ€‹เบ„เบทเบ™โ€‹เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹. เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เปƒเบŠเป‰ -1 เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ—เบตเปˆเบšเปเปˆเบกเบตเบ‚เบญเบšเป€เบ‚เบ”;
  • p โ€” เบžเบดเบเบฑเบ”เบ‚เบญเบ‡เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบง;
  • easePath โ€” เบ›เบฐโ€‹เบชเบฒเบ™โ€‹เบ‡เบฒเบ™โ€‹เบ‚เบญเบ‡โ€‹เป€เบชเบฑเป‰เบ™โ€‹เบ—เบฒเบ‡โ€‹เบเป‰เบฝเบ‡โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบ„เบทเปˆเบญเบ™โ€‹เป„เบซเบงโ€‹เป„เบ”เป‰โ€‹.

เบชเบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™เบชเบฐเป€เบžเบฒเบฐเบซเบผเบฒเบ, เปเบ•เปˆเบ—เปˆเบฒเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเบฑเบ‡เบงเบปเบ™เบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™, เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบ•เบฒเบกเบ—เบตเปˆเบกเบฑเบ™เบ„เบงเบ™.

const duration = 7000;
const ease = 'easeInOutSine';
const p =
  'M123.5,89.5 C148,82.5 239.5,48.5 230,17.5 C220.5,-13.5 127,6 99.5,13.5 C72,21 -9.5,56.5 1.5,84.5 C12.5,112.5 99,96.5 123.5,89.5 Z';
const easePath =
  'M0,100 C7.33333333,89 14.3333333,81.6666667 21,78 C25.3601456,75.6019199 29.8706084,72.9026327 33,70 C37.0478723,66.2454406 39.3980801,62.0758689 42.5,57 C48,46.5 61.5,32.5 70,28 C77.5,23.5 81.5,20 86.5,16 C89.8333333,13.3333333 94.3333333,8 100,0';
const loop = {
  yoyo: true,
  repeat: -1,
  duration,
  ease,
};

เบ•เบญเบ™เบ™เบตเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบชเป‰เบฒเบ‡เบงเบฑเบ”เบ–เบธเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป„เบ”เป‰.

  • redSquare เบ›เบฐเบเบญเบšเบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™ loop เบšเบงเบเบเบฑเบš Y coordinate, เป„เบฅเบเบฐเป€เบงเบฅเบฒเปเบฅเบฐเบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒ.
  • greenBall เบกเบตเป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบ—เบตเปˆเบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบงเบฑเบ”เบ–เบธ x, y เปเบกเปˆเบ™เบ„เปˆเบฒเบ‚เบญเบ‡ p. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เป„เบฅเบเบฐเป€เบงเบฅเบฒ, เบเบฒเบ™เบŠเปเป‰เบฒเบ„เบทเบ™เปเบฅเบฐเบเป‰เบฝเบ‡เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡ TweenOne.easing.path, เป€เบŠเบดเปˆเบ‡เบกเบตเบชเบญเบ‡เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™.
  • เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡ - easePath.
  • lengthPixel เป€เบ›เบฑเบ™เป€เบชเบฑเป‰เบ™เป‚เบ„เป‰เบ‡เบ—เบตเปˆเปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™ 400 เบžเบฒเบเบชเปˆเบงเบ™.
  • เบ•เบดเบ”เบ•เบฒเบกเปเบกเปˆเบ™เบฎเบนเบšเป„เบ‚เปˆเบ—เบตเปˆเบกเบตเปเบเบ™, เบกเบฑเบ™เบกเบตเบฎเบนเบšเปเบšเบšเบฎเบญเบšเบงเบฝเบ™เปเบฅเบฐเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบซเบกเบธเบ™.

const animate = {
  redSquare: {
    ...loop,
    y: 15,
    duration: 3000,
    delay: 200,
  },
  greenBall: {
    path: { x: p, y: p },
    duration: 5000,
    repeat: -1,
    ease: TweenOne.easing.path(easePath, { lengthPixel: 400 }),
  },
  track: {
    ...loop,
    rotate: 15,
  },
};

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบเบฑเบšเบญเบปเบ‡เบ›เบฐเบเบญเบš TweenOne. เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฑเบ‡เปเบปเบ”เบˆเบฐเบ–เบทเบเบ™เบณเป€เบ‚เบปเป‰เบฒเบˆเบฒเบ rc-tween-one. TweenOne เป€เบ›เบฑเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบกเบต proprs เบžเบทเป‰เบ™เบ–เบฒเบ™เปเบฅเบฐ props เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง. เปเบ•เปˆเบฅเบฐ TweenOne เบกเบตเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡, เป€เบŠเบฑเปˆเบ™: redSquare, track, greenBall.

import React from 'react';
import TweenOne from 'rc-tween-one';
 
export default function BannerImage() {
    return (
      <div className="wrapper-ant-design">
        <svg width="482px" height="500px" viewBox="0 0 482 500">
          <defs>
            <path
              d="M151,55 C129.666667,62.6666667 116,74.3333333 110,90 C104,105.666667 103,118.5 107,128.5 L225.5,96 C219.833333,79 209.666667,67 195,60 C180.333333,53 165.666667,51.3333333 151,55 L137,0 L306.5,6.5 L306.5,156 L227,187.5 L61.5,191 C4.5,175 -12.6666667,147.833333 10,109.5 C32.6666667,71.1666667 75,34.6666667 137,0 L151,55 Z"
              id="mask"
            />
          </defs>
          <g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd" transform="translate(0, 30)">
            <g id="Group-13" transform="translate(0.000000, 41.000000)">
              <TweenOne component="g" animation={animate.redSquare}>
                <rect
                  stroke="#F5222D"
                  strokeWidth="1.6"
                  transform="translate(184.000000, 18.000000) rotate(8.000000) translate(-184.000000, -18.000000) "
                  x="176.8"
                  y="150.8"
                  width="14.4"
                  height="14.4"
                  rx="3.6"
                />
              </TweenOne>
            </g>
            <g id="Group-14" transform="translate(150.000000, 230.000000)">
              <g id="Group-22" transform="translate(62.000000, 7.000000)">
                <image
                  id="cc4"
                  alt="globe"
                  xlinkHref="https://gw.alipayobjects.com/zos/rmsportal/FpKOqFadwoFFIZFExjaf.png"
                  width="151px"
                  height="234px"
                />
              </g>
              <mask id="mask-2">
                <use xlinkHref="#mask" fill="white" transform="translate(-42, -33)" />
              </mask>
              <g mask="url(#mask-2)">
                <TweenOne component="g" animation={animate.track} style={{ transformOrigin: '122.7px 58px' }}>
                  <g transform="translate(-16, -52)">
                    <g transform="translate(16, 52)">
                      <path
                        d="M83.1700911,35.9320015 C63.5256194,37.9279025 44.419492,43.1766434 25.8517088,51.6782243 C14.3939956,57.7126276 7.77167019,64.8449292 7.77167019,72.4866248 C7.77167019,94.1920145 61.1993389,111.787709 127.105708,111.787709 C193.012078,111.787709 246.439746,94.1920145 246.439746,72.4866248 C246.439746,55.2822262 212.872939,40.6598106 166.13127,35.3351955"
                        id="line-s"
                        stroke="#0D1A26"
                        strokeWidth="1.35"
                        strokeLinecap="round"
                        transform="translate(127.105708, 73.561453) rotate(-16.000000) translate(-127.105708, -73.561453) "
                      />
                    </g>
                    <TweenOne component="g" animation={animate.greenBall}>
                      <image
                        alt="globe"
                        id="id2"
                        xlinkHref="https://gw.alipayobjects.com/zos/rmsportal/IauKICnGjGnotJBEyCRK.png"
                        x="16"
                        y="62"
                        width="26px"
                        height="26px"
                      />
                    </TweenOne>
                  </g>
                </TweenOne>
              </g>
            </g>
          </g>
        </svg>
      </div>
    );
  }

5 เบงเบดเบ—เบตเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เปเบญเบฑเบš React เปƒเบ™เบ›เบต 2019

เปเบกเปˆเบ™เปเบฅเป‰เบง, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบ•เบฒเบขเป‰เบฒเบ™, เปเบ•เปˆเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบ™เบตเป‰เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบ.

 <TweenOne component="g" animation={animate.redSquare} />
  <TweenOne component="g" animation={animate.track} />
  <TweenOne component="g" animation={animate.greenBall} />

เบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบ„เบทเบเบฒเบ™เบญเบฐเบ—เบดเบšเบฒเบเบเบปเบ”เบฅเบฐเบšเบฝเบšเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบง เปเบฅเบฐเป‚เบญเบ™เบžเบงเบเบกเบฑเบ™เป„เบ›เบ—เบตเปˆเบญเบปเบ‡เบ›เบฐเบเบญเบš TweenOne.

เบเบฒเบ™เบšเบฑเบ™เบฅเบธเป€เบ›เบปเป‰เบฒเบซเบกเบฒเบเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบšเบปเบ”โ€‹เบ„เบงเบฒเบกโ€‹เบ™เบตเป‰โ€‹เป„เบ”เป‰โ€‹เบเบงเบกโ€‹เป€เบญเบปเบฒโ€‹เบงเบดโ€‹เบ—เบตโ€‹เปเบเป‰โ€‹เป„เบ‚โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบ—เบตเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เปƒเบ™โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบผเบฒเบโ€‹เบ‚เบญเบ‡โ€‹เป‚เบ„เบ‡โ€‹เบเบฒเบ™โ€‹. เบกเบฑเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ—เปˆเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบฅเบทเบญเบเป€เบญเบปเบฒเบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก.

Skillbox เปเบ™เบฐเบ™เปเบฒ:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster