Попробую этот код уже утром. Спасибо!
|
Цитата:
Никак не могу понять в чем дела, поменял значение на .1 в intersectionRatio работает по лучше, только теперь уже срабатывает когда блок только входит в поле зрения а не когда он полностью! Может вы знаете в чем проблема и как это исправить? Буду очень благодарен! P.S можете рассказать по подробнее про эти параметры, на что они влияют, может удастся настроить как надо: el.intersectionRatio > .4; threshold: [0.1, 0.8] |
Кажется нашел в чем проблема, я пробовал другой код, там была такая же проблема с запуском видео. Проблема в том что видео большое и выходит за пределами блока, хоть он и скрыт через css, но код определяет сам размер видео судя по всему.
https://i.ibb.co/6HdzY69/vid.png В вашем коде наверное такая же проблема, можете пжл переделать его, сделать наверное для класса и видео отдельный код или как то по другому на ваше усмотрения. С меня советник по JS так себе! Может можно сделать что б сработал когда сам блок будет в поле зрения, не учитывая ту часть видео которое выходит за пределами. Вот сам html блока если нужен:
<div class="site--image---video">
<img src="images/01.jpg" alt="Image 01">
<video class="site--video" controls muted loop>
<source src="images/video.mp4" type="video/mp4">
</video>
</div>
|
Цитата:
el.intersectionRatio > .4; --- любое число больше .1 и меньше .8 --- блок виден если true. нужен полноценный макет с css. попробуйте так ...
document.addEventListener('DOMContentLoaded', function() {
const lazyAnimate = divs => {
divs.forEach(el => {
let isInView = el.intersectionRatio > .4;
let div = el.target;
if (div.classList.contains('site--image---video')) div.classList.toggle('show', isInView);
let video = div.querySelector('.site--video');
if (isInView) {
video.play();
//$(video).bgVideo();??
} else {
video.pause();
video.currentTime = 0;
}
});
}
let observer = new IntersectionObserver(lazyAnimate, {
rootMargin: "0px",
threshold: [.1, .9] //настроить видимость
});
let container = document.querySelectorAll('.site--image---video');
container.forEach(div => observer.observe(div))
});
|
|
Не работает так как надо. Пытаюсь настроить, но не очень выходит. К примеру, при загрузке страницы если блок частично в поле зрения то он срабатывает.
Вот тут сам код как на сайте, может вам удастся настроить https://codepen.io/ethereal94/pen/vYyRoMv Было бы хорошо чтоб он работал так: Вход - при прокрутке по вертикали и горизонтали сработать сразу когда будет на 100% виден блок. Выход - при прокрутке по вертикали скрыть когда блок уйдет на 70%; Выход - при прокрутке по горизонтали скрыть сразу когда блок не будет виден на все 100%; Если можно так сделать |
ethereal,
лучше скопировать код и создать отдельную страницу для просмотра
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
body {
width: 4000px;
height: 2000px;
}
.container {
position: relative;
width: 1000px;
height: auto;
border: 1px solid gray;
margin: 0 auto;
}
.container > div {
margin: 10px;
display: inline-block;
background: gray;
}
.site--image---video video::-webkit-media-controls ,.jquery-background-video-pauseplay {
display:none !important;
}
.site--image---video {
position: relative;
overflow: visible;
width: 100%;
height: 100%;
background-position: center center;
background-repeat: no-repeat;
-webkit-background-size: cover;
-moz-background-size: cover;
background-size: cover;
}
.site--video {
position: absolute;
min-width: 100%;
min-height: 100%;
width: auto;
height: auto;
top: 50%;
left: 50%;
-o-object-fit: contain;
object-fit: contain;
-webkit-transform: translate(-50%,-50%);
-moz-transform: translate(-50%,-50%);
-ms-transform: translate(-50%,-50%);
-o-transform: translate(-50%,-50%);
transform: translate(-50%,-50%);
z-index: 0;
}
.site--image---video img {
position: relative;
width: 100%;
height: 100%;
object-fit: cover;
transition: all 800ms ease;
transition-delay: 0ms;
z-index: 10;
}
.show.site--image---video img {
opacity: 0;
transition: all 800ms ease;
transition-delay: 1200ms;
}
</style>
<script>
document.addEventListener( "DOMContentLoaded" , function() {
const lazyAnimate = divs => {
divs.forEach(el => {
let isInView = el.intersectionRatio > .8;
let div = el.target;
let site = div.querySelector('.site--image---video');
site.classList.toggle('show', isInView);
let video = div.querySelector('.site--video');
if (isInView) {
video.play();
} else {
video.pause();
video.currentTime = 0;
}
});
}
let observer = new IntersectionObserver(lazyAnimate, {
rootMargin: "0px",
threshold: [.7, .9] //настроить видимость
});
let container = document.querySelectorAll('.container > div');
container.forEach(div => observer.observe(div))
});
</script>
</head>
<body>
<div class="container">
<div style="width: 980px; height: 560px;">
<div class="site--image---video">
<img src="https://images.pexels.com/photos/6900690/pexels-photo-6900690.jpeg">
<video class="site--video" controls muted loop>
<source src="http://www.w3schools.com/Tags/mov_bbb.mp4" type="video/mp4">
<source src="http://www.w3schools.com/Tags/mov_bbb.ogg" type="video/ogg">
</video>
</div>
</div>
<div style="width: 475px; height: 360px;">
<div class="site--image---video">
<img src="https://images.pexels.com/photos/6900690/pexels-photo-6900690.jpeg">
<video class="site--video" controls muted loop>
<source src="http://www.w3schools.com/Tags/mov_bbb.mp4" type="video/mp4">
<source src="http://www.w3schools.com/Tags/mov_bbb.ogg" type="video/ogg">
</video>
</div>
</div>
<div style="width: 475px; height: 360px;">
<div class="site--image---video">
<img src="https://images.pexels.com/photos/6900690/pexels-photo-6900690.jpeg">
<video class="site--video" controls muted loop>
<source src="http://www.w3schools.com/Tags/mov_bbb.mp4" type="video/mp4">
<source src="http://www.w3schools.com/Tags/mov_bbb.ogg" type="video/ogg">
</video>
</div>
</div>
</div>
</body>
</html>
|
| Часовой пояс GMT +3, время: 12:03. |