• Как сделать так, чтобы по нажатию на блок менялись background?

    @vladdimir
    Верстальщик
    может dbclick вам нужен?

    если нет, то делайте состояние, вроде как

    let isChange = false
    
    elem.onClick = (evt) => {
      evt.preventDefault();
      
      this.style.backgroundImage: isChange ? 'url-to-img' : ''; 
      // Если true, ставим картинку, если нет, не ставим. Или любая другая логика, которая вам нужна.
      
      isChange = !isChange; // Меняем состояние на обратное, чтобы каждый второй клик менял фон
    }
    Ответ написан
  • Как сделать, чтобы при нажатии на блок выполнялась функция, где из этого блока берётся фон и передаётся в другой блок на JS?

    @vladdimir
    Верстальщик
    Алгоритм
    1. Вешаем обработчик на галерею addEventListener('click', onClickGallery)
    2. пишем функцию onClickGallery.
    Что она должна делать?
    - Если клик по превью, то изменить адрес большого изображения. И добавить индикатор текущего изображения у превью (синяя точка под последней прьвюшкой).
    - Если клик по стрелке, то показать следующее/предыдущее изображение.
    - Если клик по активному изображению или в другом месте, выйти из функции.

    Дал бы готовый код, но мне лень, а вам надеюсь хочется сделать и самому)

    Еще можно оптимизировать, чтобы в превью стояли картинки маленького разрешения, а в большую ставить полномасштабные варианты. Это ускорит загрузку сайта)
    Ответ написан
    4 комментария
  • Как скомбинировать классы, чтобы при div:hover свойство применялось к нескольким другим div?

    @vladdimir
    Верстальщик
    На сколько понял задачу, должно подойти.
    // Если изменяться должны элементы, которые лежат внутри targetClass
    .targetClass:hover .changeClass1,
    .targetClass:hover .changeClass2,
    .targetClass:hover .changeClass999, { 
    
    }
    // Если те, которые рядом лежат, то через  ~
    
    targetClass:hover ~ .changeClass1,
    targetClass:hover ~ .changeClass2,
    targetClass:hover ~ .changeClass999, {
    
    }


    Но вообще, все зависит от структуры разметки. Где и как размещены все эти блоки. Возможно в вашей разметке, с помощью css такое нереализуемо и нужно делать через js.
    Ответ написан
  • Разработка на Freelance?

    @vladdimir
    Верстальщик
    Серверная часть стандартного лендинга или визитки только обрабатывает формы - отсылает что-то куда-то (например, формы обратной связи, рассылки). Все остальное - фронтенд. Сможете такое сделать, уже хорошо.
    Вот и выходит, что для простых вещей достаточного одного js и совсем чучуть php, да и то не всегда.

    Если хотите чего-то свежего, попробуйте node.js.
    Очень удобно писать и читать код, написанный на одном языке для бекенда и фронтенда.
    Заказы на node.js есть, но не так чтобы прям очень много. Но они есть, и хорошо оплачиваются.

    Но, конечно же php все еще остается любимым сыном веба. Очень много всего на нем написано. Полезно будет узнать хотя бы основы.
    Много заказов на фрилансе требуют работы с CMS, а многие из них написаны на php. Если хотите брать заказы такого профиля, а их довольно много, придется разбираться как в самом языке (если задача требует), так и в устройстве систем.

    Но вот не смотря на всю важность и актуальность php, если учить глубоко, я бы лучше учил node.js.

    Мне кажется, сейчас не обязательно быть швецом-жнецом и учить все-все. Часто бекендом и фронтендом занимаются разные разработчики. Вы вполне можете не учить ничего, кроме js, ну и html, css, шаблонизаторов, сборщиков, библиотек и фреймворков)))
    Ответ написан
    2 комментария
  • Как сократить такое условие?

    @vladdimir
    Верстальщик
    Наверное можно и без сравнения с null, ведь условие преобразуется в логический тип, а null в js преобразуется в false:
    if (element.previousSibling) { 
     // ... остальной код Дмитрия Дерепко
    }
    
    // Или без вложенных циклов
    // сначала проверить:  если у элемента нет предшествующего элемента
    if (!element.previousSibling) { 
      return element;  
      // вернуть элемент, чтобы другая функция что-то с ним могла сделать. 
      // Или вернуть false, не суть. Важно просто обработать сценарий, когда элемент 
      // идет первым в родителе. Можно просто выйти из функции.
    }
    // Дальше, если предшественник есть, делаем как в коде Дмитрия
    const targetTags = ['h1', 'h2', ...],
        lowerName = element.previousSibling.nodeName.toLowerCase();
    
    if (!targetTags.includes(lowerName)) { 
      // do samething
    }
    
    // Кстати, можно targetTags передавать сразу аргументом в функцию, чтобы код был чуть 
    // более универсальным.
    function doSomethingEpic(element, targetTargs) {
     // code
    }
    
    const someElem = document.querySelector('.epicElement');
    const tags = ['h1', 'h2', ...],
    doSomethingEpic(someElement, tags);


    Важно: метод includes не поддерживается в IE, полифилл есть на сайте MDN
    Ответ написан
    2 комментария
  • Как реализовать поиск на сайте?

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

    Чтобы делать прям подсказки-подсказки, а не грузить заголовки найденных статей, нужно реализовывать какое-то хранилище поисковых запросов на бекенде, иначе откуда эти самые подсказки брать.
    Ответ написан
    Комментировать
  • Сколько времени нужно потратить на обучение?

    @vladdimir
    Верстальщик
    Не уверен, сколько потратил) Не буду рассказывать о процессе обучения и прочем, а то ответ разнесет на несколько экранов. Лучше перейдем к сути.

    Вы как учитесь?
    На мой взгляд, программирование и верстка это 90% практики. Нужно писать код.
    Самый оптимальный вариант обучению новому. В вашем случае верстке html&css
    1. Ознакомиться с технологией.
    2. В зависимости от уровня - взять макет в инете или поставить задачу, например: сверстать главу из любимой книги, или сделать реплику кусочка сайта, который вам нравится. И верстать.
    3. Получать кайф от магии) «Повелеваю тебе, браузер, сделай этот текст красным, а эту картинку подвинь влево!». Когда не знаете конкретное заклинание, чтобы заставить браузер сделать то, что вам нужно - идти в гугл, искать инфу.
    4. Когда магии и заклинаний станет уже мало, и вы захотите узнать, как все это дело устроено и почему, идите читать спецификации и серьезные статьи.


    Суть в том, чтобы не учиться теории, а решать прикладные задачи.
    Когда мы читаем теорию без должного подкрепления практикой, мы лишь абстрактно представляем значимость тех знаний, которые добываем. «Ну да, круто, можно написать медиа-запрос под нужныый экран и перестроить сетку, ну да, бывают элементы блочные, блочно-строчные и вообще очень разные. Круто, это мне обязательно где-нибудь пригодится, эх зевнуть что-то хочется...»

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

    @vladdimir
    Верстальщик
    Если правильно понял задачу, это свободно делается с помощью ajax: learn.javascript.ru/ajax-intro

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

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

    Сами подумайте, как пользователь, который смотрит на сайт с экрана с высоким разрешением, сможет с ним взаимодействовать? На сколько ему удобно? Зайдет еще раз?
    Ответ написан
    Комментировать
  • Sass не компилируется с css gulp4, в чем проблема?

    @vladdimir
    Верстальщик
    Мне тоже не совсем понятно, что вы делаете, что должно происходить и как это работать должно?
    Я установил Gulp 4 подключил sass и все работает, но только когда я перезапускаю gulp через терминал, до этого момента не браузер не файл css не обновляется, сижу целый день, не могу понять в чем проблема.

    В общем не могу я понять вашу проблему. Вот в тексте сказано, что при каких-то условиях сборка работает, а при других нет. Какие условия не ясно. Быстрее всего искать проблемы, сравнивая отличия. Почему работает в одних условия, что изменяется в других условиях запуска, что перестает работать.

    По самому файлу, ну слежение у вас настроено странновато

    gulp.task('watch', function() {
    gulp.watch('catalog/view/theme/apple/stylesheet/stylesheet.sass', gulp.parallel('sass'));

    Тут вроде норм, отслеживаете изменения в файле, запускаете задачу на сборку. Только вот вы отслеживаете только основной файл. Это значит, что блоки, которые вы подключаете в него, наблюдатель просмотрит только один раз, сразу после подключения директивой import, после этого все изменения в подключаемых в файле импортах наблюдатель не заменит и основной файл не пересоберет. Нужно указать путь к файлам, которые нужно отслеживать: 'catalog/view/theme/apple/stylesheet/**/*.sass', например. Хотя если у вас весь код в одном файле, без использования import, то и так норм.

    Далее по сборщику
    gulp.task('watch', function() {
    gulp.watch('catalog/view/theme/apple/template/**/*.twig', browserSync.reload);
    gulp.watch('catalog/view/theme/apple/js/**/*.js', browserSync.reload);
    gulp.watch('catalog/view/theme/apple/libs/**/*', browserSync.reload);

    Этими правилами вы говорите Галпу: «Смотри за всеми этими файлами, а если они изменятся, перезагрузи страницу и все». То есть, никакой сборки не происходит, просто перезагрузка. Хотя если так и надо или где-то в другом месте что-то делается, то значит так и надо, наверное.

    Еще заметил что у вас две задачи с одинаковым именем 'sass'. Стало интересно, что делает Галп в таких случаях: ругается или переопределяет задачу?

    Больше каких либо проблем беглым взглядом не вижу, непривычно такую сборку смотреть, очень хаотично на мой взгляд. Например, browserSync я организую в одной задаче и не приходится добавлять reload в другие задачи:
    const watcher = () => {
      watch(options.scripts.src, scripts);
      watch(options.html.watch, html);
      watch(options.styles.watch, styles);
      watch(options.copy.src, copy);
    };
    
    const server = () => {
      browserSync.init({
        server: {
          baseDir: output,
        },
      });
    
      browserSync.watch(`${output}/**/*.*`).on('change', browserSync.reload);
    };

    В итоге получается так, что если какая-то задача не работает, проблема всегда в этой задаче и по другому быть не может.
    Ответ написан
    2 комментария
  • Как поставить отслеживание для html (Gulp)?

    @vladdimir
    Верстальщик
    АПИ галпа, функция watch: gulp.watch()

    Если на пальцах:
    watch(globs, [options], [task])
    globs - строка или массив - задаем где и что отслеживать: путь к файлу
    [options]- объект с опциями, все есть в доке. Необязательный аргумент.
    [task] - задача, которую нужно запустить или набор задач через gulp.series, gulp.parallel. Или функция.

    gulp.watch('entry/html/**/*.html', html);
    Как то так вроде.

    Для справки: в доке появилась инфа, что создание задач через gulp.task(...) уже не есть хорошо и нужно подключить через exports
    вроде:
    const task1 = () => {};

    exports.task1 = task1;

    Сейчас свою базовую сборку переписываю, пока что нравится - выглядит лаконичнее.
    Ответ написан
    Комментировать
  • Как зарабатывают фри Ланса платформы?

    @vladdimir
    Верстальщик
    Комиссия с заказчиков-исполнителей.
    Патент - доступ к работе/исполнителям (аккаунты pro\полностью платный доступ\покупка возможности откликнуться на заказ).
    Доп. услуги: реклама, закрепление в топе, выделение заявок\проектов, личный консультант или менеджер - на что фантазии и здравого смысла хватит. Главное тут «и», потому что фантазия без последнего в реальном мире работает плохо.
    Ответ написан
    Комментировать
  • Посмотрите, пожалуйста, как вам шапка сайта?

    @vladdimir
    Верстальщик
    Рыбка понравилась) Мне кажется, в слогане (... как наслаждение творить.) слово «чем» легче зайдет вместо «как». Ссылки дугой заметил не сразу, это задумано так?
    Ответ написан
    2 комментария
  • Структура сайта, как?

    @vladdimir
    Верстальщик
    Здравствуйте! Везде абстрактно написано, потом что вопрос такой. Видите ли, универсальных таблеток нет. Обратите внимание на акценты. Что самое важное на странице статьи (для пользователя, естественно. Цели бизнеса известны по умолчанию ;) )? А на странице товара? На главной?

    Из вашего вопроса, мне показалось, что вы растеряны и даже не представляете с чего начать работу, поэтому книги я вам не посоветую - не помогут.

    На мой взгляд, если вы уже взяли проект, то курить книги от корки до корки уже поздно.
    Лучше посмотрите структуру крутых и успешных сайтов конкурентов. Что сделано хорошо, а что плохо? Как это "плохо" можно улучшить. Одним словом, соберите информацию с реальных, работающих сегодня проектов, которые кому-то приносят деньги. На основе этой информации составьте прототип.

    Это поможет вам структурировать мысли и сформировать конкретные вопросы, на которые Яша с Гуглом дадут вполне релевантные ответы. Успехов!
    Ответ написан
    1 комментарий
  • Как называется человек который занимается эффективность рекламы на сайте (РСЯ, AdSense + ищет новых рекламодателей)?

    @vladdimir
    Верстальщик
    Маркетолог или специалист по маркетингу, еще: менеджер по рекламе. Тот, кто занимается только контекстной рекламой - директолог.
    Ответ написан
    Комментировать
  • HTML/CSS. Как убрать расстояние между объектами полностью?

    @vladdimir
    Верстальщик
    Элементы с заданным блочно-строчным типом видят пробелы, решение:
    /jsfiddle.net/kpmjtnw8
    Убираем размер шрифта у родительского элемента, возвращаем
    .main-nav {
      ...
      font-size: 0;
      ...
    }
    
    main-nav a,
    main-nav p {
      ...
      font-size: 24px;
      ...
    }


    Исправил
    Ответ написан
    2 комментария
  • Position vs padding и margin. В каких случаях использовать?

    @vladdimir
    Верстальщик
    На мой взгляд, совсем не уместно - использовать position для выравнивания потока документа. Я использую там, где нужно навести красоту, добавить декора: прилепить иконку к инпуту, приклеить что-то к чему то и т.д.

    Паддинг это отступ от содержимого элемента к границе, маргин от границы к следующему элементу.На мой взгляд тут нет четких правил вроде: вот тут можно использовать только паддинг, а вот тут маргин и больше ничего. Использовать на вкус и по макету.
    Поиграйтесь сами с разными вариантами, посмотри как что себя ведет, 10 минут практики иногда полезнее нескольких часов зубрежки)
    https://webref.ru/ - а тут можно почитать о css.
    Ответ написан
    Комментировать