Ответы пользователя по тегу JavaScript
  • Как сделать анимацию кардиограммы?

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

    Ответ написан
    6 комментариев
  • По какому принципу работают плагины «линейки» в браузере?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Плагин Dimensions замеряет расстояния через canvas. Реализация выглядит достаточно сложно...

    Глаза боятся, а руки делают. Реализация не такая уж и сложная. Если на пальцах, то основной скрипт в основе dimensions берет данные по цветам всех пикселей картинки, координаты, откуда начать, а дальше просто ходит влево, вправо, вверх и вниз по пикселям и смотрит, насколько они отличаются по цвету. Если сильно отличаются - значит у нас нашлась граница между элементами. Сколько пикселей насчитал до границы - столько и показывает нам в ответ. И дальше весь вопрос в том, откуда взять картинку и координаты. В случае с расширением для браузера - он делает скриншот страницы и берет текущие координаты мышки. Но можно этот скрипт и отдельно от расширения использовать, просто скармливая ему свои картинки и координаты - это универсальная штука.

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

    Если делать тупую линейку чисто в браузере чисто до прямоугольных границ элементов, то можно было бы брать getBoundingClientRect и координаты мыши и вычитать одно из другого. Это будет более простое решение более простой задачи. Но не той же самой.
    Ответ написан
    1 комментарий
  • Как добавить 3D модель через Three JS?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Хорошо бы, конечно, иметь полный рабочий пример, чтобы посмотреть. Но по коду кажется, что вы уже добавили загруженный объект на сцену вот тут:

    scene.add(gltf.scene);

    Этого должно быть достаточно. Так что то, что там дальше:

    const model = new THREE.Mesh( loader, material );
    scene.add(model);


    Уже не нужно. Не говоря уже о том, что этот код - полная бессмыслица. Mesh создается из геометрии и материала, а вы туда вместо геометрии что-то другое передаете. Отсюда должна быть ошибка.
    Ответ написан
    Комментировать
  • Как ускорить передвижение лупы?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    курсор смещается внутри квадрата(нужно чтобы он оставался в центре)


    Если я правильно понял вопрос, то в JS:
    // Там, где в двух местах есть работа с --x и --y
    target.style.setProperty('--x', Math.floor(((e.clientX - rect.left) / rect.width * 100) * 100) / 100+'%');
    target.style.setProperty('--y', Math.floor(((e.clientY - rect.top) / rect.height * 100) * 100) / 100+'%');
    // нужна еще пара значений
    target.style.setProperty('--new-x', e.clientX - rect.left + 'px');
    target.style.setProperty('--new-y', e.clientY - rect.top + 'px');


    и в CSS:
    .image-zoom-block {
        /*
            left: var(--x);
            top: var(--y);
            transform: translateX(calc(var(--x) * -1)) translateY(calc(var(--y) * -1));
        */
        
        left: var(--new-x);
        top: var(--new-y);
        transform: translateX(-50%) translateY(-50%);
    }
    Ответ написан
  • Почему YouTube мешает Swiper?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Можно ли как то совместить эти события, чтобы и слайды листать, и кнопки в плеере нажимать?

    В том виде, в котором оно есть сейчас - нет. Проблема существует с 2013 года как минимум и будет решена примерно никогда, потому что обе стороны конфликта говорят, что проблема не на их стороне. Но можно вместо интерфейса от youtube прикрутить свой. То есть плеер оставить, но управление сделать свое, которое будет как-то сочетаться с имеющимся интерфейсом. Такой вот компромисс. Концептуально это будет выглядеть так, что мы убираем стандартный iframe, отключаем для плеера pointer-events:
    <div class='swiper' id='my-slider'>
        <div class='swiper-wrapper'>
            <div class='swiper-slide'>Slide 1</div>
            <div class='swiper-slide' id='youtube-slide'>
                <div id='player'></div>
            </div>
            <div class='swiper-slide'>Slide 3</div>
            <div class='swiper-slide'>Slide 4</div>
        </div>
    </div>
    <style>
    #player {
        pointer-events: none;
    }
    </style>

    И переходим к API на js, чтобы сформировать свой плеер, который мы будем контролировать:
    const youtubeScriptTag = document.createElement('script');
    youtubeScriptTag.src = 'https://www.youtube.com/iframe_api';
    document.body.appendChild(youtubeScriptTag);
    
    window.onYouTubeIframeAPIReady = () => {
        const player = new YT.Player('player', {
            videoId: 'orbr-C3gYKk',
            playerVars: {
                controls: 0
            },
            events: {
                onReady: (event) => {
                    const youtubeSlide = document.getElementById('youtube-slide');
                    let isVideoPlaying = false;
    
                    youtubeSlide.addEventListener('click', () => {
                        if (isVideoPlaying) {
                            event.target.stopVideo();
                        } else {
                            event.target.playVideo();
                        }
    
                        isVideoPlaying = !isVideoPlaying;
                    });
                }
            }
        });
    }
    
    const swiper = new Swiper('#my-slider', {});

    В playerVars можно передать всякие параметры и немного настроить внешний вид плеера (убрать лишнее). И можно все подвесить на события свайпера, чтобы запускать или останавливать видео при переходе на нужный слайд, ну или что там нужно по дизайну.

    P.S.: На CodePen метод playVideo может не работать в Chrome-подобных браузерах из-за особенностей работы песочницы, но на обычной странице все должно быть ок.
    Ответ написан
    2 комментария
  • Как сделать вращение стрелки за мышкой?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Из описания вопроса не совсем понятно, какую именно логику следования стрелки за мышкой вы хотите получить (можно придумать разные варианты), но скорее всего вам нужно отталкиваться от логики вроде такой:
    // Тут, конечно, лучше какие-нибудь id сделать для однозначности
    const circle = document.querySelector('.circle');
    const arrow = document.querySelector('.arrow');
    
    document.addEventListener('mousemove', (e) => {    
        const circleRect = circle.getBoundingClientRect();
        const circleCenterX = circleRect.left + circle.offsetWidth / 2;
        const circleCenterY = circleRect.top + circle.offsetHeight / 2;
        const deltaX = e.clientX - circleCenterX;
        const deltaY = e.clientY - circleCenterY;
        const angleInRadians = Math.atan2(deltaY, deltaX) - Math.PI / 2;
        const angleInDegrees = 180 * angleInRadians / Math.PI;
        const angleFrom0To360 = (angleInDegrees + 360) % 360;
        const shouldEffectBeApplied = deltaY < 0;
        
        if (shouldEffectBeApplied) {
            arrow.style.transform = `rotate(${angleFrom0To360}deg)`;
        }
    });

    И еще в таких штуках всегда хорошо добавить какой-нибудь transition в CSS:
    .arrow {
        transition: transform .1s linear;
    }
    Ответ написан
    1 комментарий
  • Barba.js не загружает JavaScript после перехода на следущую страницу (вперед) и обратно (назад), в чем проблема?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Ваш плеер по всей видимости отваливается после того, как из dom удаляется текущая страница (кусок, который в контейнере barba.js) и, в частности, контейнер плеера. При переходе на страницу обратно - новый контейнер создается, но скрипты никто не перезапускает. Беглый поиск по вашим файлам показал, что у вас там нигде нет кода, связанного с методом barba.init, и, собственно, настройками, что роутеру делать при переходах между страницами. Думаю вам стоит заглянуть в документацию на страницу run custom code. Там на пальцах показано, куда нужно воткнуть инициализацию вашего плеера.
    Ответ написан
    Комментировать
  • Как рандомно и одновременно равномерно расположить элементы по секции?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Имеете в виду что-то такое?

    Ответ написан
    2 комментария
  • Как сделать анимацию куба, как на сайте axoft.ru?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Что это за фреймворк?

    Да не нужны там фреймворки. Нужна копипаста стилей для кучи почти одинаковых объектов (ее, наверное, можно сократить каким-нибудь хитрым миксином, но суть не поменяется):

    Ответ написан
    1 комментарий
  • Как устранить ошибку barba.js и locomotive-scroll?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Это был настолько распространенный вопрос, что в документации barba.js появился отдельный блок про интегрирование locomotive-scroll. Имеет смысл почитать, и сделать все так, как там написано.
    Ответ написан
  • GSAP. Как изменять zIndex на определённых точках Path?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Можно продублировать SVG и "верхнюю" копию частично скрыть маской. Это не самое универсальное решение, но в контексте задачи может быть самым простым и надежным, т.к. не будет никакой привязки к контенту, только к структуре кривой:
    Ответ написан
  • Почему одни экземпляры создаём через new, а другие литерально?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    console.log(new Number(1) + new Number(2)); // выводится 3 и typeof полученного значения number
    То есть всё в порядке, это то же самое, как если бы мы сделали:
    console.log(1 + 2);

    Число - это Primitive. У примитивов есть эквивалентные объектные аналоги (кроме null и undefined). Поэтому да, это "то же самое" в каком-то смысле (у примитива нет методов, в отличии от эквивалентного объекта, они не могут быть изменены, и.т.д., но в таких простых расчетах мы не обращаем на это внимания). А штуки вроде упомянутых промисов, дат и что там еще бывает - это будут уже не примитивные типы данных, там такой двойственности уже нет.

    В остальном - там есть немного синтаксического сахара, связанного с функциями и объектами. Например Object может быть создан разными способами, хотя фактически они приводят к одному результату, а не как у примитивов и их объектных оберток-аналогов.
    Ответ написан
    Комментировать
  • Как определиться с зависимостями лендинга?

    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 комментарий
  • Как сделать такого рода эффект?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    не могу найти в поиске

    SVG-маски, маски с помощью clip-path в CSS, маски на канвасе, маски в шейдерах, и.т.д. В общем гуглите все, что связано со словом "маска". Вариант с шейдерами самый производительный, с SVG - самый простой.

    Пример с SVG:


    Пример с шейдерами (не совсем такой, но для передачи идеи пойдет):
    Ответ написан
    Комментировать
  • Что за потеря контекста webgl и с чем её едят?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Пытаюсь создать рисовалку на webgl2

    Стоит посмотреть на поддержку WebGL2 в Safari, осознать, что экспериментальная фича даже при "зеленой" поддержке не отличается стабильностью, и подумать еще раз пока не поздно. Но это так, к слову. Раз уж говорим про качество и надежность.

    Что произойдёт с данными при потере контекста? ...потом восстанавливать его? ...старый контекст автоматически удалится или так и будет висеть в небытии?

    По теме есть хорошая заметка из первых рук. Там есть ответы на ваши вопросы с подробностями и примерами кода.

    Может вообще забить на эту потерю контекста? Как часто она происходит? Раз на миллион?

    Происходит действительно редко. Я за все время экспериментов с WebGL не столкнулся ни разу. То есть такое впечатление, что скорее браузер намертво повесится, чем сбросит контекст. Нужна ли супер-надежность с обработкой этого редкого сценария в вашем конкретном случае - решать вам. Но в целом мало кто об этом заботится.
    Ответ написан
    Комментировать
  • Как реализовать вот такой эффект?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    SVG-маски - наше все. Хотя в этом случае вариант с clip-path тоже очень даже рабочий. Еще есть вариант маски на шейдерах, но это совсем особый случай, хотя может внезапно оказаться очень производительным.

    Ответ написан
    Комментировать
  • Как реализовать подобную анимацию?

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

    В этом примере как раз что-то похожее (только нужно открыть на CodePen - горизонтальный скролл не очень дружит с iframe-вставками):
    Ответ написан
    1 комментарий
  • Помощь в создании диаграммы на D3. Как сделать?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    она есть на сайте D3... нужен полный код этой, либо похожей диаграммы...


    Она и правда там есть. Равно как и кнопка "скачать исходники":
    6008378d043b8035188422.png
    Ответ написан
    Комментировать
  • 3D "window" в браузере?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    ...там работал обычный CSS, но был 3D объектом на который смотрит камера... Да, я видел всякие Three.js...

    Как раз в Three.js есть такая штука как CSS 3D Renderer. Можно расположить условные div елементы в пространстве и работать с ними "в 3D".
    Ответ написан
  • На каких технологиях создан сайт сериала тьма?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Крайне любопытен с точки зрения визуальной составляющей.
    Мне бы хотелось понимать, посредством каких технологий он был сделан.


    Не глядя в код, можно предположить использование следующих технологий:
    1. Волны абстрактные и на фотографиях, шум на фоне - WebGL, шейдеры. Вода на первом экране - скорее всего моделируется как идеальная жидкость, волны на фотографиях - чисто геометрические.
    2. Обведение текста в овал, трилистник с пунктиром, стрелки на карте - SVG, рисование линии по такому принципу.
    3. Плавные переходы между экранами можно делать по-разному, даже забытый модными фронтендерами pjax будет к месту. Можно познакомиться с barba.js - это если не самый популярный, то один из популярных инструментов для работы с плавными переходами. Можно использовать роутеры из SPA-фреймворков, не принципиально. Самое сложное здесь - все синхронизировать.
    4. Карта с персонажами - это может быть обычная верстка, подложенная под канвас с шумом. Самый простой вариант.
    5. Есть небольшое покачивание элементов вслед за мышкой, логично предположить, что это банальная CSS-трансформация на mousemove.
    6. Рисование дуг из точек - это может быть либо SVG, как в п.2, только эта линия будет маской, либо можно это строить как графики.
    7. Ну и немного стандартных CSS-анимаций там тоже есть.


    Дополнительные библиотеки здесь - дело вкуса, можно и на ванильном JS все сделать, разве что роутер я бы взял готовый. Вся соль в визуальных эффектах, а для них готовых решений не будет, если работа будет строиться по принципу "сначала придумать, потом сделать".
    Ответ написан
    Комментировать