Карусель на основе CSS3 в любом направлении, независимо от порядка - PullRequest
1 голос
/ 27 июня 2010

Я пытался создать простой эффект Карусели для набора фотографий. Это легко сделать, используя библиотеку Effects с PrototypeJS, но у меня возникают проблемы с пониманием того, как реализовать это с помощью CSS3.

Я разработал некоторые решения, но они сработали, только если порядок фотографий в HTML также соответствует порядку, в котором вы планируете перемещаться. Здесь дело не в этом.

Независимо от порядка фотографий:

  • Чтобы можно было использовать правила на основе CSS3 ( translateX / transition и т. Д.) Для анимации удаления активного изображения из вида
  • Заменить его на любое другое изображение, выбранное в раскрывающемся меню
  • Они оба движутся в одном направлении, как определено в раскрывающемся меню
  • Они оба появляются рядом

Например:

  • Первая фотография ' активная ' и в поле зрения
  • Я выбираю формат " слева направо " в меню
  • Я выбираю " 3 " в качестве номера фотографии
  • Я нажимаю " Go "
  • Когда 1-й DIV класса ' photo ' перемещается вправо, 3-й DIV (класса ' photo ') находится слева от него и также движется синхронно вправо

Некоторые соображения:

  • @ webkit предпочтительнее, но все равно
  • CSS для макета, положения и т. Д. Намеренно не существует, чтобы не мешать решению.
  • Я использую PrototypeJS для простоты, и вы тоже можете, или вообще никакой библиотеки, но НЕ jquery (извините)

Пример разметки для базы Идеи и предложения около

Я попытался включить сюда полные html / css / js страницы примера, но он частично рендерился во время предварительного просмотра, так что на всякий случай он связан здесь:

http://www.gimee.org/question.html

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
  <title>Question</title> 
  <script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"></script>
  <style>
  #demo {
    float:  left;
    width:  520px;
    height: 100%;
    overflow: hidden;
  }

  #container {
    width: 3000px;
  }

  .photo {
    float: left;
    : 500px;
    padding: 10px;
  }

  #controls {
    float: left;
  }
</style>
</head>
<body>
  <div id="demo">
    <div id="container">
      <div class="active photo">
        <img src="http://farm2.static.flickr.com/1161/4727417148_ed8d691aa3.jpg">
      </div>
      <div class="photo">
        <img src="http://farm2.static.flickr.com/1013/4730980370_75cceea5be.jpg">
      </div>
      <div class="photo">
        <img src="http://farm2.static.flickr.com/1401/4606449779_1bc79e6078.jpg">
      </div>
      <div class="photo">
        <img src="http://farm5.static.flickr.com/4053/4690748949_db09007187.jpg">
      </div>
    </div>
  </div>

  <div id="controls">
    <p>Direction:</p>
    <select id="direction">
      <option value="right">from Left to Right</option>
      <option value="left">from Right to Left</option>
    </select>
    <p>Photo Number:</p>
    <select id="photoNumber">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
      <option value="4">4</option>
    </select>
    <p><a href="#" id="go">Go</a></p>
  </div>

  <script>
    var Demo = {
      run: function() {
        console.log('Init');
        Event.observe('go', 'click', this.go.bind(this));   

      },
      go: function(e) {
        var direction = $('direction').value;
        var photoNum  = $('photoNumber').value - 1;

        console.log('direction:', direction, 'photoNum:', photoNum);

        var container = $('container');
        var photoCurrent = container.select('.active')[0];
        var photoNext    = container.select('.photo')[photoNum];

      if (photoCurrent != photoNext) {

        if (direction=="right") {
          /*
          Move the two photos, appearing side-by-side, from Left to Right
          so that the 'Next' photo appears to push the 'Current' photo out
          */
            console.log('from Left to Right');

        } else {
         /*
          Move the two photos, appearing side-by-side, from Right to Left
          so that the 'Next' photo appears to push the 'Current' photo out
         */
         console.log('from Right to Left');

        }
      } else {
        console.log("Do nothing since you're asking for the currently active photo");
      }
    }
  };
  Demo.run();
  </script>
</body>
</html>

Ответы [ 2 ]

1 голос
/ 05 июля 2010

Хорошо, похоже, я сам нашел ответ. Идея состоит в том, чтобы сбрасывать положение каждый раз, когда вы перемещаете фотографию, чтобы вы могли быть агностиком, когда натолкнетесь на нее снова, и переместить ее в левую или правую начальную точку перед анимацией CSS3.

Это сбрасывало позицию, с которой у меня была проблема, но с ключевыми кадрами на основе анимации CSS3 я теперь могу ее преодолеть.

/*
  NEXT PAGE
  Move INTO View from the Right side
*/
@-webkit-keyframes inFromRightAnim {
 0% {
   -webkit-transform: translateX(0%);
 }
 100% {
   -webkit-transform: translateX(-100%);
 }
}

.inFromRight {
 -webkit-animation-name:            inFromRightAnim;
 -webkit-animation-duration:        0.5s;
 -webkit-animation-timing-function: linear;
 -webkit-transform:                 translateX(-100%);
}

Я все еще получаю некоторую забавность с заказом, когда я перебираю цикл, но это связано с моим ошибочным кодом, а не с позициями фотографий.

0 голосов
/ 02 июля 2010

Что насчет CSS3-решения?Без Javascripts?

На этой странице есть коллекция слайдеров изображений, использующих только CSS, может быть, это может вам помочь.

http://speckyboy.com/2010/06/09/10-pure-css3-image-galleries-and-sliders/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...