Javascript-форум (https://javascript.ru/forum/)
-   (X)HTML/CSS (https://javascript.ru/forum/xhtml-html-css/)
-   -   Поясните по поводу псевдоэлементов и соседних селекторов (https://javascript.ru/forum/xhtml-html-css/85615-poyasnite-po-povodu-psevdoehlementov-i-sosednikh-selektorov.html)

eddin 12.11.2023 21:46

Поясните по поводу псевдоэлементов и соседних селекторов
 
Приветствую, друзья! Мне нужно изменить внешний вид чекбокса. Решил через LABEL, тем более способ давно известен. Но возникла проблема - изменять html-код я не могу, а span::before и span::after уже плотно используются.

Решил добавить псевдоэлемент к LABEL и от него скакать. Ведь по идее input, span и label::after находятся на одном уровне вложенности. Даже браузеры в DevTools показывают всё именно так. Да и если я к LABEL применю относительное позиционирование, а к label::after - абсолютное, то он будет позиционироваться именно относительно LABEL, что как бы намекает, что label::after находится внутри LABEL.

Но в итоге моя идея не работает. Подскажите, почему label::after не хочет менять фон на зелёный? Ну и может какую идею подкинете, как изменить чекбокс? Конечно без JS, с ним-то понятно)

ps Вообще походу все браузеры трактуют псевдоэлементы одинаково относительно друг-друга (других браузеров), но по разному относительно нахождения псевдоэлементов в DOM. Используешь позиционирование? Ок, label::after находится внутри label. Используешь соседние селекторы? Э, не, label::after тута нету. А вот span::before и span::after находятся как раз на одном уровне вместе со span, а никак не внутри него.
<!DOCTYPE html>
<html>
<head>
    <title></title>
	<style>
        label::after {
            content:'111';
        }
		
       input:checked + span + label::after {background:red}
	</style>
</head>
<body>

 <label>
  <input type="checkbox">
  <span>Я принимаю условия пользовательского соглашения</span>
 </label>

</body>
</html>

voraa 12.11.2023 23:11

Цитата:

Сообщение от eddin
input:checked + span + label::after

Этот селектор означает псевдоэлемент :after элемента label, который (сам label) идет после span, идущего после отмеченного input.
Цитата:

Сообщение от eddin
Ну и может какую идею подкинете, как изменить чекбокс?

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style>
		input {
			position:relative;
		}
        input::after {
            content:'111';
            position:absolute;
            top: 100%;
        }
         
       input:checked::after {background-color:green; color:white}
    </style>
</head>
<body>
 
 <label>
  <input type="checkbox">
  <span>Я принимаю условия пользовательского соглашения</span>
 </label>
 
</body>
</html>

voraa 12.11.2023 23:35

Хотя извиняюсь, сразу не проверил.
В Хроме это работает, в файрфоксе - нет

Идей нет. :has - тоже не работает в файрфоксе и прочих старых браузерах.

ruslan_mart 13.11.2023 01:15

<label>
  <input type="checkbox">
  <span>Я принимаю условия пользовательского соглашения</span>
 </label>


label input[type="checkbox"] {
  opacity: 0;
  pointer-events: none;
  position: absolute;
}

label input[type="checkbox"] + span::before {
  background-position: center center;
  background-repeat: no-repeat;
  background-size: auto 20px;
  border: 1px solid #000000;
  border-radius: 4px;
  content: '';
  cursor: pointer;
  display: inline-block;
  height: 24px;
  margin-right: 8px;
  vertical-align: middle;
  width: 24px;
}

label input[type="checkbox"]:checked + span::before {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' x='0px' y='0px' width='100' height='100' viewBox='0 0 24 24'%3E%3Cpath d='M 20.292969 5.2929688 L 9 16.585938 L 4.7070312 12.292969 L 3.2929688 13.707031 L 9 19.414062 L 21.707031 6.7070312 L 20.292969 5.2929688 z'%3E%3C/path%3E%3C/svg%3E");
}

label input[type="checkbox"]:disabled + span::before {
  cursor: default;
  opacity: 0.5;
}

label input[type="checkbox"]:focus + span::before {
  outline: 1px solid blue;
}

eddin 13.11.2023 03:49

Цитата:

Сообщение от voraa (Сообщение 554001)
Идей нет.

Вот и я несколько часов тупил, так ничего и не получилось. Видимо всё же придётся JS подключать.

Цитата:

Сообщение от ruslan_mart (Сообщение 554002)
label input[type="checkbox"] {
opacity: 0...

К сожалению, как я писал в первом сообщении, этот вариант не подходит.


Часовой пояс GMT +3, время: 11:53.