Ответы пользователя по тегу CSS
  • Как запретить сжатие блока по ширине при фиксированном позиционировании?

    neuotq
    @neuotq
    Прокрастинация
    Ну так у вас ширина bonus_window не задана его, те фактически блок на всю доступную ему ширину. Ширину уменьшается, блок соответственно тоже будет сжиматься.
    Делайте ему жесткие размеры ширины bonus_window, можно даже добавить и ключи по media queries для разных размеров экрана.
    Ну и лучше позиционировать по правому краю, чтобы не заходил блок за пределы экрана, либо тогда учитывать это в тех же media queries, зная под какую ширину экрана, какой размер блока(и конечно же внутренних элементов) вас устроит.
    Ответ написан
    Комментировать
  • Как при клике убрать активный класс?

    neuotq
    @neuotq
    Прокрастинация
    Немного упростим главный код и исправим названия класса.
    Активный класс, если это БЭМ или типа БЭМ, должен быть не _active, а fits-cars-showmore-content_active, ну и с остальными соответственно.
    Так же разделим название для data атрибутов, чтобы у кнопок и контента они различались, так желательно в данной семантике. Либо в дата атрибут передавать айди кого будем дёргать. Тут уже на усмотрение разработчика в зависимости от дельнейшего пути
    Сам цикл упростим (но желательно конечно вернуть/добавить проверки аргументов, существования элементов и тп, я убрал для наглядности.).
    const autoBtns = document.querySelectorAll('.block-tabs-main-home__item');
    	autoBtns.forEach(
        btn => {
          btn.addEventListener("click", (e) => {			
            const contentId = btn.getAttribute("data-content-id");     
            document
                .querySelectorAll(`[data-id="${contentId}"], .fits-cars-showmore-content_active`)
                .forEach( (el) =>
                  el.classList.toggle('fits-cars-showmore-content_active')
                )
    	        }
          );
        }
      );

    Обновил пример, забыл что вы хотели закрывать и другие. В любом случае действий мы выполняем меньше, чем обходя безусловно все элементы. Здесь мы обходим только те кто открыт и тот у кого айди совпадается
    Рабочий пример
    Ответ написан
    Комментировать
  • Как передать значение свойства в ::before класса динамически?

    neuotq
    @neuotq
    Прокрастинация
    В целом если такое происходит повод избавиться от псевдоэлемента, в подобных случаях почти всегда это можно сделать заменив его на настоящий с теми же свойствами.
    В свойстве style нельзя обращаться к псевдоэлементам, поэтому для интерактивности в схожем стиле можно использовать styled components:
    Где-то в ваших стилях:
    .testClass {
      font-size: 1.5em;
      text-align: center;
      color: #bf4f74;
    }
    
    .testClass::before {
      content: 'QQ';
      position: absolute;
      top: 10px;
    }

    В компоненте:
    // ... 
    const [textColour, setTextColour] = useState('blue');
    const TestElement = styled.h1`  
      &:before {
        color: ${textColour}
      }
    `;
    
     return (
        <>  
      <button
              onClick={() =>
                setTextColour((color) => (color === 'black' ? 'red' : 'black'))
              }
            >
              Change color of :before
            </button>   
          <Title TestElement="testClass"> HELLO </Title>
        </>
      );

    Таким образом можно будет менять интерактивно свойства псевдоэлемента.
    Ответ написан
    4 комментария
  • Как перевести пиксели в REM?

    neuotq
    @neuotq
    Прокрастинация
    Есть плагин https://plugins.jetbrains.com/plugin/11187-px2rem , но лучше наверное styleint и для него плагин https://github.com/a-tokyo/stylelint-rem-over-px который и чекает на пиксели и автоисправляет.

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

    neuotq
    @neuotq
    Прокрастинация
    У вас другие слои перехватывают события poiner-events, поэтому конвас как бы не видит их.
    Для этого, например, можно для main__section отключить : pointer-events: none;, а потом для нужных элементов включать, в данном случае для canvasFluid: pointer-events: all;

    PS и помним что такой эффект крайне ресурсоемкий, советую протестировать на "слабых" устройствах, на многих будет МНОГО меньше 60 fps, да даже меньше 10.
    Ответ написан
    4 комментария
  • Как выделить селектор?

    neuotq
    @neuotq
    Прокрастинация
    Пффф, легко.
    Берём вычисляем свгешку, и родитель родителя.
    Да не супер надёжно, но работает) Можно ещё доработать специфичность.
    document.querySelector('[d="M5.293 8.293a1 1 0 0 1 1.414 0L12 13.586l5.293-5.293a1 1 0 1 1 1.414 1.414l-6 6a1 1 0 0 1-1.414 0l-6-6a1 1 0 0 1 0-1.414Z"]').parentElement.parentElement;
    Ответ написан
  • Есть ли смысл делать анимацию без JS?

    neuotq
    @neuotq
    Прокрастинация
    Анимация = анимации рознь.

    Конкретный ответ со списком вы тут не увидите, это будет большая статья, со множественными "а вот тут", "но здесь" просто потому что многое зависит от контекста, задач, планирование.
    Главные рекомендации это не делать на js то, что отлично реализуется с помощью css. Этим к сожалению часто болеют многие фронтендеры, особенно из тех кто принципиально не любит вёрстку. Банальные примеры некоторые виды трансформаций объектов при булевых сменах какого параметра(условно навел/убрал наведения, вкл-выкл и тп).

    Но нужно иметь ввиду, что там где у вас выходит сложная логика, разные усложнённые сценарии, динамические параметры запуска и тп и тд. Без js естественно никуда.

    Поэтому просто зная возможности css, имея здравый смысл, вы будете видеть и знать где что использовать.
    К счастью css тоже в последнее время активно развивается давай нам всё больше возможностей.
    Поэтому - простая штука, что-то типа одноразовых анимации, простого повторения, туда сюда - подумать про css.
    Если к этому добавляются всякие реакции на сложные тайминги, старт-пауза перемотать остановить на промежутке и тп - js.
    Ну и безусловно разные сложные, многоходовки с завязкой друг на друга - однозначно js.

    В целом информации на эту тему достаточно в интернете, мудрить здесь особо не стоит. Поэтому повторюсь: просто здравый смысл и держать в уме знание css и не брезговать его использовать. Нередко кстати сами верстальщики уже готовят эти анимации, но это уже отдельный разговор организации команд и внутрипроектной кухни. Я сторонник того что фронтэндер, пусть и не обязан прям верстать верстать, но знать вёрстку/css должен на очень хорошем уровне.
    Ответ написан
    Комментировать
  • Почему не работает range slider?

    neuotq
    @neuotq
    Прокрастинация
    Главная причина в том, что вы отключили pointer events для него в CSS (у range.input : pointer-events: none;).
    Далее, в value вы отправляете просто константу, более того куда и как он будет обновлять значения?

    Обновим немного код, добавив состояния, чтобы потом можно было легко использовать значения в дальнейшей логике.
    import * as React from 'react';
    import styles from './style.module.scss';
    
    export default function App() {
      // состояние для левого
      const [leftVal, setLeftVal] = React.useState(2500);
      // состояние для правого
      const [rightVal, setRightVal] = React.useState(7500);
      //  Константы для ограничения макс и минимального значения
      const MINVAL = 0;
      const MAXVAL = 10000;
      return (
        <div className={styles.main}>
          <div className={styles.slider}>
            <div className={styles.slider__progress} />
          </div>
          <div className={styles.range}>
            <input
              type="range"
              name="range-min"
              min={MINVAL}
              max={MAXVAL}
              value={leftVal}
              onChange={(e) => setLeftVal(parseInt(e.target.value))}
            />
            <input
              type="range"
              name="range-max"
              min={MINVAL}
              max={MAXVAL}
              value={rightVal}
              onChange={(e) => setRightVal(parseInt(e.target.value))}
            />
          </div>
        </div>
      );
    }


    Далее, у вас теперь будет работать только последний(по порядку в коде html/jsx ), тк он будет "наверху" и события мышки просто не могут достучаться до второго. Более того, логика работы нарушается, например он может быть меньше своего левого брата, что не ок. Ну и ещё МНОГО подводных камней. Вся проблема в том, что сам стандартный элемент input range поддерживает только одно значение, а вам нужно да. Логика испольнения этого не то чтобы сложна, но таки не совсем тривиально, нужно немного поработать.

    Вот ссылка, можете изучить пример если идти по вашему пути.
    Либо как это делают через другие html элементы(условно на div), эмулируя порведение.

    На мой взгляд гибое дело с этим возиться, если у вас только не личный интерес поиграться. Если для дела - то берите готовую библиотеку + во всех(или почти всех) UI библиотека он тем или другим способом реализован.
    Ответ написан
    Комментировать
  • Как в форму вставить блок?

    neuotq
    @neuotq
    Прокрастинация
    Поместите всё в один общий блок. Вот я схематично набросал
    Ответ написан
    2 комментария
  • Как поменять цвет кнопки play для видео с youtube внутри iframe?

    neuotq
    @neuotq
    Прокрастинация
    Я бы на вашем месте не мучался, взял бы https://plyr.io/ и сделал свой дизайн.
    Ответ написан
    Комментировать
  • Прозрачный текст без размытия на filter: blur() родителе?

    neuotq
    @neuotq
    Прокрастинация
    Думаю идти по пути css(или нет) mask и около. Сейчас нет возможности экспериментировать. Но возможно всю часть с блёром придётся делать в svg.
    Ответ написан
    Комментировать
  • Как сделать чтобы текст рос вверх?

    neuotq
    @neuotq
    Прокрастинация
    Короче, забудь про абсолюты как про страшный сон. Очень редко, только когда другое ну никак нельзя.
    Сделать можно разными способами, например на флексах
    Ответ написан
    3 комментария
  • Как убрать одинаковую высоту Flex блоков div?

    neuotq
    @neuotq
    Прокрастинация
    Если именно на флексах, то можно хакать через flex-direction: column и задавать высоту этого контейнера. Тогда они складываться у вас будут по вертикалям без лишних пустот. Но это такой полукостыльный хак, хотя в некоторых ситуациях допустим и помогает.
    Ответ написан
    Комментировать
  • Как поступить в ситуации, когда настройка rem`ов не подходит к каким-то элементам на сайте?

    neuotq
    @neuotq
    Прокрастинация
    Ответ немного не в тему, но подобная практика что вы приводите относительно плохая. Одно из ключевых удобств и причин использование rem — это уважение настроек браузера пользователя. Те мы насильно не переписываем их значения. Зная базовый стандартный размер шрифта в 16px, мы можем примерно понимать, как всё будет устроено. При этом если человек у себя изменил шрифт в настройках, то сайт будет выглядеть почти идеально.
    А в вашем случае, выходит костыльный путь, который даёт ощущение меньшего кода. Так не делают.
    Я уж молчу о том, что сами элементы почти всегда масштабируются не пропорционально на разных устройствах ключевых.
    Ну и подход нужно с mobile-first начинать, а потом, если нужно, корректировать, те условно будет
    //код общий и для мобилок
    .elem {
    //...
    }
    //код для устройств 768++
    @media (min-width: 768px) {
    // ... 
    }
    //код для устройств 768++
    @media (min-width: 768px) {
    // ... 
    }
    //код для устройств 1024++
    @media (min-width: 1024px) {
    // ... 
    }
    //и тп

    Тогда код остается контролируемым, гибким. простым и ясным. Понятно, что и где как себя ведёт.
    А с вашим подходом, будет слишком много крайних случаев, когда нужно будет делать исключения, писать доп правила нарушающие логику, просто чтобы заработало и тп.
    Теперь сам ответ на ваш вопрос, вам тогда нужно в каждое значение ваших media queries, помимо html, добавлять и элемент для которого будут свои, исключительные значения, ну условно
    @media(max-width: 991px){
        html{
            font-size: 10px;
        }
       .shapka-element {
            font-size: 12px;
        }
    }
    Ответ написан
    4 комментария
  • Добавление собственных CSS элементов поверх сайта при помощи devtools, как правильно?

    neuotq
    @neuotq
    Прокрастинация
    Ну так в вашем коде просто создаётся элемент, а потом добавляется в DOM дерево.
    В конкретно вашем случае это картинка, у которой заданы соответствующие CSS чтобы она была поверх других элементов, ну и в конце её адрес.
    Вы так же можете что-то свое сделать, не обязательно картинкой.
    Ответ написан
  • Какое задать значение max-width для адаптации под телефон?

    neuotq
    @neuotq
    Прокрастинация
    Советую все брейкпоинты самому по минимуму придумывать, а брать у лидеров:
    https://getbootstrap.com/docs/5.1/layout/breakpoints/
    https://tailwindcss.com/docs/responsive-design
    Изучи какие они используют, смело бери их к себе в проект.
    Ну и конечно же лучше идти снизу вверх, те по умолчанию у тебя мобильная вёрстка, в брейкпоинтах пишешь то, что отличается у тех кто больше.
    Ответ написан
    Комментировать
  • Откуда взять изображения под ретину?

    neuotq
    @neuotq
    Прокрастинация
    По хорошему, вы изначально работаете с учётом "ретина" дисплеев, те разрешение растровых изображений условно в два раза больше чем физический размер в пикселях, а уже при сдаче проекта либо вы, либо верстальщик в автоматическом режиме(через сборщик проекта), делает все остальные.
    Таким образом, например у вас в макете есть растр размером(по макету) 200 на 300 пикселей, вы должны предоставить картинку 400 на 600.
    Ответ написан
  • Блок выходит за пределы, как убрать scroll?

    neuotq
    @neuotq
    Прокрастинация
    Ну так у вас же прокрутку добавляет не section, а другой блок(content). Вот ему и добавляйте новый класс для hidden
    Ответ написан
    4 комментария
  • Как адаптировать svg?

    neuotq
    @neuotq
    Прокрастинация
    Так же как и другие.
    Допустим начать можно с ограничения по родителю и ширине, условно:
    svg {
    max-width: 100%;
    }

    В целом практика - засовывать svg в контейнер и таким образом рулить.
    А так есть библиотеки для этого, в том числе и js
    Ответ написан
    3 комментария
  • Табы в JS. Почему не работает трансформация на втором изображении?

    neuotq
    @neuotq
    Прокрастинация
    Вы пишите в коде :
    let currentArrow = document.querySelector(".tab__arrow");

    Таким образом выбирая стрелку по слишком общему селектору, попадает первая.
    Ответ написан
    3 комментария