Jump to content
  • Sign Up
  • 0

Как повлияет на быстродействие создание дополнительных DOM-элементов на странице?


Libiros
 Share

Question

Решил использовать .webp для изображений на сайте, а также оптимизировать его через рекомендации google audits.

Таким образом получилось следующее:

<img src="image.webp" srcset="image-480.webp 480w, image-768.webp 768w, image-1024.webp 1024w" alt="alt" titile="title"/>

Так как webp не поддерживается некоторыми браузерами, было решено использовать решение WebPJS.

Теперь есть следующая проблема: решение заменяет атрибут src, но не трогает srcset. То есть изображения остаются неизменными и не отображаются.

Есть следующая идея, но я, полагаю, это будет очень затратно в плане ресурсов, а также неизвестно, как это будет влиять на SEO (может, спасут теги <nofollow>?).

  1. Распарсить атрибут srcset
  2. Создать столько img-элементов, сколько указано изображений в атрибуте
  3. Зацепить у каждого измененный атрибут src
  4. Составить новый атрибут srcset и заменить его на первом img
  5. Остальные img будут помещены под тег nofollow с классом display:none;

Пока описывал решение, подумал, что, возможно, это плохое решение в том плане, что тогда у меня возрастет количество запросов на сервер как раз на количество новосозданных img-элементов. Но не уверен, так ли это.

Link to comment
Share on other sites

9 answers to this question

Recommended Posts

  • 0
18 минут назад, Libiros сказал:

Но не уверен, так ли это.

Ответьте себе на пару вопросов.

22 минуты назад, Libiros сказал:

Создать столько img-элементов, сколько указано изображений в атрибуте

Происходит ли загрузка изображения пользователю в этом случае?

Что такое nofollow и для чего он предназначен?

Link to comment
Share on other sites

  • 0
1 час назад, AlexZaw сказал:

Ответьте себе на пару вопросов.

Происходит ли загрузка изображения пользователю в этом случае?

Что такое nofollow и для чего он предназначен?

Очевидно, происходит, раз у нас появляется новый dom-элемент с изображением.

nofollow для сокрытия от индексации.

Ваша очередь.

Link to comment
Share on other sites

  • 0
3 минуты назад, Libiros сказал:

Очевидно, происходит, раз у нас появляется новый dom-элемент с изображением.

А раз происходит загрузка то что отправляется на сервер?

4 минуты назад, Libiros сказал:

nofollow для сокрытия от индексации.

Начало хорошее. А что это такое и может ли оно помочь в вашем случае?

Ваша очередь ?

Link to comment
Share on other sites

  • 0
4 минуты назад, AlexZaw сказал:

А раз происходит загрузка то что отправляется на сервер?

Начало хорошее. А что это такое и может ли оно помочь в вашем случае?

Ваша очередь ?

На сервер отправляется запрос.

nofollow сможет не индексировать картинки.

Так что по быстродействию?

Link to comment
Share on other sites

  • 0
3 минуты назад, Libiros сказал:

На сервер отправляется запрос.

Вот и ответ на ваш вопрос. Не так уж и сложно оказалось ? 

3 минуты назад, Libiros сказал:

nofollow сможет не индексировать картинки

Путаете с noindex да и как вы собираетесь индексировать картинки?

13 минут назад, Libiros сказал:

Так что по быстродействию?

Ответ на этот вопрос вытекает из предыдущего. Чем больше запросов к серверу - тем хуже быстродействие. Ну и сайт из-за обилия картинок будет грузиться дольше. 

Link to comment
Share on other sites

  • 0

а вы не думали сделать простецкий скрипт
скажем у вас есть на сервере список webp для разных разрешений
image-480.webp 480w,
image-768.webp 768w
image-1024.webp 1024w
<img src="loading.gif" srcset="image.webp">
дальше скрипт отправляет разрешение и srcset, сервер вам отдает data: данного файла нужного разрешения и вы его вставляете в src соответствующего img.
один запрос - одна нужная картинка, не встроенная в верстку

Link to comment
Share on other sites

  • 0
7 минут назад, Switch74 сказал:

а вы не думали сделать простецкий скрипт
скажем у вас есть на сервере список webp для разных разрешений
image-480.webp 480w,
image-768.webp 768w
image-1024.webp 1024w
<img src="loading.gif" srcset="image.webp">
дальше скрипт отправляет разрешение и srcset, сервер вам отдает data: данного файла нужного разрешения и вы его вставляете в src соответствующего img.
один запрос - одна нужная картинка, не встроенная в верстку

Думал такое, но для WebPJS нужна подгрузка картинки.

 

