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

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

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

    Ответ написан
    22 комментария
  • Как узнать IP человека, который зашел на сайт?

    Вот пример(См.ниже)
    Ответ написан
    Комментировать
  • Как покрасить текст в зависимости от символа?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Ответ написан
    Комментировать
  • Как остановить функцию в js при определенном условии?

    RAX7
    @RAX7
    function headerScroll() {
      let headerTop = null;
      let headerSubstrate = null;
      let lastScrollTop = 0;
    
      function onScroll() {
        let scrollDistance = window.scrollY;
    
        if (scrollDistance > lastScrollTop) {
          headerTop.classList.remove('header__top-active');
          headerSubstrate.style.top = '-200px';
        } else {
          headerTop.classList.add('header__top-active');
          headerSubstrate.style.top = '0px';
        }
    
        lastScrollTop = scrollDistance;
      }
    
      function init() {
        destroy();
        headerTop = document.querySelector('.header__top');
        headerSubstrate = document.querySelector('.header__substrate');
        lastScrollTop = 0;
        window.addEventListener('scroll', onScroll);
      }
    
      function destroy() {
        window.removeEventListener('scroll', onScroll);
      }
    
      return { init, destroy };
    }
    
    const { init: initStickyHeader, destroy: destroyStickyHeader } = headerScroll();
    
    const mediaQuery = window.matchMedia('(min-width: 768px)');
    
    mediaQuery.addEventListener('change', (event) => {
      if (event.matches) {
        initStickyHeader();
      } else {
        destroyStickyHeader();
      }
    });

    https://developer.mozilla.org/en-US/docs/Web/API/M...
    Ответ написан
    Комментировать
  • Нужно в js создать таблицу 10 на 10 чтобы 1 шли по диагонали. Остальное 0?

    Seasle
    @Seasle Куратор тега JavaScript
    Ответ написан
    Комментировать
  • Как более компактно получить тексты ошибок и выводить цвета?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Цвета:

    progress.css('background-color', [
      { min: 100, color: '#47C965' },
      { min:  40, color: '#f5dd30' },
      { min:   0, color: '#bf4542' },
    ].find(n => n.min <= strength).color);

    Тексты ошибок: не надо никаких атрибутов, сразу положите их в объекты.
    Но если всё же хотите идти путём говнокодера, то
    const tests = [ здесь перечисляете регулярные выражения ].map((n, i) => ({
      regex: n,
      message: error_wrap.attr(`data-error_${i + 1}`),
    }));
    Ответ написан
    1 комментарий
  • Как ограничить счетчик минимальным значением 1 и максимальным 100?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Math.max(1, Math.min(100, новое значение счётчика))
    Ответ написан
    5 комментариев
  • Npm, Webpack, NodeJs с чего начать?

    @deliro
    Фронт развился в какую-то неправильную сторону, это правда
    Вкатиться на фронт очень сложно, это тоже правда. Причём, необоснованно сложно.

    Я бы выделил два пути, как можно въехать во всё это:
    1. Создать приложение на Vue или React по туториалам, затем разобраться, как и зачем оно всё
    2. Разобраться как и зачем оно всё (aka Vanilla JS), потом заняться реактами

    Имхо, вариант №2 предпочтителен и более прост, потому что на варианте №1 есть огромный шанс застрять, никогда не разобравшись, как оно работает а при любых нешаблонных ошибках поднимать лапки.

    Что здесь нужно понимать:
    1. Есть разные версии ES (ecmascript), они все обратносовместимые. Программист может писать на любой версии, какая ему нравится. Обычно берут последнюю стабильную

    2. Для проекта обычно есть две версии ES: та, на которой пишут программисты и та, которая исполняется в браузере или в ноде (об этом позже). Например, программист пишет на ES8, а код транслируется на ES5. Это позволяет использовать последние предсмертные хрипы писки моды JS при этом запуская всё на древнейшем говне вроде IE11. Перегонкой кода из JS/TS одной версии в JS другой версии занимается транспилятор: babel / esbuild / swc

    3. Новые версии JS содержат расширения стандартной библиотеки, которых нет в старых браузерах (например Array.from, Object.entries и т.п.). Эти дырки затыкают полифиллы, они же shims. Самая популярная дырозатыкательная машинка — corejs

    4. Весь код очевидно не пишется в одном файле и может быть написан на TypeScript (он же TS), JSX/TSX (реактовый синтаксис). Всё это нужно собрать в один или несколько файлов, то есть скомпоновать. Этим занимается bundler: часть webpack / esbuild / spark / etc.

    5. Этот же парень отвечает за то, чтобы та тысяча библиотек, что лежит в node_modules, попала в итоговый условный main.js, но не целиком, а только то, что используется. Последнее называется tree shaking (типа навозную кучу node_modules потрясли как дерево, что упало — то не нужно)

    6. (то самое "позже) Код может исполняться не только в браузере пользователя, но и на сервере без браузера вообще. Это нужно для SSR aka Server Side Rendering. SSR — это такой глобальный вонючий костыль для SEO. Дело в том, что стандартные SPA приложения содержат один DOM элемент, куда цепляется всё остальное приложение вроде реакта или вью, которое уже содержит всю вёрстку прямо в JS. Но не все поисковики согласны с таким подходом и некоторые (не будем показывать пальцем на яндекс) не умеют выполнять JS и индексируют только тот самый единственный DOM элемент, который существует на этапе отдачи страницы в браузер. Это уже потом к нему JS движком дорисовывается весь остальной сайт. Соответственно, сайт индексируется от слова "никак", а некоторым это важно. Например, когда SPA — это не админка. Для этого есть два выхода: страницы, важные для SEO, рендерить чем-то не-реактовым или сделать SSR — делать за яндекс работу на сервере (на ноде), представляя в уме, что у нас есть DOM и браузер (на самом деле нет), на выходе получать начальное состояние HTML, отдавать его клиенту (браузеру или поисковому роботу), а JS'ом её т.н. "гидрировать", иными словами — оживлять.

    7. webpack отвечает за всё вот это сверху в том или ином виде. Это такой кухонный комбайн, в который вкидываешь кучу хлама в одном виде, а получаешь другую кучу хлама в другом виде.

    Начать советую с parceljs, который сильно проще в освоении, чем webpack. И на написании кода максимально без библиотек.
    Ответ написан
    1 комментарий
  • Почему код не работает?

    А нечего тулить стрелочные функции если не понимаешь как они работают.
    Ответ написан
    Комментировать
  • Правильно ли выводить переменные через запятую в консоль?

    Stalker_RED
    @Stalker_RED
    Можно проще:
    console.log('name', name, 'age', age);
    // -> name Alen age 20


    Еще можно вот так
    console.log({name, age});
    // -> {name: 'Alen', age: 20}

    но это для коротких значений, длинные записи свернутся.

    Еще классная штука console.table() для двумерных массивов и объектов.
    И вообще, консоль много полезного умеет.

    И задумайтесь - для чего вы это делаете, кто эти надписи будет читать?
    слово "Vozrasr" не каждый поймет. Если чисто для себя пишете, и не знаете как написать на английском - пишите на русском уже, все равно в мире js сплошняком юникод.
    Ответ написан
    1 комментарий
  • Как поменять домен на локальном сервере?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Подскажите как можно установить ему купленный домен

    1. Арендовать у своего провайдера белый IP-адрес
    2. Прописать его в A-запись доменной зоны
    3. Прописать доменное имя в настройках своего web-сервера
    4. Настроить проброс портов на своём маршрутизаторе


    Под бесплатным имею ввиду просто взять свободный и не регать его в каких-то сервисах.

    Незарегистрированное доменное имя не обслуживается dns-серверами. Поэтому каждый клиент должен будет прописать соответствие между этим доменным именем и вашим IP-адресом себе в файл hosts. Иначе работать ничего не будет.
    Ответ написан
    Комментировать
  • Как сверстать подобное?

    wapster92
    @wapster92 Куратор тега CSS
    Ответ написан
    Комментировать
  • Можно ли создать свой node_modules чтобы импортировать оттуда нужные мне вещи?

    Fragster
    @Fragster
    помогло? отметь решением!
    конкретно для ноды и нпм - точно можно подключать репо с гитхаба:
    npm install git+https://github.com/author/repo_name.git

    и использовать
    import variable from 'repo_name'

    для composer тоже есть подобное: https://getcomposer.org/doc/05-repositories.md#vcs
    Ответ написан
    Комментировать
  • Почему async/await в Array.prototype.map работает как-то не предсказуемо(для меня)?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Такое ощущение будто в .map асинхронная функция не дожидается своих await, а сразу возвращает промис.

    Так точно. Функция, переданная в map, вызывается без всяких await'ов.

    Хотите массив со своими удвоенными значениями - используйте Promise.all:

    const arr = await Promise.all([1, 2, 3, 4, 5].map(async (value) => 2 * await asyncThing(value)));
    
    console.log(arr); // [2, 4, 6, 8, 10]
    Ответ написан
    1 комментарий
  • Как слепить такой блок на css?

    RAX7
    @RAX7
    Ответ написан
    Комментировать
  • Как добавлять сложные HTML блоки?

    edward_freedom
    @edward_freedom
    Можно так сделать



    let html = [
            {
                'type': 'div',
                'args': {
                    'id': 'dialog',
                },
                'childrens': [
                    {
                        'type': 'h1',
                        'args': {
                            'textContent': 'Заголовок 1'
                        }
                    },
                    {
                        'type': 'h2',
                        'args': {
                            'textContent': 'Заголовок 2'
                        }
                    },
                    {
                        'type': 'h5',
                        'args': {
                            'textContent': 'Заголовок 5'
                        }
                    },
                    {
                        'type': 'p',
                        'args': {
                            'textContent': 'Параграф'
                        }
                    },
                ]
            }
        ];
    
        html.forEach(parent => {
            let parentObject = document.createElement(parent.type);
            Object.entries(parent.args).forEach(([key, value]) => {
                parentObject[key] = value;
            });
            parent.childrens.forEach(children => {
                let childrenObject = document.createElement(children.type);
                Object.entries(children.args).forEach(([key, value]) => {
                    childrenObject[key] = value;
                });
                parentObject.appendChild(childrenObject);
            });
            document.body.appendChild(parentObject);
        });
    Ответ написан
    1 комментарий
  • Как сверстать такой треугольник?

    profesor08
    @profesor08 Куратор тега CSS
    Кривая Безье - это именно то, что тебе на самом деле надо для того, чтоб решить свою задачу.

    clip-path - это то, что позволит использовать тебе Кривые Безье для стилизации своего элемента.

    Тем, кто не хочет развиваться сюда
    Ответ написан
    1 комментарий
  • Как правильно записать индекс (детали в вопросе)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В reduce() в передаваемом объекте добавьте поле для передачи индекса баннера.

    Если встречается card – поле сбрасывать.
    Если встретился баннер:
    - нет индекса – брать i и сохранять его в объекте;
    - есть индеса – использовать его.

    spoiler
    const container = document.querySelector(".js-cards");
    
    const cards = [...container.children].reduce(function (obj, item, i) {
      if ("card" in item.dataset) {
        obj[item.dataset.card] = (obj[item.dataset.card] || []).concat(item);
        obj["all"] = (obj["all"] || []).concat(item);
        if (obj.hasOwnProperty('bannerIndex')) delete obj.bannerIndex;
      } else {
        if (! obj.hasOwnProperty('bannerIndex')) obj.bannerIndex = i;
        obj["banners"] = (obj["banners"] || []).concat({ item: item, index: obj.bannerIndex });
      }
      return obj;
    }, {});
    
    console.log(cards);
    Ответ написан
    1 комментарий