Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

173
Vistas
Change element's height on top without scroll jump

I have a list with 100 elements. Elements' height is fixed, e.g. 100px. But one element is 300px.

Looks like this:

===
Element 1
===
===
.
Element 2 (the big one)
.
===
===
Element 3
===
===
Element 4
===
...etc...

When we scroll down (for example, we scrolled to the "Element 40"), our 2nd Element's height decreases to 100px, like the others. I'm doing it via React.

The problem is, there's a jump in Safari iOS. Top elements' height reduces, and all elements are shifting up. Other browsers work well.

How can I avoid it?

If I use window.scrollTo(...) after the element collapsed, I also see a jump, because touchscroll goes smoothly.

const Block = ({ height, text }) => {
  return <div className="block" style={{ height: `${height}px` }}>{text}</div>
};


const App = () => {

  // set 2nd element as a big one
  const [bigElementIndex, setBigElementIndex] = React.useState(1);
  
  React.useEffect(()=>{
    document.addEventListener("scroll", handleScroll);
  }, [])

  const list = [ ...Array(100) ].map((_, i) => {
    const height = i === bigElementIndex ? 300 : 100;
    return <Block key={i} height={height} text={`Block ${i}`} />;
  });
  
  const handleScroll = e => {
    // when we scroll enough, make element smaller
    if ( window.scrollY > 2000 ) {
      setBigElementIndex(null);
    }
  }

  return (
    <div className="container">{list}</div>
  )

};

ReactDOM.render(<App />, document.getElementById("root"));
.block {
  padding: 20px;
  background-color: #ccc;
  margin-bottom: 5px;
  border: 1px solid #666;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.14.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.14.0/umd/react-dom.production.min.js"></script>

<div id="root"></div>

about 4 years ago · Juan Pablo Isaza
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda