如何在 React Slick 的滑块点中添加 slick-active class
How to add slick-active class in Slider dots in React Slick
我用了react-slick,用Slider组件做了一个轮播。代码如下,
const carousel = (props) => {
return (
<div style={{ height: '50%', marginTop: '20px' }}>
<Slider {...settings}>
<div className={text__bar}>
<div >
<font>Lorum Ipsum 1</font>
</div>
<div className={slide1} />
</div>
<div className={text__bar}>
<div>
<font>Lorum Ipsum 2</font>
</div>
<div className={slide1} />
</div>
<div className={text__bar}>
<div>
<font>Lorum Ipsum 3</font>
</div>
<div className={slide1} />
</div>
</Slider>
<div className={purple__bar}></div>
</div>
);
};
和设置对象,
const settings = {
dots: true,
infinite: true,
speed: 500,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 5000,
className: SlickMain,
dotsClass: button__bar,
arrows: false,
};
我添加了一些额外的 CSS 来设计我的旋转木马点(按钮)看起来像下面这样,
当开发人员工具检查时,与当前显示的幻灯片相关的按钮得到一个名为 'slick-active'
的 CSS class 注入
我需要做的是将幻灯片对应的按钮的背景色改为黑色,将当前颜色变为紫色。
我所做的是,
.button__bar li.slick-active button {
opacity: .75;
color: #000
}
但这行不通。我错过了什么?
.button__bar 是我在设置对象中给点的 dotsClass。
发生这种情况是因为我正在使用 CSS-模块加载我的 CSS 文件。在下面的代码示例中,您可以清楚地看到发生了什么。
https://codesandbox.io/s/1z2lnox5rq?fontsize=14
因此,作为解决方案,我所做的是向设置对象添加波纹管方法。
const settings = {
dots: true,
infinite: true,
speed: 1000,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 3000,
className: slickMain,
dotsClass: button__bar,
arrows: false,
beforeChange: (prev, next) => {
this.setState({ currentSlide: next });
},
// afterChange: (index) => this.setState({ currentSlide: index }),
appendDots: dots => {
return (
<div>
<ul>
{dots.map((item, index) => {
return (
<li key={index}>{item.props.children}</li>
);
})}
</ul>
</div>
)
},
customPaging: index => {
return (
<button style={index === this.state.currentSlide ? testSettings : null}>
{index + 1}
</button>
)
}
};
为了解决我的问题,我使用beforeChange
获取下一张幻灯片索引并将其保存在状态中。然后使用 appendDots
一个 div
和一个 ul
,li
被注入到 dot-bar 部分。在 li
中,一个 button
使用 customPaging
方法作为子属性传递。当当前幻灯片等于 customPaging
的索引时,它处于状态,然后 class 被注入背景颜色。
const testSettings = {
backgroundColor: 'rgba(255, 255, 255, 0.8)',
outline: '0'
}
我使用 :global()
使用 CSS 模块完成了这项工作
在您的具体情况下添加 li.slick-active
--> :global(li.slick-active)
.button__bar :global(li.slick-active) button {
opacity: .75;
color: #000
}
这是从你的 codebox 分叉出来的
万一有人在使用 material ui 这是它的工作原理
const settings: Settings = {
dots: true,
infinite: true,
speed: 500,
slidesToShow: 1,
slidesToScroll: 1,
dotsClass: `slick-dots ${classes.dots}`,
};
// your classes created with material ui
makeStyles((theme: Theme) => ({
// may not be the best way but it works
dots: {
bottom: 0,
"& li.slick-active button::before": {
color: theme.palette.primary.main,
},
"& li": {
"& button::before": {
fontSize: theme.typography.pxToRem(14),
color: "#fff",
opacity: 0.5,
},
}
}))
这是一个codesandbox link
https://codesandbox.io/s/bold-snow-h9rwq?file=/src/App.tsx
请注意,我还没有使用 importing slick css 进行检查,即
// Import css files
import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css";
但改用 cdn
我用了react-slick,用Slider组件做了一个轮播。代码如下,
const carousel = (props) => {
return (
<div style={{ height: '50%', marginTop: '20px' }}>
<Slider {...settings}>
<div className={text__bar}>
<div >
<font>Lorum Ipsum 1</font>
</div>
<div className={slide1} />
</div>
<div className={text__bar}>
<div>
<font>Lorum Ipsum 2</font>
</div>
<div className={slide1} />
</div>
<div className={text__bar}>
<div>
<font>Lorum Ipsum 3</font>
</div>
<div className={slide1} />
</div>
</Slider>
<div className={purple__bar}></div>
</div>
);
};
和设置对象,
const settings = {
dots: true,
infinite: true,
speed: 500,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 5000,
className: SlickMain,
dotsClass: button__bar,
arrows: false,
};
我添加了一些额外的 CSS 来设计我的旋转木马点(按钮)看起来像下面这样,
当开发人员工具检查时,与当前显示的幻灯片相关的按钮得到一个名为 'slick-active'
的 CSS class 注入我需要做的是将幻灯片对应的按钮的背景色改为黑色,将当前颜色变为紫色。
我所做的是,
.button__bar li.slick-active button {
opacity: .75;
color: #000
}
但这行不通。我错过了什么?
.button__bar 是我在设置对象中给点的 dotsClass。
发生这种情况是因为我正在使用 CSS-模块加载我的 CSS 文件。在下面的代码示例中,您可以清楚地看到发生了什么。
https://codesandbox.io/s/1z2lnox5rq?fontsize=14
因此,作为解决方案,我所做的是向设置对象添加波纹管方法。
const settings = {
dots: true,
infinite: true,
speed: 1000,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 3000,
className: slickMain,
dotsClass: button__bar,
arrows: false,
beforeChange: (prev, next) => {
this.setState({ currentSlide: next });
},
// afterChange: (index) => this.setState({ currentSlide: index }),
appendDots: dots => {
return (
<div>
<ul>
{dots.map((item, index) => {
return (
<li key={index}>{item.props.children}</li>
);
})}
</ul>
</div>
)
},
customPaging: index => {
return (
<button style={index === this.state.currentSlide ? testSettings : null}>
{index + 1}
</button>
)
}
};
为了解决我的问题,我使用beforeChange
获取下一张幻灯片索引并将其保存在状态中。然后使用 appendDots
一个 div
和一个 ul
,li
被注入到 dot-bar 部分。在 li
中,一个 button
使用 customPaging
方法作为子属性传递。当当前幻灯片等于 customPaging
的索引时,它处于状态,然后 class 被注入背景颜色。
const testSettings = {
backgroundColor: 'rgba(255, 255, 255, 0.8)',
outline: '0'
}
我使用 :global()
在您的具体情况下添加 li.slick-active
--> :global(li.slick-active)
.button__bar :global(li.slick-active) button {
opacity: .75;
color: #000
}
这是从你的 codebox 分叉出来的
万一有人在使用 material ui 这是它的工作原理
const settings: Settings = {
dots: true,
infinite: true,
speed: 500,
slidesToShow: 1,
slidesToScroll: 1,
dotsClass: `slick-dots ${classes.dots}`,
};
// your classes created with material ui
makeStyles((theme: Theme) => ({
// may not be the best way but it works
dots: {
bottom: 0,
"& li.slick-active button::before": {
color: theme.palette.primary.main,
},
"& li": {
"& button::before": {
fontSize: theme.typography.pxToRem(14),
color: "#fff",
opacity: 0.5,
},
}
}))
这是一个codesandbox link https://codesandbox.io/s/bold-snow-h9rwq?file=/src/App.tsx
请注意,我还没有使用 importing slick css 进行检查,即
// Import css files
import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css";
但改用 cdn