Задать вопрос
  • Какие lazy load-плагины для изображений лучше?

    @SergeiB
    После появления Intersection Observer API надобность в плагинах отпала. Всё решается парой десятков строк кода.
    Пример.

    const options = {
      root: null,
      rootMargin: '0px',
      threshold: 0.05
    };
    
    const lazyload = function(entries, observer) {
      entries.forEach(function(entry) {
        const target = entry.target;
        const dataset = target.dataset;
    
        if (entry.isIntersecting) {
          try {
            if ('src' in dataset) {
              target.src = dataset.src;
            }
    
            if ('bg' in dataset) {
              target.style.backgroundImage = `url(${dataset.bg})`;
            }
    
            target.classList.add('lazyloaded');
            observer.unobserve(target);
          } catch (error) {
            console.error(error);
          }
        }
      });
    };
    
    const observer = new IntersectionObserver(lazyload, options);
    
    document.querySelectorAll('.js-lazyload').forEach(elem => observer.observe(elem));

    <!-- Изображение без плейсхолдера -->
    <img class="js-lazyload" data-src="path/to/image/elephant.jpg" alt="The pink elephant">
    
    <!-- Изображение с плейсхолдером -->
    <img class="js-lazyload" data-src="path/to/image/elephant.jpg" src="path/to/placeholder.jpg" alt="The pink elephant">
    
    <!-- Ситуация, когда изображение надо задать как фон -->
    <div class="js-lazyload" data-bg="path/to/image/elephant.jpg"></div>

    Ответ написан
    3 комментария
  • Как определиться с зависимостями лендинга?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Смешались в кучу кони, люди, GSAP, React, Three.js... Стоит немного систематизировать инструменты хотя бы по задачам, которые они решают. Не привязываясь к конкретным фреймворкам из большой троицы, у нас есть несколько классов инструментов в теме креативных сайтов:

    • Про готовые CSS-анимации - animate.css, Wow.js, и.т.д. Там много динозавров из времен jQuery. Такие штуки часто бывают не в тему дизайна, но стоит посмотреть и забыть. Хотя для сайтов в духе дизайнерской дичи, вроде той, что успешно делают в студии Артемия Лебедева - может быть и ок.
    • Про интерполяцию всего и вся. Тут обычно выбирают между GSAP и Anime.js. Первый вариант - более замороченный, есть полезные плагины, второй - попроще, но тоже хорош, в некоторых кругах даже более популярен. Для совсем простых задач - можно свой инструмент написать.
    • Про скролл, в основном в контексте CSS-анимаций. Тут Locomotive Scroll рулит.
    • Про переходы между экранами. Грубо говоря прокаченный роутер. Самый популярный - Barba.js. Раньше еще был Highway.js, но в последне время что-то про него мало говорят.
    • Про экспорт готовых анимаций из софта для анимаций. Тут нужно отталкиваться от софта. Обычно вопрос возникает в контексте AE и простых мультиков - тут Lottie, говорят, неплох. Но нужно дизайнера заранее консультировать по теме, чтобы лишнего не намалевал.
    • Про визуализацию данных. Тут полезно знать про d3.js, в основном ради готовых примеров.
    • Про трехмерный WebGL, чтобы не писать все руками. Самый популярный вариант - Three.js, в основном за счет экосистемы и горы готовых решений, но есть и альтернативы на любой кус и цвет. Для 2D -эффектов вообще ничего не нужно в большинстве случаев.
    • Плюс не стоит забывать про всякие вспомогательные штуки вроде WebFontLoader, Hammer.js, LeaderLine, и.т.д. К анимациям они не относятся, но в работе могут быть полезны, чтобы не писать все самому.


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

    А вообще угадать весь стек на много проектов вперед с первого раза, не имея ни малейшего представления о том, что там будет нужно, а что нет, скорее всего все равно не получится, так что может быть стоит попробовать разное в разных проектах (тем более речь идет про некоммерческие проекты, можно себе позволить), и посмотреть на то, какие вообще варианты бывают в разных классах задач, и что они помогают делать, а что - нет.
    Ответ написан
    1 комментарий
  • Как задать блоку который находится в контейнере ширину на весь экран?

    Вот так - codepen.io/AXP/pen/WpqrjG

    .full {
        width: 100vw;
        position: relative;
        margin-left: -50vw;
        left: 50%;
        margin-bottom: 30px;
    }

    При этом адаптивность сохранится

    Актуально для всего кроме IE > 9 тут смотреть
    Ответ написан
    3 комментария
  • Как убрать повторяющиеся слэши в .htaccess?

    @ShamblerR
    Дааю сразу все поскольку в свое время задолбало для каждого проекта делать все заново, по этому сейчас просто вставляю кусок и все.
    ############################################################################
    #### Cтандартный .htaccess для проектов студии Клондайк, версия 2.3     ####
    ############################################################################
    RewriteEngine On
       #  Директива включает редиректы.
    RewriteBase / 
       # Без директивы (.*) = /$1 будет /var/wwww/site/web/$1  с директивой  = /$1
    Options +FollowSymLinks
       # Разрешает переход по символическим ссылкам.
    
    ############################################################################
    #### Перенаправляем протокол https на http                              ####
    ############################################################################
    RewriteCond %{HTTPS} on
       # Проверяем наличие https в URL.
    RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI}
       # Перенаправляем протокол на http.
    
    ############################################################################
    #### Выбор основного зеркала (или с www или без www)                    ####
    ############################################################################
       # 1. Редирект с www на без www. (раскоментировать директивы пункта 1)
    #RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
       # Проверяем, содержит ли домен www (в начале URL).
    #RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
       # Перенаправляем URL на домен без www.
    ####
       # 2. Редирект без www на www. (раскоментировать директивы пункта 2)
    #RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
       # Проверяем, не содержит ли домен www (в начале URL).
    #RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
       # Перенаправляем URL на домен c www.
    
    ############################################################################
    #### Убираем повторяющиеся слеши (/) в URL                              ####
    ############################################################################
    RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
       # Проверяем, повторяется ли слеш (//) более двух раз.
    RewriteRule . %1/%2 [R=301,L]
       # Исключаем все лишние слеши.
    
    ############################################################################
    #### Убираем слеши в конце URL для статических файлов (содержит точку)  ####
    ############################################################################
    RewriteCond %{REQUEST_URI} \..+$  
       # Если файл содержит точку.
    RewriteCond %{REQUEST_FILENAME} !-d   
       # И это не директория.
    RewriteCond %{REQUEST_FILENAME} -f
       # Является файлом.
    RewriteCond %{REQUEST_URI} ^(.+)/$      
       # И в конце URL есть слеш.
    RewriteRule ^(.+)/$ /$1 [R=301,L]     
       # Исключить слеш.
    
    ############################################################################
    #### Добавляем слеш(/), если его нет, и это не файл.                    ####
    ############################################################################
    RewriteCond %{REQUEST_URI} !(.*)/$
       # Если слеша в конце нет.
    RewriteCond %{REQUEST_FILENAME} !-f
       # Не является файлом.
    RewriteCond %{REQUEST_URI} !\..+$
       # В URL нет точки (файл).
    RewriteRule ^(.*)$ $1/ [L,R=301]
       # Добавляем слеш в конце.
    
    ############################################################################
    #### Убираем index.php, если он есть в конце URL                        ####
    ############################################################################
    RewriteCond %{REQUEST_METHOD} =GET
       # Выявляем GET запрос в URL (не POST).
    RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
       # URL cодержит index.php в конце.
    RewriteRule ^(.*)$ %1/ [R=301,L]
       # Удалить index.php из URL.
    
    ############################################################################
    #### Конец общей части, далее следует собственные директивы .htaccess   ####
    ############################################################################
    Ответ написан
    5 комментариев
  • Как сверстать такие элементы (текст, через буквы которого видна картинка; кнопка, внутри неё стрелка, которая выходит за границу кнопки)?

    kosolapus
    @kosolapus
    Если помогло - отмечайте решением
    svg + css + html
    1. ::first-letter
    2. https://codepen.io/phpcodertech/pen/ZEQYBgQ
    3. ::afer
    4. https://css-tricks.com/snippets/svg/curved-text-al...
    5. ::after, ::before и иже с ними

    Вообще, вариантов реализации каждого вопроса более 1. Рекомендую как всегда курить спецификации - mdn хотя бы. Ответы взял не из головы, а из гугла - если там не забанили, можно посмотреть)
    Ответ написан
    Комментировать
  • Где в Chrome, нужно смотреть JS-события, применённые к элементу во время какого-либо действия с этим элементом?

    @alexalexes
    F12. Раздел "Элементы", выбираете элемент, на котором нужно посмотреть обработчик события. В области интерфейса для просмотра свойств элемента выбираете вкладку "Прослушиватели событий". Выбираете вид события, и выбираете точку входа в JS коде на это событие. Далее, при просмотре кода JS на вкладке "Источники" выбираете, где вам поставить точки останова, чтобы словить остановку выполнения обработки события.
    PS: Такой метод исследования работает только на ванильном или слабо прототипированном коде, написанный без применения библиотек и фреймворков. При использовании библиотек и фреймворков точки привязки событий будут указывать, как правило, на одну единственную функцию в этой библиотеке, отвечающей за высокоуровневый байндинг событий. В этом случае нужно изучать, какие инструменты для отладки есть в самой библиотеке или фреймворке.
    Ответ написан
    Комментировать
  • Как данную функцию при наведении на объект остановить а после выхода из объекта снова запустить?

    y0u
    @y0u Куратор тега JavaScript
    dev
    $.fn.glow = function(delay = 1000) {
      return this.each(function() {
        let interval;
    
        const startGlow = () => {
          interval = setInterval(() => $(this).toggleClass('glow'), delay);
        }
    
        const stopGlow = () => {
          clearInterval(interval);
        }
    
        $(this).on('mouseenter', stopGlow);
        $(this).on('mouseleave', startGlow);
        
        startGlow();
        
        return this;
      })
    }
    
    $('.glowable').glow();
    Ответ написан
    1 комментарий
  • Как встроить на сайт сложную 3d анимацию?

    @its2easyy
    делал свой плагин для таких анимаций https://github.com/its2easy/animate-images.
    Чтобы привязать переключение к скролу можно использовать GSAP ScrollTrigger
    Ответ написан
    5 комментариев
  • Как встроить на сайт сложную 3d анимацию?

    Get-Web
    @Get-Web
    Front-End Developer
    Объединяете все картинки в спрайт и затем меняете background-position с учетом размера одного кадра, либо можно просто менять сами картинки, но это более ресурсоемкий процесс, к тому же не все картинки могут успеть прогрузиться. Готового примера под рукой нет, но смысл примерно такой же как тут https://codepen.io/get-web/pen/pqrvLY просто смена кадров с определенной скорость, в вашем случае вы будете привязываться либо к позиции курсора, если движение будет мышью, либо к кнопкам через setTimeout

    update: Готовые библиотеки можно поискать по запросу "360 view js". Например вот: https://scaleflex.github.io/js-cloudimage-360-view/
    Ответ написан
    4 комментария
  • Как убрать скролл в браузере mozilla?

    nowm
    @nowm
    В Firefox нет такой штуки, как ::-moz-scrollbar, но для элемента можно сделать scrollbar-width: none;:

    div {
      max-height: 120px;
      overflow-y: auto;
      overflow-x: none;
      scrollbar-width: none;
    }
    
    div::-webkit-scrollbar {
      display: none;
    }


    Я ваш jsfiddle-пример протестировал с scrollbar-width, и скролбар после этого исчезает корректно в Firefox.
    Ответ написан
    1 комментарий
  • Как запретить отрицательные значения для суммы?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Зачем же у вас html контент участвует в вычислениях? О разделении логики и представления слышали?

    Пишите отдельно логику вычислений и в конце калькуляций готовый результат прописывайте в разметку.

    const quantityElement = document.querySelector('#quantityitog');
    const plusButtonElement = document.querySelector('#plustab');
    const minusButtonElement = document.querySelector('#minustab');
    const totalElement = document.querySelector('#totalprice');
    const priceElement = document.querySelector('#countprice');
    
    let total = +totalElement.innerText;
    let qty = +quantityElement.innerText;
    let price = +priceElement.innerText;
    
    function updateView(){
      totalElement.innerHTML = total;
    }
    
    function increment(){
      qty++;
      total = Math.trunc((qty * price) * 100) / 100;
      updateView();
    }
    
    function decrement(){
      qty--;
      total = Math.trunc((total - price) * 100) / 100;
      if (total < 0) total = 0;
      updateView();
    }
    
    plusButtonElement.addEventListener('click', increment)
    minusButtonElement.addEventListener('click', decrement)
    Ответ написан
    2 комментария
  • Как сверстать текст с частичной прозрачностью?

    SmthTo
    @SmthTo Куратор тега CSS
    Все перепёлки мира будут оплакивать мою смерть.
    В данном случае так будет проще:



    В целом, можно ещё сделать SVG-картинкой, либо же градиент на текст в качестве заливки + text-stroke:



    Однако, в данном случае проще всего именно первый вариант из-за параллакса.
    Ответ написан
    1 комментарий
  • Верстка ромба с хвостиком?

    Aetae
    @Aetae
    Тлен
    А проблем то в чём?
    Блок, в нём по центру background: linear-gradient и :before/after повёрнутый квадрат.
    Условно так:
    Ответ написан
    Комментировать
  • Форма карты нестандартной формы css?

    YavaDev
    @YavaDev
    SVG clipPath
    Ответ написан
    Комментировать
  • Стоит ли учить html, css,js в 2021?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Просто актуальной инфы так мало по этому, а я вылез из 2015 года.

    У вас странные вопросы. HTML + CSS + JS это костяк всего веба который в принципе не заменим.

    Логически построим цепочку. Есть бизнес разного уровня - ИП, средний бизнес, интерпрайз.

    Wordpress Elementor и его аналоги, подходят для конкретной задачи - быстрое прототипирование интерфейса и запуск бизнеса в кратчайшие сроки. Пример: сегодня 1 марта, и до 8 марта вам нужно быстро запустить лендинг или магазин на шаблоне wp, что бы реализовать продажу цветов. Всё.

    Если же ваш бизнес уровня средний и выше среднего, вы не сможете насколько хорошо оптимизировать, масштабировать свой проект, что бы он покрывал все запросы. В этом случае на помощь уже приходят специалисты уровня "фронтендер + бэкэндер + тимлид + PM" и каждый решают свою задачу.

    Задача фронтендера - отлично знать HTML + CSS + JS + (React\Vue\Angular) + REST API + WebSocket + сборщики + препроцессоры + figma + performance + assesability - и да, всё это требования джуна.

    Умение грамотно строить скелет приложения не накинув лишних вложенностей + грамотно проектируя интерфейс компонентами - добавляет вам денег и профита в конце пути. Джуна без знаний html\css в принципе на работу не возьмут.
    Ответ написан
    1 комментарий
  • Как удалить объект в многомерном массиве на основе значения ключа?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Функция принимает массив и функцию (типа как встроенные методы массива - map, filter, some и т.д.), принимающую элемент массива и возвращающую true в случае, если элемент должен быть удалён. Если элемент удалять не надо, то следует обработать массив вложенных элементов - выполняется рекурсивный вызов. Как это может выглядеть:

    function deleteNested(arr, fn) {
      arr?.reduceRight?.((_, n, i, a) =>
        fn(n, i, a)
          ? a.splice(i, 1)
          : deleteNested(n.children, fn)
      , null);
    }

    или

    function deleteNested(arr, fn) {
      if (Array.isArray(arr)) {
        arr.splice(0, arr.length, ...arr.filter((n, i, a) => {
          return !fn(n, i, a) && (deleteNested(n.children, fn), true);
        }));
      }
    }

    или

    function deleteNested(arr, fn) {
      if (arr instanceof Array) {
        let numDeleted = 0;
    
        for (const [ i, n ] of arr.entries()) {
          if (fn(n, i, arr)) {
            numDeleted++;
          } else {
            arr[i - numDeleted] = n;
            deleteNested(n.children, fn);
          }
        }
    
        arr.length -= numDeleted;
      }
    }

    Использовать так:

    deleteNested(itemsData, n => n.id === id_объекта_который_надо_удалить);
    Ответ написан
    1 комментарий
  • Как удалить год из html разметки через JS?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const remove = str => str.split(' ').slice(0, -1).join(' ');
    // или
    const remove = str => str.replace(/\s\S+$/, '');
    // или
    const remove = str => str.match(/.+(?=\s)/);
    // или
    const remove = str => str.slice(0, str.lastIndexOf(' '));

    for (const n of document.getElementsByClassName('startdate')) {
      n.textContent = remove(n.textContent);
    }
    
    // или, раз уж полной даты уже не будет, пусть начало и конец интервала дат
    // располагаются внутри одного элемента - вместе с куском строки также
    // удаляем и родительский элемент
    
    document.querySelectorAll('.startdate').forEach(n => {
      n.outerHTML = remove(n.innerHTML);
      // или
      n.replaceWith(remove(n.innerText));
    });
    Ответ написан
    Комментировать
  • Как анимировать заливку svg снизу вверх?

    LenovoId
    @LenovoId Куратор тега SVG
    svg, css,js
    Если что то не ясно то переспросите

    Ответ написан
    2 комментария