javascript - 将 jquery hide/fade/delay/animation 转换为纯 js
问题描述
我试图从我的代码中删除 jquery 依赖项,遇到了几行我不知道如何在 js 中复制。
我知道我可以使用 setTimeout() 来代替延迟,使用 css 过渡来淡化,使用 css 来隐藏……只是不知道该怎么做,也无法弄清楚。
任何帮助,将不胜感激。
需要转换为普通 js 的部分有问题:
//loop that actually does the work
(function loopBg(){
$topSlide.hide().css({'background' : 'transparent url('+images[++c%n][0]+') '+images[c%n][1]}).delay(6000).fadeTo(2000, 1, function(){
$bottomSlide.css({'background' : 'transparent url('+images[c%n][0]+') '+images[c%n][1]});
loopBg();
});
}());
整个原始 jquery 代码:
//2nd position is where it starts from
var images = [
['/assets/img/sliders/6-sm.jpg', 'no-repeat scroll center bottom / cover'],
['/assets/img/sliders/9-sm.jpg', 'no-repeat scroll center bottom / cover'],
['/assets/img/sliders/2-sm.jpg', 'no-repeat scroll center bottom / cover'],
];
var $bottomSlide = $('#intro-anim .slider-bottom'),
$topSlide = $('#intro-anim .slider-top'),
n = images.length,
c = 0; // loop counter
// preload array of images
for(var i=0; i<n; i++){
var tImg = new Image();
tImg.src = images[i][0];
}
$bottomSlide.css({
'background' : 'transparent url('+images[++c%n][0]+') '+images[c%n][1]
});
//loop that actually does the work
(function loopBg(){
$topSlide.hide().css({'background' : 'transparent url('+images[++c%n][0]+') '+images[c%n][1]}).delay(6000).fadeTo(2000, 1, function(){
$bottomSlide.css({'background' : 'transparent url('+images[c%n][0]+') '+images[c%n][1]});
loopBg();
});
}());
我的转换减去相关部分:
//2nd position is where it starts from
const images = [
['/assets/img/sliders/6-sm.jpg', 'no-repeat scroll center bottom / cover'],
['/assets/img/sliders/9-sm.jpg', 'no-repeat scroll center bottom / cover'],
['/assets/img/sliders/2-sm.jpg', 'no-repeat scroll center bottom / cover'],
];
const bottomSlide = document.querySelector('#intro-anim .slider-bottom'),
topSlide = document.querySelector('#intro-anim .slider-top');
let n = images.length,
c = 0; //loop counter
//preload array of images
for(let i=0; i<n; i++){
let tImg = new Image();
tImg.src = images[i][0];
}
bottomSlide.setAttribute('style', 'background: transparent url('+images[++c%n][0]+') '+images[c%n][1]);
//loop that actually does the work
//still needs converted
//(function loopBg(){
// $topSlide.hide().css({'background' : 'transparent url('+images[++c%n][0]+') '+images[c%n][1]}).delay(6000).fadeTo(2000, 1, function(){
// $bottomSlide.css({'background' : 'transparent url('+images[c%n][0]+') '+images[c%n][1]});
// loopBg();
// });
//}());
解决方案
有点骇人听闻,但复制了与以前相同的行为,这正是我想要的。我会想办法让这个更干净。
要点是顶部滑块更改其图像并淡入。在底部滑块淡入后更改为相同图像,而顶部返回不透明度 0(保持相同图像可见)。每 6 秒重复一次,转到数组中的下一个图像。
//2nd position is where it starts from
const images = [
['/assets/img/sliders/6-sm.jpg', 'no-repeat scroll center bottom / cover'],
['/assets/img/sliders/9-sm.jpg', 'no-repeat scroll center bottom / cover'],
['/assets/img/sliders/2-sm.jpg', 'no-repeat scroll center bottom / cover'],
];
const bottomSlide = document.querySelector('#intro-anim .slider-bottom'),
topSlide = document.querySelector('#intro-anim .slider-top');
let n = images.length,
c = 0; //loop counter
//preload array of images
for(var i=0; i<n; i++){
var tImg = new Image();
tImg.src = images[i][0];
}
bottomSlide.style.background = 'transparent url('+images[++c%n][0]+') '+images[c%n][1];
topSlide.style.opacity = '0';
//loop that actually does the work
(function loopBg(){
setTimeout(function() {
topSlide.style.background = 'transparent url('+images[++c%n][0]+') '+images[c%n][1];
topSlide.style.opacity = '1';
setTimeout(function() {
bottomSlide.style.background = 'transparent url('+images[c%n][0]+') '+images[c%n][1];
topSlide.style.opacity = '0';
}, 3000); //css transition for '#intro-anim .slider-top' is 2 seconds so do 3 to be safe and let it finish (6s is the total between slides)
loopBg();
}, 6000);
}());
css 添加了 2s 的过渡:
#intro-anim .slider-top,
#intro-anim .slider-bottom {
position: absolute;
height:100%;
width:100%;
top:0;
left:0;
}
#intro-anim .slider-top {
transition: opacity 2s ease-in-out;
}
推荐阅读
- r - R - 跨不同长度数据帧的多个标准总和
- cordova - cordova-plugins-ibeacon 中的“信标”数组始终为空
- react-native - 在 React Native 中的页面之间传递数据
- php - Laravel 不渲染 html
- ios - Xcode 9 的 iPhone 越狱问题
- python - 如何在新的 conda 环境中启动 spyder?
- gremlin - TinkerPop:按边缘计数过滤
- php - Magento 2 - setup:di:compile 上不存在类
- python - 循环绘制地图而不绘制先前的点
- angular - Angular 2 或 4 或 5 ng 样式,具有超过 2 个条件输出