• Как сделать плавающий элемент, который появляется при скролинге вниз?

    @kvaak
    FE
    var yourButton = $('Ваша кнопка');
    var lastScrollTop = 0;
    $(window).scroll(function(){
       var st = $(this).scrollTop();
       st > lastScrollTop ? yourButton.hide() : yourButton.show();
       lastScrollTop = st;
    });
    Ответ написан
    3 комментария
  • Как отслеживать изменения экрана браузера на Javascript?

    SmthTo
    @SmthTo
    Все перепёлки мира будут оплакивать мою смерть.
    Если на голом JS и с троттлингом. Извините, если кого обидел лицом на фоне в примере:

    https://developer.mozilla.org/ru/docs/Web/Events/resize
    Ответ написан
    Комментировать
  • Почему именно нужен return function() (не просто return)?

    rockon404
    @rockon404
    Frontend Developer
    Задача. По нажатию на кнопки A и B добавлять буквы a и b в значение element. Варианты решения.
    1. Написать для каждой кнопки свой хандлер:
    function handleClickA() {
      element.innerHTML += 'a';
    }
    
    function handleClickB() {
      element.innerHTML += 'a';
    }
    
    a.addEventListener('click', hanldeClickA);
    b.addEventListener('click', hanldeClickB);

    Главная проблема подобных решений дублирование кода. Букв 26/33, еще цифры и спец символы.

    Решение 2. Написать билдер:

    function buildHandler(char) {
      return function() {
        element.innerHTML += char;
      }
    }
    
    a.addEventListener('click', buildHandler(a.innerHTML));
    b.addEventListener('click', buildHandler(b.innerHTML));


    С подобными билдерами очень удобно работать в цикле:
    for (let key in keys) {
      key.addEventListener('click', buildHandler(key.innerHTML);
    }


    Почему именно нужен return function() (не просто return)?

    addEventListener принимает вторым аргументом функцию, именно ее функция билдер и возвращает.
    Ответ написан
    9 комментариев
  • Как вернуть все содержимое в тегах html без самих тегов c помощью JS?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Создайте элемент, html-строку используйте в качестве разметки его дочерних элементов, затем достаньте текст:

    const div = document.createElement('div');
    div.innerHTML = document.querySelector('input').value;
    console.log(div.innerText);

    Или используйте DOMParser:

    const html = new DOMParser().parseFromString(document.querySelector('input').value, 'text/html');
    console.log(html.body.innerText);
    Ответ написан
    Комментировать
  • Базовые знания для дизайнера?

    @McBernar
    Слушай, я понимаю, что ты хочешь, но, боюсь, здесь нет ответа.

    Задача проста — систематизировать знания и закрыть пробелы. Но, к сожалению, нет никакого универсального и всеобъемлющего курса, пройдя который ты обретешь все знания. Сейчас гораздо больше информации, чем было во времена, когда я начинал карьеру дизайнера, но количество не говорит о качестве.

    Из того, что можно точно выделить:

    1. Советы Горбунова. Школа у них чудовищная, но вот в советах очень много полезной информации. И, по-моему, они эти советы перенесли в формат электронных книг. Там и по интерфейсам темы и по академическому дизайну и много ответов на разные вопросы по копирайтингу/менеджменту/развитию. В общем, довольно ценный ресурс.

    2. Школа Тильды. Это набор последовательных статей. Там описан в некоторой степени утопичный дизайн-процесс, но именно к такому процессу и нужно стремиться при работе в команде дизайна. Они рассказывают о дизайн-мышлении, о картах, персонажах и прочих ментальных инструментах. Это материал не для новичка, а для мидла скорее. Сейчас большинство крупных западных команд работает в +- подобном ключе.

    3. Книга "Психбольница в руках пациентов". Классика. Читается как роман, ставит мозги на место сразу. Ты начинаешь решать задачи, а не рисовать пиксели.

    Многие скажут, что нужно обязательно прочитать Тафти. Лично я читал его, но это невероятное занудство — более скучных книг нет на всей планете, наверное. Если ты хочешь быть прям как Бирман какой-нибудь — дотошным любителем схем, инфографики и вот этого всего, тогда это маст рид. Есть еще Раскин, который решил описать работу над интерфейсом в академическом стиле. Тоже считается некоей библией. По занудству находится примерно рядом с Тафти. Но мне кажется, что это примерно как учить английский язык по словарю.

    Если же ты работаешь над массовыми продуктами — веб, прилки — лучше потратить время на что-то продуктовое. Лучшая книга для этого — биография Джобса от Айзексона. После прочтения мир как будто проясняется, а до этого ты все время, оказывается, ходил в тумане.

    И самое главное — научись верстать. Не просто понять базовые теги html, а по-настоящему. Чтобы твой код был почти готов уйти в продакшен. Ты откроешь для себя сторону дизайна, которая всегда оставалась в тени — то, как твой продукт реально работает, а не то, как ты себе это представляешь, глядя на картинку. Например, ребята из Apple всегда делают сотнями пенопластовые и пластиковые макеты для новых Айфонов, крутят их в руках, ходят с ними в карманах и т.д. Только так можно прочувствовать форму, понять изъяны и улучшить продукт. Картинка ничего не говорит о проекте, нужно уметь ее материализовать. В вебе с этим помогает верстка.
    Ответ написан
    3 комментария
  • Где смотреть современные интересные сайты?

    sfi0zy
    @sfi0zy Куратор тега Вёрстка
    Creative frontend developer
    Ответ написан
    Комментировать
  • Почему анимация проходит моментально?

    0xD34F
    @0xD34F Куратор тега CSS
    Во-первых - ошиблись с именем класса (это вы могли бы и сами обнаружить).

    Во-вторых - браузер стремится оптимизировать внесение изменений в DOM-дерево, так что свежесозданные элементы анимироваться не будут. Чтобы анимация выполнилась, нужен дополнительный reflow, для чего можно либо обернуть добавление класса в setTimeout, либо перед добавлением класса обратиться к одному из свойств, расчёт которых вызывает reflow. Как-то так.
    Ответ написан
    Комментировать
  • Валидация формы: как правильно реализовать проверку пароля?

    @kenny_gomel
    Метод получения полей формы зависит от момента валидации, но оба они работают через JS.
    Суть в том, чтобы подняться по DOM-дереву до формы, если не обходимо, и в ней уже найти все input, checkbox, radio и textarea.
    Далее уже валидировать в зависимости от тэга и типа (в случае с input).

    А проверку схожести паролей я бы захардкодил, например по name-ам "password" и "password_repeat" или же во втором поле в data-атрибуте (например data-equal-to) указывал бы name/class/id первого поля, с которым его необходимо сравнить.
    Ответ написан
    2 комментария
  • Валидация формы: как правильно реализовать проверку пароля?

    Stalker_RED
    @Stalker_RED
    Подкидываю идею: не делай этого вообще.
    Делать какие-то странные нестандартные штуки имеет смысл только тогда, когда со стандартными что-то не срослось.

    ОБычно проверяют текущую форму в которой юзер что-то вводит или которую он сабмитит, а не все подряд на странице.
    Кроме того, неплохо бы почитать о встроенной валидации из html5
    https://developer.mozilla.org/ru/docs/Learn/HTML/F...

    Если у вас несколько одинаковых форм, то можно проверять так:
    form.addEventListener('submit', function(){
      let p1 = form.querySelector('[name=password]') // поля в текущей форме, а не из других
      let p2 = form.querySelector('[name=password_confirm]')
      if (p1.value !== p2.value) {
        // ...
      }
    })
    Ответ написан
    1 комментарий
  • Чистый CSS для анимации или gsap?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    есть микрофризы и фреймрейт скачет где-то. Стоит ли в таких случаях полностью переходить на js-движок типа GSAP ?

    Важно понимать, что GSAP, Anime.js или еще что-то похожее - это инструменты, которые не приносят ничего принципиально нового в плане технологий. Они просто дают удобный интерфейс, через который мы можем менять значения свойств CSS или каких-то атрибутов SVG. Не более того. Соответственно если у вас есть нормально написанная анимация на чистом CSS/JS и она тормозит, то GSAP ее особо не ускорит.

    есть микрофризы и фреймрейт скачет

    Если есть проблемы с текущими анимациями, то стоит проверить, что:
    - Везде используется transform, а не изменения width, height, top, bottom, margin, background-position и.т.д.
    - По возможности не запускается более одной CSS-анимации в единицу времени.
    - Все js-анимации собраны в один requestAnimationFrame.
    - Все CSS/SVG фильтры по возможности заменены на шейдеры. Советую почитать введение в эту тему и еще примеры.
    - Изменение теней в анимациях по возможности заменено на появление псевдоэлементов с такими фонами.
    - CSS-свойство will-change используется по назначению.
    Ответ написан
    1 комментарий
  • Как изменить стили SVG при использовании спрайта?

    werty1001
    @werty1001
    undefined
    При использовании use содержимое будет в Shadow DOM, он изолирован и изменить стили определенного узла из вне нельзя.

    - Можно изменять цвет, толщину границы, размеры но для всей иконки в целом.
    - С помощью currentColor можно задать сразу 2 цвета.
    - Если браузер умеет в CSS переменные, то можно красить иконки как хочешь.
    - В будущем возможно будет псевдо-селектор ::shadow, который позволит влезать в Shadow DOM, но это не точно.
    Ответ написан
    1 комментарий
  • Как запретить загрузку сайта при отключенном javascript в браузере?

    @Dorothy
    Возможно,
    <html>
    <head>
    <noscript>
    <meta http-equiv="refresh" content="0;url=http://site/blank.html">
    </noscript>
    </head>
    </html>
    Ответ написан
    1 комментарий
  • Как использовать normilize с gulp?

    @LMI
    1. Если у тебя уже установлен Gulp и настроен локально в папке проекта, то в консоли переходишь в папку этого своего проекта и вводишь npm install node-normalize-scss --save-dev

    2. Потом в основном sass-файле делаешь импорт @import "normalize";

    3. В таске по компиляции sass в css в пайп добавляешь строчку кода
    includePaths: require('node-normalize-scss').includePaths


    Вот полный код и документация

    var gulp = require('gulp');
    var sass = require('gulp-sass');
     
    gulp.task('sass', function () {
      gulp.src('path/to/input.scss')
        .pipe(sass({
          // includePaths: require('node-normalize-scss').with('other/path', 'another/path') 
          // - or - 
          includePaths: require('node-normalize-scss').includePaths
        }))
        .pipe(gulp.dest('path/to/output.css'));
    });


    https://www.npmjs.com/package/node-normalize-scss
    Ответ написан
    1 комментарий
  • Верстка с нуля: какие основные этапы работы?

    Vlad_IT
    @Vlad_IT Куратор тега Вёрстка
    Front-end разработчик
    Использую vscode+webpack+pug+scss+бэм. Из физических инструментов, основной моник: lg ultrawide 29um69g, рядом прикручен моник от ноутбука повешенный вертикально, подключенный через универсальный скаллер.

    0) Запускаю Spotify :-)

    1) Произвожу установку всех необходимых модулей для сборки. В моем случае у меня набор конфигураций для webpack (отдельные файлы для pug, scss, static и.т.д., выбираю что нужно).

    2) Запускаю avocode, загружаю в него макет. Определяю в нем переменные (в то же время записываю их, чтобы сразу кинуть в scss файл) для цветов, размеров шрифтов и.т.д. чтобы при получении кусочков кода из него, он сразу расставлял переменные.

    3) Запускаю VS Code, открываю нужную папку.

    4) Пишу размету на Pug. Пишу с БЭМ, если встречаю повторяющийся блок, то открываю файл _mixins.pug, в который пишу миксины для повторяющихся блоков, например товаров, пунктов меню, каких-то блоков и.т.д. Pug умеет делать циклы, это ускоряет сильно.

    5) Когда HTML готов, начинаю делать каркас. Если дизайн сделан по сетке, определяю контейнеры, колонки, строки в свои классы (не пишу в html тучи классов аля col-md-6, а пишу в SCSS инклуды в нужные мне блоки, типа @include make-col(2) и.т.д.).

    6) Экспортирую картинки из Avocode. Очень делается просто, указываю папку и просто кликаю экспорт и ввожу название файла и расширения. Преимущественно для иконок использую svg, если нет svg, то ищу эту иконку в интернете (дизайнеры редко рисуют иконки сами, но зато любят вставлять их не в векторе). Если иконка простая, могу сам ее в inkscape обвести, ну и если нет, то экспортирую png в размере (благо авокод это позволяет, если конечно дизайнер не вставил в исходном маленьком размере). Когда есть контакт с дизайнером, трясу его, ибо растр это плохо для иконок.

    7) Пишу стили блоков из страницы. На этом этапе можно на втором монике параллельно смотреть футураму или
    Арчера :-) Но чаще на широком монике слева браузер, справа VS Code, а на втором монике Avocode (может меняться местами с браузером). Мысленно нарезаю страницу на блоки. Для каждого блока (БЭМ) создаю отдельный scss файл (кто-то даже для элемента создает, но мне лень), из него сразу выписываю все селекторы. Иногда могу сначала выписать все селекторы со страницы (но так лучше не делать, т.к. во время работы может потребоваться изменить что-то в разметке), но чаще для одного блока выполняю этот пункт и за ним сразу выполняю пункт 8, потом для нового блока опять 7 и 8 и.т.д.

    8) Пишу css код вместе с Avocode, у него беру нужные мне параметры (а он уже подставил в них переменные), и вставляю в мой код. И параллельно сверяю со скрином макета используя вот это расширение https://chrome.google.com/webstore/detail/perfectp...

    9) Пишу адаптив. Я не могу привыкнуть к методологии mobile-first, поэтому пишу всегда сначала полную версию сайта. Я понимаю, что это чревато всякими проблемами и это типа не модно, но мне норм.

    10) Медиа-запросы пишу прямо в блоках, для каждого блока/элемента/модификатора может быть отдельный медиа-запрос. Но для начала определяю breakpoint'ы для разных экранов (чтобы их не было сотни разных), если использую Bootstrap, то беру его breakpoint'ы.

    11) Добавляю анимашки. Даже если заказчик не просил отдельно (и если не указал отдельно, что нельзя), он все равно будет доволен, а с animate.css+onscreen.js это вообще работа 10 минут. Сложные анимации обговариваю отдельно, чтобы не сделать ненужную работу.

    11) Все снова сверяю, пишу скрипты где надо. Для слайдеров в 99% случаев подходит slick (с доработками конечно, но там хорошее API), для других случаев могу написать свой.

    12) Сдаю заказчику и жду ответа сидя на тостере/пикабу.

    Это чисто мой опыт, опыт фрилансера, не знаю, как делают другие и не могу на 100% утверждать что это 100% правильный способ. Я так и не смог заставить свой конфиг webpack правильно вставлять спрайты svg.
    Надеюсь чем-то поможет мой ответ.
    Ответ написан
    7 комментариев
  • Что означает (jQuery) после (function( $ )?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    (function( ) {
    })();

    Вот эта конструкция называется "анонимная самовызываемая функция".

    То есть, тут два действия:
    Объявление анонимной функции
    function( ) {
    }

    и сразу ее вызов
    ()()
    Первые скобки это синтаксический приём для вызова анонимной функции. Есть и другие методы. Например
    +function(){}()
    Вторые скобки - это собственно вызов функции и при необходимости передача параметра (обычный вызов же)

    ()(jQuery) — в параметре передается jQuery

    function($){} — а тут этот параметр объявлен и используется

    (function($){})(jQuery) — итого, объявили анонимную функцию, и вызвали ее, передав параметром объект jQuery

    Например, доллар у вас используется другой библиотекой, пусть MooTools.
    Тогда вы запускаете jQuery в безконфликтном режиме

    jQuery.noConflict();

    Это значит, что доллар использоваться не будет, и объект будет доступен только по ссылке jQuery.

    Но для удобства вы можете использовать анонимную функцию и безопасно использовать внутри неё переменную доллара

    (function($){
      $('.slider').slick();
    })(jQuery);


    Чтобы стало совсем понятно, конструкцию можно переписать без анонимной функции

    var myFunc = function($){
     // some code
    }
    
    myFunc(jQuery);
    Ответ написан
    Комментировать