Как создать эффект параллакса без использования фонового изображения?

Я пытаюсь создать эффект параллакса без использования background-image с background-attachment: fixed, так как background-attachment: fixed не работает на iOS так хорошо. Вот что я придумал:

HTML

<article class="twentyseventeen-panel">
  <div class="panel-image">
    <div style="position: absolute; top: 0; bottom: 0; left: 0; right: 0;" >
      <img src="<?php echo esc_url( $thumbnail[0] ); ?>" style="width: 100%;" />
    </div>
  </div>
</article>

CSS

.twentyseventeen-panel {
    overflow: hidden;
    position: relative;
}
.panel-image {
    position: relative;
    height: 100vh;
    max-height: 200px;
}

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

Ответы

Ответ 1

К сожалению, я не знаю какого-либо уверенного пути, используя чистый CSS. Причина этого в том, что нет возможности получить текущую позицию прокрутки (которую мы могли бы использовать в calc()). Кроме того, при позиционировании элемента с помощью fixed он больше не заботится о своем родителе, и становится невозможным принудительное выполнение overflow:hidden.

Существует два способа создания эффекта паралакса без использования фона, чтобы использовать JavaScript, я дал вам полный рабочий пример. Это минимально, может заставить браузер работать слишком много для ничего, но он работает. Вы, конечно, захотите оптимизировать его, чтобы применять только к элементам, которые видны, если у вас много.

$(document).ready(function() {
  var onScroll = function() {
    var scrollTop = $(this).scrollTop();
    $('.paralax-image').each(function(index, elem) {
      var $elem = $(elem);
      $elem.find('img').css('top', scrollTop - $elem.offset().top);
    });
  };
  onScroll.apply(window);
  $(window).on('scroll', onScroll);
});
.content {
  height: 500px;
}

.paralax-image {
  overflow: hidden;
  height: 200px;
  position: relative;
}

.paralax-image img {
  position: absolute;
  height: 100vh;
  min-width:100%;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="content">
  <h2>Lorem Ipsum</h2>
  <div class="paralax-image">
    <img src="http://lorempixel.com/400/200">
  </div>


</div>

Ответ 2

На самом деле вы можете сделать чистые эффекты параллакса CSS без необходимости background-image или background-attachment. У Keith Clark есть отличный написать и учить об этом. Я возьму его код для примера:

HTML

<div class="parallax">
  <div class="parallax__layer parallax__layer--back">
    ...
  </div>
  <div class="parallax__layer parallax__layer--base">
    ...
  </div>
</div>

CSS

.parallax {
  perspective: 1px;
  height: 100vh;
  overflow-x: hidden;
  overflow-y: auto;
}
.parallax__layer {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
}
.parallax__layer--base {
  transform: translateZ(0);
}
.parallax__layer--back {
  transform: translateZ(-1px) scale(2);
}

На самом деле это довольно простое решение, но может потребоваться секунда, чтобы понять, как все это происходит. Большая вещь, которая здесь происходит, - это transform: translateZ(-1px) scale(2), которая перемещает это <div> назад вдоль оси z и изменяет ее до нормального значения. Установка оси z - это управление скоростью параллакса. Таким образом, translateZ(-1px) работает медленнее, чем translateZ(-2px).

Теперь, когда div был перемещен назад по оси z, его необходимо изменить до нормального размера. Для этого просто добавьте scale в свойство transform. Масштаб должен быть рассчитан с помощью 1 + (translateZ * -1) / perspective. Таким образом, transform: translateZ(-10px) должен быть transform: translateZ(-2px) scale(3), если вы установите для параметра perspective значение 1px.

Затем perspective изменяется на 1px для контейнера .parallax, который устанавливает точку <div> в центр. Добавление overflow-y: auto позволяет прокручивать содержимое в обычном режиме, но элементы-потомки будут отображаться в фиксированной перспективе.

Поскольку это просто использует <div> и CSS, вы сможете решить свою проблему без JS. Вы можете просто разместить свои изображения в div. Это простая демонстрация, которая показывает только один эффект параллакса <div>. Если вы посмотрите на исходный код, вы не увидите JavaScript, кроме части для Google Analytics. Вот демо с тоннами различных разделов.

Я рекомендую вам читать этот учебник, поскольку код должен делать все, что вы хотите. Плюс он работает безупречно на iOS, Safari, Chrome и FF. Я использовал его несколько раз, и я не могу рекомендовать этот метод достаточно. Излишне говорить, что я заимствовал большую часть своего ответа из этого учебника, поэтому реквизит Кейт Кларк за отличную запись.