Уроки

Переизбыток маленьких картинок

Чтобы загрузить файл, браузер тратит время на служебные операции: установка соединения, отправка запроса, получение ответа, закрытие соединения. Это время постоянно и не зависит от скорости интернет соединения. Например, при очень быстром интернет соединении на загрузку содержимого файла уйдёт  1 миллисекунда, а на служебные операции до 100. Время выполнения служебных операций зависит от сетевой задержки — пинга, а не от скорости интернет соединения.

Чтобы ускорить сайт, программисты группируют множество маленьких иконок в один большой файл. Обычно это CSS или HTML файл. Делается это с помощью data url технологии.

Вот примеры data url картинки в формате PNG размером 1 на 1 пиксель.

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P4DwQACfsD/Z8fLAAAAAAASUVORK5CYII=">
.element {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2P4DwQACfsD/Z8fLAAAAAAASUVORK5CYII=)
}

Конвертировать в data url можно любой файл. Сервис для конвертации файлов.

Ниже пример того, как меняется скорость загрузки, если иконки загружать не отдельным файлом, а перенести их в HTML код, как data url.

<?php
$mode = $_GET['mode'] ?? '';
$base64 = 'data:image/png;base64,'.base64_encode(file_get_contents('icon-64.png'));
?><!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            .btn {
                color: #000;
                display: inline-block;
                margin-bottom: 5px;
                text-decoration: none;
                padding: 5px 10px;
                border: 1px solid #000;
                border-radius: 5px;
            }
            .btn:hover {
                background-color: #ddd;
            }
            .btn.active {
                background-color: #000;
                color: #fff;
            }

        </style>
        <script>
            window.addEventListener("load", (event) => {
                document.querySelector('#page-load').innerHTML = 'Страница загрузилась (событие window.onload) за <b>'+(performance.now()/1000)+'с</b>.';
            });
        </script>
    </head>
    <body style="font-family: sans-serif;">
        Режим: <a class="btn <?=$mode === '' ? 'active' : ''?>" href="./icons_count.php">Иконки файлами</a> <a class="btn <?=$mode === '64' ? 'active' : ''?>" href="./icons_count.php?mode=64">Иконки base64</a>
        <br />
        <p>На странице 100 иконок.</p>
        <p id="page-load">Тут отобразится время загрузки страницы (вызова события window.onload)</p>
