Ответы пользователя по тегу JavaScript
  • Как лучше анимировать svg?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Зависит от того, что именно вы хотите анимировать в svg. Кому то трансформаций хватит, а кому-то нужны сложные анимации для path со всякими кастомными приблудами.
    Универсальные варианты - GSAP и D3. Гсап чисто заточен под анимации, и там имеется большое количество готовых решений/плагинов для свг. Если вам необходимо сделать крутую и комплексную анимацию, то это наверное самый оптимальный вариант. D3 тоже хорош, но он больше рассчитан на работу с данными, и для всяких красивяшек-анимашек не особо подойдет.
    Есть еще velocityJS и подобные либы, но они все по сути дела являются лайт-версиями Гсапа (при том что у самого гсапа есть более легкие его версии).
    CSS умеет многое, с ним можно даже анимировать отрисовку path и подобные штуки, но он вообще не дружит ни с какими ИЕ, когда дело касается работы с path (+ в ФФ имеются проблемы с transform-origin). Примеры баловства с svg лоадерами на чистом css:
    codepen.io/suez/pen/myvgdg
    codepen.io/suez/pen/ogmMOM
    codepen.io/suez/pen/MwJdRy

    Если вам необходимо сделать что-то совсем уж кастомное и крутое, и при этом вы совершенно не уверены что либы в этом вам помогут (либо нет такого функционала, либо пока научитесь его юзать - сойдете с ума), то придется писать велосипеды на js. requestAnimationFrame и в бой. Вот два велосипеда для примера - codepen.io/suez/pen/oXLroX и codepen.io/suez/pen/emjwvP

    Ах да, еще есть SMIL анимации (которые прямо внутри SVG описываются) и они умеют очень многое (во многом даже удобнее js получаются, без потери в функциональности), но от них уже медленно отказываются современные браузеры (да и к тому же они никогда не поддерживались в IE). Так что их можете обходить стороной.
    Ответ написан
  • Как сделать такой паралакс?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Писать код очень лень, напишу примерно возможные варианты:
    1) Использование css blend-modes. Но мне кажется что с неоднородной картинкой не прокатит такое.
    2) Дублировать этот заголовок, поменять его цвет, поместить его внутрь скошенного контейнера, повернуть его в обратную сторону с помощью skew (вы ведь скошенный контейнер через skew будете делать) и с помощью translateY все это дело двигать (аля контейнер двигается вверх, а заголовок вниз). В виде описания возможно выглядит сложно, но как только вы накидаете какой-нибудь кривой пример, станет куда проще.
    Вот например 2 демки с похожим эффектом маски (только без скошенных углов, но это по сути дела 1 свойство добавить):
    codepen.io/suez/pen/XJGOyL - здесь текст в пунктах меню "перекрашивается" в белый, хотя на самом деле внутри перемещающегося блока просто расположен дубликат списка, который движется в обратную сторону, во время движения самого блока.
    codepen.io/suez/pen/kqlIJ - моя самая первая демка на эту тему, код там скорее всего жутковатый, но зато можно легко понять как работает этот mask эффект через F12.
    Ответ написан
    Комментировать
  • Как заставить 'reduce' изменять 'this' а не возвращать новый объект?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Почему бы не написать что-то такое:
    beers.reduceBeers = function () {
    return this.filter(function(el) {return el === 'domestic'});
    };

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

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Под ваше описание подходит второй пример из этого гсап плагина - https://greensock.com/draggable
    Если я конечно правильно понял что вам необходимо.
    Ответ написан
    2 комментария
  • Как отслеживать коллизии SVG объектов?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    https://greensock.com/draggable - вот это посмотрите. Сам не юзал, но по описанию подходит. + мне знающие люди советовали это в некоторых случаях.
    Ответ написан
    2 комментария
  • Что лучше для svg-анимаций snap.svg или velocity.js,?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Velocity это по сути дела лайтовая надстройка над jQuery. В плане фич/производительности она с лихвой проигрывает Snap/GSAP. Лучше всего юзать GSAP, ибо эта либа подходит для анимации вообще всего, а не только svg.
    Ответ написан
    1 комментарий
  • Как правильно вызывать функции по ресайзу Javascript?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Не до конца понял что конкретно требуется, но обычно все делаю так:
    1) Создается функция, внутри которой лежит логика ресайза, и эта функция оборачивается в debounce функцию
    // обычно беру debounce функцию отсюда http://davidwalsh.name/javascript-debounce-function
    // ибо подключать ради неё какой-нибудь underscore/lodash это overkill
    function debounce(func, wait, immediate) {
    	var timeout;
    	return function() {
    		var context = this, args = arguments;
    		var later = function() {
    			timeout = null;
    			if (!immediate) func.apply(context, args);
    		};
    		var callNow = immediate && !timeout;
    		clearTimeout(timeout);
    		timeout = setTimeout(later, wait);
    		if (callNow) func.apply(context, args);
    	};
    };
    
    var resizeFn = debounce(function() { /* your logic */ }, 100); // 100 это собственно таймер дебаунса, то есть функция будет срабатывать только тогда, когда после последнего её вызова прошло минимум 100ms
    // прикрепляем функцию к обработчику события
    $(window).on("resize", resizeFn);

    2) Ну и так как вам необходимо все это дело триггернуть на загрузке страницы, то просто пишите resizeFn();и все.
    Это то что вам необходимо?
    Ответ написан
    Комментировать
  • Реализация блочного скролла?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Как называется такая прокрутка контента? - вот здесь я давал ответ по точно такому же вопросу.
    Ответ написан
    1 комментарий
  • WebAssembly заменит JS?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    www.2ality.com/2015/06/web-assembly.html - 3 пункт. Акселю можно верить, он крутой.
    Ответ написан
    Комментировать
  • Есть ли сервисы по антиминификации кода?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    В хроме можно при просмотре css/js в F12 просто кликать по фигурным скобочкам слева снизу и будет все ок.
    H8yt7vB.png
    Ответ написан
    Комментировать
  • Как при помощи js присвоить класс атрибуту svg path?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Все довольно просто - jQuery не умеет в добавление классов к svg. Хотите добавлять класс - юзайте нативный js. jQ вообще очень много чего не умеет с svg. Да и вообще с свг много своих "фишек", которые вы освоите только с опытом. Например classlist api, которому так все радуются в ванилле, вообще не умеет работать с свг в ИЕ.
    Вот простая демка - codepen.io/suez/pen/634874e5486fcea55c7e9f8053d49e54
    Слева попытка добавить при клике класс на jQuery, справа на ванилле. Заодно можете и в ие посмотреть, там оба варианта не сработают :)
    Ответ написан
    3 комментария
  • Как лучше реализовать такую круговую навигацию?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    1) Свг. Оно для этого лучше всего подходит. Денис посоветовал D3, это наверное самый классический вариант.
    2) Можно на канвасе. Но на фоне свг это оверкилл, и его надо юзать только если вы захотите сделать что-то невероятно уникальное с какими-то неприлично крутыми эффектами.
    3) Можно на css. Валентин дал ссылку на codrops демку, но есть еще более старая и не менее крутая версия - stackoverflow.com/questions/13132864/creating-a-ra...
    Правда там имеются некоторые проблемы, ибо демку с тех пор никто не фиксил, скинул просто для ознакомления с "темной магией".
    Так же еще чекните вот это - sarasoueidan.com/tools/circulus
    Крутой интрумент от Сары, с помощью которого можно кастомизировать меню как следует. Но оно в плане дизайна не совсем подходит в вашем случае.
    Ответ написан
    1 комментарий
  • Python/Django-кидди, SQL-мартышка, Web-негр — что перспективнее (Ага, «Pre-Junior»)?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Если у вас нету реального опыта над "боевыми" сайтами и подобными вещами, то одназначно 1 вариант. Можно сколько угодно читать книжки и заниматься самообразованием, но без старта в офисе под присмотром более опытных коллег, результаты будут плачевными скорее всего. Это просто аксиома, надо поработать вначале 4-12 месяцев в офисе, пиля живые сайты/проекты и впитывая знания от "старших", а дальше будет намного проще.
    2 вариант подходит только если вас действительно к этому тянет.
    3 вариант звучит крайне сомнительно, ибо опыта для полноценного фриланса у вас по сути дела нет. С проектом то вы может и справитесь, но что вы будете делать после его окончания? Этот же заказчик вряд ли завалит вас новой работой, а скиллами для эффективного фриланса за 1 проект вы точно не обзаведетесь. Есть риск после этого погрязнуть в болоте под названием "русские фриланс биржи", где вы с большой вероятностью будете биться на смерть со школьниками за самые примитивные и убогие задачи, типа "сверстайте 10 страниц и натяните их на вордпресс за 5к рублей".
    Вначале надо выбирать такую работу, где собственно будет много этой самой работы и развития (не без помощи более опытных коллег). А после получения стартового буста сориентироваться будет намного проще.
    Ах да, если вы действительно хотите работать 5-7 лет в Краснодаре, то это эээ... весьма мрачное виденье своего будущего. Через 1.5-3+ года (зависит от области) можно будет без проблем начинать думать о фрилансе в валюте (при учете интенсивного развития).
    Ответ написан
    4 комментария
  • Как сверстать данный (нестандартный) блок?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    clip-path: polygon для современных вебкитов/блинков. Весьма легко кастомизировать, можно всякие параллаксы сделать и при этом производительность будет хорошая.
    Svg clippath для более серьёзной поддержки.
    Можно нашаманить что-нибудь с transform: skew, но чую что решение будет похоже на один большой хак + будет пиксельная лесенка.
    P.S. - все написанное выше подразумевает, что вам это обязательно надо сверстать не с помощью картинки, то есть в этом должен быть какой-то смысл (эффекты/параллакс/что-то еще). Если то, что изображено на скриншоте, будет статичным (я про эти полигональные фоны), то проще сделать картинкой, у которой нижняя левая часть (там где обычный светлый фон) будет прозрачной.
    Ответ написан
    7 комментариев
  • Производительность canvas анимации?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    codepen.io/suez/pen/2ab9aaf1b3290ea5ebdcbaee61898f64 - похоже на необходимый эффект?
    В общем перепробовал массу способов, вариант с margin самый адекватный. При использовании translate все дергается при анимации, видимо из-за sub-pixel rendering.
    Я естественно позволил себе сделать прототип с использованием вьюпорт едениц, но по виду и вы их юзать можете, раз уж вы пытались юзать clip-path с куда более скромной поддержкой :)
    Для того чтобы расположить элементы не в % величинах (там где у меня юзается left: 20% например), надо будет либо хардкодить свои цифры, либо просто юзать calc(), считая отступ центра кружка относительно вертикального центра страницы.
    Ответ написан
    Комментировать
  • Как сделать смену текста на лендинге по таймеру?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    2 варианта, придуманных за полминуты:
    1) Если слоганы не будут менять/добавлять (или будут делать это очень редко) и не нужна будет смена слоганов по клику юзера, то создаешь блоки со слоганами в html, ставишь их в одном месте через position: absolute (например внутри основного контейнера слоганов) и затем пилишь keyframes анимации на css, которые циклично будут показывать/прятать нужные блоки изменяя opacity и прочие штуки, типа трансформов.
    2) Если слоганы надо подгружать с бэкенда где их будут часто менять/добавлять, то так же запихиваешь их в разметку, добавляя первому элементу со старта класс active, затем на js через $(".text-block").length получаешь их количество, создаешь переменную инкременту и setInterval. Внутри интервала с нужным тебе шагом увеличиваешь инкременту, и к нужному блоку добавляешь класс active, убирая его же с других блоков. То есть что-то такое в итоге:
    var len = $(".text-block").length;
    var intervalCounter = 1;
    setInterval(function() {
      intervalCounter++;
      if (intervalCounter > len) intervalCounter = 1;
      $(".text-block").removeClass("active");
      $(".text-block").eq(intervalCounter - 1).addClass("active");
    }, 5000);

    Если потребуется реализация смены слоганов при клике юзера, то заменяешь интервал на setTimeout, который вызывает сам себя, а на click биндишь очистку таймаута, изменение инкременты, смену классов и запуск таймаута. Часть этого кода тогда лучше будет обернуть в отдельную функцию.
    Анимации соответственно будут реализованы с помощью css transition, и будут срабатывать при добавлении/убирании класса.
    Ответ написан
    Комментировать
  • Почему не работает массив ссылок jquery?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Вы отменяете стандартное действие по клику на span (которого в общем то и нет), и затем идет всплытие ивента, которое триггерит стандартный ивент при клике на анкор. Вам либо надо предотвращать всплытие, с помощью e.stopPropagation(), либо биндить перехват ивента конкретно на a, а не на спан внутри a.
    Ну и к тому же конструкция с toArray.forEach кривая, вам надо делать как написано в ответе Kir ---
    Ответ написан
    Комментировать
  • Зачем нужна конструкция var App = App || {} в JavaScript?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    stackoverflow.com/questions/6439579/what-does-var-... - вот тут хорошо отвечено.
    Если в кратце, то допустим у вас один используемый namespace в двух файлах. При инициализации кода из 1 файла вы не находите такой объект и создаете новый, добавляя в него функцию1. Затем инициализируется второй файл, видит что объект уже создан и просто добавляет в него функцию2.
    Ответ написан
    2 комментария
  • Как отменить прокрутку страницы наверх при клике по пустой ссылке?

    Ronnie_Gardocki
    @Ronnie_Gardocki
    Я у мамы фронтендщик.
    Это напрямую связано с тем, что ваши радио кнопки имеют такие стили:
    input[type="radio"] {
        position: absolute;
        top: -9999px;
        left: -9999px;
    }

    При клике на них, браузер пытается перевести окно к их положению.
    Задайте им примерно такие стили:
    .hidden-radio {
      position: absolute;
      left: 0;
      top: 0;
      opacity: 0;
      z-index: -9999;
    }

    Опасити спрячет кнопку визуально, отрицательный z-index сделает их некликабельными/неактивными для hover'а.
    Ответ написан
    1 комментарий