animation scrollintoview

Mon code est à http://jsfiddle.net/mannagod/QT3v5/7/.

Le JS:

function delay() {
    var INTENDED_MONTH = 7 //August
    // INTENDED_MONTH is zero-relative
    now = new Date().getDate(),
rows = document.getElementById('scripture').rows;
    if (new Date().getMonth() != INTENDED_MONTH) {
        // need a value here less than 1, 
        // or the box for the first of the month will be in Red
        now = 0.5
    };
    for (var i = 0, rl = rows.length; i < rl; i++) {
        var cells = rows[i].childNodes;
        for (j = 0, cl = cells.length; j < cl; j++) {
            if (cells[j].nodeName == 'TD'
  && cells[j].firstChild.nodeValue != ''
  && cells[j].firstChild.nodeValue == now) {
                // 'ffff99' // '#ffd700' // TODAY - red
                rows[i].style.backgroundColor = 'red' 
                rows[i].scrollIntoView();
            }
        }
    }
}

je dois trouver un moyen de lisser le .scrollintoview(). En ce moment, il "saute" à la ligne en surbrillance. J'en ai besoin pour passer en douceur à cette rangée. Il doit être fait dynamiquement dans le remplacement de scrollintoview. Des idées? Grâce.

25
demandé sur Mosh Feu 2012-08-24 05:24:15

7 réponses

Il y a un plugin jQuery exactement pour ça

Voici le lien un article du blog de la mine qui décrit l'ensemble de la chose et a un lien vers le projet GitHub où vous pouvez obtenir le plugin.

Animé scrollintoview() jQuery plugin.

5
répondu Robert Koritnik 2012-08-24 09:51:46

je suis à la recherche de ce problème et a trouvé cette solution:

$('html, body').animate({
    scrollTop: $("#elementId").offset().top
}, 1000);

ressources: http://www.abeautifulsite.net/smoothly-scroll-to-an-element-without-a-jquery-plugin-2/

29
répondu Sarkhan 2018-07-30 00:20:53

Dans la plupart des navigateurs modernes ( Chrome et Firefox, mais pas Safari, UC, ou IE) vous pouvez passer des options dans un objet à .scrollIntoView().

essaye ceci:

elm.scrollIntoView({ behavior: 'smooth', block: 'center' })

les Autres valeurs sont behavior: 'instant' ou block: 'start' ou block: 'end'. Voir https://developer.mozilla.org/en/docs/Web/API/Element/scrollIntoView

27
répondu Chris78 2018-05-31 17:12:56

peut-être que vous ne voulez pas ajouter jQuery juste pour la mise en œuvre de cette fonctionnalité. elem est l'élément à défiler. La position de destination peut être prise à partir de la propriété offsetTop de l'élément à déplacer.

function Scroll_To(elem, pos)
{
    var y = elem.scrollTop;
    y += (pos - y) * 0.3;
    if (Math.abs(y-pos) < 2)
    {
        elem.scrollTop = pos;
        return;
    }
    elem.scrollTop = y;
    setTimeout(Scroll_To, 40, elem, pos);   
}
13
répondu Klaus Heyne 2013-04-23 13:55:44

lisser le défilement en utilisant requestAnimationFrame sur une durée déterminée sans jQuery.

Démo: http://codepen.io/Shadeness/pen/XXyvKG?editors=0010

window.bringIntoView_started = 0;
window.bringIntoView_ends = 0;
window.bringIntoView_y = 0;
window.bringIntoView_tick = function() {
  var distanceLeft, dt, duration, t, travel;
  t = Date.now();
  if (t < window.bringIntoView_ends) {
    dt = t - window.bringIntoView_started;
    duration = window.bringIntoView_ends - window.bringIntoView_started;
    distanceLeft = window.bringIntoView_y - document.body.scrollTop;
      travel = distanceLeft * (dt / duration);
      document.body.scrollTop += travel;
      window.requestAnimationFrame(window.bringIntoView_tick);
  } else {
    document.body.scrollTop = window.bringIntoView_y;
  }
};
window.bringIntoView = function(e, duration) {
  window.bringIntoView_started = Date.now();
  window.bringIntoView_ends = window.bringIntoView_started + duration;
  window.bringIntoView_y = Math.min(document.body.scrollTop + e.getBoundingClientRect().top, document.body.scrollHeight - window.innerHeight);
  window.requestAnimationFrame(window.bringIntoView_tick);
};

par exemple:

bringIntoView(document.querySelector('#bottom'), 400)

Il devrait accélérer comme dt (deltaTime) devient plus grand, et ralentit distanceLeft get est plus petit. J'ai pensé briser la boucle si l'utilisateur filait mais meh. Les variables globales empêchent l'appel précédent de prendre le dessus complètement, mais n'annulent pas le précédent boucle récursive afin d'animer deux fois plus vite.

7
répondu Zren 2016-02-10 05:18:46

vous avez juste besoin d'inclure ce polyfill et cela fonctionne.

https://github.com/iamdustan/smoothscroll

<script src="js/smoothscroll.js"></script>

Ou l'exiger si vous utiliser npm.

require('smoothscroll-polyfill').polyfill();

utilisez la méthode native scrollIntoView.

document.getElementById('parallax-group-logo').scrollIntoView({
    block: "start",
    behavior: "smooth"
});
3
répondu Ilario Engler 2017-05-06 16:56:36

essaye ceci:

function scroll_into_view_smooth(elem)
{   var FPS = 48; // frames per second
    var DURATION = 0.6; // sec
    var e = elem;
    var left = e.offsetLeft;
    var top = e.offsetTop;
    var width = e.offsetWidth;
    var height = e.offsetHeight;
    var body = document.body;
    var to_scroll = [];
    var p, offset;
    while ((p = e.offsetParent))
    {   var client_width = p.clientWidth;
        var client_height = p!=body ? p.clientHeight : Math.min(document.documentElement.clientHeight, window.innerHeight);
        if (client_width<p.scrollWidth-1 && ((offset=left-p.scrollLeft)<0 || (offset=left+width-p.scrollLeft-client_width)>0))
        {   to_scroll.push({elem: p, prop: 'scrollLeft', from: p.scrollLeft, offset: offset});
        }
        if (client_height<p.scrollHeight-1 && ((offset=top-p.scrollTop)<0 || (offset=top+height-p.scrollTop-client_height)>0))
        {   to_scroll.push({elem: p, prop: 'scrollTop', from: p.scrollTop, offset: offset});
        }
        e = p;
        left += e.offsetLeft;
        top += e.offsetTop;
    }
    var x = 0;
    function apply()
    {   x = Math.min(x+1/(DURATION * FPS), 1);
        for (var i=to_scroll.length-1; i>=0; i--)
        {   to_scroll[i].elem[to_scroll[i].prop] = to_scroll[i].from + to_scroll[i].offset*x*x;
        }
        if (x < 1)
        {   setTimeout(apply, 1000/FPS);
        }
    }
    apply();
}
2
répondu jeremiah 2017-05-28 19:54:06