简体   繁体   English

React-slick:在滑动时添加 animation

[英]React-slick: Adding animation while sliding

I had created a slider using react slick now there is a requirement to change transition and animation of slides on prev and next button click.我已经使用 react slick 创建了 slider 现在需要在上一个和下一个按钮单击时更改幻灯片的过渡和 animation。 Got some help that add class to currently active slide while changing slide and add animation and transition effect to it.获得一些帮助,将 class 添加到当前活动的幻灯片,同时更改幻灯片并添加 animation 和过渡效果。 And remove after it slides completely changed.并在它完全改变幻灯片后删除。 I tried but it is not working as expecting.我试过了,但它没有按预期工作。 First it is not adding classe on next or prev button button click Second it is adding class on swiping slide but it disturbs other carousel items Here is my code首先它没有在下一个或上一个按钮按钮单击上添加类其次它在滑动幻灯片上添加 class 但它会干扰其他轮播项目这是我的代码

  const settings = {
    slidesToShow: 1,
    slidesToScroll: 1,
    arrows: false,
    autoplay: false,
    autoplaySpeed: 2000,
    infinite: false,
    beforeChange,
    afterChange,
    useCSS: false,
    useTransform : false
  }

  const beforeChange = (prev: number, next: number) => {
    let element = document.querySelector('.slick-active');
    element?.classList.add('next-slide-anim');
    setIndex(next);
  };

  const afterChange = (index : number) => {
    let element = document.querySelector('.slick-active');
    element.classList.remove('next-slide-anim')
  };

  const settings = {
    slidesToShow: 1,
    slidesToScroll: 1,
    arrows: false,
    autoplay: false,
    autoplaySpeed: 2000,
    infinite: false,
    beforeChange,
    afterChange,
    useCSS: false,
    useTransform : false
  }

  const next = () => {
    sliderRef.current.slickNext()
  };

  const previous = () => {
    sliderRef.current.slickPrev();
  };

 <div className="home-slider">
            <div className="carousel">
              <Slider {...settings} className="carousel-inner" ref={ref => sliderRef.current = ref}>
                {
                  slides.map((slide: any, index) => (
                    <div className="carousel-item" key={index} ref={ref => carouselRef.current = ref}>
                      <div className="slide-content">
                        {index !== slides.length - 1 &&
                          <>
                            <h3>{slide.username}</h3>
                            <span id="user-icon-link">
                              <Link to="/" target="_blank">
                                <img src="/images/homeScreen/instagram.png" alt="link-icon" width="20" height="20" />{slide.userlink}</Link>
                            </span>
                          </>
                        }
                      </div>
                      <img src={slide.path} alt="Chicago" width="1100" height="500" />
                    </div>
                  ))
                }
              </Slider>
              {((slides.length !== 0) && (index !== slides.length - 1)) &&
                <>
                  {(index !== 0) && <a href="#/" className="carousel-control-prev" onClick={previous}>
                    <img src="/images/homeScreen/skipnewbtn.png" alt="Los Angeles" />
                  </a>}
                  {index !== slides.length - 1 && <a href="#/" className="carousel-control-next" id="next-btn" onClick={next}  >
                    <img src="/images/homeScreen/fast-forward-button.gif" alt="Los Angeles" />
                  </a>}
                </>
              }
            </div>
          </div>

Instead of using .slick-active , you can get the slide elements in your beforeChange by using the index values passed to the function and then add/remove the classes from the appropriate slides.您可以使用传递给beforeChange的索引值来获取 beforeChange 中的幻灯片元素,而不是使用.slick-active ,然后从相应的幻灯片中添加/删除类。 Without seeing your CSS, I'm guessing that you want to add your animation in the beforeChange , but if it works out better, you could always move the classList.add() to your afterChange .在没有看到您的 CSS 的情况下,我猜您想在 beforeChange 中添加beforeChange ,但如果效果更好,您可以随时将classList.add()移动到您的afterChange中。

const beforeChange = (prev: number, next: number) => {
  const prevSlideElement = slider.current.innerSlider.list.querySelector(`[data-index="${prev}"]`);
  const nextSlideElement = slider.current.innerSlider.list.querySelector(`[data-index="${next}"]`);

  prevSlideElement.classList.remove('next-slide-anim');
  nextSlideElement.classList.add('next-slide-anim');
}

Response of Ed is good, but need one more trick ! Ed 的反应很好,但还需要一个技巧!

beforeChange is triggerd before react-slick add his internal classes like "current-slide", so next-slide-anim is override and animation don't show up...在 react- beforeChange添加他的内部类(如“current-slide”)之前触发 beforeChange,因此next-slide-anim被覆盖并且 animation 不会出现......

To correct this we need to call a Timeout function to trigger code on next tick.为了纠正这个问题,我们需要调用Timeout function 以在下一个滴答时触发代码。

const beforeChange = (prev: number, next: number) => {
  const prevSlideElement = slider.current.innerSlider.list.querySelector(`[data-index="${prev}"]`);
  const nextSlideElement = slider.current.innerSlider.list.querySelector(`[data-index="${next}"]`);
  setTimeout(() => {
    prevSlideElement.classList.remove('next-slide-anim');
    nextSlideElement.classList.add('next-slide-anim');
  });
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM