Est-il possible d'animer le défilement avec CSS3?
Quelque chose comme ça?
@-webkit-keyframes scrolltoview
{
0% { scrollTop: 0; }
100% { scrollTop: 30%; }
}
Comment mettre dans le css où est le point de départ de l'animation?
les animations CSS3 ne fonctionnent qu'avec les propriétés CSS. ce n'est pas possible dans les limites de CSS.
Comme expliqué ci-dessus here vous pouvez le faire en utilisant margin-top
astuce et en mettant à jour la position de défilement de manière dynamique. Vous pouvez vérifier le demo . Le code est simple:
// Define the variables
var easing, e, pos;
$(function(){
// Get the click event
$("#go-top").on("click", function(){
// Get the scroll pos
pos= $(window).scrollTop();
// Set the body top margin
$("body").css({
"margin-top": -pos+"px",
"overflow-y": "scroll", // This property is posed for fix the blink of the window width change
});
// Make the scroll handle on the position 0
$(window).scrollTop(0);
// Add the transition property to the body element
$("body").css("transition", "all 1s ease");
// Apply the scroll effects
$("body").css("margin-top", "0");
// Wait until the transition end
$("body").on("webkitTransitionEnd transitionend msTransitionEnd oTransitionEnd", function(){
// Remove the transition property
$("body").css("transition", "none");
});
});
});
@AndrewP a fourni un Nice exemple de travail basé sur cette idée
J'ai découvert un meilleur moyen d'animer le défilement, qui consiste à utiliser JavaScript pour traduire le corps du document. Les avantages de l'animation avec translation sur marge ou position sont jolis bien documentés . En fin de compte, lors de l'animation d'éléments, le processeur graphique fera toujours un meilleur travail.
Voici un exemple qui calcule la position actuelle de l'utilisateur à partir du haut de la fenêtre, puis convertit en douceur vers le haut de la fenêtre. Supposons qu'un utilisateur clique ou touche l'événement déclenche la fonction backToTop.
Voir en action: https://antibland.github.io/starting_point/
function whichTransitionEvent() {
var t,
el = document.createElement('fakeelement'),
transitions = {
'transition':'transitionend',
'OTransition':'oTransitionEnd',
'MozTransition':'transitionend',
'WebkitTransition':'webkitTransitionEnd'
};
for (t in transitions){
if (el.style[t] !== undefined){
return transitions[t];
}
}
}
function backToTop() {
var pos_from_top = window.scrollY,
transitionend = whichTransitionEvent(),
body = document.querySelector("body");
function scrollEndHandler() {
window.scrollTo(0, 0);
body.removeAttribute("style");
body.removeEventListener(transitionend, scrollEndHandler);
}
body.style.overflowY = "scroll";
window.scrollTop = 0;
body.style.webkitTransition = 'all .5s ease';
body.style.transition = 'all .5s ease';
body.style.webkitTransform = "translateY(" + pos_from_top + "px)";
body.style.transform = "translateY(" + pos_from_top + "px)";
transitionend && body.addEventListener(transitionend, scrollEndHandler);
}
C’est une fonction .js très simple que j’ai créée pour animer + faire défiler une page Web.
var Current_scroll_Y=0;
var Target_scroll_Y=0;
var scroll_Speed = 15;
function animate_Scroll(Y)
{
Target_scroll_Y = Y;
screen_Y = Math.floor(window.scrollY);
//Scroll Down
if(screen_Y<Y)
{
var myWindowScroll = setInterval(function(){ screen_Y = screen_Y+scroll_Speed; if(screen_Y>=Target_scroll_Y){ clearInterval(myWindowScroll); return;} window.scrollTo(0, screen_Y); }, 3);
}
//Scroll Up
if(screen_Y>Y)
{
var myWindowScroll = setInterval(function(){ screen_Y = screen_Y-scroll_Speed; if(screen_Y<=Target_scroll_Y){ clearInterval(myWindowScroll); return;} window.scrollTo(0, screen_Y); }, 3);
}
}//End animate_Scroll
Je ne pense pas que ce soit possible avec CSS3, mais si je comprends bien votre question, c’est très facile avec JQuery.
Check-out: