在react中使用swiper7,横向循环焦点图片展示的轮播图

1、版本

"react": "17.0.2",
"swiper": "^7.4.1"

2、引入swiper

import { Navigation,Pagination} from 'swiper';
import { Swiper, SwiperSlide } from 'swiper/react/swiper-react.js';
import 'swiper/swiper-bundle.css';

注:因为插件包原因,引入方式也不一样,如有报错,请看swiper安插包内容。(此处引入与网官有出入)

3、页面代码

js代码

onSetTransition = (swiper,transition) => {
        for (let i = 0; i < swiper.slides.length; i++) {
            let slide = swiper.slides.eq(i)
            slide.transition(transition);
        }
}

onProgress = (swiper, progress) => {
        for(let i = 0; i < swiper.slides.length; i++){
            let slide = swiper.slides.eq(i);
            let slideProgress = swiper.slides[i].progress
            let modify = 1;
            if (Math.abs(slideProgress) > 1) {
               modify = (Math.abs(slideProgress) - 1) * 0.3 + 1;
            }
            let translate = slideProgress * modify * 319 + 'px';
            let scale = 1 - Math.abs(slideProgress) / 5;
            let zIndex = 999 - Math.abs(Math.round(10 * slideProgress));
            slide.transform('translateX(' + translate + ') scale(' + scale + ')');
            slide.css('zIndex', zIndex);
            slide.css('opacity', 1);
            if (Math.abs(slideProgress) > 3) {
                slide.css('opacity', 0);
            }
        }
}


 <div id="certify">
        <div className="swiper-container">
                <Swiper
                                key={systemData.length}
                                className="swiper-wrapper"
                                loop={true} //循环切换
                                watchSlidesProgress={true}  //Progress(进度、进程)分为swiper的progress 和每个slide单独的progress。
                                loopedSlides={5} //可视slide有3个,loopedSlides可设为5个或以上
                                slidesPerView={'auto'}
                                pagination={{ clickable: true }} //此参数设置为true时,点击分页器的指示点分页器会控制Swiper切换。
                                navigation={true} //前后进退按纽
                                centeredSlides={true} //设定为true时,active slide会居中,而不是默认状态下的居左。
                                initialSlide={Math.floor(systemData.length/2)} //与centeredSlide结合使用,指定初始化的索引
                                modules={[Navigation,Pagination]}
                                onProgress={this.onProgress} //回调函数,当Swiper的progress被改变时执行。接受swiper实例和此Swiper的progress作为参数(返回值范围一般在0-1)。
                                onSetTransition={this.onSetTransition} //回调函数,每当设置Swiper开始过渡动画时执行。transtion获取到的是Swiper的speed值。


                                >
                               {systemData.map(item => {
                                   return (
                                    <SwiperSlide key={item.course_id} className="swiper-slide">
                                    {/* <div className="swiper-slide"> */}
                                       <img src={item.course_img} alt="" key={item.course_id} onClick={() => {this.gotoDetails(item.course_id)}}/>
                                       <div className="swiper-title">{item.course_name}</div>
                                       <div className="swiper-askr"></div>
                                   {/* </div> */}
                                   </SwiperSlide>
                                   )
                               })}
                   </Swiper>
         </div>
 </div>

注:在react中,用了centeredSlides(设定为true时,active slide会居中,而不是默认状态下的居左。)属性时,一定要指定设定初始化时slide的索引,两位结合使用。要不,centeredSlides:true就会失效,会为默认状态居左。
scss代码

// 轮播图样式
    #certify{
        position: relative;
        width: 100%;
        /* width: 1200px; */
        width: 1210px;
        height: 530px;
        // height: 602px;
        margin: 0 auto;
        overflow: hidden;
        }
        #certify .swiper-slide {
        /* width: 520px;
        height: 408px; */
        width: 660px;
        // height: 410px;
        height: 468px;
        background: #fff;
        box-shadow: 0 8px 30px #ddd;
        font-size: 18px;
        transition: 300ms;
        border-radius: 16px;
        overflow: hidden;
        margin-bottom: 30px;
        position: relative;
    }
    .swiper-title{
        height: 60px;
        width: 100%;
        color: #333333;
        font-size: 19px;
        line-height: 60px;
        padding-left: 32px;
    }
    #certify .swiper-slide img{
        width: 660px;
        height: 410px;
        overflow: hidden;
    }
    
    .swiper-container {
        width: 100%;
        height: 100%;
    }

    .swiper-pagination-bullet{
        width: 10px;
        height: 10px;
        border-radius: 5px;
        background: rgba(255, 255, 255) ;
        opacity: 1 !important;
    }
    .swiper-pagination-bullet-active{
        width: 31px;
        height: 10px;
        background: linear-gradient(-90deg, #5FCDFB 0%, #1DAFED 100%);
        border-radius: 5px;
    }
    .swiper-slide-active {
        cursor: pointer;
        .swiper-askr{
            display: none !important;
        }
    }
    .swiper-slide{
        .swiper-askr{
            display: block;
        }
    }
    .swiper-askr{
        position: absolute;
        background: rgba(0, 0, 0, .4);
        width: 660px;
        height: 468px;
        top: 0;
        left: 0;
    }
    .swiper-button-prev,.swiper-button-next{
        width: 52px;
        height: 52px;
        background: #000000;
        opacity: 0.6;
        border-radius: 50%;
    }
    .swiper-button-prev{
        left: 26px;
    }
    .swiper-button-next{
        right: 26px;
    }
    .swiper-button-next:after,.swiper-button-prev:after{
        color: #fff !important;
        transform: scale(0.4);
    }
    .swiper-horizontal > .swiper-pagination-bullets .swiper-pagination-bullet, .swiper-pagination-horizontal.swiper-pagination-bullets .swiper-pagination-bullet{
        margin: 0 7px;
        cursor: pointer;
    }
    
}

4、效果如下

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容