Como moverse de un punto a otro de la página grácilmente

Clasificado en:

Una de mis colegas (psicóloga), me decía que lo más apestoso del mundo era seleccionar un ítem de una lista para modificar (digamos, la ficha de una persona) y estar como tarado bajando una pantalla completa para editar la información. Así que, me instó a programar algo para que saltara el foco desde el cuadro de selección al de edición de forma automática (sin usar un link con #, se entiende).

La tarea alguna vez la intente sin mucho éxito, así que preferí ir con Google para buscar la información. Y, ¡cha-chán!, encontré este artículo del año 2003 en sitepoint llamado Make Internal Links Scroll Smoothly with JavaScript, que da una solución bastante simpática para hacer que la página no salte al clickear en un link interno, sino que se "deslice".

Haciendo unos pequeños cambios por aquí y allá, llegué a una versión que puede ser llamada desde un código cualquiera, ya sea mandando como parámetro el id o el objeto hacia donde queremos movernos. Very nice!

  1.  // smoothscroll.js
  2.  // Permite saltar de un punto a otro de la página moviéndose
  3.  // en forma paulatina.
  4.  
  5.  /**
  6.  * Función que permite saltar de la posición actual de la pantalla
  7.  * hacia otro objeto, a través de una referencia o su id
  8.  * @param string|object
  9.  */
  10.  function smoothScroll(des) {
  11.   if(typeof des=='object') {
  12.   var destinationLink=des
  13.   } else if(typeof des=='string') {
  14.   var destinationLink=document.getElementById(des)
  15.   }
  16.   // Find the destination's position
  17.   var destx = destinationLink.offsetLeft;
  18.   var desty = destinationLink.offsetTop;
  19.   var thisNode = destinationLink;
  20.   while (thisNode.offsetParent &&
  21.   (thisNode.offsetParent != document.body)) {
  22.   thisNode = thisNode.offsetParent;
  23.   destx += thisNode.offsetLeft;
  24.   desty += thisNode.offsetTop;
  25.   }
  26.  
  27.   // Stop any current scrolling
  28.   clearInterval(ss_INTERVAL);
  29.  
  30.   cypos = ss_getCurrentYPos();
  31.  
  32.   ss_stepsize = parseInt((desty-cypos) / ss_STEPS); // /
  33.   ss_INTERVAL = setInterval('ss_scrollWindow('+ss_stepsize+','+desty+')',10);
  34.  
  35.   // And stop the actual click happening
  36.   if (window.event) {
  37.   window.event.cancelBubble = true;
  38.   window.event.returnValue = false;
  39.   }
  40.  }
  41.  
  42.  function ss_scrollWindow(scramount,dest) {
  43.   wascypos = ss_getCurrentYPos();
  44.   isAbove = (wascypos < dest);
  45.   window.scrollTo(0,wascypos + scramount);
  46.   iscypos = ss_getCurrentYPos();
  47.   isAboveNow = (iscypos < dest);
  48.   if ((isAbove != isAboveNow) || (wascypos == iscypos)) {
  49.   // if we've just scrolled past the destination, or
  50.   // we haven't moved from the last scroll (i.e., we're at the
  51.   // bottom of the page) then scroll exactly to the link
  52.   window.scrollTo(0,dest);
  53.   // cancel the repeating timer
  54.   clearInterval(ss_INTERVAL);
  55.   // and jump to the link directly so the URL's right
  56.   }
  57.  }
  58.  
  59.  
  60.  function ss_getCurrentYPos() {
  61.   if (document.body && document.body.scrollTop)
  62.   return document.body.scrollTop;
  63.   if (document.documentElement && document.documentElement.scrollTop)
  64.   return document.documentElement.scrollTop;
  65.   if (window.pageYOffset)
  66.   return window.pageYOffset;
  67.   return 0;
  68.  }
  69.  
  70.  
  71.  var ss_INTERVAL;
  72.  var ss_STEPS = 25;
icono de usuario

Pues vaya que me ha parecido interesante este tutorial, principalmente por el atractivo visual que le puede dar a los enlaces internos.

Felicidades por los arreglos y ya lo estare probando en algunos proyectos nuevos :D

Enviado por Stan (no verificado) el Jue, 28/07/2005 - 11:53.
Imagen de clbustos

El mérito principal es del chico que hizo el script. El mío, el de pillarlo :)
Se ve muy agradable y ayuda mucho en ubicarse en que parte del documento está uno.

Enviado por clbustos el Jue, 28/07/2005 - 13:11.
icono de usuario

me vas a creer que hace unos años busque desesperadamente un Js que hiciera eso y solo encontre uno que funcionaba en IE 5.5 ???

^_^ saludos!!

Enviado por ochovio (no verificado) el Jue, 28/07/2005 - 20:08.

Enviar un comentario nuevo

El contenido de este campo se mantiene como privado y no se muestra públicamente.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato