
В этом тренажере вы попрактикуетесь в реализации ленивой загрузки изображений (lazy loading) с использованием JavaScript и HTML. Ленивая загрузка позволяет отложить загрузку изображений, которые находятся за пределами видимой области экрана, до тех пор, пока пользователь не прокрутит страницу до них. Это значительно ускоряет начальную загрузку страницы и экономит трафик. Вам предстоит работать с Intersection Observer API, атрибутами `data-src` и стандартными атрибутами изображений. Задания охватывают различные аспекты ленивой загрузки, от базовой реализации до обработки ошибок и добавления эффектов.
- Модуль 1: Основы выбора элементов
- Выбор элемента по ID.
- Выбор элементов по классу.
- Выбор элементов по тегу.
- Выбор по селектору CSS.
- Выбор по атрибуту.
- Поиск элементов внутри другого элемента.
- Поиск родительского элемента.
- Поиск соседних элементов (предыдущий, следующий).
- Поиск первого и последнего дочернего элемента.
- Поиск всех дочерних элементов.
- Модуль 2: Манипуляция содержимым
- Модуль 3: Работа с атрибутами
- Модуль 4: Управление классами
- Модуль 5: Управление стилями
- Модуль 6: Создание и удаление элементов
- Создание нового элемента.
- Вставка элемента перед другим элементом.
- Вставка элемента после другого элемента.
- Добавление элемента в определенную позицию внутри списка дочерних элементов.
- Удаление элемента из DOM.
- Замена одного элемента другим.
- Перемещение существующего элемента в другое место DOM..
- Очистка содержимого элемента без его удаления.
- Модуль 7: Обработка событий
- Модуль 8: Работа с формами
- Модуль 9: Продвинутые манипуляции
- Модуль 10: Работа с размерами и прокруткой
- Получение размеров элемента.
- Получение позиции элемента относительно окна браузера.
- Получение позиции элемента относительно родительского элемента.
- Управление прокруткой страницы.
- Определение, виден ли элемент в текущей области просмотра.
- Плавная прокрутка к элементу.
- Создание элемента, который фиксируется при прокрутке.
- Модуль 11: Работа с медиа-элементами
- Модуль 12: Практические задания
Базовая ленивая загрузка
Реализуйте простейшую ленивую загрузку для одного изображения. Вам дан HTML с изображением, у которого вместо атрибута `src` используется атрибут `data-src` с URL изображения. Ваша задача - написать JavaScript код, который при загрузке страницы заменит `data-src` на `src`, тем самым инициируя загрузку изображения.
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike2-300x300.png" alt="Image 1">
document.addEventListener('DOMContentLoaded', function() {
const img = document.input__1('img');
img.input__2('src', img.input__3('data-src'));
});
Ленивая загрузка с Intersection Observer
Используйте Intersection Observer API для отслеживания появления изображений в области видимости. Вам дан HTML с несколькими изображениями, у которых есть атрибут `data-src`. Напишите JavaScript код, который будет наблюдать за появлением изображений в области видимости и загружать их, меняя `data-src` на `src`.
body { height:200px;}
img { display: block; margin-bottom: 20px; width: 300px; height: 300px; }
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike2-300x300.png" alt="Image 1">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike-300x300.png" alt="Image 2">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike3-300x300.png" alt="Image 3">
document.addEventListener('DOMContentLoaded', function() {
const images = document.querySelectorAll('img');
const observer = new input__1((entries, observer) => {
entries.forEach(entry => {
if (input__2) {
const img = entry.target;
img.src = img.dataset.src;
input__3.unobserve(img);
}
});
});
images.forEach(image => {
observer.input__4(image);
});
});
Добавление placeholder
Добавьте placeholder (заполнитель) для изображений на время, пока они загружаются. Placeholder может быть, например, одноцветным фоном или полупрозрачным изображением. Измените JavaScript код из предыдущего задания так, чтобы перед загрузкой изображения отображался placeholder.
body { height:200px;}
img { display: block; margin-bottom: 20px; width: 300px; height: 300px; background-color: #f0f0f0; /* Placeholder background */ }
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike2-300x300.png" alt="Image 1">
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike-300x300.png" alt="Image 2">
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike3-300x300.png" alt="Image 3">
document.addEventListener('DOMContentLoaded', function() {
const images = document.querySelectorAll('img');
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.onload = () => {
input__1;
}
observer.unobserve(img);
}
});
});
images.forEach(image => {
observer.observe(image);
});
});
Обработка ошибок загрузки
Добавьте обработку ошибок при загрузке изображений. Если изображение не загрузилось, покажите вместо него другое изображение или сообщение об ошибке.
body { height:200px;}
img { display: block; margin-bottom: 20px; width: 300px; height: 300px; }
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike2-300x300.png" alt="Image 1">
<img data-src="https://invalid-url.com/image.png" alt="Image 2">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike3-300x300.png" alt="Image 3">
document.addEventListener('DOMContentLoaded', function() {
const images = document.querySelectorAll('img');
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.onerror = () => {
img.input__1 = "https://naytikurs.ru/assets/uploads/2025/03/naskolko-vas-legko-obmanut-v-internete-300x300.png"; // Запасное изображение
};
observer.unobserve(img);
}
});
});
images.forEach(image => {
observer.observe(image);
});
});
Плавное появление изображений
Добавьте эффект плавного появления (fade-in) для изображений после их загрузки. Используйте CSS-анимацию или переходы (transitions).
body { height:200px;}
img { display: block; margin-bottom: 20px; width: 300px; height: 300px; opacity: 0; transition: opacity 0.5s ease; }
.loaded { opacity: 1; }
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike2-300x300.png" alt="Image 1">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike-300x300.png" alt="Image 2">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike3-300x300.png" alt="Image 3">
document.addEventListener('DOMContentLoaded', function() {
const images = document.querySelectorAll('img');
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
img.onload = () => {
img.classList.input__1('loaded');
};
observer.unobserve(img);
}
});
});
images.forEach(image => {
observer.observe(image);
});
});
Настройка порога Intersection Observer
Измените порог (threshold) Intersection Observer так, чтобы изображения начинали загружаться немного раньше, чем они появятся в области видимости.
body { height:200px;}
img { display: block; margin-bottom: 20px; width: 300px; height: 300px; }
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike2-300x300.png" alt="Image 1">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike-300x300.png" alt="Image 2">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike3-300x300.png" alt="Image 3">
document.addEventListener('DOMContentLoaded', function() {
const images = document.querySelectorAll('img');
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
}, { input__1: 0.2 });
images.forEach(image => {
observer.observe(image);
});
});
Использование нескольких порогов
Задайте несколько пороговых значений для Intersection Observer, чтобы отслеживать различные степени видимости изображения.
body { height:200px;}
img { display: block; margin-bottom: 20px; width: 300px; height: 300px; }
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike2-300x300.png" alt="Image 1">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike-300x300.png" alt="Image 2">
<img data-src="https://naytikurs.ru/assets/uploads/2025/03/3d-modelirovanie-i-vizualizatsiya-test-dlya-spetsialistov-v-trehmernoj-grafike3-300x300.png" alt="Image 3">
document.addEventListener('DOMContentLoaded', function() {
const images = document.querySelectorAll('img');
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
console.log('Видимость:', entry.intersectionRatio);
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img);
}
});
}, { threshold: input__1 });
images.forEach(image => {
observer.observe(image);
});
});