Задать вопрос
  • Почему не заменяет перенос строки на пробел?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    sed имеет своеобразное представление о том, что такое "новая строка", можно попробовать опцию -z:

    speedtest --simple | sed '1d' | sed -z 's/\n/ /g'
    Ответ написан
    Комментировать
  • Как сделать, чтобы при переносе последнего слова, вместе с ним переносилась иконка, идущая за ним?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    не влезая в плагин, уже на загруженной странице

    const table = document.querySelector('table');
    const html = table.innerHTML;
    const modifiedHtml = html.replace(/>\s+<i/g, '>&nbsp;<i');
    
    table.innerHTML = modifiedHtml;
    Ответ написан
    9 комментариев
  • Как добавить 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%);
    }
    Ответ написан
  • Как сделать анимацию притягивания кнопки при движении мыши?

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

    Эффект определенно зависит от расположения мыши, расположения кнопки, и, возможно, от ее размеров. Так в чем проблема начать и посмотреть, что будет?

    Тут весь вопрос в том, чтобы подобрать нужную функцию от расстояния (в примере синус - самый простой вариант, хотя и не самый интересный). И определиться, будет ли эффект зависеть от расстояния до центра элемента (как в примере) или от расстояния до края кнопки. От этих выборов будет зависеть конечный эффект. Там долго можно играться с функцией и параметрами, но направление должно быть понятно.
    Ответ написан
  • Почему 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. Там на пальцах показано, куда нужно воткнуть инициализацию вашего плеера.
    Ответ написан
    Комментировать
  • Как вы делаете code-review?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    У code review должна быть цель. В моей практике обычно проекты небольшие и там нет отдельных тестировщиков. Получается, что code review отвечает на три вопроса:

    1. Соответствует ли функционал ТЗ?
    2. Создает ли код проблемы команде?
    3. Есть ли тут какой-то специфичный для проекта опыт, который лучше задокументировать, пока мы еще в контексте?


    Получается что-то такое:

    • До выполнения задачи: проводится анализ задачи, формулируется ТЗ. Бывает, что нужно подключиться и помочь с требованиями, с контекстом, в котором все делается. Чем более подробный анализ мы делаем и чем лучше мы понимаем контекст на этом этапе, тем больше вероятность, что потом весь процесс выполнения задачи пойдет как по маслу и code review будет чистой формальностью в конце.
    • До ревью: линтеры проверяют код на соответствие стилю, на отсутствие синтаксического бреда.
    • Дальше - проверка на соответствие функционала ТЗ. Это защита от глупых ошибок в продакшене, которые коснутся пользователей.
    • Потом - на сответствие принятым соглашениям по коду, если они есть в проекте. Обычно это архитектурные паттерны и что-то про зависимости, смотрим не создает ли код проблем окружающим, а то разные глупости порой случаются. Особенно это важно в коде, который не сам в себе, а затрагивает много чего вокруг. Иногда возникает конфликт интересов, когда что-то явно устарело, и соглашения дополняются чем-то. Чем лучше был анализ в начале, тем меньше вероятность, что тут будет, что обсуждать.
    • Дальше уточняющие вопросы по странным местам, если они есть. Это больше с целью узнать контекст задачи, почему приняты те или иные решения. Происходит передача специфичных для проекта знаний в сторону команды. Возможно там же будут какие-то рекомендации по поводу практик, на что стоит обратить внимание в следующий раз. Это будет передача опыта от команды.


    А кто там будет, джун или синьер-помидор - не важно. Все люди ошибаются, и всем нужен контекст происходящего для эффективной работы.
    Ответ написан
    Комментировать
  • Как выбрать все элементы, кроме последнего и предпоследнего?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    Еще, как вариант, можно делать "-n+k" и выбирать все, кроме последних k элементов:
    .item:not(:nth-last-child(-n+2)) {
        /* ... */
    }
    Ответ написан
    Комментировать
  • Как рандомно и одновременно равномерно расположить элементы по секции?

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

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

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

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

    Ответ написан
    1 комментарий
  • Не грузится Proton VPN?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    Его заблокировали что ли?

    Да. Ну то есть почти да. Клиенты не могут скачать конфигурации для подключения к серверам. Если скачать их из админки своими руками и вставить в любой независимый vpn-клиент, то все соединяется и работает хорошо - сами сервера никуда не делись.
    Ответ написан
    1 комментарий
  • Как устранить ошибку barba.js и locomotive-scroll?

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

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    В светлом будущем для решения этой задачи у нас будет :has. Но пока что о кроссбраузерности там речи не идет. В текущем состоянии CSS нет селектора, который бы позволил сделать тот же эффект. Но в контексте вашей задачи никто не мешает самим item сделать классы-модификаторы.
    Ответ написан
  • Как вписать изображения большего размера, что бы разметка не ломалась?

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

    Можно что-то такое сделать:
    .inv-cell {
        position: relative;
    }
    
    img {
        position: absolute;
        width: 100%;
        height: 100%;
        object-fit: cover;
    }

    Весь вопрос тут будет скорее не в размере картинок, а в их пропорциях. Если вы привязываете саму сетку к пропорциям экрана - она 100% будет расходиться с пропорциями картинок внутри в ту или иную сторону. Если это какие-то формальные фоточки, то object-fit решит вопрос, если же это превьюшки для фильмов с текстами или еще чем-то, что нельзя отрезать - то будет вопрос по самой концепции к дизайнеру, и его нужно будет решать с ним.
    Ответ написан
    4 комментария
  • GSAP. Как изменять zIndex на определённых точках Path?

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

    sfi0zy
    @sfi0zy Куратор тега Вёрстка
    Creative frontend developer
    Чтобы не перепечатывать каждое свойство в caniuse

    doiuse?
    Ответ написан
    Комментировать
  • Почему одни экземпляры создаём через 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 может быть создан разными способами, хотя фактически они приводят к одному результату, а не как у примитивов и их объектных оберток-аналогов.
    Ответ написан
    Комментировать
  • Не отображается встроенное изображение в .svg на сайте?

    sfi0zy
    @sfi0zy
    Creative frontend developer
    На MDN говорят, что это вопрос безопасности (там только про Gecko, но можно предположить, что везде так). Если SVG используется как картинка, то в ней уже нельзя подгрузить другие внешние ресурсы. Как вариант можно использовать тег embed вместо img, и все будет работать без таких ограничений.
    Ответ написан
    Комментировать