<?php for($i = 0; $i < 100;++$i) { ?>
        <img src="<?=$mode === '64' ? $base64 : './icon-64.png?t='.microtime(true).'.'.$i ?>" />
<?php } ?>
    </body>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <style>
            .btn {
                color: #000;
                display: inline-block;
                margin-bottom: 5px;
                text-decoration: none;
                padding: 5px 10px;
                border: 1px solid #000;
                border-radius: 5px;
            }
            .btn:hover {
                background-color: #ddd;
            }
            .btn.active {
                background-color: #000;
                color: #fff;
            }

        </style>
        <script>
            window.addEventListener("load", (event) => {
                document.querySelector('#page-load').innerHTML = 'Страница загрузилась (событие window.onload) за <b>'+(performance.now()/1000)+'с</b>.';
            });
        </script>
    </head>
    <body style="font-family: sans-serif;">
        Режим: <a class="btn active" href="./icons_count.php">Иконки файлами</a> <a class="btn " href="./icons_count.php?mode=64">Иконки base64</a>
        <br />
        <p>На странице 100 иконок.</p>
        <p id="page-load">Тут отобразится время загрузки страницы (вызова события window.onload)</p>
        <img src="./icon-64.png?t=1772916254.6354.0" />
        <img src="./icon-64.png?t=1772916254.6354.1" />
        <img src="./icon-64.png?t=1772916254.6355.2" />
        <img src="./icon-64.png?t=1772916254.6355.3" />
        <img src="./icon-64.png?t=1772916254.6355.4" />
        <img src="./icon-64.png?t=1772916254.6355.5" />
        <img src="./icon-64.png?t=1772916254.6355.6" />
        <img src="./icon-64.png?t=1772916254.6355.7" />
        <img src="./icon-64.png?t=1772916254.6355.8" />
        <img src="./icon-64.png?t=1772916254.6355.9" />
        <img src="./icon-64.png?t=1772916254.6355.10" />
        <img src="./icon-64.png?t=1772916254.6355.11" />
        <img src="./icon-64.png?t=1772916254.6355.12" />
        <img src="./icon-64.png?t=1772916254.6355.13" />
        <img src="./icon-64.png?t=1772916254.6355.14" />
        <img src="./icon-64.png?t=1772916254.6355.15" />
        <img src="./icon-64.png?t=1772916254.6355.16" />
        <img src="./icon-64.png?t=1772916254.6355.17" />
        <img src="./icon-64.png?t=1772916254.6355.18" />
        <img src="./icon-64.png?t=1772916254.6355.19" />
        <img src="./icon-64.png?t=1772916254.6355.20" />
        <img src="./icon-64.png?t=1772916254.6355.21" />
        <img src="./icon-64.png?t=1772916254.6355.22" />
        <img src="./icon-64.png?t=1772916254.6355.23" />
        <img src="./icon-64.png?t=1772916254.6355.24" />
        <img src="./icon-64.png?t=1772916254.6355.25" />
        <img src="./icon-64.png?t=1772916254.6355.26" />
        <img src="./icon-64.png?t=1772916254.6355.27" />
        <img src="./icon-64.png?t=1772916254.6355.28" />
        <img src="./icon-64.png?t=1772916254.6355.29" />
        <img src="./icon-64.png?t=1772916254.6355.30" />
        <img src="./icon-64.png?t=1772916254.6355.31" />
        <img src="./icon-64.png?t=1772916254.6355.32" />
        <img src="./icon-64.png?t=1772916254.6355.33" />
        <img src="./icon-64.png?t=1772916254.6355.34" />
        <img src="./icon-64.png?t=1772916254.6355.35" />
        <img src="./icon-64.png?t=1772916254.6355.36" />
        <img src="./icon-64.png?t=1772916254.6355.37" />
        <img src="./icon-64.png?t=1772916254.6355.38" />
        <img src="./icon-64.png?t=1772916254.6355.39" />
        <img src="./icon-64.png?t=1772916254.6355.40" />
        <img src="./icon-64.png?t=1772916254.6355.41" />
        <img src="./icon-64.png?t=1772916254.6355.42" />
        <img src="./icon-64.png?t=1772916254.6355.43" />
        <img src="./icon-64.png?t=1772916254.6355.44" />
        <img src="./icon-64.png?t=1772916254.6355.45" />
        <img src="./icon-64.png?t=1772916254.6355.46" />
        <img src="./icon-64.png?t=1772916254.6355.47" />
        <img src="./icon-64.png?t=1772916254.6355.48" />
        <img src="./icon-64.png?t=1772916254.6355.49" />
        <img src="./icon-64.png?t=1772916254.6355.50" />
        <img src="./icon-64.png?t=1772916254.6355.51" />
        <img src="./icon-64.png?t=1772916254.6355.52" />
        <img src="./icon-64.png?t=1772916254.6355.53" />
        <img src="./icon-64.png?t=1772916254.6355.54" />
        <img src="./icon-64.png?t=1772916254.6355.55" />
        <img src="./icon-64.png?t=1772916254.6355.56" />
        <img src="./icon-64.png?t=1772916254.6355.57" />
        <img src="./icon-64.png?t=1772916254.6355.58" />
        <img src="./icon-64.png?t=1772916254.6355.59" />
        <img src="./icon-64.png?t=1772916254.6355.60" />
        <img src="./icon-64.png?t=1772916254.6355.61" />
        <img src="./icon-64.png?t=1772916254.6355.62" />
        <img src="./icon-64.png?t=1772916254.6355.63" />
        <img src="./icon-64.png?t=1772916254.6355.64" />
        <img src="./icon-64.png?t=1772916254.6355.65" />
        <img src="./icon-64.png?t=1772916254.6355.66" />
        <img src="./icon-64.png?t=1772916254.6355.67" />
        <img src="./icon-64.png?t=1772916254.6355.68" />
        <img src="./icon-64.png?t=1772916254.6355.69" />
        <img src="./icon-64.png?t=1772916254.6355.70" />
        <img src="./icon-64.png?t=1772916254.6355.71" />
        <img src="./icon-64.png?t=1772916254.6355.72" />
        <img src="./icon-64.png?t=1772916254.6355.73" />
        <img src="./icon-64.png?t=1772916254.6355.74" />
        <img src="./icon-64.png?t=1772916254.6355.75" />
        <img src="./icon-64.png?t=1772916254.6355.76" />
        <img src="./icon-64.png?t=1772916254.6355.77" />
        <img src="./icon-64.png?t=1772916254.6355.78" />
        <img src="./icon-64.png?t=1772916254.6355.79" />
        <img src="./icon-64.png?t=1772916254.6355.80" />
        <img src="./icon-64.png?t=1772916254.6355.81" />
        <img src="./icon-64.png?t=1772916254.6355.82" />
        <img src="./icon-64.png?t=1772916254.6355.83" />
        <img src="./icon-64.png?t=1772916254.6355.84" />
        <img src="./icon-64.png?t=1772916254.6355.85" />
        <img src="./icon-64.png?t=1772916254.6355.86" />
        <img src="./icon-64.png?t=1772916254.6355.87" />
        <img src="./icon-64.png?t=1772916254.6355.88" />
        <img src="./icon-64.png?t=1772916254.6355.89" />
        <img src="./icon-64.png?t=1772916254.6355.90" />
        <img src="./icon-64.png?t=1772916254.6355.91" />
        <img src="./icon-64.png?t=1772916254.6355.92" />
        <img src="./icon-64.png?t=1772916254.6355.93" />
        <img src="./icon-64.png?t=1772916254.6355.94" />
        <img src="./icon-64.png?t=1772916254.6355.95" />
        <img src="./icon-64.png?t=1772916254.6355.96" />
        <img src="./icon-64.png?t=1772916254.6355.97" />
        <img src="./icon-64.png?t=1772916254.6355.98" />
        <img src="./icon-64.png?t=1772916254.6355.99" />
    </body>
</html>

ПРО подписка для работы с сервисом

Промо
Проверка 50 страниц в инструменте «Проверка страницы»
190 ₽
Подписка активируется на 10 дней и привязана к определённому сайту.
ПРО подписка
3500 страниц в неделю в инструментах «Проверка страницы» и «Полное сканирование сайта».
1 580 ₽
Подписка активируется на 30 дней и можно сканировать любой сайт.
Кошелёк
Дополнительные страницы, зачисляющиеся на отдельный баланс. Для проверки крупных сайтов.
200 ₽
Количество страниц
Требуется активная ПРО подписка.
Мы используем cookie. Продолжая пользоваться сайтом, вы соглашаетесь на обработку персональных данных в соответствии с политикой конфиденциальности. Соглашаюсь