Я пытаюсь анимировать два элемента 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 Да, это начальная анимация ключевых кадров. Я включил ссылку на YouTube на проблему, с которой я сталкиваюсь локально, если вы хотите ее проверить. Не уверен, почему то же самое не происходит здесь или в Codepen. youtube.com/watch?v=G2dAX2fPPN4&feature=youtu.be
Ваш CSS:
.about-left {
...
left: 18%;
...
}
Ваш js:
$horizontal.css({
'right': position
});
Попробуйте использовать в обоих «левых» или в обоих «правых».
или добавьте в класс .about-left "text-align: right;"
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)
Я пытаюсь понять, как реализовать такое же поведение для самой нижней части страницы, чтобы сохранить согласованность стилей, но я не могу найти способ сохранить исходное положение. Я знаю, что приведенное выше решение предназначено для верхней части экрана, так что это не сработает, но я также пытался объединить scrollTop и windowHeight в качестве переменной и включить поведение при достижении элемента, но безуспешно. Он работает для других элементов выше на странице (перемещение вверх по прокрутке и т. д.), но не для нижней части. Есть предположения? Заранее спасибо!
@JustinCefai Я просмотрел ваш сайт и, кажется, понял, что вы имеете в виду (say-hi-l/r
?), но я, вероятно, не вижу всего соответствующего кода. Класс .visible
, похоже, не имеет анимации, и я не заметил никакого позиционирования JS, хотя я не очень старался читать сжатый CSS/JS :-) Я заметил, что у вас есть $(tag)
там, где вы должны были просто tag
, хотя я не думаю, что это что-то сломает. Я не знаю какой-либо причины, по которой тот же подход нет будет работать, используя нижнюю часть в качестве ссылки вместо верхней. Если вы все еще застряли, возможно, откройте новый вопрос, и я проверю его :-)
Да, это та часть, о которой я говорю, я просто не запускал ее в прямом эфире, потому что я подал заявку на работу и не хочу никаких ошибок, ха-ха. Я в основном просто застрял, пытаясь понять, как использовать нижнюю часть в качестве ссылки вместо верхней (я предполагаю, что это делается в рамках математики в переменной position?). Когда я прокручиваю экран вверху, в инструментах разработчика отображается 0, а внизу — что-то вроде 2.01326e+08px. Любые советы будут потрясающими!
может это я, но анимация происходит только при загрузке страницы...