Как я могу предварительно загрузить правильное количество изображений в зависимости от размера экрана?
Я работаю над оптимизацией самой большой Contentful Paint (LCP), но у меня возникают проблемы с предварительной загрузкой правильного количества изображений-кандидатов LCP в зависимости от размера устройства.
Проблема:
- на маленьких экранах одно изображение отображается в виде карусели
- на больших экранах можно показывать до четырех изображений
- Я не могу контролировать размер указанных изображений, что означает, что любой может быть кандидатом LCP.
- загрузка всех четырех изображений на небольшие устройства - бесполезная задача: трата пропускной способности и снижение производительности.
Желаемое решение:
- предварительно загрузить только одно изображение на маленьких экранах
- предварительно загрузить все четыре изображения на большие устройства
Мое первое, хотя и очевидное, использовало эльфы.
media
атрибут, чтобы решить, что загружать; однако все ресурсы все равно загружаются (ссылки 1, 2).
Я не поклонник моего лучшего «решения» для этого: использование
link
с
imagesrcset
+
imagesizes
атрибуты для загрузки первого изображения независимо, а последние изображения размером 1px на 1px на небольших устройствах.
НАПРИМЕР
<link
rel="preload"
as="image"
href="image1"
imagesrcset="image1-small 100w 200h,image1-large 200w 400h"
imagesizes="(max-width: 40em) 100vw, 400px"
>
<link
rel="preload"
as="image"
href="image2"
imagesrcset="image2-tiny 1w 1h, image2-small 100w 200h,image2-large 200w 400h"
imagesizes="(max-width: 40em) 1px, 400px"
>
Явно очень хакерский. Есть ли «правильный» способ сделать это? Я что-то пропустил?
2 ответа
Итак, оказывается, что с помощью
media
атрибут для
link
Эль из
type="image"
действительно работает.
Урок научился всегда проверять то, что читаю :)
Поэтому для решения данной проблемы необходимо выполнить следующие действия:
<link
rel="preload"
as="image"
href="image1"
imagesrcset="image1-small 100w 200h, image1-large 200w 400h"
imagesizes="(max-width: 40em) 100vw, 400px"
>
<link
rel="preload"
as="image"
href="image2"
imagesrcset="image2-small 100w 200h, image2-large 200w 400h"
imagesizes="400px"
media="(min-width: 40em)"
>
Вы пытались изобретать колеса, чтобы создать адаптивную сеточную систему Bootstrap :). Это большое нет-нет. Я предлагаю остаться с толпой и использовать Bootstrap. Вот ответ:
- Загрузите и установите node.js с https://nodejs.org/
- Проверка правильности установки: ⦁ Откройте окно терминала на своем компьютере, введите:
node -v
npm -v
- Затем перейдите в ПАПКУ ВАШЕГО ПРОЕКТА, в окне cmd введите:
npm install
npm install jquery popper.js --save
npm install bootstrap --save
npm init
- В файле index.html вставьте эти коды в:
<!-- Required meta tags always come first -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="node_modules/bootstrap/dist/css/bootstrap.min.css">
- Вставьте в файл index.html непосредственно перед концом тела, то есть непосредственно перед тегом:
<!-- jQuery first, then Popper.js, then Bootstrap JS. -->
<script src="node_modules/jquery/dist/jquery.slim.min.js"></script>
<script src="node_modules/popper.js/dist/umd/popper.min.js"></script>
<script src="node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
Теперь вот ваш код для управления внешним видом изображений на экране разного размера. Я написал его для 1 ряда из 4 изображений. Если более 1 строки, скопируйте и вставьте раздел столько раз, сколько нужно. В строке будет отображаться 4, затем 2, а затем 1 изображение, когда размеры экрана изменяются от компьютера к планшету или мобильному устройству прибл.
<div class="container">
<div class="row">
<div id="img-1" class="col-12 col-sm-6 col-md-3 mb-2">
<img width="100%" src="#"/>
</div>
<div id="img-2" class="col-12 col-sm-6 col-md-3 mb-2">
<img width="100%" src="#"/>
</div>
<div id="img-3" class="col-12 col-sm-6 col-md-3 mb-2">
<img width="100%" src="#"/>
</div>
<div id="img-4" class="col-12 col-sm-6 col-md-3 mb-2">
<img width="100%" src="#"/>
</div>
</div>