Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Проблемы с разработкой слайдера (https://javascript.ru/forum/dom-window/61913-problemy-s-razrabotkojj-slajjdera.html)

frontmaker 15.03.2016 12:25

Проблемы с разработкой слайдера
 
Пытаюсь написать слайдер с автоматическим переключением, вроде получилось, но код выглядит ужасно.Прошу помощи в оценке.
var sliderInit = (function(){
	'use strict'

	function Slider() {
	this.controls = document.querySelector('.controls');
	this.buttons = document.querySelectorAll('.controls__btn');
	this.slider = document.querySelector('.slider');
	this.slide = document.querySelector('.slide');


	this.start = function(time) {
		this.updateClass();
		this.changeSlide();
		this.timer(time)
	}
}


Slider.prototype.updateClass = function() {
	var that = this;
	this.controls.onclick = function(e) {
		var btn = e.target;
		if (btn.tagName === "A") {
			e.preventDefault();
			that.checkClass("active");
			that.changeSlide(btn);
			btn.classList.toggle('active');
		}
	}
}


Slider.prototype.checkClass = function(className) {
	[].filter.call(this.buttons, function(btn) {
		if (btn.classList.contains(className)) {
			btn.classList.remove(className);
		}
	});
}


Slider.prototype.timer = function(time) {
	var i = 0,
	that = this;
	length = this.buttons.length;

	var timerId = setInterval(function(){
		that.checkClass('active');
		that.buttons[i].classList.toggle('active');
		var btn = that.buttons[i];
		that.changeSlide(btn);
		i++;
		if (i === length) {
			i = 0;
		};
	},time);

}


Slider.prototype.changeSlide = function(btn) {
		btn = btn || this.buttons[0];
		var index = btn.getAttribute('data-index');
		var width = -(this.slide.clientWidth) - 50; //margin-right
		switch(index) {
		case "1": 
			this.slider.style.webkitTransform = "translate3d(0px, 0px, 0px)";
		break;
		case "2":
			this.slider.style.webkitTransform = "translate3d(" + width + "px, 0px, 0px)";
		break;
		case "3":
			this.slider.style.webkitTransform = "translate3d("+ width * 2 + "px, 0px, 0px)";
		}
	}

	return Slider;

})();


var slider = new sliderInit();

slider.start(2000);

рони 15.03.2016 14:21

frontmaker,
макет бы полностью c html и css ... а без setInterval никак?

frontmaker 15.03.2016 14:25

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<link rel="stylesheet" href="style.css">
<body>
    <div class="slider-wrap">
      <div class="slider">
          <div class="slide">
            <img src="img/portfolio-img3.jpg" alt="">
           </div>
            <div class="slide">
            <img src="img/portfolio-img4.jpg" alt="">
           </div>
            <div class="slide">
            <img src="img/portfolio-img5.jpg" alt="">
           </div>
      </div>
      <div class="controls-wrap">
      <div class="controls">
        <a class="controls__btn active" href="#" data-index="1"></a>
        <a class="controls__btn" href="#" data-index="2"></a>
        <a class="controls__btn" href="#" data-index="3"></a>
      </div>
      </div>
    </div>  
      <script src="main.js"></script>
</body>
</html>

frontmaker 15.03.2016 14:27

.slider-wrap {
	display: block;
	margin: 0 auto;
	width: 20%;
	overflow: hidden;
}

.slider {
	width: 2500%;
	left: 0;
	position: relative;
	transform: translate3d(0px, 0px, 0px);
	transition: all .3s;
}


.slider:before,
.slider:after {
	content: " ";
	display: table;
	clear: both;
}

.slider-wrap .slide {
	float: left;
	margin-right: 50px;
} 

.slider-wrap .slide img {
	display: block;
	margin: 0 auto;
}


.controls-wrap {
	padding-top: 50px;
}

.controls {
	width: 65px;
	margin: 0 auto;

}
.controls .controls__btn {
	width: 15px;
    height: 15px;
    border-radius: 50%;
    background-color: #506a85;
    display: inline-block;
    margin-right: 6px;
}

.controls .controls__btn:last-child {
	margin-right: 0;
}

.controls .controls__btn.active {
	background-color: #00bc9c;
}

frontmaker 15.03.2016 14:28

Цитата:

Сообщение от рони (Сообщение 411048)
макет бы полностью c html и css ... а без setInterval никак?

А как можно без него?

рони 15.03.2016 14:37

frontmaker,
либо setTimeout или что ещё лучше requestAnimationFrame

рони 15.03.2016 14:41

frontmaker,
и может хранить индекс текущего слайдера чем заниматся перебором в поисках активного - checkClass ??

frontmaker 15.03.2016 14:55

Цитата:

Сообщение от рони (Сообщение 411056)
и может хранить индекс текущего слайдера чем заниматся перебором в поисках активного - checkClass ??

checkClass удаляет "active", чтоб не было больше 1 элемента с этим классом

рони 15.03.2016 14:57

Цитата:

Сообщение от frontmaker
чтоб не было больше 1 элемента с этим классом

а цикл для этого зачем?

frontmaker 15.03.2016 15:03

Цитата:

Сообщение от рони (Сообщение 411059)
а цикл для этого зачем?

но ведь элементов несколько


Часовой пояс GMT +3, время: 07:22.