• Так ли важна скорость загрузки по PageSpeed Insights?

    @pu6elozed
    Bitrix, fullstack
    Используйте современные форматы изображений JPEG 2000, JPEG XR и WebP

    Для этого существует тэг picture с source, в котором и можно использовать webp. Если не будет поддерживаться, то и не будет использоваться этот source

    Устраните ресурсы, блокирующие отображение

    Советую почитать по critical-css, т.е. css который необходим для отображения первого экрана. Весь остальной css можно подключать как раз внизу сайта.

    Настройте подходящий размер изображений

    но на мобильном нет таких размеров. в лучшем случае 375px и @2x, что соответствует 750px, нужно подгружать те форматы и размеры изображения, которые будут подходить текущему разрешению экрана, через тот же вышеупомянутый тег source внутри picture

    Задайте правила эффективного использования кеша для статических объектов

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

    Как это можно исправить, или это не так важно...? Как вы поступаете в таких ситуациях? Вы придерживаетесь рекомендациям google?

    Как было написано - это всего лишь рекомендация. Руководствоваться этими рекомендациями или нет, решать лично вам. Однако гугл уже давно использует данные PageSpeedInsights, и учитывает их при ранжировании
    Ответ написан
    3 комментария
  • Почему значения меняются одинаково?

    @qq1
    У вас month всегда 6, а его нужно получать динамически для каждого периода подписки.
    Там где extendPrice.text(summ);
    заменить на что-то вроде
    extendPrice.text(function(){
      let month = $(this).closest('.range-item').find('.licenses-month').attr('data-month');
      return parseInt(count * month * defaultPrice * 100) / 100;
    });
    Ответ написан
    Комментировать
  • Как сделать ограничение на уменьшение числа в input?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Добавить input'у атрибуты min/max; всем трём элементам добавить общую обёртку (уверен, на странице подобных блоков будет больше одного):

    <div class="counter">
      <button class="minus">-</button>
      <input type="number" min="2" max="17" value="5">
      <button class="plus">+</button>
    </div>

    При обновлении input'а ограничивать новое значение значениями атрибутов min/max (если где-то ограничений быть не должно, то вместо отсутствующих значений атрибутов подставлять +/- бесконечность). Кроме того, неплохо бы обрабатывать пользовательский ввод в input - а ну как кто захочет его напрямую отредактировать, мимо кнопок.

    Как это может выглядеть:

    const updateInput = change => e =>
      $('input', e.delegateTarget).val(function(i, v) {
        const min = this.min || -Infinity;
        const max = this.max || Infinity;
        return Math.max(min, Math.min(max, (v | 0) + change));
      });
    
    $('.counter')
      .on('click', '.minus', updateInput(-1))
      .on('click', '.plus', updateInput(1))
      .on('input', updateInput(0));

    Или, к чёрту jquery:

    const updateInput = change => e => {
      const input = e.target.closest('.counter').querySelector('input');
      const min = input.min || -Infinity;
      const max = input.max || Infinity;
      input.value = Math.min(max, Math.max(min, (input.value | 0) + change));
    };
    
    document.querySelectorAll('.counter').forEach(function(n) {
      n.querySelector('.minus').addEventListener('click', this[0]);
      n.querySelector('input').addEventListener('input', this[1]);
      n.querySelector('.plus').addEventListener('click', this[2]);
    }, [ -1, 0, 1 ].map(updateInput));

    Или, не обязательно назначать обработчики событий каждому элементу индивидуально, достаточно по одному делегированному на тип события:

    document.addEventListener('click', ({ target: t }) => {
      const change =
        t.classList.contains('plus')  ? +1 :
        t.classList.contains('minus') ? -1 :
                                         0;
      if (change) {
        const input = t.closest('.counter').querySelector('input');
        input.value -= -change;
        input.dispatchEvent(new Event('input'), { bubbles: true });
      }
    });
    
    document.addEventListener('input', ({ target: t }) => {
      if (t.closest('.counter')) {
        t.value = Math.min(t.max || Infinity, Math.max(t.min || -Infinity, t.value | 0));
      }
    });

    А ещё можно добавить кнопкам data-атрибуты, указывающие, на сколько должно быть изменено значение input'а, и тогда проверять у кнопок наличие классов будет не надо:

    <button class="minus" data-change="-1">-</button>
    <button class="plus" data-change="+1">+</button>

    document.addEventListener('input', updateInput);
    document.addEventListener('click', updateInput);
    
    function updateInput({ target: t }) {
      const counter = t.closest('.counter');
      if (counter) {
        const input = counter.querySelector('input');
        const min = input.min || -Infinity;
        const max = input.max || Infinity;
        input.value = Math.min(max, Math.max(min, (input.value | 0) + (t.dataset.change | 0)));
      }
    }
    Ответ написан
    Комментировать
  • Как правильно сверстать меню?

    LenovoId
    @LenovoId
    svg, css,js
    https://jsfiddle.net/ngz93vre/8/ вот так наверно ...
    шрифт и зазоры поправите
    Ответ написан
    1 комментарий
  • Как при помощи JQuery сменить содержимое блока?

    KickeRocK
    @KickeRocK
    FrontFinish
    Держите
    Только там принцип чуть другой: При клике, активная ссылка меняется и блок, который подвязан к этой ссылке - становится видимым.
    Т.е. кол-во ссылок = кол-во блоков.
    Ответ написан
    1 комментарий
  • Как выровнять карточки товаров flexbox?

    Адаптивный вариант -https://jsfiddle.net/Svupol/o2wvd30L/46/
    Ответ написан
    Комментировать