代码之家  ›  专栏  ›  技术社区  ›  LayTexas

自定义箭头滑动滑块+Next.js+Sass

  •  1
  • LayTexas  · 技术社区  · 3 年前

    我在Next开发的一个项目中使用滑块滑动器。JS和我正在使用Sass进行样式设计。但是,当我按照文档的要求使用滑动器类来设置箭头样式时,它不起作用。

    我需要箭头在组件外部,不要重叠。

    CSS

    .swiper-button-next,
    .swiper-button-prev {
      background: red;
      position: absolute;
      top: 50%;
      width: calc(var(--swiper-navigation-size) / 44 * 27);
      height: var(--swiper-navigation-size);
      margin-top: calc(0px - (var(--swiper-navigation-size) / 2));
      z-index: 10;
      cursor: pointer;
      display: flex;
      align-items: center;
      justify-content: center;
      color: var(--swiper-navigation-color, var(--swiper-theme-color));
    }
    .swiper-button-next.swiper-button-disabled,
    .swiper-button-prev.swiper-button-disabled {
      opacity: 0.35;
      cursor: auto;
      pointer-events: none;
    }
    .swiper-button-next:after,
    .swiper-button-prev:after {
      background: red;
      font-family: swiper-icons;
      font-size: var(--swiper-navigation-size);
      text-transform: none !important;
      letter-spacing: 0;
      text-transform: none;
      font-variant: initial;
      line-height: 1;
    }
    .swiper-button-prev,
    .swiper-container-rtl .swiper-button-next {
      left: 10px;
      right: auto;
    }
    .swiper-button-prev:after,
    .swiper-container-rtl .swiper-button-next:after {
      content: "prev";
      color: #000;
    }
    .swiper-button-next,
    .swiper-container-rtl .swiper-button-prev {
      right: 10px;
      left: auto;
    }
    .swiper-button-next:after,
    .swiper-container-rtl .swiper-button-prev:after {
      content: "next";
    }
    .swiper-button-next.swiper-button-white,
    .swiper-button-prev.swiper-button-white {
      --swiper-navigation-color: #ffffff;
    }
    .swiper-button-next.swiper-button-black,
    .swiper-button-prev.swiper-button-black {
      --swiper-navigation-color: #000000;
    }
    .swiper-button-lock {
      display: none;
    }
    

    我尝试过更改样式,但组件上没有任何反映。如果我通过浏览器更改样式,它会正常工作。

    0 回复  |  直到 3 年前
        1
  •  8
  •   adrianmanduc    3 年前

    更改基本箭头样式非常简单-看看下面的codesandbox: https://codesandbox.io/s/stoic-shaw-q35wq?file=/src/styles.scss

    .swiper-button-prev, .swiper-button-next {
      top: 45%;
      width: 40px;
      height: 40px;
      background: #fff;
      border: 1px solid gray;
      border-radius: 50%;
      color: blue;
      font-weight: 700;
      outline: 0;
      transition: background-color .2s ease, color .2s ease;
      
      &::after {
          font-size: 16px;
      }
    }
    
    .swiper-button-prev {
      &:after {
          position: relative;
          left: -1px;
      }
    }
    
    .swiper-button-next {
      &:after {
          position: relative;
          left: 1px;
      }
    }
    
    .swiper-button-prev, .swiper-container-rtl .swiper-button-next {
      left: 10px;
      right: auto;
    }
    
    .swiper-button-next, .swiper-container-rtl .swiper-button-prev {
      right: 10px;
      left: auto;
    }
    
    .swiper-button-prev.swiper-button-disabled, .swiper-button-next.swiper-button-disabled {
      opacity: 0;
      cursor: auto;
      pointer-events: none;
    }
    

    然而,将箭头移到外面有点棘手。在上面的例子中,我使用了一些CSS技巧(负边距和相应的填充)和一些溢出来让它工作,但这可能不足以满足你的用例。

    您必须创建自己的下一个/上一个元素:

    import React from "react";
    import { Navigation, Pagination, Scrollbar, A11y, Controller } from "swiper";
    import { Swiper, SwiperSlide } from "swiper/react";
    
    // Import Swiper styles
    import "swiper/css";
    import "swiper/css/navigation";
    import "swiper/css/pagination";
    import "swiper/css/scrollbar";
    
    import "./styles.scss";
    
    const image = "https://source.unsplash.com/featured/300x201";
    
    export default function App() {
      const images = new Array(6).fill({ url: image });
    
      const [swiper, setSwiper] = React.useState();
      const prevRef = React.useRef();
      const nextRef = React.useRef();
    
      React.useEffect(() => {
        if (swiper) {
          console.log("Swiper instance:", swiper);
          swiper.params.navigation.prevEl = prevRef.current;
          swiper.params.navigation.nextEl = nextRef.current;
          swiper.navigation.init();
          swiper.navigation.update();
        }
      }, [swiper]);
    
      return (
        <div className="App">
          <div className="carousel-container">
            <div className="swiper-button" ref={prevRef}>
              prev
            </div>
            <Swiper
              modules={[Navigation, Pagination, Scrollbar, A11y, Controller]}
              className="external-buttons"
              spaceBetween={24}
              slidesPerView={1}
              navigation={{
                prevEl: prevRef?.current,
                nextEl: nextRef?.current
              }}
              updateOnWindowResize
              observer
              observeParents
              initialSlide={2}
              onSwiper={setSwiper}
            >
              {images.map((image, index) => (
                <SwiperSlide key={index}>
                  <img
                    height="200"
                    width="300"
                    alt="img"
                    className="image"
                    src={image.url}
                  />
                </SwiperSlide>
              ))}
            </Swiper>
            <div className="swiper-button" ref={nextRef}>
              next
            </div>
          </div>
        </div>
      );
    }
    

    完整示例- https://codesandbox.io/s/prod-darkness-o483y?file=/src/App.js

    重要事项 -示例使用的是Swiper v7

        2
  •  2
  •   hamza liaqat    2 年前

    以下是添加自定义箭头的最佳方法:

    import React, { useRef } from "react";
    // For Typescript 
    // import SwiperCore from "swiper";
    import { Swiper, SwiperSlide } from "swiper/react";
    import "swiper/css";
    
    
    const SliderComponent = () => {
    const swiperRef = useRef();
    
    // For Typescript!
    // const swiperRef = useRef<SwiperCore>();  
    
    
    const sliderSettings = {
      440: {
        slidesPerView: 1,
        spaceBetween: 30,
      },
      680: {
        slidesPerView: 2,
        spaceBetween: 30,
      },
      1024: {
        slidesPerView: 3,
        spaceBetween: 30,
      },
    };
    
    return (
        <div>
          <button onClick={() => swiperRef.current?.slidePrev()}>Prev</button>
    
          <Swiper
            slidesPerView={3}
            breakpoints={sliderSettings}
            onBeforeInit={(swiper) => {
              swiperRef.current = swiper;
            }}
          >
            <SwiperSlide>
              Slide 1
            </SwiperSlide>
            <SwiperSlide>
              Slide 2
            </SwiperSlide>
            <SwiperSlide>
              Slide 3
            </SwiperSlide>
            <SwiperSlide>
              Slide 4
            </SwiperSlide>
            <SwiperSlide>
              Slide 5
            </SwiperSlide>
          </Swiper>
    
          <button onClick={() => swiperRef.current?.slideNext()}>Next</button>
        </div>
      );
    };
    
    export default SliderComponent;
    
        3
  •  0
  •   Justin Torre    2 年前

    hamza liaqat的答案是正确的,但对于打字稿,你需要添加

    import { Swiper as SwiperCore } from 'swiper/types';