Slider 图片轮播

如果项目中使用的是 1.x 版本的基础组件(@alifd/next),请在左侧导航顶部切换组件版本。

安装方法

  1. 在命令行中执行以下命令npm install @icedesign/base@latest -S

Guide

轮播组件,就是以幻灯片的方式,在页面中横向展示诸多内容的组件。轮播内容相互独立,前后在内容以及数据上都不存在逻辑关系。

何时使用

  • 单图轮播:该样式通常用于承载运营banner,是一个位置相对固定的模块。

  • 多图轮播:单元信息浏览

使用注意点

  • 当轮播组件中只有一张图片的时候,轮播组件会隐藏导航锚点、禁止自动循环(即使上层设置了)、禁止拖拽播放(即使上层设置了)。

  • 如果您要将 Slider 放到 Dialog 中,此时你需要关闭 Dialog 的动画,避免 Slider 在计算内部元素宽度时造成出错。

  • 如果出现图片高度 1px 的问题,可以尝试在 img 标签的外部包裹一层 div 标签。

API

图片轮播

参数说明类型默认值
prefix样式前缀String'next-'
className自定义传入的样式String-
adaptiveHeight是否使用自适应高度Booleanfalse
animation是否开启动效Booleantrue
arrows是否显示箭头Booleantrue
arrowSize导航箭头大小可选值:'medium', 'large'Enum'medium'
arrowPos导航箭头位置可选值:'inline', 'outer'Enum'inline'
arrowDirection导航箭头的方向可选值:'horizontal', 'vertical'Enum'horizontal'
nextArrow向后箭头ReactElementnull
prevArrow向后箭头ReactElementnull
autoplay是否自动播放Booleanfalse
autoplaySpeed自动播放的速度Number3000
centerMode是否启用居中模式Booleanfalse
dots是否显示导航锚点Booleantrue
dotsDirection导航锚点到位置可选值:'horizontal', 'vertical'Enum'horizontal'
draggable是否可拖拽Booleantrue
fade是否使用淡入淡出效果Booleanfalse
infinite是否使用无穷循环模式Booleantrue
initialSlide初始被激活的轮播图Number0
lazyLoad是否启用懒加载Booleanfalse
slideDirection轮播方向可选值:'horizontal', 'vertical'Enum'horizontal'
slidesToShow同时展示的图片数量Number1
slidesToScroll同时滑动到图片数量Number1
speed轮播速度Number500
slickGoTo跳转到指定的轮播图(受控)Number-
afterChange轮播切换后的回调函数签名:Function(index: Number) => void参数:index: {Number} 当前幻灯片的索引Functionnull
beforeChange轮播切换前的回调函数签名:Function(currentIndex: Number, nextIndex: Number) => void参数:currentIndex: {Number} 当前幻灯片的索引nextIndex: {Number} 下一张幻灯片的索引Functionnull

代码示例

导航箭头位置

可以通过指定arrowPos的属性值为outer,使用外置按钮,其默认值为inline。轮播组件的导航按钮在默认情况下为内置模式。在多图同时导航的情况下,如果想要使用外置按钮,

Slider 图片轮播 - 图1

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. ReactDOM.render(
  3. <div>
  4. <Slider slidesToShow={4} arrowPos="outer">
  5. <div style={{ width: "25%" }}>
  6. <h4 className="h4">1</h4>
  7. </div>
  8. <div style={{ width: "25%" }}>
  9. <h4 className="h4">2</h4>
  10. </div>
  11. <div style={{ width: "25%" }}>
  12. <h4 className="h4">3</h4>
  13. </div>
  14. <div style={{ width: "25%" }}>
  15. <h4 className="h4">4</h4>
  16. </div>
  17. <div style={{ width: "25%" }}>
  18. <h4 className="h4">5</h4>
  19. </div>
  20. </Slider>
  21. <br />
  22. <Slider>
  23. <div>
  24. <h3 className="h3">1</h3>
  25. </div>
  26. <div>
  27. <h3 className="h3">2</h3>
  28. </div>
  29. <div>
  30. <h3 className="h3">3</h3>
  31. </div>
  32. <div>
  33. <h3 className="h3">4</h3>
  34. </div>
  35. </Slider>
  36. </div>,
  37. mountNode
  38. );
  1. .next-slick .h3, .h4 {
  2. background: #4F74B3;
  3. color: #fff;
  4. line-height: 150px;
  5. text-align: center;
  6. margin-top: 0;
  7. margin-bottom: 0;
  8. }
  9. .next-slick .h4 {
  10. margin: 0 5px;
  11. position: relative;
  12. }

自动播放

可以通过 autoplayautoplaySpeed 属性来设置组件是否自动轮播 和 自动轮播的速度。

Slider 图片轮播 - 图2

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. ReactDOM.render(
  3. <div style={{ width: "600px" }}>
  4. <Slider
  5. slidesToShow={4}
  6. arrowPos="outer"
  7. dots={false}
  8. autoplay
  9. autoplaySpeed={1000}
  10. >
  11. <div style={{ width: "25%" }}>
  12. <h4 className="h4">1</h4>
  13. </div>
  14. <div style={{ width: "25%" }}>
  15. <h4 className="h4">2</h4>
  16. </div>
  17. <div style={{ width: "25%" }}>
  18. <h4 className="h4">3</h4>
  19. </div>
  20. <div style={{ width: "25%" }}>
  21. <h4 className="h4">4</h4>
  22. </div>
  23. <div style={{ width: "25%" }}>
  24. <h4 className="h4">5</h4>
  25. </div>
  26. <div style={{ width: "25%" }}>
  27. <h4 className="h4">6</h4>
  28. </div>
  29. <div style={{ width: "25%" }}>
  30. <h4 className="h4">7</h4>
  31. </div>
  32. <div style={{ width: "25%" }}>
  33. <h4 className="h4">8</h4>
  34. </div>
  35. <div style={{ width: "25%" }}>
  36. <h4 className="h4">9</h4>
  37. </div>
  38. </Slider>
  39. </div>,
  40. mountNode
  41. );
  1. .next-slick .h3, .h4 {
  2. margin: 0 5px;
  3. background: #4F74B3;
  4. color: #fff;
  5. line-height: 150px;
  6. text-align: center;
  7. margin-top: 0;
  8. margin-bottom: 0;
  9. }

基本

注意: 如果出现图片 1px 高度的问题,建议将图片的外部包括一层 div 来避免这个问题。在默认模式下(不指定任何属性值),轮播组件为单图轮播模式。轮播组件共有两种类型:单图轮播和多图同时轮播。

Slider 图片轮播 - 图3

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const slides = [
  3. {
  4. url: "https://img.alicdn.com/tps/TB1bewbNVXXXXc5XXXXXXXXXXXX-1000-300.png",
  5. text: "手机淘宝皮肤征集"
  6. },
  7. {
  8. url: "https://img.alicdn.com/tps/TB1xuUcNVXXXXcRXXXXXXXXXXXX-1000-300.jpg",
  9. text: "阿里公益T恤设计大概"
  10. },
  11. {
  12. url: "https://img.alicdn.com/tps/TB1ikP.NVXXXXaYXpXXXXXXXXXX-1000-300.jpg",
  13. text: "淘公仔设计大赛"
  14. },
  15. {
  16. url: "https://img.alicdn.com/tps/TB1s1_JNVXXXXbhaXXXXXXXXXXX-1000-300.jpg",
  17. text: "磁带播放器换肤设计大赛"
  18. }
  19. ];
  20. ReactDOM.render(
  21. <Slider>
  22. {slides.map((item, index) => (
  23. <div key={index} className="slider-img-wrapper">
  24. <img src={item.url} alt={item.text} />
  25. </div>
  26. ))}
  27. </Slider>,
  28. mountNode
  29. );
  1. .slider-img-wrapper img {
  2. width: 100%;
  3. }

导航按钮尺寸

对特定场景,比如展示的图片较大的情况下,可以选择large,将导航按钮设置为大按钮。可以通过arrowSize属性来更改导航组件的按钮尺寸,默认值为normal

