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

    mizutsune
    @mizutsune
    Frontend Developer
    Один из вариантов - это использовать псевдоэлементы для двойного бекграунда блока.

    Вариант - #1

    .element {
            width: 100%;
            height: 400px;
            position: relative;
    }
    
    .element:before {
            content: "";
            width: 30%;
            height: 100%;
            background: #673ab7;
            position: absolute;
            top: 0;
            left: 0;
    }
    
    .element:after {
            content: "";
            width: 70%;
            height: 100%;
            background: url(image.jpg);
            position: absolute;
            top: 0;
            right: 0;
    }




    Блок с текстом уже при желании можно отцентрировать кучей различных способов.

    Если рассматривать другие варианты, то к примеру можно взять свойство background-image и применить с его помощью два фона к блоку, путём указания двух разных бекграундов, плюс минус потребуется настройка положения, размера, etc. Допустим первый бекграунд сделаем градиентом, а для второго уже можно использовать изображение.

    Вариант - #2
    .element {
            width: 100%;
            height: 400px;
            background: linear-gradient(to right, #e91e63 100%, transparent), url(image.jpg);
            background-size: 30% 100%, 70% 100%;
            background-position: left center, right center;
            background-repeat: no-repeat, no-repeat;
    }


    Есть конечно ещё множество других вариантов, но некоторые из них не стоит рассматривать, потому что данная задача решается одним только CSS, без добавления лишних сущностей в разметку.
    Ответ написан
    2 комментария
  • Как реализовать такой эффект?

    mizutsune
    @mizutsune
    Frontend Developer
    Это называется Before/After Image Slider Comparison или просто Image Comparison Slider.

    Несколько плагинов на JQuery.
    Несколько разных вариантов.
    Ещё можно на Codepen поискать. Есть несколько вариантов.

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

    mizutsune
    @mizutsune
    Frontend Developer
    Можно сделать например через clip-path + SVG.

    Если кратко объяснить процесс, то это делается примерно так:

    Рисуете в графическом редакторе фигуру, которая будет использоваться в качестве контейнера для видео. Далее копируем код SVG и воспользовавшись данным инструментом, получаем координаты для реализации clip-path.

    Финальная реализация будет выглядеть примерно так:

    <svg class="svg">
      <clipPath id="my-clip-path" clipPathUnits="objectBoundingBox">
        <path d="M0.5,0 L1,1 H0"></path>
      </clipPath>
    </svg>
    
    <div class="clipped">
      <video src="./assets/video.mp4"></video>
    </div>


    .svg {
         position: absolute;
         width: 0;
         height: 0;
    }
    
    .clipped {
         width: 100%;
         max-width: 500px;
         height: 350px;
         -webkit-clip-path: url(#my-clip-path);
         clip-path: url(#my-clip-path);
    }
    
    video {
            width: 100%;
            height: 100%;
            object-fit: cover;
    }
    Ответ написан
    3 комментария
  • Как нормализовать высоту элемента во флексбоксе?

    mizutsune
    @mizutsune
    Frontend Developer
    Так как в вопросе нет ссылки на песочницу, остаётся только догадываться что там, но судя по скринам скорее всего структура блока с карточками такая:

    <parent>
       <card></card>
       <card></card>
       <card></card>
       <card></card>
       <button></button>
    </parent>


    И если у родительского блока установлено display: flex и без изменений свойство align-items, тогда получается такая вот картина:

    6307d351d66e6315633533.png

    Это потому что в свойстве align-items по дефолту стоит значение stretch. Можете погуглить об этом и найдете полезную информацию, но во всяком случае вот:

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


    Если нужно по-быстрому решить задачу, тогда просто добавьте для родительского контейнера:

    align-items: center;

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

    mizutsune
    @mizutsune
    Frontend Developer
    1. Оборачиваем нужное слово, например в тег <span сlass="element">Hello</span> и для удобства добавляем класс, по которому будет стилизовать элемент.
    2. Так как тег span является строчным элементом, добавим ему свойство display со значением inline-flex или inline-block. Это нужно для получения корректных значений, при вычислении высоты и ширины элемента.
    3. Задаём нужный font-size, font-family, line-height(можно добавить ещё font-weight, но это по желанию) и узнаем ширину и высоту элемента. При изменении размера шрифта - эти данные конечно будут меняться, но это наверняка не будет особой проблемой.
    4. Задаём изображению флага - размеры высоты и ширины блока с текстом. Картинку можно даже сделать немного больше.


    Теперь переходим к стилям CSS:

    .element {
            background-image: url(./image.jpg);
            background-repeat: no-repeat;
            background-size: cover;
            -webkit-background-clip: text;
            -webkit-text-fill-color: transparent;
            font-size: 50px;
            line-height: 50px;
            display: inline-flex;
            font-family: "Roboto", sans-serif;
    }


    Через группу свойств:

    background-image: url(./picture.jpg);
    background-repeat: no-repeat;
    background-size: cover;


    Задаём фоновое изображение для элемента(для текста) и настраиваем дополнительные параметры отображения бекграунда. Если вдруг нужно отцентрировать изображение по вертикали или горизонтали, используем предназначенные для этого свойства: background-position-x или background-position-y.

    Основную работу выполняют следующие свойства: -webkit-text-fill-color и background-clip, которые создают эффект прозрачности, что позволяет использовать бекграунд элемента в качестве фона для текста. Однако можно обойтись и без свойства -webkit-text-fill-color, заменив его следующей строчкой color: transparent.

    Однако, смотрим поддержку данных свойств:

    -webkit-text-fill-color 
    -webkit-background-clip


    И если текущее состояние не устраивает, используем SVG с текстом и заливкой в виде картинки.
    Ответ написан
    Комментировать
  • Почему transition не срабатывает при скрытии элемента?

    mizutsune
    @mizutsune
    Frontend Developer
    Для начала несколько рекомендаций:

    1. Следует отказаться от стилизации элементов по ID селектору, потому что это считается плохой практикой.
    2. Для простой функции переключения класса у элемента, не нужно столько кода.

    Почему transition не срабатывает при скрытии элемента?


    - transition: opacity 0.3s;
    + transition: opacity 0.3s, visibility 0.3s;


    При комбинированном использовании свойств opacity и visibility, следует указывать оба свойства в transition, желательно с одинаковым временем перехода от одного состояния к другому.

    CSS и JS можно сократить и привести к нормальному виду.


    CSS:

    .block {
        width: 250px;
        height: 250px;
        background: #eee;
        opacity: 0;
        visibility: hidden;
        transition: opacity 0.3s, visibility 0.3s;
      }
    
      .block-active {
        opacity: 1;
        visibility: visible;
      }


    JS:

    function show() {
        const element = document.getElementById("block");
        element.classList.toggle("block-active");
      }


    Или:

    function show() {
         const element = document.getElementById("block");
    
         switch (Boolean(element.classList.contains("block-active"))) {
              case false:
                   return element.classList.add("block-active");
              case true:
                   return element.classList.remove("block-active");
         }
    }
    Ответ написан
    5 комментариев
  • Как при наведении на картинку сделать под ней фон в виде окружности?

    mizutsune
    @mizutsune
    Frontend Developer
    Вариант первый:



    В данном примере при наведении на блок, меняется цвет фона у псевдоэлемента, который находится на заднем фоне изображения. Псевдоэлемент можно заменить например SVG фигурой, чтобы добиться похожего визуального эффекта как на сайте Юла.

    Вариант второй:



    В данном примере при наведении на блок, меняется цвет заливки у SVG вектора.
    Ответ написан
    6 комментариев
  • Почему img стоит не по центру button?

    mizutsune
    @mizutsune
    Frontend Developer
    Конечно неплохо было бы добавить кнопке отдельный класс и уже дальше стилизовать кнопку по селектору класса, а не по имени тега. Ну это так, скорее рекомендация.

    А так по поводу вопроса, то можно сделать например вот так:

    button {
      width: 30px;
      height: 30px;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    Ответ написан
    5 комментариев
  • Как у input "file" убрать дефолтный значек?

    mizutsune
    @mizutsune
    Frontend Developer
    При создании своих версий input file, input radio, select и прочих нативных элементов, нужно учитывать многие детали, без реализации и настройки которых компонент будет просто красивой свистелкой без полноценного функционала.

    Вот небольшой пример кастомного </input type="file">:



    Тут конечно есть ещё над чем поработать, но основа уже есть.
    Ответ написан
    Комментировать
  • Почему не работает анимация? CSS JS?

    mizutsune
    @mizutsune
    Frontend Developer
    Анимация не работает потому что в переменной --animation-duration скорее всего содержится <число>ms. Если указать только число, то всё будет работать.

    Однако зачем такие calc(var(--animation-duration) * 1ms) сложности? Неужели не проще написать напрямую время анимации или пусть даже в переменной, но без calc() и прочего? Для чего лишние вычисления и прочие операции? Не нужно ничего усложнять.

    Можно написать намного проще.

    Указываем нужное время анимации в переменной:

    --animation-duration: 500ms;

    Используем без всяких наворотов и лишних движений:

    .add-panel_button.sending .svg{
        animation: fly-out-in var(--animation-duration) ease-in-out;
    }


    В скрипте тоже содержится достаточно лишнего кода. Вместо setTimeout можно прослушивать событие animationend на нужном элементе и тогда лишние вычисления станут реально "лишними" и их можно будет удалить.

    addTodoButton.addEventListener("click", () => {
         addTodoButton.classList.add("sending");
         addTodoButton.addEventListener("animationend", e => {
                   addTodoButton.classList.remove("sending");
                   addItem();
              }, { once: true }
         );
    });
    Ответ написан
    1 комментарий
  • Как сделать двойную стрелочку на Css?

    mizutsune
    @mizutsune
    Frontend Developer
    Если хочется использовать или создавать иконки на CSS, можете посмотреть эту библиотеку: https://github.com/astrit/css.gg

    Там есть CSS версии иконок, например вот двойная стрелочка. Можете найти нужные вам и заодно возможно и поучиться как делать подобное.

    Или гуглить:

    chevron right css
    chevron double right css

    Однако на мой взгляд для таких целей всё же лучше подходят SVG иконки.
    Ответ написан
    Комментировать
  • Как создать сетку из фото как в инстаграм?

    mizutsune
    @mizutsune
    Frontend Developer
    Если правильно понял, то можно например вот так:



    Соотношение сторон конечно изменить, если нужно что-то другое, изменив значение в свойстве aspect-ratio или если по каким-то причинам свойство aspect-ratio не подходит, тогда можно воспользоваться старым трюком используя padding-top: 100% на родительском контейнере, а изображению установить абсолютное позиционирование + растянуть на всю высоту и ширину родительского блока.
    Ответ написан
    1 комментарий
  • Как изменить цвет лейбла при состоянии input checked?

    mizutsune
    @mizutsune
    Frontend Developer
    Вместо того чтобы пытаться менять стили тега label при состоянии :checked у input, можно использовать для стилизации элемент <span class="color-tabs__text"></span> и добавив для этого элемента - псевдоэлемент, набросать для него дополнительные стили.

    Далее при выборе кнопки, можно менять внешний вид элемента <span class="color-tabs__text"></span> , а также и внешний вид его псевдоэлемента, что собственно говоря очень удобно.

    Пример:

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

    mizutsune
    @mizutsune
    Frontend Developer
    Как поменять цвет активного буллита


    .swiper-pagination-bullets .swiper-pagination-bullet-active {
    // стили для активного буллета
    }


    и как их все вместе немного сдвинуть вниз


    Добавить определенные стили для элемента .swiper-pagination-bullets. Например margin-top или если блок с буллетами имеет абсолютное позиционирование, тогда использовать свойство top.
    Ответ написан
    1 комментарий
  • Как сделать кнопку-ромб?

    mizutsune
    @mizutsune
    Frontend Developer
    Например:

    .button {
        background: #63319f;
        padding: 10px 45px;
        color: #fff;
        clip-path: polygon(85% 0, 100% 50%, 85% 100%, 15% 100%, 0% 50%, 15% 0);
    }
    Ответ написан
    Комментировать
  • Как сделать линии между элементами flex?

    mizutsune
    @mizutsune
    Frontend Developer
    Как вариант, можно сделать через псевдоэлемент, чтобы не загрязнять разметку лишними сущностями, учитывая тот факт что эта линия - больше украшательство, чем что-то более серьезное и требущее отдельных элементов.

    Вот пример:

    <div class="block">
         <span class="title">Hello World</span>
         <span class="value">999999</span>
    </div>


    .block {
         display: flex;
         align-items: baseline;
    }
    
    .block::after {
         background: #4a4a4a;
         height: 3px;
         content: "";
         flex-grow: 1;
    }
    
    .value {
         order: 3;
    }


    При желании можно заменить псевдоэлемент, например на тег span.

    Есть конечно ещё и другие варианты, например задать border-bottom родителю, а дочерним элементам прописать однотонный фон, чтобы он закрыл собой линию снизу и это собственно говоря и создаст эффект как на картинке(плюс-минус добавить дополнительные стили), но это наверное не столь красиво и аккуратно, выглядит, если сравнивать с первым вариантом.
    Ответ написан
    2 комментария
  • Как корректно сделать плавное изменение цвета кнопки при hover?

    mizutsune
    @mizutsune
    Frontend Developer
    Можно сделать например так:

    .quality__button--all {
        margin-right: 13px;
        position: relative;
        background: #FF6428;
        border-radius: 40px;
        padding: 18px 45px;
        overflow: hidden;
        display: inline-flex;
        justify-content: center;
        align-items: center;
        text-decoration: none;
        color: #FFF;
    }
    
    
    .quality__button--all::before {
        content: "";
        background: #FF6428;
        color: #fff;
        background: red;
        border-radius: 40px;
        position: absolute;
        top: 0;
        left: 0;
        width: 0%;
        height: 100%;
        transition: width 0.3s linear;
    }
    
    .quality__button--all:hover::before {
        width: 100%;
    }
    
    .quality__button.quality__button--all::after {
        content: "Get the App";
        position: relative;
        color: inherit;
    }


    Ещё можно сделать без изменения ширины с помощью transform: translate:

    .quality__button--all::before {
        width: 100%;
        transform: translateX(-100%);
        transition: transform 0.3s linear;
    }
    
    .quality__button--all:hover::before {
        transform: translateX(0);
    }
    Ответ написан
    1 комментарий
  • Как прижать footer к низу страницы?

    mizutsune
    @mizutsune
    Frontend Developer
    Это реализуется многими способами, но вот например как можно сделать гридами:

    Разметка:

    <div class="wrapper">
         <header></header>
         <main></main>
         <footer></footer>
    </div>


    Стили:

    .wrapper {
        display: grid;
        grid-template-rows: auto 1fr auto;
        grid-template-columns: 100%;
        min-height: 100vh;
    }
    Ответ написан
    Комментировать
  • Почему не работает бургер меню?

    mizutsune
    @mizutsune
    Frontend Developer
    Не работает потому что у вас ошибка в строчках:

    menu.toggleClass('.burger-menu_active');
    menu.hasClass('.burger-menu_active')

    Нужно просто убрать точки перед именами классов в этих методах:

    menu.toggleClass() & menu.hasClass()

    Полезная информация по этим методам: JQuery - toggleClass и JQuery - hasClass и совет на будущее: Если используете ту или иную библиотеку, читайте внимательнее документацию. Это намного упрощает жизнь.

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

    Переписать исходную функцию на нативный JS, можно например так:

    function burgerMenu(selector) {
      const menuElement = document.querySelector(selector);
    
      const elements = [
        "burger-menu_link",
        "burger-menu_button",
        "burger-menu_overlay",
      ];
    
      const isTriggerElement = (element) => {
        return [...element.classList].some((className) =>
          elements.includes(className)
        );
      };
    
      menuElement.addEventListener("click", ({ target }) => {
        if (isTriggerElement(target)) {
          toggleMenu();
        }
      });
    
      function toggleMenu() {
        menuElement.classList.toggle("burger-menu_active");
        menuElement.classList.contains("burger-menu_active")
          ? document.body.classList.add("no-scroll")
          : document.body.classList.remove("no-scroll");
      }
    }
    
    burgerMenu(".burger-menu");


    И немного дополнить стили.

    Добавить правило pointer-events: none для элемента .burger-menu_lines

    .burger-menu_lines {
       pointer-events: none;
    }


    И добавить новый класс:

    .no-scroll {
       overflow: hidden;
    }


    Намного проще написать подобный функционал на чистом JS и не стоит тащить в проект зависимость в виде Jquery. Лучшие времена этой библиотеки уже давно прошли.
    Ответ написан
    1 комментарий