Задать вопрос
Ответы пользователя по тегу CSS
  • Продвинутые пользовательские стили сайтов, не ограниченные одним css?

    @ImagineTables
    Другой пример когда мне нужно применить какой то стиль к
    #responsive_page_template_content > div.page_content_ctn > div
    Если в теге
    #responsive_page_template_content > div.page_content_ctn > div > div > div
    есть искомое мной значение, будь то класс .class или текст [href="text"]


    body:has(#responsive_page_template_content > div.page_content_ctn > div > div > div.class[href="text"]) #responsive_page_template_content > div.page_content_ctn > div
    {
    …
    }


    Скажем выделить цвет красным, если Красный. Тут уже нужно что-то более глубокое чем CSS.


    Обычно надо догадаться, какой принцип в структуре, и написать правильный селектор. Именно так и приходится делать, отключая баннеры в Яндекс.Почте, например, поскольку они генерируют классы и идентификаторы заново каждый раз и юблок не работает. Задача творческая и универсального ответа нет. (Кстати, они, судя по всему, начали бороться, определяя, что реклама не отобразилась и вставляя искусственные паузы в наказание).

    Опять же, помогает :has(), типа «среди детей такого-то поищи такого-то, чтобы у него был класс banner на любой глубине вложенности».
    Ответ написан
    2 комментария
  • Различие скелета в пк версии и телефонной, как лучше всего делать такие вещи?

    @ImagineTables
    1. «по макету для десктопа и для мобильной версии расположение элементов сильно отличается» — подумайте, правильный ли это макет. (Или, скорее, правильная ли трактовка макета вами). Расположение элементов обычно ставят в зависимость от ширины экрана (при помощи media queries), а уже через неё — возникает разница между десктопом и мобилой.

    Если хочется сделать радикальное упрощение для мобил, сайт обычно пакуют в приложение вместе с webview.

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

    Чтобы этого избежать, меньше пользуйтесь утилитами (классами типа w-100, d-none и т.д.), размечайте маркап семантически (классами типа «меню для юзера», «карточка того-то», «панель сего-то»), не вводите атрибуты для контроля за отображением, а отображение настраивайте строго через CSS.
    Ответ написан
    Комментировать
  • Как сделать нестандартную рамку?

    @ImagineTables
    border-image-slice не подойдёт?

    Вообще, эта техника в UI называется 9-split border. Я пользовался её кастомной имплементацией, но свойство выше должно точно так же решать проблему.
    Ответ написан
    Комментировать
  • Какие принципы нужно соблюдать при разработке фреймворков по типу Bootstrap/Tabler, UIKit и прочих?

    @ImagineTables
    Какие принципы должны лечь в основу создания CSS-кода


    Не писать CSS. Только препроцессор, только миксины.
    Ответ написан
    Комментировать
  • Как в CSS остановить одну анимацию и сразу запустить вторую для одного элемента?

    @ImagineTables
    Если правильно понял вопрос, попробуйте это (придётся подписаться на событие focusin):

    // Resets CSS animation based on keyframes.
    System.resetAnimation = function (elements)
    {
    	elements.forEach(element =>
    	{
    		element.style.animation = 'none';
    		element.offsetHeight; // Trigger reflow.
    		element.style.animation = null;
    	});
    }


    Опять же, если я понял ваш вопрос правильно, можно обе анимации объединить на основе переменных, а в нужный момент задавать значение переменной, управляющее ходом анимации, и сбрасывать её. Примерно так:

    const map = $('.map');
    map
    	.css('--current-position-y', getComputedStyle(map[0]).backgroundPositionY)
    	.css('--direction', position.y > 0 ? '-1' : '1') // Map is scrolled in opposite direction.
    	.css('--speed', Math.abs(position.y).toString());
    
    System.resetAnimation([map[0]]);


    @keyframes move-map-bg_map
    {
    	from
    	{
    		background-position-y: var(--current-position-y);
    	}
    
    	to
    	{
    		background-position-y: calc(var(--current-position-y) + var(--direction) * var(--city-map-size));
    	}
    }


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

    @ImagineTables
    А оно вообще анимируемое?

    Вот тут, например, пишут, что нет: https://stackoverflow.com/questions/71085424/how-t...

    В стандарте (https://drafts.csswg.org/css-overflow-4/#propdef-l...) этот вопрос обходят стороной:

    Animation type: see individual properties


    А далее, обратно на сепульки. ))

    По ссылке на SO есть рабочие примеры, как добиться того же эффекта при помощи других свойств, плюс в стандарте показано, из каких трёх свойств можно собрать данное (чтоб уж полностью воспроизвести, если надо).
    Ответ написан
    Комментировать
  • Как выбрать «опорные точки» перехода ширины экрана для стилей страниц сайта?

    @ImagineTables
    Как уже было сказано выше,

    1. Брякпоинты из любимого фреймворка (чем стандартнее, тем лучше), плюс
    2. Точечные фиксы для конкретных кусков, ломающиеся так далеко от брейкпоинтов (посередине, например), что на них не натянуть.
    Ответ написан
    1 комментарий
  • Взаимодействие с другими классами и блоками можно ли так?

    @ImagineTables
    Декларативно (на pure CSS) можно сделать что-то типа такого:

    body:has(.first-block:hover) .second-block
    {
        background: red;
    }


    И неважно, где эти блоки и как связаны. :hover можно заменить на другой псевдокласс, обозначающий взаимодействие с юзером, например :active или :focus-visible.

    Но для кликов лучше прибегнуть к императивному скрипту (используется jQuery):

    $('.first-block').on('click', () => $('.second-block').addClass('red');


    И, само собой, CSS:

    .red
    {
        background: red;
    }
    Ответ написан
    Комментировать
  • Как добиться срабатывания transition для checkbox?

    @ImagineTables
    для маркера checkbox навешен transition для плавного появления


    Это плохой UX, не надо так делать. Ощущаться будет как замедленная реакция интерфейса на нажатие.

    Но если приспичило, можно:

    Первый вариант
    1. Описать галку в начале файла:

    <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" class="template">
    	<defs>
    		<symbol id="checkmark" class="checkmark" viewBox="0 0 16 16">
    			<path fill="currentColor" … />
    		</symbol>
    	</defs>
    </svg>


    2. Вставить в кнопку:
    <svg width="32" height="32"><use href="#checkmark"></use></svg>


    3. Анимировать прозрачность.

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

    Если хочется сохранить растровое изображение, используйте его как маску (clip), а фон заливайте сплошным цветом. Если использовать кастомные свойства, ими можно анимировать хоть градиенты:

    @property --my-color-1
    {
    	syntax: '<color>';
    	initial-value: #000;
    	inherits: false;
    }
    Ответ написан
    Комментировать