Slider 图片轮播 - 图4

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const bigSlides = [
  3. {
  4. url: "https://img.alicdn.com/tps/TB1bewbNVXXXXc5XXXXXXXXXXXX-1000-300.png",
  5. text: "磁带播放器换肤设计大赛"
  6. },
  7. {
  8. url: "https://img.alicdn.com/tps/TB1xuUcNVXXXXcRXXXXXXXXXXXX-1000-300.jpg",
  9. text: "手机淘宝皮肤征集"
  10. },
  11. {
  12. url: "https://img.alicdn.com/tps/TB1ikP.NVXXXXaYXpXXXXXXXXXX-1000-300.jpg",
  13. text: "设计赋能公益"
  14. },
  15. {
  16. url: "https://img.alicdn.com/tps/TB1s1_JNVXXXXbhaXXXXXXXXXXX-1000-300.jpg",
  17. text: "淘公仔设计大赛"
  18. }
  19. ];
  20. ReactDOM.render(
  21. <div>
  22. <Slider>
  23. {bigSlides.map((item, index) => (
  24. <div key={index} className="slider-img-wrapper">
  25. <img src={item.url} alt={item.text} />
  26. </div>
  27. ))}
  28. </Slider>
  29. <br />
  30. <Slider arrowSize="large">
  31. {bigSlides.map((item, index) => (
  32. <div key={index} className="slider-img-wrapper">
  33. <img src={item.url} alt={item.text} />
  34. </div>
  35. ))}
  36. </Slider>
  37. </div>,
  38. mountNode
  39. );
  1. .slider-img-wrapper img {
  2. width: 100%;
  3. }

居中模式

居中模式可以突出显示最核心区域的内容,您可以通过设置 centerMode 属性址为 true 开启该功能。

Slider 图片轮播 - 图5

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const settings = {
  3. className: "custom-slide center",
  4. centerMode: true,
  5. infinite: true,
  6. dots: false,
  7. arrowPos: "outer",
  8. centerPadding: "60px",
  9. slidesToShow: 3,
  10. speed: 500
  11. };
  12. ReactDOM.render(
  13. <Slider {...settings}>
  14. <div>
  15. <h3>1</h3>
  16. </div>
  17. <div>
  18. <h3>2</h3>
  19. </div>
  20. <div>
  21. <h3>3</h3>
  22. </div>
  23. <div>
  24. <h3>4</h3>
  25. </div>
  26. <div>
  27. <h3>5</h3>
  28. </div>
  29. <div>
  30. <h3>6</h3>
  31. </div>
  32. <div>
  33. <h3>7</h3>
  34. </div>
  35. <div>
  36. <h3>8</h3>
  37. </div>
  38. <div>
  39. <h3>9</h3>
  40. </div>
  41. </Slider>,
  42. mountNode
  43. );
  1. .custom-slide h3 {
  2. background: #4F74B3;
  3. color: #fff;
  4. font-size: 36px;
  5. line-height: 100px;
  6. margin: 10px;
  7. padding: 2%;
  8. position: relative;
  9. text-align: center;
  10. }
  11. .center h3 {
  12. opacity: 0.8;
  13. transition: all 300ms ease;
  14. }
  15. .center .next-slick-center h3 {
  16. color: #e67e22;
  17. opacity: 1;
  18. transform: scale(1.08);
  19. }

自定义导航箭头

开发者可以通过 prevArrownextArrow 两个属性传入自定义的导航箭头组件。

Slider 图片轮播 - 图6

查看源码在线预览

  1. import { Slider, Icon } from "@icedesign/base";
  2. const slides = [
  3. {
  4. url: "https://img.alicdn.com/tps/TB1bewbNVXXXXc5XXXXXXXXXXXX-1000-300.png",
  5. text: "手机淘宝皮肤征集"
  6. },
  7. {
  8. url: "https://img.alicdn.com/tps/TB1xuUcNVXXXXcRXXXXXXXXXXXX-1000-300.jpg",
  9. text: "阿里公益T恤设计大概"
  10. },
  11. {
  12. url: "https://img.alicdn.com/tps/TB1ikP.NVXXXXaYXpXXXXXXXXXX-1000-300.jpg",
  13. text: "淘公仔设计大赛"
  14. },
  15. {
  16. url: "https://img.alicdn.com/tps/TB1s1_JNVXXXXbhaXXXXXXXXXXX-1000-300.jpg",
  17. text: "磁带播放器换肤设计大赛"
  18. }
  19. ];
  20. const arrowStyle = {
  21. display: "block",
  22. background: "red",
  23. opacity: 1,
  24. margin: "0 20px"
  25. };
  26. const CustomNextArrow = props => {
  27. return (
  28. <div {...props} style={arrowStyle}>
  29. <Icon type="arrow-double-right" />
  30. </div>
  31. );
  32. };
  33. const CustomPrevArrow = props => {
  34. return (
  35. <div {...props} style={arrowStyle}>
  36. <Icon type="arrow-double-left" />
  37. </div>
  38. );
  39. };
  40. ReactDOM.render(
  41. <Slider
  42. nextArrow={<CustomNextArrow />}
  43. prevArrow={<CustomPrevArrow />}
  44. lazyLoad
  45. >
  46. {slides.map((item, index) => (
  47. <div key={index} className="slider-img-wrapper">
  48. <img src={item.url} alt={item.text} />
  49. </div>
  50. ))}
  51. </Slider>,
  52. mountNode
  53. );
  1. .slider-img-wrapper img {
  2. width: 100%;
  3. }