Вообще получается, что WebPJS делает base64 encode для картинок, если браузер не поддерживает .webp.

Выходит, даже если браузер отдает только одну картинку пользователю, в моей задаче нужно переделать весь srcset! На моем сайте минимум 10 изображений и для каждого по 5 srcset'ов. То есть скрипт должен обработать в base64 50 изображений. Из них 40 не отобразятся, а место я сожру побольше, чем занимают сами картинки, даже путем экономии запросов к серверу.

Отказаться от .webp вообще я тоже не планирую.

Одно из окончательных решений, которые пришли мне в голову - определить заранее, поддерживает ли браузер .webp, и если нет, то отдавать пользователю .jpg. И не использовать разные костыли, типа .webp или кодирования в base64 на уровне сервера в .htaccess.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Similar Content

    • Yurich
      By Yurich
      Всем привет, у меня такой вот вопрос, делаю сайт через react и при изменении расширения что-то идёт не так и какой-то бред получается, подскажите как решить данную проблему. Я вообще не понимаю из-за чего это происходит, по этому не могу нормально объяснить 😅.

    • bromble
      By bromble
      Всем привет!
      Может ли кто-нибудь сказать как реализована такая каруселька у элементов каталога?
      MyVideo_55.mp4
    • IsayR
      By IsayR
      Всем привет! Подскажите, пожалуйста, как правильно сделать раскрывающиеся блоки со скрытым содержанием внутри? У меня в принципе все работает, блок открывается и закрывается, НО если я нажимаю на блок, а не на стрелочку, она у меня остается в таком же положении(а она должна у меня меняться, когда блок открывается), и получается куча мала, и выглядит это не очень презентабельно. Подскажите, пожалуйста!
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="wrapper-div"> <div class="div"> <div class="window-one"> <h3 class="title"> Заголовок 1 </h3> <div class="arrow-test"></div> </div> <div class="window-two"> <div class="text">Текст 1</div> </div> </div> </div> <div class="wrapper-div"> <div class="div"> <div class="window-one"> <h3 class="title"> Заголовок 2 </h3> <div class="arrow-test"></div> </div> <div class="window-two"> <div class="text">Текст 2</div> </div> </div> </div> <div class="wrapper-div"> <div class="div"> <div class="window-one"> <h3 class="title"> Заголовок 3 </h3> <div class="arrow-test"></div> </div> <div class="window-two"> <div class="text">Текст 3</div> </div> </div> </div> .div{ border: 1px solid #3A444E; border-radius: 10px; width: 300px; height: 64px; overflow: hidden; } .div.open { height: auto; background: #000; color: #fff; } .window-one { display: flex; align-items: center; justify-content: space-between; } .title { margin-bottom: 20px; } .arrow-test { content: ''; background: url('http://cdn.onlinewebfonts.com/svg/img_387044.png') no-repeat center center / 100%; width: 30px; height: 30px; cursor: pointer; } .arrow-test.open { content: ''; background: url('https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Eo_circle_yellow_arrow-up.svg/1024px-Eo_circle_yellow_arrow-up.svg.png') no-repeat center center / 100%; width: 30px; height: 30px; cursor: pointer; } $('.div, .arrow-test').click( function(){ $(this).toggleClass('open')});  
    • IsayR
      By IsayR
      Всем привет, подскажите, пожалуйста, как сделать так, чтобы форма открывалась при нажатии на кнопку, которой на странице находится несколько штук? У меня есть кнопка и несколько ее копий на странице, и я хочу, чтобы если пользователь захотел нажать на кнопку, только на другом месте страницы, открывалась та же самая форма. Но, к сожалению, ее открывает, только самая первая кнопка, подскажите, пожалуйста, решение! Спасибо!
      <body> <button class="btn-modal" id="open">Отправить заявку</button> <button class="btn-modal" id="open">Отправить заявку</button> <button class="btn-modal" id="open">Отправить заявку</button> <div class="wrapper-modal" id="wrapperModal"> <div class="overlay-modal" id="overlayModal"></div> <div class="form-modal__item" id="formModal"> <form action="#" id="formModalBody" class="form-modal__body"> <h4 class="form-modal__title"> Оставьте заявку </h4> <span class="close" id="close"> <div class="form-modal__item"> <label for="formName" class="form-modal__label"> Имя: </label> <input id="formName" type="text" name="name" class="form-modal__input" placeholder="Ваше имя *"> </div> <div class="form-modal__item"> <label for="formTel" class="form-modal__label"> Номер телефона: </label> <input id="formTel" type="tel" name="length" class="form-modal__input" placeholder="+7 (___) ___ - __ - __ *"> </div> <div class="form-modal__item"> <label for="formEmail" class="form-modal__label"> Email: </label> <input id="formEmail" type="text" name="width" class="form-modal__input" placeholder="Введите e-mail *"> </div> <button class="form-modal__button" id="open">Отправить</button> </form> </div> </div> </body> #wrapperModal { display: none; position: fixed; width: 100%; height: 100%; z-index: 3; top: 8%; left: 20%; } #wrapperModal.active { display: block; } #overlayModal { position: absolute; top: -8%; left: -20%; width: 100%; height: 100%; z-index: 0; background-color: grey; opacity: 0.5; } .form-modal__body { width: 270px; min-height: 200px; background: #363A4D; border-radius: 20px; padding: 48px 51px 41px 50px; position: relative; } .form-modal__title { font-size: 24px; margin-bottom: 23px; } .close:before, .close:after { position: absolute; content: ' '; right: 28px; top: 16px; height: 18px; width: 2px; background-color: #7E839A; cursor: pointer; border-radius: 5px; } .close:before { transform: rotate(45deg); } .close:after { transform: rotate(-45deg); } .form-modal__label { margin-bottom: 6px; } const btnForm = document.getElementById('open'); const modal = document.getElementById('wrapperModal'); const overlay = document.getElementById('overlayModal'); const close = document.getElementById('close'); btnForm.addEventListener('click', (e) => { e.preventDefault() modal.classList.add('active'); }); const closeModal = () => { modal.classList.remove('active'); } overlay.addEventListener('click',closeModal); close.addEventListener('click',closeModal);  
    • IsayR
      By IsayR
      Всем привет! Подскажите, пожалуйста, как сделать так, чтобы у меня табы переключались с помощью кнопок "Назад" и "Следующая" с js/jquery. Еще, когда я хочу вернуться назад и нажимаю на предыдущую ячейку, ничего не срабатывает, но когда нажимаю следующую, все прекрасно работает. В общем, у меня какой то кривоватый таб:) Подскажите, пожалуйста! 
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div class="tabs"> <div class="tab active"> <div class="tab__content"> <ul class="steps"> <li class="step active">1</li> <li class="step">2</li> <li class="step">3</li> </ul> <h2>Заголовок 1</h2> <p>Текст 1</p> <button class="btnNext">Следующая</button> </div> </div> <div class="tab"> <div class="tab__content"> <ul class="steps"> <li class="step">1</li> <li class="step active">2</li> <li class="step">3</li> </ul> <h2>Заголовок 2</h2> <p>Текст 2</p> <button class="btnNext">Следующая</button> <button class="btnPrev">Назад</button> </div> </div> <div class="tab"> <div class="tab__content"> <ul class="steps"> <li class="step">1</li> <li class="step">2</li> <li class="step active">3</li> </ul> <h2>Заголовок 3</h2> <p>Текст 3</p> </div> </div> </div> ul,li { display: block; cursor: pointer; } .tabs { margin: 50px; } .steps { display: flex; position: absolute; top: 0px; left: 35px; } .step { display: flex; margin-right: 15px; font-size: 15px; justify-content: center; align-items: center; border-radius: 50%; width: 50px; height: 50px; border: 1px solid red; } .step.active{ background: green; } .tab { padding: 20px; background: blue; width: 300px; height: 200px; border-radius: 20px; display: none; } .tab.active { display: block; } (function($) { $(function() { $('ul.steps').on('click', 'li:not(.active)', function() { $(this) .addClass('active').siblings().removeClass('active') .closest('div.tabs').find('div.tab').removeClass('active').eq($(this).index()).addClass('active'); }); }); })(jQuery);  
  • Обсуждения

    • Sider
      Всем спс сам розобрался.
    • Nicolyasic
      Вот хороший пример "Рандомайзер слов из списка". Тут вместо дивов с картинками инпуты, но сути дела не меняет. Кроме того работает с разным кразмером списка (код универсальный). Если в сорсе код найдешь увидишь как работает — там 3 строчки с тем же Math.random. Если будут трудности пиши тут, я оповещение увижу кину тебе код оттуда + объясню шо как. Вообще прикольно так можешь посмотреть другие страницы на сайте, потренироваться с js (для начала как раз пойдет).   Ну я вовремя конечно 
    • SAVC
      Пытаюсь динамически сформировать группу элементов <input type="checkbox"> Элементы создаются, но не получается задать им надпись, хотя раньше, создавая их вручную в HTML, всё получалось..   vk-groups-3.html vk-groups-1.html наладил.. vk-groups-3.html
    • Bobbi86
      Вы отучились на бухгалтера или программиста? Почему спрашиваю. Я финансист, бухгалтер. Естественно, в свое время отучился на курсах 1С, но как экономист. Поэтому могу помочь с развитием именно в этом направлении, так как опыт огромный. 
    • Sider
      Всем привет.Не так давно начал изучать верстку.И кароче захотел создать слайдер на основе html css без js. Застрял булеты работают и стрелки также но только стрелки становяться видимы когда первый раз нажал на булет.До этого их никак немогу настроить.   <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <meta name="viewport" content="width=device-width, initial-scale=1.0">     <title>Document</title>     <style>         .wrapper{             width: 700px;             height: 400px;             margin:0 auto;             border:5px solid green;             border-radius: 20px;             overflow: hidden;             position: relative;         }         .container{             width: 600px;             height: 300px;             border: 5px solid green;             border-radius: 20px;             margin: 20px auto;         }         .slider__items{             display: none;         }         .bullets{             display: flex;             position: absolute;             left:100px;             bottom:30px;         }         .bullets__items{             width: 50px;             height: 15px;             border:2px solid green;             border-radius: 20px;             background-color: lightgreen;             margin: 0 20px;         }             .images{             display: flex;         }         .images__items{             width: 600px;             height: 300px;             border-radius: 20px;             margin-right: 55px;         }               .arrows__prev{             background-image: url(./img/next.png);             background-size: contain;             width: 40px;             height: 40px;             position: absolute;             top:150px;             left: 2px;         }         #slide1:checked ~ .images .image1{             margin-left: 0;         }         #slide2:checked ~ .images .image2{             margin-left: -655px;         }         #slide3:checked ~ .images .image3{             margin-left: -1310px;         }         #slide4:checked ~ .images .image4{             margin-left: -1965px;         }         #slide5:checked ~ .images .image5{             margin-left: -2620px;         }         #slide1:checked ~ .arrow__next .img2,         #slide2:checked ~ .arrow__next .img3,         #slide3:checked ~ .arrow__next .img4,         #slide4:checked ~ .arrow__next .img5,         #slide5:checked ~ .arrow__next .img1{             display: block;             background-image: url(./img/next.png);             background-size: contain;             width: 40px;             height: 40px;             position: absolute;             top:150px;             right: 2px;                 }         #slide1:checked ~ .arrow__prev .img5,         #slide2:checked ~ .arrow__prev .img1,         #slide3:checked ~ .arrow__prev .img2,         #slide4:checked ~ .arrow__prev .img3,         #slide5:checked ~ .arrow__prev .img4         {             display: block;             background-image: url(./img/prev.png);             background-size: contain;             width: 40px;             height: 40px;             position: absolute;             top:150px;             left: 2px;                 }     </style> </head> <body>     <div class="wrapper">         <div class="container">             <div class="slider">                 <input type="radio" name="slider" class="slider__items" id="slide1">                 <input type="radio" name="slider" class="slider__items" id="slide2">                 <input type="radio" name="slider" class="slider__items" id="slide3">                 <input type="radio" name="slider" class="slider__items" id="slide4">                 <input type="radio" name="slider" class="slider__items" id="slide5">                                 <div class="bullets">                     <label for="slide1" class="bullets__items"></label>                     <label for="slide2" class="bullets__items"></label>                     <label for="slide3" class="bullets__items"></label>                     <label for="slide4" class="bullets__items"></label>                     <label for="slide5" class="bullets__items"></label>                 </div>                 <div class="arrow__next">                     <label for="slide1" class="arrows__item img1"></label>                     <label for="slide2" class="arrows__item img2"></label>                     <label for="slide3" class="arrows__item img3"></label>                     <label for="slide4" class="arrows__item img4"></label>                     <label for="slide5" class="arrows__item img5"></label>                 </div>                 <div class="arrow__prev">                     <label for="slide1" class="arrows__item img1"></label>                     <label for="slide2" class="arrows__item img2"></label>                     <label for="slide3" class="arrows__item img3"></label>                     <label for="slide4" class="arrows__item img4"></label>                     <label for="slide5" class="arrows__item img5"></label>                 </div>                 <div class="images">                     <img src="./img/1.jpg" alt="" class="images__items image1">                     <img src="./img/2.jpg" alt="" class="images__items image2">                     <img src="./img/3.jpg" alt="" class="images__items image3">                     <img src="./img/4.jpg" alt="" class="images__items image4">                     <img src="./img/5.jpg" alt="" class="images__items image5">                 </div>             </div>         </div>     </div> </body> </html>
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy