mirror of
https://github.com/cotes2020/jekyll-theme-chirpy.git
synced 2025-12-19 06:06:54 +00:00
refactor(core): optimize image loading
- JavaScript runs so fast that LQIP will never be detected - Increase the running priority of image processing in posts Enhancement for #1267
This commit is contained in:
@@ -2,30 +2,60 @@
|
||||
* Setting up image lazy loading and LQIP switching
|
||||
*/
|
||||
|
||||
const ATTR_DATA_SRC = 'data-src';
|
||||
const ATTR_DATA_LQIP = 'data-lqip';
|
||||
const C_SHIMMER = 'shimmer';
|
||||
const C_BLUR = 'blur';
|
||||
|
||||
function handleImage() {
|
||||
const $img = $(this);
|
||||
|
||||
if (this.hasAttribute(ATTR_DATA_LQIP) && this.complete) {
|
||||
$img.parent().removeClass(C_BLUR);
|
||||
} else {
|
||||
$img.parent().removeClass(C_SHIMMER);
|
||||
}
|
||||
}
|
||||
|
||||
/* Switch LQIP with real image url */
|
||||
function switchLQIP(img) {
|
||||
// Sometimes loaded from cache without 'data-src'
|
||||
if (img.hasAttribute(ATTR_DATA_SRC)) {
|
||||
const $img = $(img);
|
||||
const dataSrc = $img.attr(ATTR_DATA_SRC);
|
||||
$img.attr('src', encodeURI(dataSrc));
|
||||
}
|
||||
}
|
||||
|
||||
export function loadImg() {
|
||||
const $images = $('main img[loading="lazy"]');
|
||||
const $lqip = $('main img[data-lqip="true"]');
|
||||
const $images = $('article img');
|
||||
|
||||
if ($images.length > 0) {
|
||||
$images.on('load', function () {
|
||||
/* Stop shimmer when image loaded */
|
||||
$(this).parent().removeClass('shimmer');
|
||||
});
|
||||
if ($images.length) {
|
||||
$images.on('load', handleImage);
|
||||
}
|
||||
|
||||
$images.each(function () {
|
||||
/* Images loaded from the browser cache do not trigger the 'load' event */
|
||||
if ($(this).prop('complete')) {
|
||||
$(this).parent().removeClass('shimmer');
|
||||
/* Images loaded from the browser cache do not trigger the 'load' event */
|
||||
$('article img[loading="lazy"]').each(function () {
|
||||
if (this.complete) {
|
||||
$(this).parent().removeClass(C_SHIMMER);
|
||||
}
|
||||
});
|
||||
|
||||
const $lqips = $(`article img[${ATTR_DATA_LQIP}="true"]`);
|
||||
|
||||
if ($lqips.length) {
|
||||
const isHome = $('#post-list').length > 0;
|
||||
|
||||
$lqips.each(function () {
|
||||
if (isHome) {
|
||||
// JavaScript runs so fast that LQIPs in home page will never be detected
|
||||
// Delay 50ms to ensure LQIPs visibility
|
||||
setTimeout(() => {
|
||||
switchLQIP(this);
|
||||
}, 50);
|
||||
} else {
|
||||
switchLQIP(this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if ($lqip.length > 0) {
|
||||
$lqip.each(function () {
|
||||
/* Switch LQIP with real image url */
|
||||
const dataSrc = $(this).attr('data-src');
|
||||
$(this).attr('src', encodeURI(dataSrc));
|
||||
$(this).removeAttr('data-src data-lqip');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user