JavaScript - No funciona scrollIntoView, funciona de manera inesperada.

 
Vista:
Imágen de perfil de Albert J.

No funciona scrollIntoView, funciona de manera inesperada.

Publicado por Albert J. (3 intervenciones) el 16/12/2022 22:15:50
Que tal amigos. Buenas tardes.

La cuestión es la siguiente, solo estoy probando una función de javascript llamada scrollIntoView(). El código es muy sencillo y su funcionamiento también: al hacer click en un link del menú te debe desplazar hacia el elemento con un efecto llamado "smooth", que es una transición suave hacia el elemento.

El problema: No se aplica la opción behavior: "smooth". Aunque el desplazamiento se da en forma de salto como si solo estuviera funcionando el enlace que hace href="#uno"<-->div id="uno".

1) En el código HTML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<body>
    <nav class="main-nav">
        <a href="#uno">UNO</a>
        <a href="#dos">DOS</a>
        <a href="#tres">TRES</a>
        <a href="#cuatro">CUATRO</a>
    </nav>
    <div id="uno">
        <h2>Sección UNO</h2>
    </div>
    <div id="dos">
        <h2>Sección DOS</h2>
    </div>
    <div id="tres">
        <h2>Sección TRES</h2>
    </div>
    <div id="cuatro">
        <h2>Sección CUATRO</h2>
    </div>
 
    <script src="app.js" type="text/javascript"></script>
</body>

2) Código app.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// seleccionamos la lista de elementos para agregarle un evento.
const enlaces = document.querySelectorAll('.main-nav a');
 
enlaces.forEach( link => {
    link.addEventListener("click", function(e) {
        // prevenimos el comportamiento por defecto del <a>
        e.preventDefault();
 
        // guardamos el valor del elemento selecionado: "#uno", "#dos"...
        const seccionScroll = e.target.attributes.href.value;
 
        // apuntamos al elemento al que nos queremos desplazar
        const target = document.querySelector(seccionScroll);
        // aplicamos la función para dezplasarnos al elemento seleccionado
        target.scrollIntoView({ behavior: "smooth"});
    });
});

Esto es todo. La función no se aplica, he intentado en varios navegadores, con varios ejemplos pero no se aplica el efecto deseado. No sé si sea alguna mala configuración dentro de mi navegador (que es improbable porque no suelo mover nada).


Espero su ayuda y de antemano muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de ScriptShow
Val: 2.019
Plata
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

No funciona scrollIntoView, funciona de manera inesperada.

Publicado por ScriptShow (692 intervenciones) el 17/12/2022 01:18:11
Saludos Albert,

es mínimo el cambio que precisa para funcionar. Prueba a ver...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<nav class="main-nav">
<a href="#uno">UNO</a>
<a href="#dos">DOS</a>
<a href="#tres">TRES</a>
<a href="#cuatro">CUATRO</a>
</nav>
 
<div id="uno">
<h2>Sección UNO</h2>
</div>
 
<div id="dos">
<h2>Sección DOS</h2>
</div>
 
<div id="tres">
<h2>Sección TRES</h2>
</div>
 
<div id="cuatro">
<h2>Sección CUATRO</h2>
</div>
 
<style>
div {
min-height: 100vh;
}
</style>
 
<script>
const enlaces = document.querySelectorAll('.main-nav a');
 
enlaces.forEach( link => {
link.addEventListener("click", function(e) {
// prevenimos el comportamiento por defecto del <a>
e.preventDefault();
// guardamos el valor del elemento selecionado: "#uno", "#dos"...
const seccionScroll = e.target.attributes.href.value;
// apuntamos al elemento al que nos queremos desplazar
const target = document.querySelector(seccionScroll);
// aplicamos la función para dezplasarnos al elemento seleccionado
target.scrollIntoView({ behavior: "smooth"});
});
 
});
</script>

Eapero sea útil.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Albert J.

No funciona scrollIntoView, funciona de manera inesperada.

Publicado por Albert J. (3 intervenciones) el 17/12/2022 07:14:10
Hola ScriptShow.

Gracias por apoyar. Revisé el cambio que le hiciste, pero no funcionó. ¿Solo agregaste el style verdad? Si tengo un css que tiene los estilos de los divs, algo similar a lo que me compartiste, es solo para darles un alto a los divs.

El caso es que no me funcionó. Gracias por el aporte. ¿Me podrías indicar si hiciste algo mas que yo no haya notado?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de ScriptShow
Val: 2.019
Plata
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

No funciona scrollIntoView, funciona de manera inesperada.

Publicado por ScriptShow (692 intervenciones) el 17/12/2022 21:45:38
Hola Albert,

está probado y funciona sin problema. Es un ejemplo para ponerle y/o quitarle experimentando desde tu script.
Es poco aconsejable utilizar códigos que no se entienden bien. Mejor partir de una base e ir adaptando y aprendiendo.

Gracias por el comentario.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Albert J.

SOLUCION - RESUELTO

Publicado por Albert J. (3 intervenciones) el 17/12/2022 08:00:49
Encontré la solución y no fue lo que yo pensaba.

Buscaba mas ejemplos de la función para seguir estudiándola y quizá entenderla mejor y encontrar el error.

En una de esas páginas que contenía un ejemplo y explicación detallada de la función (scrollIntoView) y me aparecía lo siguiente:

"disabled due to prefers-reduced-motion in your system settings"



Resulta que había olvidado que tenía deshabilitadas las animaciones de mi sistema (según yo por rendimiento), no sabía que al deshabilitar esas animaciones también quitan las animaciones de los navegadores.

Uso Windows 11.

¿Alguien conoce algún articulo sobre el tema, sobre cómo afecta el rendimiento de javascript?
Porque las animaciones css las corre sin problema.


Prueben desactivando las animaciones de su sistema y visiten la pagina:
link de la pagina: https://jonaskuske.github.io/smoothscroll-anchor-polyfill/#start
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de ScriptShow
Val: 2.019
Plata
Ha mantenido su posición en JavaScript (en relación al último mes)
Gráfica de JavaScript

SOLUCION - RESUELTO

Publicado por ScriptShow (692 intervenciones) el 17/12/2022 21:31:09
Saludos,

si lo que quieres son ejemplos en CSS Nativo, sin dependencias de terceros, etc., vamos a ello...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html>
<head>
<meta name="encoding" content="UTF-8">
<meta name="viewport" content="width=device-width">
<title>CSS Smooth Scroll + Reveal</title>
<style type="text/css">
/*
// ====================================
// ScriptShow Web © 2000 - 2020
// Experiments by 2K code © 2000 - 2020
// ====================================
*/
 
html, body {
margin: 0px;
padding: 0px;
height: 100%;
color: #000000;
font: normal 18px/1.8 sans-serif;
scroll-behavior: smooth;
}
.block {
width: 100%;
height: 100%;
position: relative;
background-attachment: fixed;
}
#box1 { background-color: rgba(255,000,000,0.4); }
#box2 { background-color: rgba(000,000,255,0.4); }
#box3 { background-color: rgba(255,255,000,0.4); }
#box4 { background-color: rgba(000,255,255,0.4); }
.tab {
margin: 48px 24px;
position: fixed;
color: #FFFFFF;
z-index: 4444;
}
div:target {
top: 0px;
position: relative;
}
</style>
</head>
<body>
<div class="tab">
<a href="#box1">Link 1</a><br>
<a href="#box2">Link 2</a><br>
<a href="#box3">Link 3</a><br>
<a href="#box4">Link 4</a><br>
</div>
<div class="block" id="box1">Test 01</div>
<div class="block" id="box2">Test 02</div>
<div class="block" id="box3">Test 03</div>
<div class="block" id="box4">Test 04</div>
</body>
</html>

P.D.: Incluye un efecto Reveal que se apreciaría en caso de poner una imágen de fondo en cada bloque.

Espero sea útil.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar