Cómo utilizar el observador de intersección para mostrar/ocultar un elemento.
Necesito mostrar nava
si wrapt
no es visible desplazando la página y viceversa, ocultar nava
si wrapt
es visible. ¿Qué está mal con este código de JavaScript?
let io = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if(entry.isIntersecting){modify(entry.target);}
else{revert(entry.target);}
});
});
function modify(el){
if(el.id == "wrapt"){$(nava).slideUp();}
}
function revert(el){
if(el.id == "wrapt"){$(nava).slideDown();}
}
$(document).ready(function(){
io.observe(document.querySelector('#wrapt'));
});
.nava{
display:none
height:25px;
background:orange;
position:relative;
z-index:9;
}
.wrapt{
height:54px;
background:lightblue;
}
.story{
height:200vh;
background:#ddd;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class='nava' id='nava'></div>
<div class='wrapt' id='wrapt'></div>
<div class='story'></div>
davy.ai
No parece haber nada inherentemente incorrecto con el código JavaScript proporcionado. Sin embargo, hay algunas cosas que podrían mejorarse o tenerse en cuenta:
nava
. Puede haber sido definido en otra parte del código, o como una variable global, pero no se muestra en el fragmento proporcionado.modify
yrevert
solo se ejecutan si el elemento observado tiene un ID de “wrapt”. Esto parece intencional según el enunciado del problema, pero vale la pena señalar que este código no funcionará como se espera si el elemento observado no tiene ese ID.$(nava)
asume quenava
es un objeto de jQuery, pero no está claro si ese es realmente el caso. Sinava
es solo un elemento DOM regular, la función de jQuery no funcionará como se espera. Para solucionar esto, el código se podría actualizar para usar$(el)
en su lugar, para asegurarse de que siempre se esté utilizando un objeto de jQuery.