使用自定义组件

你可以为传递自定义组件到 Slider 组件中。前提是该组件一定要开放透传 props 到下层组件或元素,Slider 底层需要执行元素的 clone 操作。

Slider 图片轮播 - 图7

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. import PropTypes from "prop-types";
  3. const pages = [1, 2, 3, 4];
  4. function Inner({ children, ...others }) {
  5. // 注意这里要透传其他属性到到下层节点上,Slider 底层需要执行元素的 clone 操作
  6. return <div {...others}>{children}</div>;
  7. }
  8. Inner.propTypes = {
  9. children: PropTypes.any
  10. };
  11. const slider = (
  12. <Slider>
  13. {pages.map((page, index) => {
  14. return (
  15. <Inner className="custom-inner" key={index}>
  16. custom {page}
  17. </Inner>
  18. );
  19. })}
  20. </Slider>
  21. );
  22. ReactDOM.render(<div>{slider}</div>, mountNode);
  1. .custom-inner {
  2. background: #4F74B3;
  3. color: #fff;
  4. line-height: 150px;
  5. text-align: center;
  6. margin-top: 0;
  7. margin-bottom: 0;
  8. }

导航锚点方向

当其值设为 vertical 时为垂直方向展示。通过 dotsDirection 可以改变导航锚点的位置,默认为 horizontal 即水平方向。

Slider 图片轮播 - 图8

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. ReactDOM.render(
  3. <div>
  4. <Slider dotsDirection="horizontal" arrows={false}>
  5. <div>
  6. <h3 className="h3">1</h3>
  7. </div>
  8. <div>
  9. <h3 className="h3">2</h3>
  10. </div>
  11. <div>
  12. <h3 className="h3">3</h3>
  13. </div>
  14. <div>
  15. <h3 className="h3">4</h3>
  16. </div>
  17. </Slider>
  18. <br />
  19. <Slider dotsDirection="vertical" arrows={false}>
  20. <div>
  21. <h3 className="h3">1</h3>
  22. </div>
  23. <div>
  24. <h3 className="h3">2</h3>
  25. </div>
  26. <div>
  27. <h3 className="h3">3</h3>
  28. </div>
  29. <div>
  30. <h3 className="h3">4</h3>
  31. </div>
  32. </Slider>
  33. </div>,
  34. mountNode
  35. );
  1. .next-slick .h3, .h4 {
  2. background: #4F74B3;
  3. color: #fff;
  4. line-height: 150px;
  5. text-align: center;
  6. margin-top: 0;
  7. margin-bottom: 0;
  8. }
  9. .next-slick .h4 {
  10. margin-right: 5px;
  11. position: relative;
  12. }

Fade

切换跑马灯时使用渐变效果。

Slider 图片轮播 - 图9

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const settings = {
  3. arrowPos: "outer",
  4. dots: false,
  5. fade: true,
  6. infinite: true,
  7. speed: 500,
  8. slidesToShow: 1,
  9. slidesToScroll: 1,
  10. className: "custom-slide"
  11. };
  12. ReactDOM.render(
  13. <Slider {...settings}>
  14. <div>
  15. <h3>1</h3>
  16. </div>
  17. <div>
  18. <h3>2</h3>
  19. </div>
  20. <div>
  21. <h3>3</h3>
  22. </div>
  23. <div>
  24. <h3>4</h3>
  25. </div>
  26. <div>
  27. <h3>5</h3>
  28. </div>
  29. <div>
  30. <h3>6</h3>
  31. </div>
  32. <div>
  33. <h3>7</h3>
  34. </div>
  35. <div>
  36. <h3>8</h3>
  37. </div>
  38. <div>
  39. <h3>9</h3>
  40. </div>
  41. </Slider>,
  42. mountNode
  43. );
  1. .custom-slide h3 {
  2. background: #4F74B3;
  3. color: #fff;
  4. font-size: 36px;
  5. line-height: 100px;
  6. margin: 10px;
  7. padding: 2%;
  8. position: relative;
  9. text-align: center;
  10. }

禁止循环

如果你不想启用这样的复制效果,只要关闭 infinite 属性即可。值得注意的是,由于组件的默认行为是无穷模式,所以默认情况下,自动将单张图片复制了两份,可以通过设置 infinitefalse,用来禁止循环模式。默认情况下,轮播组件的表现为无穷循环模式。如果你不想无穷循环,

Slider 图片轮播 - 图10

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. ReactDOM.render(
  3. <div>
  4. <Slider slidesToShow={4} arrowPos="outer" infinite={false} dots={false}>
  5. <div style={{ width: "25%" }}>
  6. <h4 className="h4">1</h4>
  7. </div>
  8. <div style={{ width: "25%" }}>
  9. <h4 className="h4">2</h4>
  10. </div>
  11. <div style={{ width: "25%" }}>
  12. <h4 className="h4">3</h4>
  13. </div>
  14. <div style={{ width: "25%" }}>
  15. <h4 className="h4">4</h4>
  16. </div>
  17. <div style={{ width: "25%" }}>
  18. <h4 className="h4">5</h4>
  19. </div>
  20. </Slider>
  21. <br />
  22. <Slider infinite={false}>
  23. <div>
  24. <h3 className="h3">1</h3>
  25. </div>
  26. <div>
  27. <h3 className="h3">2</h3>
  28. </div>
  29. <div>
  30. <h3 className="h3">3</h3>
  31. </div>
  32. <div>
  33. <h3 className="h3">4</h3>
  34. </div>
  35. </Slider>
  36. </div>,
  37. mountNode
  38. );
  1. .next-slick .h3, .h4 {
  2. background: #4F74B3;
  3. color: #fff;
  4. line-height: 150px;
  5. text-align: center;
  6. margin-top: 0;
  7. margin-bottom: 0;
  8. }
  9. .next-slick .h4 {
  10. margin: 0 5px;
  11. position: relative;
  12. }

多图轮播

可以通过 slidesToScroll 属性制定单次轮播图片的个数。在单图轮播的基础上,通过指定slidesToShow属性值,可以同时进行多图轮播。

Slider 图片轮播 - 图11

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const slides = [1, 2, 3, 4, 5, 6, 7, 8, 9].map(item => (
  3. <div style={{ width: "25%" }} key={item}>
  4. <h4 className="h4">1</h4>
  5. </div>
  6. ));
  7. ReactDOM.render(
  8. <div style={{ width: "600px" }}>
  9. <div className="demo-item-title">一次轮播一张图片</div>
  10. <Slider slidesToShow={4} arrowPos="outer" dots={false}>
  11. {slides}
  12. </Slider>
  13. <div className="demo-item-title">一次轮播多张图片</div>
  14. <Slider slidesToShow={4} slidesToScroll={4} arrowPos="outer" dots={false}>
  15. {slides}
  16. </Slider>
  17. </div>,
  18. mountNode
  19. );
  1. .next-slick .h3, .h4 {
  2. margin: 0 5px;
  3. background: #4F74B3;
  4. color: #fff;
  5. line-height: 150px;
  6. text-align: center;
  7. margin-top: 0;
  8. margin-bottom: 0;
  9. }
  10. .demo-item-title {
  11. font-size: 16px;
  12. color: #333;
  13. padding: 8px;
  14. margin: 20px 0 10px 0;
  15. }

悬浮时暂停

可以通过设置 pauseOnHover 属性为 true 使得 Slide 在鼠标悬浮时自动停止轮播。

Slider 图片轮播 - 图12

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const settings = {
  3. className: "custom-slide",
  4. arrowPos: "outer",
  5. dots: false,
  6. infinite: true,
  7. slidesToShow: 3,
  8. slidesToScroll: 1,
  9. autoplay: true,
  10. autoplaySpeed: 2000,
  11. pauseOnHover: true
  12. };
  13. ReactDOM.render(
  14. <Slider {...settings}>
  15. <div>
  16. <h3>1</h3>
  17. </div>
  18. <div>
  19. <h3>2</h3>
  20. </div>
  21. <div>
  22. <h3>3</h3>
  23. </div>
  24. <div>
  25. <h3>4</h3>
  26. </div>
  27. <div>
  28. <h3>5</h3>
  29. </div>
  30. <div>
  31. <h3>6</h3>
  32. </div>
  33. <div>
  34. <h3>7</h3>
  35. </div>
  36. <div>
  37. <h3>8</h3>
  38. </div>
  39. <div>
  40. <h3>9</h3>
  41. </div>
  42. </Slider>,
  43. mountNode
  44. );
  1. .custom-slide h3 {
  2. background: #4F74B3;
  3. color: #fff;
  4. font-size: 36px;
  5. line-height: 100px;
  6. margin: 10px;
  7. padding: 2%;
  8. position: relative;
  9. text-align: center;
  10. }

slickGoTo

通过 slickGoTo 方法可以快速的定位到指定次序的 slider 。

Slider 图片轮播 - 图13

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const slides = [
  3. {
  4. url: "https://img.alicdn.com/tps/TB1bewbNVXXXXc5XXXXXXXXXXXX-1000-300.png",
  5. text: "磁带播放器换肤设计大赛"
  6. },
  7. {
  8. url: "https://img.alicdn.com/tps/TB1xuUcNVXXXXcRXXXXXXXXXXXX-1000-300.jpg",
  9. text: "手机淘宝皮肤征集"
  10. },
  11. {
  12. url: "https://img.alicdn.com/tps/TB1ikP.NVXXXXaYXpXXXXXXXXXX-1000-300.jpg",
  13. text: "设计赋能公益"
  14. },
  15. {
  16. url: "https://img.alicdn.com/tps/TB1s1_JNVXXXXbhaXXXXXXXXXXX-1000-300.jpg",
  17. text: "淘公仔设计大赛"
  18. }
  19. ];
  20. class SlickGoTo extends React.Component {
  21. constructor(props) {
  22. super(props);
  23. this.state = {
  24. currentSlide: 0 // 这里初始值需要置为 0,如果你希望初始值不为 0 ,可以使用 initialSlide 属性设置
  25. };
  26. this.changeHandler = this.changeHandler.bind(this);
  27. }
  28. changeHandler(e) {
  29. this.setState({
  30. currentSlide: parseInt(e.target.value)
  31. });
  32. }
  33. render() {
  34. const settings = {
  35. dots: false,
  36. infinite: true,
  37. slickGoTo: this.state.currentSlide
  38. };
  39. return (
  40. <div>
  41. <div className="demo-item-title">拉动下面的滚动条切换</div>
  42. <input
  43. onChange={this.changeHandler}
  44. defaultValue={0}
  45. type="range"
  46. min={0}
  47. max={3}
  48. />
  49. <Slider {...settings}>
  50. {slides.map((item, index) => (
  51. <div key={index} className="slider-img-wrapper">
  52. <img src={item.url} alt={item.text} />
  53. </div>
  54. ))}
  55. </Slider>
  56. </div>
  57. );
  58. }
  59. }
  60. ReactDOM.render(<SlickGoTo />, mountNode);
  1. .slider-img-wrapper img {
  2. width: 100%;
  3. }
  4. .demo-item-title {
  5. font-size: 16px;
  6. color: #333;
  7. padding: 8px;
  8. margin: 20px 0 10px 0;
  9. }

beforeChange 和 afterChange 钩子

你可以利用 beforeChangeafterChange 两个钩子函数处理一些额外的逻辑。

Slider 图片轮播 - 图14

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const settings = {
  3. className: "custom-slide",
  4. arrowPos: "outer",
  5. dots: false,
  6. infinite: true,
  7. speed: 500,
  8. slidesToShow: 1,
  9. slidesToScroll: 1,
  10. beforeChange: function(currentSlide, nextSlide) {
  11. console.log("before change", currentSlide, nextSlide);
  12. },
  13. afterChange: function(currentSlide) {
  14. console.log("after change", currentSlide);
  15. }
  16. };
  17. ReactDOM.render(
  18. <Slider {...settings}>
  19. <div>
  20. <h3>1</h3>
  21. </div>
  22. <div>
  23. <h3>2</h3>
  24. </div>
  25. <div>
  26. <h3>3</h3>
  27. </div>
  28. <div>
  29. <h3>4</h3>
  30. </div>
  31. <div>
  32. <h3>5</h3>
  33. </div>
  34. <div>
  35. <h3>6</h3>
  36. </div>
  37. <div>
  38. <h3>7</h3>
  39. </div>
  40. <div>
  41. <h3>8</h3>
  42. </div>
  43. <div>
  44. <h3>9</h3>
  45. </div>
  46. </Slider>,
  47. mountNode
  48. );
  1. .custom-slide h3 {
  2. background: #4F74B3;
  3. color: #fff;
  4. font-size: 36px;
  5. line-height: 100px;
  6. margin: 10px;
  7. padding: 2%;
  8. position: relative;
  9. text-align: center;
  10. }

