Reputation: 8408
I created a simple image slider and I am trying to make it work regardless of how many are on the same page. I have tried many approaches, but none work correctly unless I call each slider separately:
HTML
<section id="rm-slider-1" class="rm-slider" data-name="rm-slider-1">
<a href="#" class="rm-slider-control rm-prev">
<span class="rm-slider-icon-container"><span><</span></span>
</a>
<a href="#" class="rm-slider-control rm-next">
<span class="rm-slider-icon-container"><span>></span></span>
</a>
<ul class="rm-slider-slides">
<li class="rm-slider-slide slide-1" style="background-image: url(http://www.planwallpaper.com/static/images/beautiful-sunset-images-196063.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide One</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 1</span>
</a>
</div>
</li>
<li class="rm-slider-slide slide-2" style="background-image: url(http://www.planwallpaper.com/static/images/434976-happy-valentines-day-timeline-cover.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Two</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 2</span>
</a>
</div>
</li>
<li class="rm-slider-slide slide-3" style="background-image: url(http://all4desktop.com/data_images/original/4237670-images.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Three</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 3</span>
</a>
</div>
</li>
</ul>
</section>
<section id="rm-slider-2" class="rm-slider" data-name="rm-slider-2">
<a href="#" class="rm-slider-control rm-prev">
<span class="rm-slider-icon-container"><span><</span></span>
</a>
<a href="#" class="rm-slider-control rm-next">
<span class="rm-slider-icon-container"><span>></span></span>
</a>
<ul class="rm-slider-slides">
<li class="rm-slider-slide slide-4" style="background-image: url(http://www.planwallpaper.com/static/images/download-happy-janmashtami-hd-images_q0dlDbz.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Four</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 4</span>
</a>
</div>
</li>
<li class="rm-slider-slide slide-5" style="background-image: url(http://www.planwallpaper.com/static/images/happy_diwali__sms_images_.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Five</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 5</span>
</a>
</div>
</li>
<li class="rm-slider-slide slide-6" style="background-image: url(http://www.planwallpaper.com/static/images/_77246627_fa4891a6-ccf8-4c8f-9e32-f1a80cdcdf4c_0ClWxBM.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Six</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 6</span>
</a>
</div>
</li>
</ul>
</section>
<section id="rm-slider-3" class="rm-slider" data-name="rm-slider-3">
<a href="#" class="rm-slider-control rm-prev">
<span class="rm-slider-icon-container"><span><</span></span>
</a>
<a href="#" class="rm-slider-control rm-next">
<span class="rm-slider-icon-container"><span>></span></span>
</a>
<ul class="rm-slider-slides">
<li class="rm-slider-slide slide-7" style="background-image: url(http://www.planwallpaper.com/static/images/Halloween-Wallpaper-37.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Seven</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 7</span>
</a>
</div>
</li>
<li class="rm-slider-slide slide-8" style="background-image: url(http://www.planwallpaper.com/static/images/11-sea-beach-sand-wallpaper_w80EYH0.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Eight</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 8</span>
</a>
</div>
</li>
<li class="rm-slider-slide slide-9" style="background-image: url(http://www.planwallpaper.com/static/images/1080p-wallpapers-new.png);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Nine</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 9</span>
</a>
</div>
</li>
<li class="rm-slider-slide slide-10" style="background-image: url(http://www.planwallpaper.com/static/images/fire_fist_vs_water_fist-wallpaper-1920x1080_gVipT2G.jpg);">
<div class="rm-copy-container">
<h1 class="rm-img-slider-title">Slide Ten</h1>
<a class="rm-img-slider-call-to-action" href="http://georgecodes.com/">
<span>Button 10</span>
</a>
</div>
</li>
</ul>
</section>
CSS
/* Placeholders */
/* ============ */
a.rm-slider-control {
height: 100%;
width: 100%;
display: block;
transition: all 0.5s; }
.rm-slider, .rm-slider-slide {
height: 100%;
width: 100%;
position: relative;
display: block;
margin: 0;
padding: 0;
background-size: cover;
background-position: center;
background-repeat: no-repeat; }
/* Image Slider Styles */
/* =================== */
html, body {
padding: 0;
margin: 0; }
/* Hero */
/* ==== */
.rm-slider {
overflow: hidden;
height: 100vh; }
.rm-slider ul {
position: relative;
width: 100%;
height: 100%;
padding: 0;
margin: 0; }
@media only screen and (min-width: 1024px) {
.rm-slider-copy {
position: absolute;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
font-size: 64px;
text-align: left;
bottom: auto; } }
/* Image Slider */
/* ============ */
.rm-slider-slide {
float: left;
transition: opacity 0.5s linear;
z-index: 0;
opacity: 0;
position: absolute;
display: block; }
.rm-slider-slide .rm-copy-container {
position: absolute;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
text-align: center;
color: white;
width: 100%; }
.rm-slider-slide.active {
z-index: 1;
opacity: 1; }
/* Slider Controls */
/* --------------- */
a.rm-slider-control {
position: absolute;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
z-index: 2;
background: rgba(42, 42, 42, 0.1);
cursor: pointer;
font-size: 36px;
height: 100px;
width: 30px; }
a.rm-slider-control .rm-slider-icon-container {
color: white;
height: 100%;
width: 100%; }
a.rm-slider-control .rm-slider-icon-container span {
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%); }
a.rm-slider-control.rm-next {
right: 0; }
a.rm-slider-control.rm-prev {
left: 0; }
a.rm-slider-control:hover {
background: rgba(42, 42, 42, 0.4); }
@media only screen and (min-width: 1280px) {
a.rm-slider-control {
height: 100px;
width: 50px; }
a.rm-slider-control .rm-slider-icon-container span {
font-size: 32px; } }
/* Slider Text */
/* ----------- */
.rm-img-slider-title {
font-size: 22px;
text-transform: uppercase;
letter-spacing: 1px;
margin: 16px 0;
line-height: 1; }
.rm-img-slider-call-to-action {
border: 2px solid white;
border-radius: 40px;
color: white;
margin: 16px auto 0;
display: table;
height: 40px;
position: relative;
margin: 0 auto; }
.rm-img-slider-call-to-action span {
display: table-cell;
vertical-align: middle;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 1px;
padding: 0 32px; }
.rm-img-slider-call-to-action:hover {
background: rgba(255, 255, 255, 0.4); }
@media only screen and (min-width: 768px) {
.rm-img-slider-title {
font-size: 56px; } }
/* Testing */
.rm-slider {
overflow: hidden;
height: 500px;
width: 33.33333333%;
float: left; }
/*# sourceMappingURL=style.css.map */
JS
var ramonSlider = function(slider, slides, prev, next, transition) {
var imgSlider = {
slider: $(slider).data('name'),
sliderId: $('#' + $(slider).data('name')),
slides: $(slides),
prev: $(prev),
next: $(next),
transition: transition || 3000,
currentIndex: 0,
interval: undefined,
slideCount: function() {
return this.sliderId.find(slides).length;
},
makeFirstSlideActive: function() {
this.sliderId.find(slides).first().addClass('active');
},
moveItems: function() {
var slideItems = this.sliderId.find(slides);
var currentSlide = slideItems.eq(this.currentIndex);
console.log(currentSlide);
slideItems.removeClass('active');
currentSlide.addClass('active');
},
moveOne: function() {
console.log(this.slideCount());
var thisObject = this;
if (this.currentIndex > this.slideCount() - 1) {
thisObject.currentIndex = 0;
}
this.moveItems();
},
autoSlide: function() {
var thisObject = this;
this.interval = window.setInterval(function() {
thisObject.currentIndex++;
thisObject.moveOne();
}, thisObject.transition);
},
moveToNext: function() {
var thisObject = this;
var nextItem = this.sliderId.find(next);
nextItem.on('click', function(e) {
e.preventDefault();
window.clearInterval(thisObject.interval);
thisObject.currentIndex++;
thisObject.moveOne();
});
},
moveToPrev: function() {
var thisObject = this;
var prevItem = this.sliderId.find(prev);
prevItem.on('click', function(e) {
e.preventDefault();
window.clearInterval(thisObject.interval);
thisObject.currentIndex--;
if (thisObject.currentIndex < 0) {
thisObject.currentIndex = thisObject.slideCount() - 1;
}
thisObject.moveItems();
});
}
}
var init = function() {
imgSlider.makeFirstSlideActive();
imgSlider.moveItems();
imgSlider.moveOne();
imgSlider.autoSlide();
imgSlider.moveToNext();
imgSlider.moveToPrev();
}
return init();
};
This Works (Calling each function with the ID of the slider)
$(document).ready(function() {
ramonSlider('#rm-slider-1', '.rm-slider-slide', '.rm-prev', '.rm-next');
ramonSlider('#rm-slider-2', '.rm-slider-slide', '.rm-prev', '.rm-next');
ramonSlider('#rm-slider-3', '.rm-slider-slide', '.rm-prev', '.rm-next');
});
I want this to work (calling a function once using a class instead of ids)
$(document).ready(function() {
ramonSlider('.rm-slider', '.rm-slider-slide', '.rm-prev', '.rm-next');
});
Any thoughts?
Upvotes: 0
Views: 171
Reputation: 999
You can try looping it in $.each
$(document).ready(function() {
$('.rm-slider').each(function(){
ramonSlider(this, '.rm-slider-slide', '.rm-prev', '.rm-next');
});
});
Tested and verified
Upvotes: 1
Reputation: 90013
Untested, but should work:
$(document).ready(function() {
$('.rm-slider').each(function(){
ramonSlider(this, '.rm-slider-slide', '.rm-prev', '.rm-next');
});
});
Also, these three lines are actually wrong in your slider plugin:
...
slides: $(slides),
prev: $(prev),
next: $(next),
...
As it is now, they are selecting all elements with those classes in your document, when you probably only want to select the ones in the current slider. For that you probably want to replace them with
...
slides: $(slides, $(slider)),
prev: $(prev, $(slider)),
next: $(next, $(slider)),
...
If it works as it is now, it's probably because you don't actually use this.slides
, this.prev
or this.next
. But... if you don't use them, I don't see any point in defining them as properties of your object. Most likely, your slider will be fine if you remove those lines altogether.
Upvotes: 2