• Возможно ли с SVG сгенерировать JSON для lottie-react?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Во-первых из вопроса нужно убрать реакт. Lottie - это самостоятельный инструмент, который к реакту никакого отношения не имеет. Его прародитель, Bodymovin, был расширением для After Effects, позволяющим экспортировать анимации оттуда. Сейчас это все развилось в целую экосистему для дизайнеров, и там чего только нет. Плагин для AE - это теперь малая часть экосистемы. А фронтендерский пакет lottie-react - это просто обертка над местным плеером, не более того.

    Вы можете по-старинке взять After Effects, импортировать SVG туда, там все анимировать, и потом оттуда экспортировать с помощью плагина Lottie, и загрузить к нам во фронтенд. Альтернативно вы можете взять их собственный редактор (на сайте Lottie есть все, что нужно знать про него). Что там, что там - будет нужно погрузиться в локальную специфику работы с этими программами, на какие кнопочки тыкать. По идее это зона ответственности моушн-дизайнера, а не программиста-фронтендера. Если у вас в проекте все завязано на Lottie - где-то поблизости должен быть и дизайнер, который работает или с AE, или с их собственным редактором. Если вы не умеете - он умеет. Тут не нужно изобретать новые инструменты. Все уже есть. Работайте по стандартной схеме.

    Но если смотреть на вопрос в вакууме, со стороны фронтенда, то в текущей формулировке все звучит так, что вы хотите взять что-то, что уже находится в мире фронтенда, вынести в мир Lottie, а потом внести обратно. Это выглядит как усложнение ради усложнения. Иногда такой подход можно объяснить, но не всегда. Учитывая простоту вашей анимации - возможно имеет смысл рассмотреть что-то из стандартных фронтендерских инструментов? У нас есть по крайней мере три способа анимировать SVG нативными средствами. Возможно, что в конкретном случае проще будет не ввязываться в зависимость от Lottie.
    Ответ написан
    Комментировать
  • Как сделать такой эффект?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Там весь сайт - это по сути видео-презентация, где на каждом экране пользователю показывается новое видео. Фронтендерские навыки тут особо и не нужны.

    Выбор видео в данном случае решает два вопроса - экономию бюджета и обеспечение качества:

    • Все это может делать один дизайнер (+ опционально 3D-художник) в специализированных программах. Это быстрее, чем руками кодировать (быстро = дешево). Дальше мы просто вставляем результат в страницу. Соответственно не нужен фронтендер, понимающий в компьютерной графике (таких долго и дорого искать), не нужно воссоздавать визуально сложные и утвержденные заказчиком эффекты на фронтендерских технологиях (это просто боль, плюс сроки, и, опять же лишний бюджет).
    • Вопросы производительности отсутствуют. В теории можно взять WebGL и рендерить все на устройстве пользователя. Но на самом деле рассчитывать хитрое освещение в реальном времени всегда проблематично - там куда ни плюнь будут вычислительно-сложные алгоритмы. Что делать с ноутбуками со встроенной графикой или с телефонами? Это вечный вопрос. Часто такие проекты горят именно на том, что на старте разработчики не осознают, насколько там на самом деле требовательные алгоритмы, и к дедлайну все безнадежно тормозит. Приходится сильно упрощать картинку, жертвовать качеством изображения в угоду производительности. Чтобы в это не вляпаться, презентации товаров рендерят заранее (можно несколько секунд презентации хоть всю ночь рендерить), сохраняют или в видео, или в набор картинок, и уже их показывают конечному пользователю. Это стандартная практика.
    Ответ написан
    Комментировать
  • Микроразметка не видна - как исправить?

    sfi0zy
    @sfi0zy Куратор тега HTML
    Creative frontend developer
    Такие вещи всегда лучше для начала проверять с помощью официального Schema Markup Validator + Rich Results Test от Google. Первый проверит, что все ок с синтаксисом (вне зависимости от поисковых систем), а второй - что конкретно Google может посчитать странным. В данном случае синтаксически все хорошо, но Google докапывается до отсутствующих position и говорит, что без них не будет эти данные использовать. В примере для itemListElement (во вкладке microdata) можно посмотреть, куда эти мета теги с position добавить. Вероятно вам стоит все ваши страницы прогнать через эти сервисы и посмотреть, что там еще не так.
    Ответ написан
    9 комментариев
  • Как сделать подобную анимацию?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Никакой Three.js тут не нужен. Ну то есть, конечно, никто не мешает сделать все это на WebGL и прикрутить здоровенный фреймворк сверху, но все же это будет слегка избыточным решением в большинстве случаев. Такое можно аргументировать только если весь сайт изначально так и делается на WebGL и это просто "один из" эффектов, которые туда нужно интегрировать.

    В 99% остальных случаев подобные штуки делаются одной svg-картинкой, одним path, который рисуется в зависимости от положения мышки и размеров контейнера. Немного школьной геометрии, ограничение диапазона возможных смещений всего этого - и дальше можно до посинения играть с алгоритмом расчета смещения, до тех пор, пока реакция на мышку не начнет нравится. Там уже нет универсального рецепта, все от дизайна зависит. Можно линейно привязать к положению мыши. Это обычно выглядит скучно. Можно использовать какую-то функцию от расстояния до центра, чтобы сделать движения менее равномерными. В каких-то случаях делают полноценный эффект инерции, как верно подмечено в соседнем ответе. Там получаются более естественные движения (обычно все это является развитием гравитационных моделей). Есть совсем замороченный подход, когда используется моделирование системы пружин (для общего развития можно загуглить силовые алгоритмы визуализации графов). Там можно получить целый ряд занятных эффектов, которые часто оказываются в тему как раз в таких фонах, где какие-то штуки связаны между собой прямыми линиями. Ну и можно просто вдохновиться какими-то физическими явлениями и сделать что-то "по мотивам".

    Ответ написан
    22 комментария
  • Почему в normalize.css выдает две ошибки?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Вероятно вы используете либо встроенный в VSCode линтер для CSS, либо stylelint. С настройками по умолчанию они оба сообщают о наличии префиксов у CSS-свойств. В случае со встроенным линтером - у него есть настройка css.lint.vendorPrefix, смысл которой в том, что к свойству с префиксом нужно добавлять свойство без префикса, и если его нет, то это выглядит странно. В случае со stylelint - есть правило property-no-vendor-prefix. Там логика другая - в нормально выстроенном процессе сборки всю работу с префиксами на себя берет autoprefixer, соответственно само появление префиксов в коде выглядит как что-то лишнее. Если они добавляются автоматически, то писать их самому в обычных ситуациях вроде как не нужно.

    В normalize.css эти префиксы нужны, именно в том виде, в котором они там есть, чтобы подровнять стили между разными браузерами. В этом его задача. Так что предупреждения от обоих линтеров в данном случае не имеют практического смысла. Этот файл такой, какой есть, и мы не будем его трогать. Можно добавить этот файл в исключения, чтобы замечания по нему не мозолили глаза.
    Ответ написан
    Комментировать
  • Как сделать глобальный node_modules или как не дублировать одни и те же пакеты между проектов?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Вероятно вам нужно смотреть на что-то вроде pnpm. Этот инструмент как раз создает единое хранилище пакетов и потом ссылается на файлы в нем вместо скачивания всего по 100 раз.
    Ответ написан
    Комментировать
  • Можно ли опустить первые 0% в linear-gradient?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Да, можно пропустить первое значение в 0%. Если почитать стандарт, то там прямым текстом написано, что эти значения, где расположить цвета на градиенте - не обязательные. Можно вообще все пропустить. Если они пропущены, то расположение цветов в градиенте восстанавливается по четкому алгоритму.

    В целом ответы на подобные вопросы о тонкостях интерпретации CSS имеет смысл искать в стандартах.
    Ответ написан
    2 комментария
  • Как анимировать такой фон?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Неоднородные плавные искривления никак не получится сделать в рамках CSS или SVG. Плюс волна трехмерная, поэтому изобретать что-то в 2d-канвасе будет непрактично и скорее всего сложно в плане производительности. Поэтому использование WebGL - это естественный выбор. Конкретные библиотеки/фреймворки не имеют значения, в конечном счете все такие волны сводятся к простой схеме:

    1. Берем плоскость
    2. На плоскость накладываем какую-нибудь красивую текстуру
    3. Добавляем вершин побольше
    4. В вершинном шейдере делаем какой-то генератор шума и используем значения из него чтобы двигать вершины туда-сюда в направлении, перпендикулярном плоскости
    5. Опционально там же рассчитываем нормали для освещения
    6. Играемся с коэффициентами до посинения, пока результат не начнет нравиться


    Ответ написан
    Комментировать
  • Почему canvas на телефоне работает по другому?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    В codepen я нашел интересный проект...

    Это WebGL Fluid Simulation. И оригинальная ее версия на телефонах работает хорошо. Вы нашли какую-то из вариаций на тему этой штуки. Думаю для вас будет проще взять оригинал, а не отлаживать тот пример, который вы нашли.
    Ответ написан
    1 комментарий
  • Почему bottom:0 не работает?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Использование position: relative совместно со свойствами top, right, bottom или left смещает элемент относительно его естественного расположения на странице. Поэтому все работает так, как и должно. Ваш main естественным образом расположен в верхней части родителя и смещен на 0px. Ну то есть никуда не смещен.

    Вероятно вы получите нужное вам поведение если будете использовать position: absolute.
    Ответ написан
    Комментировать
  • Как добавить класс если в блоке что то есть?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    через css хочу скрыть его, когда пуст

    В такой формулировке можно обойтись без дополнительных классов:
    .wishlist_products_counter_number:empty {
        display: none;
    }
    Ответ написан
    1 комментарий
  • Как быть с анимацией в Firefox?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Это известный баг у масок в Firefox. Проявляется и с mask, и с clip-path. Суть проблемы в том, что маска применяется уже после трансформации, после поворота, и при расчете ее границ возникают сложности с округлениями до целого количества пикселей. Браузер не знает, в какую сторону лучше округлять. В результате для каких-то пикселей на границах маска применяется не так, как мы ожидаем, ее граница как бы смещается на 1px. Самый простой и безболезненный способ избавиться от проблемы в вашем конкретном случае - избавиться от масок. Нет маски - нет проблемы. Исходя из вашей задачи ничто не мешает использовать svg-иконки сразу, как есть, в виде обычных картинок, без нагораживания всей этой истории с белым квадратом, который потом обрезается.
    Ответ написан
    4 комментария
  • Шрифты по разному ведут себя в консоли и на реальном устройстве, почему?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Прежде, чем ломать голову над тем, проблема это в эмуляторе в Chrome или нет, стоит проверить, а воспроизводится ли проблема в других браузерах или даже в самом Chrome, если само его окно поменять в размерах. И да, воспроизводится. Текст обрезается то сверху, то снизу. Это не проблема эмулятора. Нужно смотреть логику в коде, кто смещает текст.

    А в коде на некоторых разрешениях экрана вы тексту добавляете padding сверху. А на некоторых - не добавляете. Вот он и ездит вверх-вниз внутри контейнера с overflow: hidden и обрезается. А звездочкам с абсолютным позиционированием на padding все равно, они не ездят. Это то, что нужно исправить.

    По поводу эмулятора в Chrome: он всегда имел сложности с единицами vh/vw. С годами его поведение менялось, но в целом все его тараканы в голове всегда можно было прибить с помощью мета тега для вьюпорта. Вы его используете только чтобы задать изначальное масштабирование, но там еще есть возможности для ограничения - minimum-scale, maximum-scale и грубое user-scalable. С ними нужно быть осторожнее в продакшене, чтобы не ломать людям доступность, но в каких-то замороченых случаях отладки можно применить, чтобы забрать у эмулятора возможность что-то масштабировать и странно трактовать единицы измерения. Но, еще раз, практика эта странная, ваше верстка должна работать без таких ограничений.
    Ответ написан
    Комментировать
  • Почему на windows возникает ошибка, а на linux работает?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    В документации moment.js говорится, что для парсинга строки (когда мы делаем moment(String)) эта самая строка должна соответствовать одному из форматов ISO 8601. В случае если строка стандарту не соответствует - работа во всех браузерах не гарантируется. Там есть специальное предупреждение по этому поводу и примеры строк, которые будут соответствовать. Вероятнее всего вы столкнулись именно с этим - ваши даты не парсятся в определенных браузерах.
    Ответ написан
    Комментировать
  • Как стилизовать список?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    нужно, чтобы строки при переносе начинались с отступом

    В свойстве list-style не нужен inside. Форматирование "с отступом" - это форматирование, которое применяется по умолчанию. Просто не меняйте то, что и так работает.
    Ответ написан
    Комментировать
  • Как сделать, чтобы высота iframe была равна соотношению 16:9?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    пропорции 16:9

    Ну так:
    .whois-video {
        aspect-ratio: 16 / 9;
    }

    И да, это уже можно делать. Пора уже забыть эти хаки с padding.
    Ответ написан
    Комментировать
  • Как сделать эффект движения за курсором?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    На этом сайте используется какая-то из версий WebGL Fluid Simulation.
    Ответ написан
    1 комментарий
  • Как реализовать такую таблицу с затемнением?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    В таких штуках самое главное - это свести цвета на пересечениях линий. Просто вставить линии-градиенты на всю ширину-высоту таблицы картинками тут не прокатит т.к. пропорции ячеек могут меняться и цвета на пересечениях будут расходиться. Вариант наложить на всю сетку SVG-маску тоже отпадает по этой же причине - она будет расходиться с пропорциями конкретных ячеек и будет ломаться логика, в каких пределах должно происходить затемнение. Поэтому, вне зависимости от выбора CSS-свойств, все будет сводиться к одной и той же идее, что мы должны сделать границы для всех ячеек в центре стандартным образом, а для первой и последней колонки и первой и последней строки нарисовать кастомные границы. Как вариант:



    Код с повторениями почти одного и того же, вероятно его можно сократить в какой-нибудь хитрый миксин, но конечная идея примерно такая.

    P.S.: И тут, по хорошему, стоит уточнить у дизайнера, как он видит длину затемнения в процентах от длины ячейки, особенно когда они сильно отличаются по пропорциям. Здесь градиенты от края до края, но, возможно, что в вашем случае нужно делать градиент не от 0% до 100%, а от 0% до какого-то другого значения, возможно зависящего от размера шрифта, а дальше уже заканчивать одним цветом.
    Ответ написан
    1 комментарий
  • Как вивести на экран камеру?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    var video = document.querySelector('video');

    У вас в body нет ни одного тега video, соответственно с помощью querySelector не находится ничего, переменная video равна null, и дальше все ломается. Добавьте тег video и все заработает.
    Ответ написан
    1 комментарий
  • Почему свойство transform-origin не работает для rotate() внутри svg-изображения?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    В SVG условный transform-origin всегда находится в координатах (0,0) координатной плоскости. Его нельзя изменить. Если мы пытаемся задать его в CSS, то логика работы трансформаций в CSS входит в явный конфликт с логикой работы трансформаций в SVG, и там каждый браузер интерпретирует происходящее на свой вкус (тут есть старая, но все еще годная статья по теме). В последние годы, со всеми этими сменами движков у браузеров, вкусы начинают двигаться в одну сторону, но бардак все еще присутствует. Но всегда можно сделать старую добрую матрешку:

    <!-- 90 = x + width, 168 = y + height - правый нижний угол книги -->
    <g transform="translate(90, 168.5)">
        <g id="book">
            <rect class="fil0 str0" x="60" y="18.5" width="30" height="150" transform="translate(-90, -168.5)" />
        </g>
    </g>


    Убираем transform-origin из CSS, чтобы не было конфликтов, смещаем нужный центр трансформации в координаты (0, 0), применяем там трансформацию, смещаем обратно, где он должен быть.
    Ответ написан
    3 комментария