Lessons

An overabundance of small pictures

To download a file, the browser spends time on service operations: establishing a connection, sending a request, receiving a response, closing a connection. This time is constant and does not depend on the speed of the Internet connection. For example, with a very fast Internet connection, it will take 1 millisecond to download the contents of the file, and up to 100 for service operations. The execution time of service operations depends on the network latency — ping, and not on the speed of the Internet connection.

To speed up the site, programmers group many small icons into one large file. This is usually a CSS or HTML file. This is done using data url technology.

Here are examples of the data url of a 1-by-1 pixel PNG image.

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

You can convert any file to data url. [Conversion service](https://datauri.ai /) files.

Below is an example of how the download speed changes if the icons are not uploaded as a separate file, but transferred to HTML code as a data url.

Demonstration
PHP code
HTML code
<?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=1780780080.4391.0" />
        <img src="./icon-64.png?t=1780780080.4391.1" />
        <img src="./icon-64.png?t=1780780080.4391.2" />
        <img src="./icon-64.png?t=1780780080.4391.3" />
        <img src="./icon-64.png?t=1780780080.4391.4" />
        <img src="./icon-64.png?t=1780780080.4391.5" />
        <img src="./icon-64.png?t=1780780080.4391.6" />
        <img src="./icon-64.png?t=1780780080.4392.7" />
        <img src="./icon-64.png?t=1780780080.4392.8" />
        <img src="./icon-64.png?t=1780780080.4392.9" />
        <img src="./icon-64.png?t=1780780080.4392.10" />
        <img src="./icon-64.png?t=1780780080.4392.11" />
        <img src="./icon-64.png?t=1780780080.4392.12" />
        <img src="./icon-64.png?t=1780780080.4392.13" />
        <img src="./icon-64.png?t=1780780080.4392.14" />
        <img src="./icon-64.png?t=1780780080.4392.15" />
        <img src="./icon-64.png?t=1780780080.4392.16" />
        <img src="./icon-64.png?t=1780780080.4392.17" />
        <img src="./icon-64.png?t=1780780080.4392.18" />
        <img src="./icon-64.png?t=1780780080.4392.19" />
        <img src="./icon-64.png?t=1780780080.4392.20" />
        <img src="./icon-64.png?t=1780780080.4392.21" />
        <img src="./icon-64.png?t=1780780080.4392.22" />
        <img src="./icon-64.png?t=1780780080.4392.23" />
        <img src="./icon-64.png?t=1780780080.4392.24" />
        <img src="./icon-64.png?t=1780780080.4392.25" />
        <img src="./icon-64.png?t=1780780080.4392.26" />
        <img src="./icon-64.png?t=1780780080.4392.27" />
        <img src="./icon-64.png?t=1780780080.4392.28" />
        <img src="./icon-64.png?t=1780780080.4392.29" />
        <img src="./icon-64.png?t=1780780080.4392.30" />
        <img src="./icon-64.png?t=1780780080.4392.31" />
        <img src="./icon-64.png?t=1780780080.4392.32" />
        <img src="./icon-64.png?t=1780780080.4392.33" />
        <img src="./icon-64.png?t=1780780080.4392.34" />
        <img src="./icon-64.png?t=1780780080.4392.35" />
        <img src="./icon-64.png?t=1780780080.4392.36" />
        <img src="./icon-64.png?t=1780780080.4392.37" />
        <img src="./icon-64.png?t=1780780080.4392.38" />
        <img src="./icon-64.png?t=1780780080.4392.39" />
        <img src="./icon-64.png?t=1780780080.4392.40" />
        <img src="./icon-64.png?t=1780780080.4392.41" />
        <img src="./icon-64.png?t=1780780080.4392.42" />
        <img src="./icon-64.png?t=1780780080.4392.43" />
        <img src="./icon-64.png?t=1780780080.4392.44" />
        <img src="./icon-64.png?t=1780780080.4392.45" />
        <img src="./icon-64.png?t=1780780080.4392.46" />
        <img src="./icon-64.png?t=1780780080.4392.47" />
        <img src="./icon-64.png?t=1780780080.4392.48" />
        <img src="./icon-64.png?t=1780780080.4392.49" />
        <img src="./icon-64.png?t=1780780080.4392.50" />
        <img src="./icon-64.png?t=1780780080.4392.51" />
        <img src="./icon-64.png?t=1780780080.4392.52" />
        <img src="./icon-64.png?t=1780780080.4392.53" />
        <img src="./icon-64.png?t=1780780080.4392.54" />
        <img src="./icon-64.png?t=1780780080.4392.55" />
        <img src="./icon-64.png?t=1780780080.4392.56" />
        <img src="./icon-64.png?t=1780780080.4392.57" />
        <img src="./icon-64.png?t=1780780080.4392.58" />
        <img src="./icon-64.png?t=1780780080.4392.59" />
        <img src="./icon-64.png?t=1780780080.4392.60" />
        <img src="./icon-64.png?t=1780780080.4392.61" />
        <img src="./icon-64.png?t=1780780080.4392.62" />
        <img src="./icon-64.png?t=1780780080.4392.63" />
        <img src="./icon-64.png?t=1780780080.4392.64" />
        <img src="./icon-64.png?t=1780780080.4392.65" />
        <img src="./icon-64.png?t=1780780080.4392.66" />
        <img src="./icon-64.png?t=1780780080.4392.67" />
        <img src="./icon-64.png?t=1780780080.4392.68" />
        <img src="./icon-64.png?t=1780780080.4392.69" />
        <img src="./icon-64.png?t=1780780080.4392.70" />
        <img src="./icon-64.png?t=1780780080.4392.71" />
        <img src="./icon-64.png?t=1780780080.4392.72" />
        <img src="./icon-64.png?t=1780780080.4392.73" />
        <img src="./icon-64.png?t=1780780080.4392.74" />
        <img src="./icon-64.png?t=1780780080.4392.75" />
        <img src="./icon-64.png?t=1780780080.4392.76" />
        <img src="./icon-64.png?t=1780780080.4392.77" />
        <img src="./icon-64.png?t=1780780080.4392.78" />
        <img src="./icon-64.png?t=1780780080.4392.79" />
        <img src="./icon-64.png?t=1780780080.4392.80" />
        <img src="./icon-64.png?t=1780780080.4392.81" />
        <img src="./icon-64.png?t=1780780080.4392.82" />
        <img src="./icon-64.png?t=1780780080.4392.83" />
        <img src="./icon-64.png?t=1780780080.4392.84" />
        <img src="./icon-64.png?t=1780780080.4392.85" />
        <img src="./icon-64.png?t=1780780080.4392.86" />
        <img src="./icon-64.png?t=1780780080.4392.87" />
        <img src="./icon-64.png?t=1780780080.4392.88" />
        <img src="./icon-64.png?t=1780780080.4392.89" />
        <img src="./icon-64.png?t=1780780080.4392.90" />
        <img src="./icon-64.png?t=1780780080.4392.91" />
        <img src="./icon-64.png?t=1780780080.4392.92" />
        <img src="./icon-64.png?t=1780780080.4392.93" />
        <img src="./icon-64.png?t=1780780080.4392.94" />
        <img src="./icon-64.png?t=1780780080.4392.95" />
        <img src="./icon-64.png?t=1780780080.4392.96" />
        <img src="./icon-64.png?t=1780780080.4392.97" />
        <img src="./icon-64.png?t=1780780080.4392.98" />
        <img src="./icon-64.png?t=1780780080.4392.99" />
    </body>
</html>

Tariff plans for working with the service

We use cookies. By continuing to use the site, you agree to the processing of personal data in accordance with privacy policy. I agree