> Faqs > Scroll suavizado para los enlaces internos (links a anclas)

Scroll suavizado para los enlaces internos (links a anclas)

¿Cómo se hace para que los enlaces internos produzcan un desplazamiento suavizado de la página?

Por ejemplo, tengo un enlace así:

<a href="#enlace">Texto del enlace</a>

Y su correspondiente ancla:

<a name="enlace"></a>

Lo que se desea es que al pulsar el link el navegador lleve al lugar donde está el ancla con un desplazamiento suavizado, en vez de ir de golpe.

Respuestas

Para conseguir un desplazamiento suave en la página al hacer clic en enlaces internos (enlaces hacia anclas), puedes usar CSS. En realidad no necesitas nada más.

Puedes probar esta declaración de estilos:

html {
 scroll-behavior: smooth;
}

Con eso podrás habilitar el desplazamiento suavizado.

Cómo hacerlo con Javascript

En realidad scroll-behavior: smooth es una propiedad CSS que está bastante extendido en los navegadores modernos. Pero si en el navegador que te interesa no hay soporte a esta propiedad de CSS, también podrías hacerlo con Javascript. De hecho es como se hacía anteriormente.

Puedes usar el siguiente código básico:

document.querySelectorAll('a[href^="#"]').forEach(anchor => {
  anchor.addEventListener('click', function (e) {
    e.preventDefault();
    document.querySelector(this.getAttribute('href')).scrollIntoView({
      behavior: 'smooth'
    });
  });
});

Este script selecciona todos los enlaces que comienzan con # (lo hace mediante un selector de CSS de atributo), y luego agrega un evento click que evita el comportamiento predeterminado del enlace (la navegación predeterminada). En lugar de ello hace el desplazamiento suavemente hacia el elemento destino.

Solo hay una cosa muy importante y es que el elemento de destino debería ser un elemento con el identificador que se haya usado como nombre del ancla.

Por ejemplo si el enlace es así:

<a href="#link">Enlace interno</a>

El ancla es un elemento de la página que tenga id="link":

<p id="link">Aquí está el ancla</p>

Te dejo un ejemplo de página donde se puede ver en uso este script de Javascript:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>probando enlaces internos suavizados</title>
  <style>
    p { font-size: 1.6rem; line-height: 2.5rem;}
  </style>
</head>
<body>
  <p>
    <a href="#link">Enlace interno</a>
  </p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p id="link">Aquí está el ancla</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  <p>-</p>
  
  <script>
    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
      anchor.addEventListener('click', function (e) {
        e.preventDefault();
        document.querySelector(this.getAttribute('href')).scrollIntoView({
          behavior: 'smooth'
        });
      });
    });
  </script>
</body>
</html>
Santiago
561 18 44 21
Muchas gracias por este completo ejemplo!! me ha servido mucho.