Temmuz 10, 2025

/

Prevent layout shift caused by image loading

Görseller ilk render işleminden sonra yüklendiğinde, genellikle layout shift’e (içeriğin beklenmedik şekilde kayması) neden olurlar ve bu da kullanıcı deneyimine zarar verir. Bu yazıda, görsel içeren popup örneği üzerinde basit ve etkili bir yaklaşımla nasıl çözdüğümüzü adım adım inceleyeceğiz.

Problem

Videoda göreceğiniz üzere Size guide butonuna tıklandığında açılan popup, görselin yüklenmesi zaman aldığı için beklenmedik şekilde kayar.

Popup’ın yüklenmesi kasıtlı olarak geciktirilmiştir.

Solve

Sorunu çözmek için aşağıdaki adımları izliyoruz:

1. Track image loading state

Görselin yüklenip yüklenmediğini takip etmek için state kullanıyoruz:

Terminal window
const [imageLoaded, setImageLoaded] = React.useState(false);
const handleLoadImage = () => {
setImageLoaded(true);
};

Bu state, görselin onLoad event’i tetiklendiğinde güncellenir.

2. Conditionally show the popup based on load state

Görsel yüklendiğinde koşullu olarak bir CSS sınıfı uygulanır:

Terminal window
<Popup
show={showChartPopup}
onClose={() => setShowChartPopup(false)}
className={classNames("chart-popup", {
"chart-popup-loaded": imageLoaded,
})}
>

Popup’ın ne zaman görünür hale geleceğini, görselin tamamen yüklenip yüklenmediğine göre kontrol etmemizi sağlar.

3. Use CSS to control visibility

.chart-popup varsayılan olarak gizlenir ve yalnızca görsel yüklendiğinde gösterilir:

Terminal window
.chart-popup {
display: none;
}
.chart-popup-loaded {
display: block;
}

Böylece görsel hazır olana kadar herhangi bir içeriğin görüntülenmesini engeller.

4. Full Code

Komponent kodunun son hali aşağıdaki gibi olacaktır:

Terminal window
import React, { type FC } from "react";
import { Popup } from "ui-kit";
import classNames from "classnames";
export const SizeChartPopup = (sizeChartUrl: string) => {
const [showChartPopup, setShowChartPopup] = React.useState(false);
const [imageLoaded, setImageLoaded] = React.useState(false);
const handleLoadImage = () => {
setImageLoaded(true);
};
return (
<>
<button onClick={() => setShowChartPopup(true)}>
Size guide
</button>
<Popup
show={showChartPopup}
onClose={() => setShowChartPopup(false)}
className={classNames("chart-popup", {
"chart-popup-loaded": imageLoaded,
})}
>
<img
src={sizeChartUrl}
alt="Product size chart"
onLoad={handleLoadImage}
/>
</Popup>
</>
);
};

Result

İşte iyileştirilmiş versiyon; burada popup yalnızca görsel yüklendikten sonra daha stabil bir şekilde görünür:

Conclusion

Görsel yüklemesi, özellikle modal veya popup’larda beklenmedik layout shift’lere yol açabilir. Kodda küçük bir değişiklik olmasına rağmen, bu durumun hissedilen performans üzerinde, özellikle mobil cihazlarda ve yavaş ağlarda önemli bir etkisi vardır.