2017-09-17 20 views
7

Tôi muốn tạo một thứ gì đó giống như trang web mà bạn cuộn xuống và một số hoạt ảnh theo sau cuộn của bạn và nếu bạn di chuyển lên thì ngược lại.Cách liên kết thời gian hoạt ảnh css để cuộn

Tôi thấy một số thư viện như this nhưng tôi muốn thấy nó có thể được thực hiện một số cách đơn giản hơn?

Cảm ơn

$(document).ready(function(){ 
 
    var lastScrollTop = 0; 
 
    $(document).scroll(function(event){ 
 
     var st = $(this).scrollTop(); 
 
     if (st > lastScrollTop){ 
 
      $('div').removeClass('scrollUp').addClass('scrollDown'); 
 
     } else { 
 
      $('div').removeClass('scrollDown').addClass('scrollUp'); 
 
     } 
 
     lastScrollTop = st; 
 
    }); 
 
});
body{ 
 
    height: 150vh; 
 
    overflow-y: auto; 
 
} 
 
div { 
 
    width: 100px; 
 
    height: 100px; 
 
    position: fixed; 
 
} 
 
@keyframes myfirst { 
 
    0% {background: rgba(0,0,0,0); top: 0px;} 
 
    100% {background: rgba(0,0,0,1); top: 400px;} 
 
} 
 
.scrollDown{ 
 
    animation-name: myfirst; 
 
    animation-duration: 5s; 
 
    animation-direction: alternate; 
 
} 
 
.scrollUp{ 
 
    animation-name: myfirst; 
 
    animation-duration: 5s; 
 
    animation-direction: alternate-reverse; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div></div>

Bên cạnh đó tôi chỉ cố gắng thay đổi keyframe trên cuộn để 100% hoặc cuối của hình ảnh động thay đổi bằng cách di chuyển xuống và 0% bằng cách cuộn lên nhưng nó không làm việc:

$(document).ready(function(){ 
 
    var lastScrollTop = 0; 
 
    $(document).scroll(function(event){ 
 
     var st = $(this).scrollTop(); 
 
     $('head>style').last().remove(); 
 
     if (st > lastScrollTop){ 
 
      $('head').append('<style>@keyframes myfirst{0%{background: rgba(0,0,0,0); top: 0px;}100%{background: rgba(0,0,0,1); top: '+st+'px;}}</style>'); 
 
      $('div').removeClass('scrollUp').addClass('scrollDown'); 
 
     } else { 
 
     $('head').append('<style>@keyframes myfirst{0%{background: rgba(0,0,0,0); top: '+st+'px;}100%{background: rgba(0,0,0,1); top: '+lastScrollTop+'px;}}</style>'); 
 
      $('div').removeClass('scrollDown').addClass('scrollUp'); 
 
     } 
 
     lastScrollTop = st; 
 
    }); 
 
});
body{ 
 
    height: 150vh; 
 
    overflow-y: auto; 
 
} 
 
div { 
 
    width: 100px; 
 
    height: 100px; 
 
    position: fixed; 
 
    border: 1px solid black; 
 
} 
 
.scrollDown{ 
 
    animation-name: myfirst; 
 
    animation-duration: 0s; 
 
    animation-direction: alternate; 
 
} 
 
.scrollUp{ 
 
    animation-name: myfirst; 
 
    animation-duration: 0s; 
 
    animation-direction: alternate-reverse; 
 
}
<head> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
</head> 
 
<div></div>

GIẢI PHÁP VỚI CHUYỂN TIẾP (KHÔNG keyframe)

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div></div> 
 
<style> 
 
body{ 
 
    height: 150vh; 
 
    overflow-y: auto; 
 
} 
 
div { 
 
    width: 100px; 
 
    height: 100px; 
 
    position: fixed; 
 
    border: 1px solid black; 
 
    opacity: 0; 
 
    transition: opacity 0s ease; 
 
    background: rgb(0,0,0); 
 
} 
 
</style> 
 
</head> 
 
<body> 
 
<div></div> 
 
<script> 
 
    $(document).ready(function(){ 
 
    var lastScrollTop = 0; 
 
    $(document).scroll(function(event){ 
 
     var st = $(this).scrollTop(); 
 
     $('head>style').last().remove(); 
 
     if (st > lastScrollTop){ 
 
     
 
      $('div').css({ 
 
       opacity: function() { 
 
       var opacity = ((1 - (400 - st)/400) * 0.8); 
 
       return opacity; 
 
      }, left: st 
 
     
 
      }); 
 
     } else { 
 
      $('div').css({ 
 
       opacity: function() { 
 
       var opacity = ((1 - (400 - st)/400) * 0.8); 
 
       return opacity; 
 
      }, left: st 
 
     
 
      }); 
 
     } 
 
     lastScrollTop = st; 
 
    }); 
 
}); 
 
</script> 
 
</body> 
 
</html>

+0

Hi Kid ngu ngốc. Tôi nghĩ rằng, giá trị của nó cố gắng để chỉ kích hoạt các hình ảnh động ở một ngưỡng quy định sau khi phát hiện hướng cuộn di chuyển với một khoảng thời gian nhỏ có thể khoảng 50 đến 100 micro giây. – jidexl21

Trả lời

1

Nó có thể được thực hiện đơn giản hơn và không có jQuery. Đây là một mất thô, nhưng tôi đã làm cho nó chung chung hơn một chút bằng cách thêm một container và đi qua tỷ lệ xung quanh để có được chủ yếu là đầy đủ, bao bọc trái sang phải vị trí và hiệu ứng chuyển tiếp zero-to-one opacity:

var locked = false; 
 
var container = document.getElementById('container'); 
 
var animated = document.getElementById('animated'); 
 

 
window.addEventListener('scroll', function() { 
 
    if (!locked) { 
 
    window.requestAnimationFrame(function() { 
 

 
     animated.style.opacity = Math.min(window.scrollY/window.innerHeight, 1); 
 
     animated.style.left = Math.min(animated.style.opacity * container.clientWidth, container.clientWidth - animated.clientWidth).toString() + 'px'; 
 

 
     locked = false; 
 
    }); 
 
    } 
 
    locked = true; 
 
});
#container { 
 
    border: 1px solid red; 
 
    height: 200vh; 
 
    width: 80%; 
 
} 
 

 
#animated { 
 
    width: 100px; 
 
    height: 100px; 
 
    position: fixed; 
 
    opacity: 0; 
 
    background: rgb(0, 0, 0); 
 
}
<div id="container"> 
 
    <div id="animated"></div> 
 
</div>

Các vấn đề liên quan