Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Карусель для картинок разной ширины (https://javascript.ru/forum/dom-window/56231-karusel-dlya-kartinok-raznojj-shiriny.html)

noto 05.06.2015 20:07

Карусель для картинок разной ширины
 
Всем привет!

Возникла следующая проблема. Какое нужно создать условия, для остановки прокрутки вправо, если обнаружен последний элемент карусели(т.е фото)? Думал по координатам определять, находится ли в зоне видимости фото и тогда прокручивать на ширину фотографии карусель, но тоже не могу додуматься как это сделать. Если что, У меня обычная карусель, которая работает по маргину влево, если нужно могу написать сюда структуру этой карусели.

P.S если у кого-то есть варианты как лучше это сделать, напишите пожалуйста:)
P.P.S за помощь готов оплатить(за этим в лс);

Сейчас черновой вариант следующий:

function Carousel(options) {
  var elem = this.elem = options.elem; 
  this.position = 0; // текущая прокрутка карусели

  elem.addEventListener("click", function(event){
    this.checkDirection(event); 
  }.bind(this));
}

Carousel.prototype.checkDirection = function(event) {
  var direction = event.target.getAttribute("data-direction");

  switch (direction) {
    case 'prev' :
      this.prev(this.elem.offsetWidth);
      break;
    case 'next' :
      this.next(this.elem.offsetWidth);
      break;
  }
};

Carousel.prototype.next = function(width) {
  this.position += -width;
  this.elem.querySelector(".gallery-main__photos").style.marginLeft = this.position + "px"
};

Carousel.prototype.prev = function(width) {
  this.position += +width;

  if (this.position >= 0) {
    this.elem.querySelector(".gallery-main__photos").style.marginLeft = 0 + "px";
    this.position = 0;
  }

  this.elem.querySelector(".gallery-main__photos").style.marginLeft = this.position + "px";
};


var carousel = new Carousel({elem: document.getElementById("gallery")});

рони 05.06.2015 20:49

noto,
сделайте макет с html и css

рони 05.06.2015 20:54

noto,
алгоритм простой ширина всей галереи минус ширина окна показа -- если this.position больше этой величины сдвигают на вычисленную выше разницу а не на this.position

noto 05.06.2015 21:05

рони,
http://codepen.io/anon/pen/PqmPpL
Цитата:

Сообщение от рони (Сообщение 373966)
noto,
алгоритм простой ширина всей галереи минус ширина окна показа -- если this.position больше этой величины сдвигают на вычисленную выше разницу а не на this.position

Ширина галереи указана 9999px, т.к это сайт для портфолио фотографа и заранее предугадать какая ширина будет, нельзя.

рони 05.06.2015 21:48

Цитата:

Сообщение от noto
Ширина галереи указана 9999px

где ???
решение по алгоритму выше и ширине 9999
http://codepen.io/anon/pen/eNWpjR

noto 05.06.2015 22:00

Извиняюсь, не тот вариант скопировал просто. Поправил, gallery-main__photos ширина 9999px. Проблема в том, что картинок сейчас не на всю ширину контейнера, они могут добавляться или убираться в любой момент, по этому такой вариант не подходит. Можно конечно каждый раз менять ширину под текущий контейнер, но по моему это не очень хороший вариант.

рони 05.06.2015 22:13

noto,
какая разница сколько картинок ? алгоритм всегда отработает правильно -- вычисляется же ширина галереи на текущий момент, на момент клика.

рони 05.06.2015 22:19

noto,
иного варианта просто нет.

Endy 05.06.2015 22:26

Можно еще наверное что то со счетчиком намутить,пример с массивом:
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
window.onload = function(){
        var arr = [1, 2, 3, 4, 5],
    body = document.body,
    count = 0,
    len = arr.length;
alert(arr);
body.innerHTML = arr[0];
var interval = setInterval(function () {
    count++;
    if (count === len) {
        clearInterval(interval);
    } else {
        arr.push(arr.shift());
        body.innerHTML = arr[0];
    }
}, 1000);
}
    </script>
</head>
<body>
    
</body>
</html>

Endy 05.06.2015 22:31

https://learn.javascript.ru/task/carousel вот кстати задачка похожая на вашу,там и решение к ней есть :)


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