Запретить div «прыгать» при анимации прокрутки

Я пытаюсь анимировать два элемента div, чтобы скользить по экрану и выходить из него при прокрутке. Прокрутите вниз, и они будут двигаться наружу, пока не исчезнут из поля зрения. Прокрутите вверх, и они вернутся в поле зрения и остановятся в своем исходном положении, указанном в CSS (я использовал ключевые кадры для достижения этого при загрузке страницы). Проблема в том, что элементы div прыгают примерно на 500 пикселей от своего исходного положения, как только активируется движение прокрутки, т. е. левый элемент div перепрыгнет на правую сторону, а затем переместится в исходную указанную позицию CSS вместо того, чтобы начинать с этой позиции и двигаться за пределы экрана.. У меня настроено поведение только для левого элемента в качестве примера.

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

Вот видео по проблеме. - https://thewikihow.com/video_G2dAX2fPPN4&feature=youtu.be

https://codepen.io/anon/pen/axpMwZ

$(document).ready(function() {
  var $horizontal = $('.about-left');

  $(window).scroll(function() {
    var s = $(this).scrollTop(),
      d = $(document).height(),
      c = $(this).height();

    scrollPercent = (s / (d - c) * 18);

    var position = (scrollPercent * ($(document).width() - $horizontal.width()));

    $horizontal.css({
      'right': position
    });
  });
});
.main {
  height: 300vh; // maximized to illustrate scroll
  width: auto;
}

.about-left {
  position: absolute;
  top: 22%;
  left: 18%;
  font-size: 300px;
  color: #15ad93;
  text-shadow: 0px 1px 3px black;
  animation: 1s ease-out 0s 1 slideInFromLeft;
}

.about-right {
  position: absolute;
  top: 22%;
  right: 18%;
  font-size: 300px;
  color: #15ad93;
  text-shadow: 0px 1px 3px black;
  animation: 1s ease-out 0s 1 slideInFromRight;
}

@keyframes slideInFromLeft {
  0% {
    transform: translateX(-200%);
    opacity: 0;
  }
  100% {
    transform: translateY(0);
    opacity: 1;
  }
}

@keyframes slideInFromRight {
  0% {
    transform: translateX(200%);
    opacity: 0;
  }
  100% {
    transform: translateY(0);
    opacity: 1;
  }
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "main">

  <div class = "about-left">[]</div>

  <div class = "about-right">[]</div>

</div>

может это я, но анимация происходит только при загрузке страницы...

kukkuz 10.04.2019 05:16

@kukkuz Да, это начальная анимация ключевых кадров. Я включил ссылку на YouTube на проблему, с которой я сталкиваюсь локально, если вы хотите ее проверить. Не уверен, почему то же самое не происходит здесь или в Codepen. youtube.com/watch?v=G2dAX2fPPN4&feature=youtu.be

Justin Cefai 10.04.2019 07:10
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
0
2
1 140
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш CSS:

.about-left {
  ...
  left: 18%;
  ...
}

Ваш js:

$horizontal.css({
    'right': position
});

Попробуйте использовать в обоих «левых» или в обоих «правых».

или добавьте в класс .about-left "text-align: right;"

Ответ принят как подходящий

Почему ваш Codepen не показывает прокрутку

1) Для абсолютного позиционирования требуется родительский элемент с позицией relative. Вероятно, упрощая ваш код для этого вопроса и Codepen, ваш .main div потерял это. Я добавил его обратно.

2) Когда это все еще не заработало, я проверил консоль разработчика и заметил ошибку о тегах <script>. Ваш Codepen включает их в панель JS, оказывается, они не требуются и на самом деле вызывают проблему. Я удалил их.

Почему ваша анимация прыгает

Короче говоря, это просто математическая задача. Ваш .about-left стиль начинается с left: 18%;. При прокрутке, которая переопределяется встроенным стилем с помощью right: <something>, где <something> изменяется в зависимости от положения прокрутки. Самое первое значение этого <something> резко отличается от начальной позиции left: 18%;, поэтому элемент прыгает по экрану. Я не пытался разобраться в деталях вашей математики прокрутки, чтобы понять, почему, так как есть более простое решение.

Самый простой вариант — использовать единый механизм позиционирования изначально и при прокрутке. Для начального положения left: 18%; можно также выразить как:

right: calc(82% - 200px);

Простое использование 82% помещает сторону правильно блока, содержащего элемент, на 82% от правой стороны страницы, но на самом деле нам нужна сторона блока осталось, поэтому мы должны вычесть ширину этого блока. В вашем Codepen это 200 пикселей, хотя это, вероятно, зависит от вашего окончательного стиля и может отличаться в вашем реальном коде (например, ваше видео показывает красивую фигурную скобку, а не квадратную в Codepen). Придется подстраиваться по мере необходимости.

Затем я обновил ваш код прокрутки JS, чтобы изменить позицию, начиная с той же начальной позиции:

$horizontal.css({
    'right': 'calc(82% - 200px + ' + position + 'px)'
});

Пока ваше самое первое значение position относительно невелико, первый ход будет на небольшом расстоянии от начальной точки.

Обратите внимание, что вы должны использовать кавычки вокруг calc() и снять кавычки с переменной position JS.

Обновленный, рабочий Codepen. Анимация довольно быстрая, я имею в виду, что она перемещается за пределы экрана быстро и довольно большими прыжками, хотя, конечно, вы можете настроить значение приращения, изменив свои математические вычисления (следите за записанными значениями положения в консоли).

Это идеально, именно то, что я себе представлял. Большое спасибо за подробное объяснение! Вот он в действии - [Встроенная ссылка] (Justincefai.co)

Justin Cefai 10.04.2019 22:28

Я пытаюсь понять, как реализовать такое же поведение для самой нижней части страницы, чтобы сохранить согласованность стилей, но я не могу найти способ сохранить исходное положение. Я знаю, что приведенное выше решение предназначено для верхней части экрана, так что это не сработает, но я также пытался объединить scrollTop и windowHeight в качестве переменной и включить поведение при достижении элемента, но безуспешно. Он работает для других элементов выше на странице (перемещение вверх по прокрутке и т. д.), но не для нижней части. Есть предположения? Заранее спасибо!

Justin Cefai 18.04.2019 19:19

@JustinCefai Я просмотрел ваш сайт и, кажется, понял, что вы имеете в виду (say-hi-l/r?), но я, вероятно, не вижу всего соответствующего кода. Класс .visible, похоже, не имеет анимации, и я не заметил никакого позиционирования JS, хотя я не очень старался читать сжатый CSS/JS :-) Я заметил, что у вас есть $(tag) там, где вы должны были просто tag, хотя я не думаю, что это что-то сломает. Я не знаю какой-либо причины, по которой тот же подход нет будет работать, используя нижнюю часть в качестве ссылки вместо верхней. Если вы все еще застряли, возможно, откройте новый вопрос, и я проверю его :-)

Don't Panic 19.04.2019 10:50

Да, это та часть, о которой я говорю, я просто не запускал ее в прямом эфире, потому что я подал заявку на работу и не хочу никаких ошибок, ха-ха. Я в основном просто застрял, пытаясь понять, как использовать нижнюю часть в качестве ссылки вместо верхней (я предполагаю, что это делается в рамках математики в переменной position?). Когда я прокручиваю экран вверху, в инструментах разработчика отображается 0, а внизу — что-то вроде 2.01326e+08px. Любые советы будут потрясающими!

Justin Cefai 20.04.2019 04:19

Другие вопросы по теме