vanilla-lazyload
Version:
A fast, lightweight script to load images as they enter the viewport. SEO friendly, it supports responsive images (both srcset + sizes and picture) and progressive JPEG
97 lines (83 loc) • 2.89 kB
JavaScript
import { getData } from "./lazyload.data";
import { supportsWebp } from "./lazyload.environment";
import { replaceExtToWebp } from "./lazyload.webp";
import { purgeOneElement } from "./lazyload.purge";
export const setSourcesInChildren = function(
parentTag,
attrName,
dataAttrName,
toWebpFlag
) {
for (let i = 0, childTag; (childTag = parentTag.children[i]); i += 1) {
if (childTag.tagName === "SOURCE") {
let attrValue = getData(childTag, dataAttrName);
setAttributeIfValue(childTag, attrName, attrValue, toWebpFlag);
}
}
};
export const setAttributeIfValue = function(
element,
attrName,
value,
toWebpFlag
) {
if (!value) {
return;
}
element.setAttribute(attrName, replaceExtToWebp(value, toWebpFlag));
};
export const setSourcesImg = (element, settings) => {
const toWebpFlag = supportsWebp && settings.to_webp;
const srcsetDataName = settings.data_srcset;
const parent = element.parentNode;
if (parent && parent.tagName === "PICTURE") {
setSourcesInChildren(parent, "srcset", srcsetDataName, toWebpFlag);
}
const sizesDataValue = getData(element, settings.data_sizes);
setAttributeIfValue(element, "sizes", sizesDataValue);
const srcsetDataValue = getData(element, srcsetDataName);
setAttributeIfValue(element, "srcset", srcsetDataValue, toWebpFlag);
const srcDataValue = getData(element, settings.data_src);
setAttributeIfValue(element, "src", srcDataValue, toWebpFlag);
};
export const setSourcesIframe = (element, settings) => {
const srcDataValue = getData(element, settings.data_src);
setAttributeIfValue(element, "src", srcDataValue);
};
export const setSourcesVideo = (element, settings) => {
const srcDataName = settings.data_src;
const srcDataValue = getData(element, srcDataName);
setSourcesInChildren(element, "src", srcDataName);
setAttributeIfValue(element, "src", srcDataValue);
element.load();
};
export const setSourcesBgImage = (element, settings) => {
const toWebpFlag = supportsWebp && settings.to_webp;
const srcDataValue = getData(element, settings.data_src);
const bgDataValue = getData(element, settings.data_bg);
if (srcDataValue) {
let setValue = replaceExtToWebp(srcDataValue, toWebpFlag);
element.style.backgroundImage = `url("${setValue}")`;
}
if (bgDataValue) {
let setValue = replaceExtToWebp(bgDataValue, toWebpFlag);
element.style.backgroundImage = setValue;
}
};
const setSourcesFunctions = {
IMG: setSourcesImg,
IFRAME: setSourcesIframe,
VIDEO: setSourcesVideo
};
export const setSources = (element, instance) => {
const settings = instance._settings;
const tagName = element.tagName;
const setSourcesFunction = setSourcesFunctions[tagName];
if (setSourcesFunction) {
setSourcesFunction(element, settings);
instance._updateLoadingCount(1);
instance._elements = purgeOneElement(instance._elements, element);
return;
}
setSourcesBgImage(element, settings);
};