垂直滑动

默认为值为 horizontal 。垂直模式也可以设置单图和多图轮播。轮播组件可以通过 slideDirection 属性设置两种轮播方向。当值为 vertical 时轮播方向为垂直方向,

Slider 图片轮播 - 图15

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. ReactDOM.render(
  3. <div style={{ width: "200px" }}>
  4. <div className="demo-item-title">垂直多图模式</div>
  5. <Slider
  6. slideDirection="vertical"
  7. slidesToShow={3}
  8. slidesToScroll={1}
  9. dots={false}
  10. arrowPos="inline"
  11. arrowDirection="vertical"
  12. className="vertical-slick"
  13. >
  14. {[1, 2, 3, 4, 5].map((item, index) => (
  15. <div
  16. key={index}
  17. className="custom-slider"
  18. style={{ border: "1px solid transparent" }}
  19. >
  20. <h3 className="h3">{item}</h3>
  21. </div>
  22. ))}
  23. </Slider>
  24. <div className="demo-item-title">垂直单图模式</div>
  25. <Slider
  26. slideDirection="vertical"
  27. dots={false}
  28. arrowPos="inline"
  29. arrowDirection="vertical"
  30. className="vertical-slick"
  31. >
  32. {[1, 2, 3, 4, 5].map((item, index) => (
  33. <div key={index} className="custom-slider">
  34. <h3 className="h3">{item}</h3>
  35. </div>
  36. ))}
  37. </Slider>
  38. </div>,
  39. mountNode
  40. );
  1. .vertical-slick .h3 {
  2. background: #4F74B3;
  3. color: #fff;
  4. line-height: 150px;
  5. text-align: center;
  6. font-size: 36px;
  7. margin-top: 0;
  8. margin-bottom: 0;
  9. }
  10. .demo-item-title {
  11. font-size: 16px;
  12. color: #333;
  13. padding: 8px;
  14. margin: 20px 0 10px 0;
  15. }

弹出来的跑马灯

如果你要将 Slider 放到 Dialog 中,此时你需要关闭 Dialog 的动画,避免 Slider 在计算内部元素宽度时造成出错。

Slider 图片轮播 - 图16

查看源码在线预览

  1. import { Slider, Dialog, Button } from "@icedesign/base";
  2. import PropTypes from "prop-types";
  3. const slides = [
  4. {
  5. url: "https://img.alicdn.com/tps/TB1bewbNVXXXXc5XXXXXXXXXXXX-1000-300.png",
  6. text: "磁带播放器换肤设计大赛"
  7. },
  8. {
  9. url: "https://img.alicdn.com/tps/TB1xuUcNVXXXXcRXXXXXXXXXXXX-1000-300.jpg",
  10. text: "手机淘宝皮肤征集"
  11. },
  12. {
  13. url: "https://img.alicdn.com/tps/TB1ikP.NVXXXXaYXpXXXXXXXXXX-1000-300.jpg",
  14. text: "设计赋能公益"
  15. },
  16. {
  17. url: "https://img.alicdn.com/tps/TB1s1_JNVXXXXbhaXXXXXXXXXXX-1000-300.jpg",
  18. text: "淘公仔设计大赛"
  19. }
  20. ];
  21. const dialogStyle = {
  22. width: "800px"
  23. };
  24. class FlappySlider extends React.Component {
  25. static propTypes = {
  26. slides: PropTypes.array
  27. };
  28. constructor(props) {
  29. super(props);
  30. this.state = {
  31. visible: false
  32. };
  33. }
  34. setVisible() {
  35. this.setState(prevState => {
  36. return {
  37. visible: !prevState.visible
  38. };
  39. });
  40. }
  41. render() {
  42. return (
  43. <div className="demo-wrapper">
  44. <Button type="primary" onClick={this.setVisible.bind(this)}>
  45. 显示跑马灯
  46. </Button>
  47. <Dialog
  48. visible={this.state.visible}
  49. title="Alibaba.com"
  50. footer={false}
  51. style={dialogStyle}
  52. animation={false}
  53. onClose={this.setVisible.bind(this)}
  54. >
  55. <Slider>
  56. {this.props.slides.map((item, index) => (
  57. <div key={index} className="slider-img-wrapper">
  58. <img key={index} src={item.url} alt={item.text} />
  59. </div>
  60. ))}
  61. </Slider>
  62. </Dialog>
  63. </div>
  64. );
  65. }
  66. }
  67. ReactDOM.render(<FlappySlider slides={slides} />, mountNode);
  1. .slider-img-wrapper img {
  2. width: 100%;
  3. }

