Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2023, 21:46
Аспирант
Отправить личное сообщение для eddin Посмотреть профиль Найти все сообщения от eddin
 
Регистрация: 11.10.2010
Сообщений: 60

Поясните по поводу псевдоэлементов и соседних селекторов
Приветствую, друзья! Мне нужно изменить внешний вид чекбокса. Решил через 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>
Ответить с цитированием
  #2 (permalink)  
Старый 12.11.2023, 23:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Сообщение от 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>
Ответить с цитированием
  #3 (permalink)  
Старый 12.11.2023, 23:35
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

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

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

Последний раз редактировалось voraa, 12.11.2023 в 23:44.
Ответить с цитированием
  #4 (permalink)  
Старый 13.11.2023, 01:15
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

<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;
}
Ответить с цитированием
  #5 (permalink)  
Старый 13.11.2023, 03:49
Аспирант
Отправить личное сообщение для eddin Посмотреть профиль Найти все сообщения от eddin
 
Регистрация: 11.10.2010
Сообщений: 60

Сообщение от voraa Посмотреть сообщение
Идей нет.
Вот и я несколько часов тупил, так ничего и не получилось. Видимо всё же придётся JS подключать.

Сообщение от ruslan_mart Посмотреть сообщение
label input[type="checkbox"] {
opacity: 0...
К сожалению, как я писал в первом сообщении, этот вариант не подходит.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск