Использование `filter: яркость ()` с псевдоэлементами разрушает абсолютное позиционирование?

У меня есть псевдокласс на теге <label>, чтобы показать проверку, когда опция была проверена. Он проделывал все эти сумасшедшие вещи с позиционированием, бросал все псевдоэлементы в верхний угол и даже показывал два одинаковых элемента ::after при наведении курсора.

Я наконец понял, что у меня есть filter: brightness(.9) на :hover, но нет filter: brightness на базовом <label> CSS. Как только я добавил filter: brightness(1) к базовому элементу, проблема исчезла.

Вот рабочий пример. Сначала наведите указатель мыши на флажки в правом верхнем углу и синие кнопки, чтобы увидеть проблему. Затем раскомментируйте строку filter: brightness(1), чтобы увидеть исправление. Я сделал его немного некрасивым, чтобы проблема была видна.

Но теперь я остаюсь чесать голову. Что происходило? Похоже, что из-за того, что filter не был включен, CSS забыл, какой элемент был родительским, и просто сослался на последний нестатически позиционированный элемент. Почему это могло произойти? А есть еще такие случаи?

На вашей этикетке отсутствует position: relative, поэтому, конечно же, галочка будет вверху

Huangism 10.01.2019 18:32

Также обратите внимание, что фильтр (отличный от none) создает новый контекст наложения и IIRC, который включает в себя его относительный (поэтому добавление filter к метке работает)

chazsolo 10.01.2019 18:36

Спасибо! Голосует за вас обоих. Есть ли причина, по которой он создает два при наведении курсора на элемент?

Benny Hinrichs 10.01.2019 18:37

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

Huangism 10.01.2019 18:43

Хорошо, спасибо! Я на самом деле понял это за 10 секунд до того, как вы ответили, и собирался отредактировать свой комментарий, но вы меня опередили

Benny Hinrichs 10.01.2019 18:45

Я оставил ответ на случай, если эти комментарии потеряются

Huangism 10.01.2019 18:47
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
6
254
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первоначальная проблема заключается в том, что ваш label отсутствует.

position: relative;

Чтобы стрелка была вверху, поскольку она абсолютная, не содержится в кнопке.

Когда вы добавляете к нему фильтр, элемент меняется на содержащий блок (это то, что делает фильтр), поэтому он имеет эффект position: relative, и поэтому все выглядит нормально.

В вашей скрипке, когда вы наводите курсор, он применяет фильтр, который, в свою очередь, изменяет элемент на содержащий блок (в основном относительное положение), как только это происходит, галочка возвращается в правильное положение на кнопке, но теперь она больше не зависает и возвращается в верхний правый угол. Это повторяется, пока вы зависаете, и поэтому он мигает

Другие вопросы по теме