Ответы пользователя по тегу JavaScript
  • Как сделать эффект нажатия частей картинки?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Вариант номер 1 - найти какое-нибудь полуготовое решение для работы с такими вещами. Думаю что на d3js.org такое уже сто раз решали, и есть какие-то готовые плагины.
    Вариант номер 2 - по идее, если такую карту нарисовать в каком-нибудь Иллюстраторе, то там же можно будет её экспортировать в виде svg. После этого лишь надо будет "подчистить" этот свг и затем для областей (отдельные path элементы) добавлять класс через js, который будет их как то перекрашивать и делать прочую нужную вам магию (с возможностью использования transition и так далее).
    Ответ написан
    Комментировать
  • Как сделать плавное изменение числа в js коде?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Если такое не умеет GSAP (а по ходу он не умеет), то по идее это должно решаться с помощью requestAnimationFrame. То есть пишите функцию анимации, которая стартует raf, меняя значение с использованием изинга. В теории все звучит легко, но на деле при привязке к mousemove начинается адовая херня. Надо юзать что-то типа throttle, но у меня уже голова болит таким в воскресенье вечером заниматься.
    codepen.io/suez/pen/ab687e94e1a7de55b483c454988e8c73 - вот оооооочень кривая демка с говнокодом, которая анимирует позицию радиального градиента по клику. Если в самом низу в $(document).on("click" этот клик поменять на mousemove, то увидите как все будет дергаться (о чем я собственно и писал выше, упоминая необходимый throttle). В этой демке уже предусмотрена система остановки анимации и старта новой. То есть если во время анимации кликнуть по блоку снова, то анимация корректно переедет в новое место. Но с mousemove без throttle по виду забивается весь тред при быстром движении мышью и получается веселуха.
    Ответ написан
  • Как добиться плавности высоконагруженной анимации?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Так как я уже убитый после рабочего дня и войны с кастомными скроллбарами, то полного ревью по веб-перфу дать не смогу. Но по мелочам пробежаться могу.
    1) Вот так выглядит таймлайн сайта, после полного скролла вниз, а затем вверх (смотреть на верхний график).
    YjaRo9S.png
    Если в кратце, то все печально :) На всех переходах фпс стабильно падает до 30 (и иногда ниже). Ваша цель - 60 фпс в среднем, и не ниже 40 на паре-тройке фреймов при переходах.
    Если вы чайник в замерах веб-перформанса с помощью таймлайна (и дев тулс вообще), то вам сюда:
    а) https://developers.google.com/web/fundamentals/per... - святой грааль.
    б) https://www.udacity.com/course/browser-rendering-o... - по сути дела дополнение к текстовому варианту, но только в виде отличных видео и мини-тестами. Там же на udacity есть похожил курс от Григорика.
    в) Искать другие годные статьи в дайджестах и блогах, пилить/изучать демки и все такое.
    2) Очень беглый осмотр показал, что у некоторых элементов анимация происходит с помощью изменения таких свойств как left например (вылезающий и жутко тормозящий блок справа на 3 странице). В 90% случаев для анимации движения/перемещения/отображения прилично использовать только transform/opacity, особенно когда речь идет о больших элементах. С анимацией всяких left/top/width и подобных вещей для больших элементов можете вообще забыть о 60фпс.
    3) Основную ставку вам надо будет делать на создание отдельных слоев для элементов, проще говоря юзать translateZ/backface-visibility. Но только юзать это надо с умом, и каждый раз все профилировать через таймлайн. В веб-перфе есть одна крылая фраза "Tools, not rules".
    Ответ написан
  • Использование jQuery и AngularJS вместе. Это плохо?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Это не плохо. Ибо в самом ангуларе столько всего сделано через жопу, что использование jQuery в некоторых местах будет вашей наименьшей проблемой. Но тут очень важно понимать, где и как этот jQuery юзать, ибо простое подключение глобального файлика с jq-кодом особых результатов не даст из-за асинхронности angular'а, по этому вам все равно придется запихивать jq-код во всякие link функции и прочие места, так что код в итоге получится вполне нормальным.
    Ответ написан
    Комментировать
  • Как сделать очистку формы на JS?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Прямой ресет формы:
    $("#searchform")[0].reset();
    Ресет формы по клику на кнопку внутри самой формы:
    $('.reset').on('click', function() {
        $(this).closest('form')[0].reset();
    });

    [0] обращается к оригинальному элементу формы чтобы запустить метод ресета, которого нету в jQuery.
    Ответ написан
    Комментировать
  • Какой принцып работы якорьного progress bar-a?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Примерное описание логики без реального кода:
    1) Получаете размеры секций, на которое будут ориентироваться эти навигационные якоря (height/offsetTop).
    2) Навешиваете на глобальный скролл обработчик, который на основе текущего scrollTop и сравнения с размерами и пункта 1 будет понимать, в какой же секции вы сейчас находитесь и навешивать к нужному кружочку класс active.
    3) Полируете все это дело. Нужно будет навесить обработчик на window resize, чтобы пересчитывать размеры из пункта 1. Можно будет даже сделать, чтобы из одного кружка шла линия прогресса в другому (при разных размерах секций), но это уже из разряда извращений :)
    Ответ написан
    Комментировать
  • Блокировка скроллинга страницы при скроллинге дочернего DIV`a?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Сам неделю назад решал подобную проблему, когда необходим был скролл внутри кастомного попапа, с блокировкой скролла самой страницы. Оказалось, что если вариант с overflow: hidden; не подходит по эстетическим соображениям из-за моментально меняющей ширины страницы (пропажа скроллбара), то придется пилить велосипед. Тут реализована блокировка скролла, которая позволяет скроллить внутри контейнера, если в направлении скролла есть чего еще скроллить. То есть если убрать строчки с st > 0 (и подобной для конца скролла) , то глобальная страница будет скроллится, когда скролл попапа будет доходить до конца/начала. Ну а $(e.target).closest(popUpClass).length соответственно проверяет, находитесь ли вы внутри попАпа в общем плане, чтобы не блокировался весь скролл вообще. Ах да, тут еще блокируются клавиши для скроллинга, кроме пробела, чтобы в инпутах печатать можно было.
    Получилось примерно такое:
    var scrollKeys = [33,34,35,36,38,40];
    var popUpClass = ".%класс-активного-попАпа%";
    
    function preventScroll() {
      $(document).on("mousewheel DOMMouseScroll", "body", function(e) {
        var $np = $(popUpClass)[0];
        var st = $np.scrollTop;
        if (e.originalEvent.wheelDelta > 0 || e.originalEvent.detail < 0) {
          if ($(e.target).closest(popUpClass).length && 
              st > 0) return;
        } else {
          if ($(e.target).closest(popUpClass).length && 
              st + $np.offsetHeight < $np.scrollHeight) return;
        }
        e.preventDefault();
        e.stopPropagation();
      });
    
      $(document).on("keydown", function(e) {
        if (scrollKeys.indexOf(e.which) > -1) {
          e.preventDefault();
        }
      });
    };
    
    function returnScroll() {
      $(document).off("mousewheel DOMMouseScroll keydown");
    };
    
    // если необходимо делегирование событий, замените на mouseenter и mouseleave соответственно
    $(popUpClass).hover(function() {
      preventScroll();
    }, function() {
      returnScroll();
    });
    Ответ написан
    5 комментариев
  • Как реализовать смену класса по передвижению курсора вниз с зажатой кнопки мыши?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Код примерно будет выглядеть вот так (работает сразу для мыши и тача):
    $(document).on("mousedown touchstart", ".%класс_области_активности_ивентов%", function(e) {
      // если необходимо, сохраняем стартовую позицию ивента
      var startY =  e.pageY || e.originalEvent.touches[0].pageY;
    
      $(document).on("mousemove touchmove", function(e) {
        // получаем Y координаты во время движения с зажатой мышью/тачем
        var y = e.pageY || e.originalEvent.touches[0].pageY;
        // ваши действия со всей этой фигней
      });
    
    });
    
    $(document).on("mouseup touchend", function() {
      // отключаем обработчики маусмува/тачмува
      $(document).off("mousemove touchmove");
      // действия, которые вы возможно хотите сделать по окончании действий юзера
    });
    Ответ написан
    1 комментарий
  • Как временно убрать css transition?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Мой ответ является расширенной версией ответа Илья Шатохин про добавление класса .no-transition.
    И он в общем то полагается на костыль, но не настолько ужасный как setTimeout.
    .no-transition {
      transition: none !important;
    }

    Затем в js пишем нечто подобное
    elem.classList.add("no-transition");
    var triggerLayout = elem.offsetHeight;
    // действия с элементом которые произойдут мгновенно

    Суть такова, что работа с DOM в браузере оптимизирована таким образом, что он "группирует" все изменения и потом применяет их одновременно. Но, если в js коде обращаться к свойстам элементов, которые триггерят лэйаут, эти группы будут "дробиться" в этом месте вызова. В итоге вот эта самая строчка "var triggerLayout = elem.offsetHeight;" вызывает триггер лэйаута и операция с элементом происходит уже так, словно к нему добавлен класс без транзишена. Точно таким же образом например анимируются элементы с display: none, которые надо показать с помощью изменения opacity. Вначале вы меняете свойство display, затем триггерите лэйаут, затем добавляете класс изменяющий опасити - у вас происходит анимация. Без триггера элемент просто моментально появится.
    Таблицу css триггеров можно найти тут - csstriggers.com
    + вот тут еще пишут про это gent.ilcore.com/2011/03/how-not-to-trigger-layout-...
    Сам по себе лэйаут нужно триггерить только тогда, когда это является лучшим способом реализации анимации, ибо это влияет на производительность. На эту тему (и многие другие вещи) вам сюда - https://developers.google.com/web/fundamentals/per...
    Ответ написан
  • Как быстро войти в технологический пик html5 верстки?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Вариант с обучением через верстку .psd макетов вас до "пика" не доведет. Максимум до уровня рядового "верстальщика". Сверстать статику может каждый второй, кто хоть иногда этим занимается. Если вы нацелены на реальный "пик", то вам надо учиться на основе живых примеров уровня www.awwwards.com www.cssdesignawards.com и www.thefwa.com
    Копайтесь, смотрите что как сделано, пытайтесь сами воссоздавать отдельные куски "не смотря под капот" (то есть только на основе того, что вы видите, не залезая в F12). Но перед этим вам надо будет нагнать основы, то есть все что связано с css трансформами, нестандартными лэйаутами и другими трендами дизайна, а то иначе когнетивный диссонанс вам обеспечен. После этого будете долго практиковать анимации, свг, 2d-canvas и в самом конце возможно даже WebGL. Обязателен к употреблению codepen.io
    Ну а если прочитав все это вы вдруг поняли, что вас на самом деле не интересуют всякие нестандартные промо-сайты, а вам просто надо уметь верстать странички для стандартных интернет-магазинов или еще чего подобного, то вам достаточно будет потратить 1-2 месяца на чтение вводных статей и начать штамповать сайты на бутстрапе. Вот.
    Ответ написан
    3 комментария
  • Нужны ли углубленные знания javascript angular-разработчику?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Если речь идет о чем то примитивном, типа вывести данные в шаблон и забыть, то с таким кто угодно справится, ибо изначально ангулярчик был запилен с расчетом на дизайнеров и бэкендщиков. Но как только потребуется написание чего-то сложного, изменение некоторых кусков фреймворка под себя, уверенной работы с директивами и так далее, то пиши пропало. С ангуларом очень легко начать, но потом оказывается что там все нихрена не просто и без пол-литра не разобраться (и постоянно надо воевать с фреймворком). Так что с 99% вероятностью ты превратишь проект в jQuery-лапшу уже через неделю, и любой нормальный разработчик, заглянувший внутрь, захочет повеситься.
    И вообще, уровень js-garden это прям совсем дно дна, рановато вам еще пользоваться фреймворками.
    Ответ написан
    Комментировать
  • Есть ли библиотеки для организации интерактивных подсказок в интерфейсе?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    bootstraptour.com
    usablica.github.io/intro.js - с оврелеем.
    + на каком-то сайте видел тур как во втором примере, но с красивыми и реалистичными кривыми стрелочками на канвасе. Но боюсь что там было свое решение.
    Ответ написан
    Комментировать
  • Как сделать движущиеся полоски на заднем фоне?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Сделано это с помощью canvas'а, размещенного по центру. js у них минифицированный, так что вам самим все придется писать. А уж как это написать, ну это уже совсем другая история, и тут вам вряд кто-то будет такое кодить :)
    Ответ написан
    Комментировать
  • Объясните как исправить ошибку Javascript?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    У вас там используется jQuery метод .live, которых сдох уже пару лет назад и не поддерживается начиная с 1.7 или 1.6 версии примерно. А в данный момент у вас стоит 1.11 версия, то есть современная. Вам либо код переписывать (менять live на on и все такое), либо ставить древнюю версию jQuery, если в данный момент нет возможности перелопатить код.
    Вот собственно сама строчка кода, на которую матерится браузер (там еще и другие такие есть, если что):
    $('#cart > .heading a').live('click', function() {
    Ответ написан
    3 комментария
  • Vh - px. Как правильнее реализовать?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    1) calc про который вы уже написали сами
    2) Js (так себе вариант)
    3) Использовать padding-top: 120px для header, а nav поместить вверху с position: absolute. Внутри header создать блок с height: 100%, он в свою очередь благодаря паддингу родительского элемента займет все оставшееся пространство, вычитая паддинг. И там уже делайте что-хотите.
    Естественно у header должен быть position: relative и для элементов должен быть задан box-sizing: border-box;
    Ответ написан
    6 комментариев
  • Какие хардкорные книги по JavaScript можно почитать?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Хочется хардкора - читайте статьи в интернетах. Книги это больше про структурированную информацию и закрепление знаний. По крайней мере сколько я не начинал читать js-книг для "профессионалов/ниндзя/магистров" везде меня ждали одни и те же вещи, либо что-то устаревшее. А вот в интернетах непаханое поле из хардкорных статей и демок. Искать их правда не так просто, обычно такие вещи попадаются случайно.
    Ну и если вы прям совсем-совсем хардкора ищите, то вам на гитхаб, читать исходники крутых и известных библиотек/фреймворков. Например в исходниках монструозного ангуляра можно найти много всяких фишек и крутых решений (речь именно об отдельных частях).
    Update: ну и если вам обязательно нужна книга (читать в метро или на диване), то могу посоветовать как минимум одну - Async Javascript (www.amazon.com/Async-JavaScript-Responsive-Pragmat...)
    Скажу честно, я её даже не осилил до конца, у меня в какой-то момент мозг расплавился от асинхронности :) Хотя пробовал я её еще более зеленым, надо бы дочитать сейчас.
    Ответ написан
    1 комментарий
  • Анимация при удалении класса jquery?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Какие то ужасные советы выше перечислены, не советую вообще использовать стандартные методы jQuery для анимации.
    В вашем случае анимация при убирании класса не срабатывает, ибо собственно она привязана к этому классу. Вам необходимо задать свойство transition для самого элемента .panel
    .panel {
      transition: transform 0.7s;
    }
    Ответ написан
    2 комментария
  • Объясните коротко, по делу что же лучше/производительнее/удобнее и в каких ситуациях?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Давно приучил себя к следующей структуре:
    $(document).on("%eventType1% %eventType2% %eventTypeN%", "%classSelector1%, %classSelectorN", function() {
      //code
    });
    // ну и соответственно исключения для window вида $(window).on("resize", function(){});

    Про всякие микрооптимизации ради невызова 1-2 функций забудьте, в любом случае все эти операции под капотом слишком незначительны в сравнении с прожорливостью манипуляций с самим DOM'ом.
    Лучше абсолютно всегда делать все через делегирование ивентов, чем один раз забыть и сидеть потом час ломать себе мозг "а почему не работает" (с динамически добавленными элементами).
    Ответ написан
    Комментировать
  • Как сделать, что высота DIV подстраивалась по высоту экрана?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    1) Viewport единицы. В данном случае 100vh. Поддержка вот такая caniuse.com/#search=viewport
    2) Если ваш див не находится где то глубоко в разметке, а лежит прямо в body (или глобальном контейнере), то можно сделать вот так:
    html, body {
      height: 100%;
    }
    .container { // если имеется
      height: 100%;
    }
    .block {
      height: 100%;
    }

    Так как мы не задаем overflow: hidden для body или контейнера, то с ними ничего плохого не произойдет, контент по прежнему будет адекватно отображаться и скроллится.
    Ответ написан
    Комментировать
  • Какой базовый набор знаний для frontend developmenta?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Лучше на достаточно хорошем уровне изучить html+css+js (ваниллу+jQuery) и только потом смотреть в сторону фреймворков. Фрейморвки конечно вещь крутая, но их слишком много (или они слишком громоздкие). Отличные познания в js, и фронтенде в целом, не денутся никуда, а вот знания полученные от изучения особенностей и внутренностей какого-нибудь монструозного ангуляра могут с легкостью превратиться в тыкву с выходом, допустим, второй его версии (не все конечно, но большая часть). Все таки фреймворки это вещи уже под конкретные задачи, и они чаще всего рассчитаны на команды.
    Ответ написан
    3 комментария