• Как сделать, чтобы ребёнок с абсолютным позиционированием игнорировал релативное позиционирование родителя?

    @ned4ded
    Верстка, Фронтенд
    Никак.

    upd
    Наверное, немножко стоит пояснить, чтобы не быть голословным. Позиционирование элемента со свойством position: absolute; относительно родителя со свойством position: relative; - это заложенное в логику рендеринга поведение. Вы пытаетесь сломать то, что работает так, как задумано. Попробуйте положить мяч на наклонную поверхность и попросите гравитацию перестать работать, чтобы мяч не покатился вниз.

    Вот ссылка на спеку, если вам интересно, пример 13.
    Ответ написан
    1 комментарий
  • Почему запись .setAttribute('style', 'text-align:center;') неправильная?

    @ned4ded
    Верстка, Фронтенд
    td = document.createElement('td').setAttribute('colspan', '6').setAttribute('style', 'text-align:center;');


    это не jquery, после вызова первого метода setAttribute не возвращается $-элемент (т.е. отсутствует имплементированый в $ method chaining ), но возвращается undefined.

    вам нужно написать:
    const td = document.createElement('td');
    td.setAttribute('colspan', '6');
    td.setAttribute('style', 'text-align:center;');
    // console.log(td);
    // <td colspan="6" style="text-align:center;"></td>
    
    // ps я бы написал через сеттер 
    // td.style.textAlign = 'center';
    // td.colSpan = 6;
    Ответ написан
    Комментировать
  • Почему при нажатии кнопки в форме ничего не работает?

    @ned4ded
    Верстка, Фронтенд
    Могу предположить, что дело в типе кнопки. Попробуйте type="submit"
    Ответ написан
    Комментировать
  • Как сделать чтобы EventListener не работал некоторое время?

    @ned4ded
    Верстка, Фронтенд
    На мой взгляд, самый верный вариант - снимать листнер на время действия скролла, т.к., с точки зрения оптимизации, браузер не будет чекать во время анимации даже булевый флаг:
    (() => {
      const scrollingFn = () => {
       window.removeEventListener('wheel', scrollingFn);
    
       $.scrollTo($('.something'), 1000, {
         onAfter: () => window.addEvenListener('wheel', scrollingFn),
       });
      }
    
      window.addEventListner('wheel', scrollingFn);
    })();
    Ответ написан
    Комментировать
  • Почему не работает фильтр по свойствам класса?

    @ned4ded
    Верстка, Фронтенд
    В целом, вы, похоже, просто запутались в в контексте и ссылках:

    name.filter(product => name === undefined || product.name === this.name); 
    // в этом месте вы пытаетесь отфильтровать переданную опцию name, которая является строкой "anything 4",
    // так же контекст this.name - будет undefined, потому что в данном случае вы передаете стрелочную функцию, 
    // this которой будет ссылаться на объект, в котором она была создана, т.е. - на Shop. У Shop нет свойства name
    // правильный вариант: 
    const filtered = this.products.filter(product => {
     return product.name === undefined || product.name === name
    });


    Все последующие функции вам нужно отредактировать по тому же принципу.

    PS.
    Не совсем понимаю, зачем вам парсить строчные операторы сравнения, когда можно просто отправлять функцию сравнения в метод фильтрации.

    class Shop {
        constructor(products) {
            this.products = [];
        }
    
        addProduct(newProduct) {
            this.products.push(newProduct);
        }
    
        filterProduct(fn) {
          return this.products.filter(fn);
        }
        
    }
    const shop = new Shop();
    shop.addProduct(new Product("product 1", 1, 2000));
    shop.addProduct(new Product("item 2", 2, 100));
    shop.addProduct(new Product("some 3", 3, 500));
    shop.addProduct(new Product("anything 4", 4, 1000));
    
    const filtered = shop.filterProduct((product) => product.name === 'anything 4' && product.count > 3 && product.price >= 500);
    
    // console.log(filtered): [ Product { name: 'anything 4', count: 4, price: 1000 } ]


    На самом деле, есть еще много мелких моментов:
    1) С данными лучше работать функционально и не допускать добавления, удаление и проч. операции в текущем объекте, т.е. объект должен быть иммутабельным. При добавлении товара нужно создавать новый объект Shop.

    2) Вытекает из первого - зачем вам в конструкторе Shop сигнатура products, когда вы ее не используете? По сути, ее должно использовать именно для сохранения передаваемого массива продуктов.

    3) В объектах, работающих с данными, особенно когда идет фильтрация, сортировка и проч операции, лучше сразу имплементировать fluent-interface.
    Ответ написан
    Комментировать
  • Какова вероятность, что js вытеснит css?

    @ned4ded
    Верстка, Фронтенд
    Нет, не вытеснит, так же как наличие мяса не вытесняет с полок магазинов хлеб. Хороший веб-сайт - это компромис между производительностью и динамикой, и если что-то можно сделать через css, то лучше это сделать именно через css, не применяя js.
    Ответ написан
    1 комментарий
  • Как проверить, есть ли объект в массиве?

    @ned4ded
    Верстка, Фронтенд
    const arr = [
      {lat: 52.289591, lng: 21.030541},
      {lat: 52.289591, lng: 21.030541},
      {lat: 51.09464, lng: 17.019549},
    ];
    
    const uniq = arr.filter(
      (el, i, array) => !array
        .slice(0, i)
        .find(({lat, lng}) => lat === el.lat && lng === el.lng)
    );


    https://repl.it/@ned4ded/ElementaryVeneratedTelevision
    Ответ написан
    Комментировать
  • Как выбрать четные/нечетные дочерние элементы родителя только с определенным классом?

    @ned4ded
    Верстка, Фронтенд
    Ответ: Невозможно реализовать такую выборку через обычный css селектор.

    Каждый элемент в доме входит в "список сиблингов" (яхз как нормально перевести list of siblings), т.е. список таких нод, которые являются прямыми потомками для одной родительской ноды.

    Все структурные псевдо-классы (:nth-child, :nth-of-type, etc) работают именно со списком таких нод, т.е. выставляя любом селектору псевдокласс ":nth-child()" вы выбираете только те элементы, для позиции которых в списке сиблингов верна заданная в nth-child формула.

    На примере: .child:nth-child(1) { color: red; } не окрасит ни один элемент, по той причине, что ни один .child элемент не является первым в списке сбилнгов; однако, .child:nth-child(4) { color: red; } окрасит самый первый элемент с классом .child в приведенном ТС примере, т.к. он является 4 элементов в списке своих сиблингов.

    Вывод: без js вы не сможете сделать такую выборку. Я вижу два решения: 1) вы окрашиваете на стороне клиента эти элементы через js, 2) вы рассчитываете на стороне бека, какой из элементов является четным и добавляете ему класс .child--view--even, который в стилях будет окрашивать ваш элемент в красный цвет.

    Для фронта:
    (() => {
    	const elements = document.getElementsByClassName('child');
      
      const rec = (arr) => {
        if(!arr.length) return;
        
        const [even, odd, ...rest] = arr;
        
        even.setAttribute('style', 'color: red');
        
        return rec(rest);
      }
      
      rec(elements);
      
      return;
    })();


    ps если вы будете использовать мой пример в чистом виде, то лучше его отбабелить
    Ответ написан
    Комментировать
  • Как сделать контурную обводку png?

    @ned4ded
    Верстка, Фронтенд
    Добрый день. Т.к. изображение круглое, можно обойтись и без фотошопа. Удалите тег img. Сделайте картинку из img фоном для тега a. Используйте свойство border-radius. Пример:

    .shake {
      display:block;
      width: 90px;
      height: 90px;
      border: 5px solid transparent;
      border-radius: 100%;
      background-image: url(http://xn----8sbacs4bcidfthwu.xn--p1ai/wp-includes/images/call-img.png);
      background-repeat: no-repeat;
      background-size: cover;
      box-sizing: border-box;
    }
    
    .shake:hover {
      border: 5px solid hsl(0, 100%, 50%);
    }


    Пример на фидле.
    Ответ написан
    Комментировать
  • Слайдер пролистывает чере один слайд?

    @ned4ded
    Верстка, Фронтенд
    Добрый вечер. Файл app.js, содержащий исполняющий код для этого слайдера, подключен в двух местах. Полагаю, что удаление одной из ссылок на него ликвидирует проблему, т.к. eventlistner вешается на кнокпи дважды.
    Ответ написан
    1 комментарий
  • Как сделать слайдер, переключающийся по таймеру?

    @ned4ded
    Верстка, Фронтенд
    setTimeout() - функция однократного действия. Используйте setInterval() или рекурсию.

    Можете почитать тут.
    Ответ написан
    Комментировать
  • Что не так с этим кодом?

    @ned4ded
    Верстка, Фронтенд
    Все просто, ты пытаешься работать с html data=* атрибутом через .data() метод jquery, что не совсем одно и тоже.

    Сделай это через метод .attr(). Например, если исправить код вот здесь:

    var action = $(this).attr('data-action');

    то твой пример заработает (т.е. id у тебя нигде не используется).

    Почему не работает .data()? А вот почему:
    The data- attributes are pulled in the first time the data property is accessed and then are no longer accessed or mutated (all data values are then stored internally in jQuery).


    Т.е. используется этот метод только для сбора данных со страницы единожды, далее с этими данными работать можно только через .data() метод внутри jquery (изменять, удалять, дополнять).
    Ответ написан
    1 комментарий
  • Как сделать переход по ссылке с помощью input?

    @ned4ded
    Верстка, Фронтенд
    Добрый день! Могу лишь помочь вам с высоты своих скромных знанйи (я в http не очень шарю). Но мне кажется, вы немного запутались в языке самого протокола и процессе отправки данных с формы.

    Текст отправляется именно такой, потому что ? - это %3F в unicode. Любое name с формы будет перекодировано в base64. Сам же ? в конец строки браузера подставляется при формировании запроса к серверу (т.е. браузером, а не вами), сл-но, его нужно исключить.

    Тоже самое происходит со знаком амперсанд. Браузером автоматически собираются параметры с формы и отправляются на сервер используюя такую структуру: key=value&key2=value2...

    Следующий код сформирует запрос ?kek=&results=<your_text> к целевому пути

    <form action="/targetPage.html" method="GET">
        <input name="kek" hidden>
        <input type="text" name="results" value=""> // здесь нужно будет ввести текст
      </form>


    Как видите, в таком случае после слова kek подставляется знак равенство, т.к. это соответствует протоколу http. Веротяно, можно настроить http сервер, который сможет принимать и обрабатывать запросы без = (без пустого параметра), но я в точности вас сейчас просветить по этому моменту не смогу.
    Ответ написан
  • Оцените вёрстку макета?

    @ned4ded
    Верстка, Фронтенд
    Привет из htmlacademy, тоже верстал этот макет )
    Индекс:

    1) Иконки на дашборде расположены неровно.

    2) Едет меню каталога товаров при переполнении.

    3) Спецификация товара, сделанная через флекс, не имеет свойства wrap, из-за чего при переполнении едет верстка.

    4) Псевдоэлемент after для кнопки Подробнее находится не по центру в firefox.

    5) В email форме нет стилизации бэкграунда для инпутов.

    6) Футер, по-моему, должен быть растянутым в края (как и фон для блока services, которого у тебя нет).

    Страница каталога:

    7) бэкграунд для фильтров не соответствует макету и должен быть в края.

    8) Bluetooth радиокнопки сделаны неровно.

    9) Цены под карточками сделаны неровно.

    10) При наведении на карточку товара должна становится прозрачной кратинка, а не серый фон + позиционирование неровное, какая-то линия на каждой карточкой по наведению.

    11) Пагинация без заливки.

    12) Селфи-палка «Следуй за мной» 4900 руь.

    13) И почти для всех блоков: ты используешь display:flex, но располагаешь элементы все равно используя margin. Да, в некоторых местах это необходимо, но, например, в меню каталог товаров, в info секции можно нормально расположить блоки, используя свойства флекс-боксов. А в каталоге (в лучшем месте для использования флекса), у тебя inline-block )

    14) В некоторых местах у тебя используются section теги, тогда как являются они, по сути, обычными дивами.

    Сколько времени тебе осталось до сдачи работы?) Я свою, помню, допиливал в последние минуты перед дедлайном ^^
    Ответ написан
    2 комментария
  • Как сделать эфект ховер на карточки товаров как на tiffany или sunlight?

    @ned4ded
    Верстка, Фронтенд
    На Tifanny это реализовано с помощью js. Сильно сомневаюсь, что тут нужна доп. библиотека. При наведении на товар добавляется целый блок в секцию товара. После mouseleave (хз, как назвать это по-русски, отведение курсора?) блок удаляется.

    У них использован js, вероятно, для сокращения веса страницы, увеличения скорости рендеринга.

    Как ни странно, на Sunlight это реализованно сильно по-другому. Там через js добавляется только класс к блоку, все остальные его элементы уже заранее собраны.

    Совпадение стилей - случайность, возможно, дизайн кто-то у кого-то стырил (причем весь дизайн, у них совпадает не только эффект при наведении на карточку товара, но много чего еще).

    На чистом css реализовать можно, но без анимации. Что-то вроде:

    .card
        .card__info
        .card__info-more

    .card__info:hover ~ .card__info-more { display: block };


    Все это вы вполне могли узнать сами, используя инструменты разработчика ;)
    Ответ написан
    3 комментария
  • Почему блок с outline не слушается z-index?

    @ned4ded
    Верстка, Фронтенд
    z-index работает только с абсолютной и относительной позиционкой.

    https://jsfiddle.net/ned4ded/cbn4dts3/
    Ответ написан
    Комментировать
  • Как зафиксировать текст на определенном месте страницы (при медиазапросах)?

    @ned4ded
    Верстка, Фронтенд
    Доброго дня.

    Предлагаю обернуть куб в контейнер, контейнеру задать относительное позиционирование (p: relative). Текст с p: absolute внутри такого контейнера будет позиционироваться относительно своего родителя, а не страницы. Если размер контейнера не будет изменяться, то не будет изменяться и позиция текста внутри этого контейнера.
    Ответ написан
    Комментировать
  • Как прижать блоки один блок к низу а другой к правому верхнему углу?

    @ned4ded
    Верстка, Фронтенд
    В общем, проблем несколько:

    1) вы редактируете позиционку div-контейнеров, а не самих svg внутри этих контейнеров.

    2) у вас есть небольшие проблемы с пониманием того, как работает viewBox. 3 и 4 значением свойства задаются ширина и высота svg элемента. Но т.к. у svg нет как таковой ширины и высоты, т.к. это векторная графика, то это больше соотношение ширины ии высоты + их дефолтные значения для ширины равной 100%. Более того, внутренние элементы svg (у вас - path в обоих случаях) начинают свой отсчет координат от верхнего левого угла svg, соответственно, чтобы они полностью поместили в svg контейнер, нужно, чтобы сам контейнер удовлетворял соотношениям сторон, которые были использованы при создании svg-элементов.

    Лучший выход:
    1) Задайте для body

    display: flex;
      flex-flow: column nowrap;
      justify-content: space-between;


    Это позволит нормально расположить див - контейнеры svg.

    2) Задайте самим дивам относительное позиционирование:

    #buttom {
      position: relative;
    }
    
    #top {
      position: relative;
    }


    3) Добавьте svg элементам классы class="top" и class="bottom"

    4) Задайте классам следующие стили, чтобы расположить их внутри див-контейнеров:

    .top {
      position: absolute;
      width: 60%;
      right: 0;
    }
    .bottom {
      position: absolute;
      bottom: 0;
    }


    5) Измените viewBox для обоих svg согласно соотношениям их сторон:

    <!-- Для примера на моем фидле использовано именно такое значение.
    Вообще соотношение ~ равно 5,2 к 1, расчитать можете его делением ширины на высота 
    (или наоборот, как вам удобно) -->
    <svg class="top" viewBox="0 0 690 133" > ... 
    
    <!-- примерно 7,2 к 1 -->
    <svg class="bottom" viewBox="0 0 1170 163" > ...


    Пример тут:
    https://jsfiddle.net/ned4ded/jbw09skj/3/

    Надеюсь, я понял вас правильно и вы имели ввиду именно ресайз svg элементов в зависимости от ширины страницы. Чтобы посмотреть функционирование - сократите ширину iframe элемента с отображением результата
    Ответ написан
    Комментировать
  • Как подгонять макет под Pixel Perfect?

    @ned4ded
    Верстка, Фронтенд
    Доброго дня!

    У этого расширения есть поле "масштаб".

    5a140b32241b1741659528.png

    Вам нужен, судя по всему, масштаб = ~0,85.

    В любом случае, если не получится уменьшить масштаб картинки, то можно уменьшить масштаб отображения окна браузера (ctrl+колесо).
    Ответ написан
    1 комментарий
  • Обязательно ли отправлять заголовок запроса серверу?

    @ned4ded
    Верстка, Фронтенд
    Работать-то может и будет, но заголовок - это мета, примерно как !doctype для html документа, http сервер должен обработать метаданные, чтобы не было проблем с кодировкой и т.п. Вероятно, в большинстве случаев тип контента будет определен автоматически, но это явно плохая практика.

    Отвечая на ваш вопрос - нет, не обязательно[, но желательно].
    Ответ написан
    Комментировать