外部控制

用户可以包装 Slider 组件,以便进行外部控制。例如通过包装组件实现外部对 Slider 组件 autoplayautoplaySpeed 值的控制。

Slider 图片轮播 - 图17

查看源码在线预览

  1. import { Slider, Select } from "@icedesign/base";
  2. const { Option } = Select;
  3. class SliderWrapper extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.state = {
  7. autoplay: false,
  8. autoplaySpeed: 1000
  9. };
  10. }
  11. onSelectAutoplay(value) {
  12. this.setState({ autoplay: value });
  13. }
  14. onSelectAutoplaySpeed(value) {
  15. this.setState({ autoplaySpeed: value });
  16. }
  17. render() {
  18. return (
  19. <div>
  20. <Select
  21. placeholder="自动播放"
  22. onChange={this.onSelectAutoplay.bind(this)}
  23. >
  24. <Option value>True</Option>
  25. <Option value={false}>False</Option>
  26. </Select>
  27. &nbsp;&nbsp;
  28. <Select
  29. placeholder="轮播速度"
  30. onChange={this.onSelectAutoplaySpeed.bind(this)}
  31. >
  32. <Option value={1000}>1 second</Option>
  33. <Option value={2000}>2 seconds</Option>
  34. <Option value={3000}>3 seconds</Option>
  35. </Select>
  36. <br />
  37. <br />
  38. <Slider
  39. autoplay={this.state.autoplay}
  40. autoplaySpeed={this.state.autoplaySpeed}
  41. >
  42. <div>
  43. <h3 className="h3">1</h3>
  44. </div>
  45. <div>
  46. <h3 className="h3">2</h3>
  47. </div>
  48. <div>
  49. <h3 className="h3">3</h3>
  50. </div>
  51. <div>
  52. <h3 className="h3">4</h3>
  53. </div>
  54. </Slider>
  55. </div>
  56. );
  57. }
  58. }
  59. ReactDOM.render(<SliderWrapper />, mountNode);
  1. .next-slick .h3, .h4 {
  2. background: #4F74B3;
  3. color: #fff;
  4. line-height: 150px;
  5. text-align: center;
  6. margin-top: 0;
  7. margin-bottom: 0;
  8. }

不同的图片宽度

通过设置 variableWidthtrue,您可以在 Slider 中放置不同宽度的图片。Slider 在默认情况下会认为所有的子元素是等宽的。

Slider 图片轮播 - 图18

查看源码在线预览

  1. import { Slider } from "@icedesign/base";
  2. const settings = {
  3. className: "custom-slide variable-width",
  4. arrowPos: "outer",
  5. dots: true,
  6. infinite: true,
  7. slidesToShow: 1,
  8. slidesToScroll: 1,
  9. variableWidth: true
  10. };
  11. ReactDOM.render(
  12. <Slider {...settings}>
  13. <div style={{ width: 100 }}>
  14. <p>100</p>
  15. </div>
  16. <div style={{ width: 200 }}>
  17. <p>200</p>
  18. </div>
  19. <div style={{ width: 75 }}>
  20. <p>75</p>
  21. </div>
  22. <div style={{ width: 300 }}>
  23. <p>300</p>
  24. </div>
  25. <div style={{ width: 225 }}>
  26. <p>225</p>
  27. </div>
  28. <div style={{ width: 175 }}>
  29. <p>175</p>
  30. </div>
  31. </Slider>,
  32. mountNode
  33. );
  1. .variable-width .next-slick-slide p {
  2. background: #4F74B3;;
  3. height: 100px;
  4. color: #fff;
  5. margin: 5px;
  6. line-height: 100px;
  7. text-align: center;
  8. }

相关区块

Slider 图片轮播 - 图19

暂无相关区块