Css предыдущий элемент: css — Селектор левых соседей
Содержание
некоторые хитрости работы с одноуровневыми элементами
От автора: если вы когда-либо использовали смежные селекторы CSS одного уровня, вы знаете, что их всего два. Комбинатор + выбирает первое соответствие, которое находит сразу после, а комбинатор ~ выбирает все последующие.
Но у нас нет способа выбрать те, которые расположены раньше. Либо родительские селекторы, либо предыдущие селекторные одного уровня — такого просто нет.
Я знаю, что вы этого хотите, вы знаете, что я этого хочу, но суровая правда в том, что они не существуют (и, вероятно, никогда не будут). Есть миллион сообщений «Почему?». Есть даже предложения о том, как их реализовать. Но мы застреваем на однонаправленной обработке правил CSS — это делается, скорее всего, чтобы защитить нас от «плохого опыта», связанного с неправильным течением потока обработки или даже бесконечными циклами.
К счастью, как и в случае большинства ограничений CSS, мы можем имитировать это. Первое, что нужно учитывать — это то, для чего нам нужны предыдущие одноуровневые элементы. Существуют два случая:
Нам нужно выбрать все элементы одного уровня с элементом, а комбинатор ~ выбирает только те, которые расположены после.
Практический курс по верстке адаптивного сайта с нуля!
Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3
Узнать подробнее
Нам нужно выбрать только элементы одного уровня, которые расположены раньше
1. Выбор всех элементов одного уровня
Иногда нам нужно выбрать как предыдущие, так и последующие элементы одного уровня. Для этого мы можем выбрать родительский элемент и использовать некоторые хитрости.
Например, чтобы выбрать все span в следующей структуре, когда мы наводим указатель мыши на любой из них, мы могли бы просто использовать селектор дочерних элементов для родителя. Нам нужно переключить pointer-events с родителя на дочерние элементы. Таким образом, любое действие, которое мы хотим осуществить, будет срабатывать только при вводе для дочернего элемента, а не самого родителя.
<div>
<span> 1st element </span>
<span> 2nd element </span>
<span> 3rd element </span>
</div>
<div> <span> 1st element </span> <span> 2nd element </span> <span> 3rd element </span> </div> |
.container{
pointer-events:none
}
.container > span{
pointer-events: auto;
}
.container:hover > span{
background: red;
/*или что угодно, что вы хотите сделать с со всеми элементами одного уровня, когда вы наводите мышь на один из них */
}
.container{ pointer-events:none } .container > span{ pointer-events: auto; } .container:hover > span{ background: red; /*или что угодно, что вы хотите сделать с со всеми элементами одного уровня, когда вы наводите мышь на один из них */ } |
Если вам нужно выбрать все элементы одного уровня, кроме того, на который был наведен курсор, вы можете совместить предыдущий метод с селектором :not, чтобы исключить его. Стандартным примером для этого является меню:
<ul>
<li>first item</li>
<li>second item</li>
<li>third item</li>
</ul>
<ul> <li>first item</li> <li>second item</li> <li>third item</li> </ul> |
ul:hover > li:not(:hover){
opacity: 0.5;
}
ul:hover > li:not(:hover){ opacity: 0.5; } |
В приведенном выше коде будет переключаться непрозрачность всех элементов li, кроме того, что на который наведен курсор.
Кроме того, вы можете использовать селекторы type и nth, чтобы дополнительно отфильтровать нужные элементы. Задав определенные стили, мы можем получить следующее:
Обратите внимание: если вы хотите использовать подход pointer-events:none, помните, что это может нарушить порядок стекирования (возможно, вы выберете элементы, которые «ниже» в порядке стекирования). Это также не будет работать в IE10 и ниже, если только вам не нужны указатели события для чего-то другого. Поэтому будьте очень осторожны при использовании.
2. Выбор предыдущих элементов
Для этого варианта использования мы можем изменить в обратном направлении порядок сортировки в HTML, а затем отсортировать элементы обратно в CSS и использовать селекторы ~ и +. Таким образом, мы будем выбирать следующие элементы, но самом деле это будут предыдущие.
Существует несколько способов сделать это. Самый простой и, вероятно, самый старый — это изменение направления написания нашего контейнера:
<div>
<span> 3rd element </span>
<span> 2nd element </span>
<span> 1st element </span>
</div>
<div> <span> 3rd element </span> <span> 2nd element </span> <span> 1st element </span> </div> |
.container{
direction: rtl;
/* встроенные элементы будут размещаться справа на лево */
}
.container{ direction: rtl; /* встроенные элементы будут размещаться справа на лево */ } |
Если ваши элементы должны отображать фактический текст, вы всегда можете отменить это обратно:
.container > span {
direction: ltr;
}
.container > span { direction: ltr; } |
Но во многих случаях это может быть неудобно. К счастью, современный инструментарий CSS позволяет сделать это намного проще и безопаснее. Мы можем просто использовать для контейнера Flexbox и изменить порядок с помощью flex-direction: row-reverse:
.container{
display:flex;
flex-direction: row-reverse;
}
.container{ display:flex; flex-direction: row-reverse; } |
Лучшее в этом подходе то, что мы не вносим путаницу в направление написания. Нам не нужно перезагружать дочерние элементы, и все гораздо более предсказуемо.
Использование «предыдущих элементов одного уровня» для создания системы звезд-рейтингов на чистом CSS
Семантически, рейтинговую систему можно рассматривать как простой список радио-кнопок с соответствующими метками. Это позволит нам использовать проверенный псевдо-селектор :checked для изменения элементов одного уровня. Итак, давайте начнем с этого:
<div>
<input type=»radio» name=»rating» value=»5″><label for=»5″>☆</label>
<input type=»radio» name=»rating» value=»4″><label for=»4″>☆</label>
<input type=»radio» name=»rating» value=»3″><label for=»3″>☆</label>
<input type=»radio» name=»rating» value=»2″><label for=»2″>☆</label>
<input type=»radio» name=»rating» value=»1″><label for=»1″>☆</label>
</div>
<div> <input type=»radio» name=»rating» value=»5″><label for=»5″>☆</label> <input type=»radio» name=»rating» value=»4″><label for=»4″>☆</label> <input type=»radio» name=»rating» value=»3″><label for=»3″>☆</label> <input type=»radio» name=»rating» value=»2″><label for=»2″>☆</label> <input type=»radio» name=»rating» value=»1″><label for=»1″>☆</label> </div> |
Практический курс по верстке адаптивного сайта с нуля!
Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3
Узнать подробнее
Как мы рассматривали ранее, элементы находятся в обратном порядке тому, который позволяет нам применить селектор «предыдущий элемент одного уровня». Обратите внимание, что мы используем для представления пустых звезд символ юникода “white star” (U + 2606).
Давайте отобразим их рядом друг с другом, в правильном (обратном) порядке:
.rating {
display: flex;
flex-direction: row-reverse;
}
.rating { display: flex; flex-direction: row-reverse; } |
Теперь скроем сами переключатели, никому не нужно их видеть:
.rating > input{
display:none;
}
.rating > input{ display:none; } |
И применим некоторые стили к символам звездочек:
.rating > label {
position: relative;
width: 1.1em;
font-size: 15vw;
color: #FFD700;
cursor: pointer;
}
.rating > label { position: relative; width: 1.1em; font-size: 15vw; color: #FFD700; cursor: pointer; } |
Единственная действительно важная строка — это position: relative. Это позволит нам по абсолютно позиционировать псевдо-элемент с закрашенной звездой (U + 2605), который будет изначально скрыт.
.rating > label::before{
content: «\2605»;
position: absolute;
opacity: 0;
}
.rating > label::before{ content: «\2605»; position: absolute; opacity: 0; } |
Когда мы наводим указатель на звездочку, псевдо-элемент закрашенной звездный должен стать видимым для нее и всех предыдущих одноуровневых элементов.
.rating > label:hover:before,
.rating > label:hover ~ label:before {
opacity: 1 !important;
/* shame… shame… shame… I’ll explain that later*/
}
.rating > label:hover:before, .rating > label:hover ~ label:before { opacity: 1 !important; /* shame… shame… shame… I’ll explain that later*/ } |
То же делается для выбранного рейтинга, через сопоставление всех меток, которые находятся перед выбранной радио-кнопкой:
.rating > input:checked ~ label:before{
opacity: 1;
}
.rating > input:checked ~ label:before{ opacity: 1; } |
Помните, что использование флага !important прямо противоположно хорошей практике. Я делаю это здесь, так как другого способа реализовать данный функционал нет.
И последнее, но не менее важное: нам нужно «запомнить» текущий рейтинг, на случай, если пользователь захочет его изменить. Например, если он выбрал пять звезд и по какой-либо причине хочет изменить их на четыре, мы должны отображать звезды с 1 по 4, как заполненные, а пятую — полупрозрачной при наведении указателя на четвертую.
Это может быть достигнуто путем изменения при наведении курсора на контейнер непрозрачности предыдущих элементов одного уровня выбранного ввода:
.rating:hover > input:checked ~ label:before{
opacity: 0.4;
}
.rating:hover > input:checked ~ label:before{ opacity: 0.4; } |
Вот для чего нам нужно pacity:1 !important в начальном объявлении наведения. В противном случае это последнее правило переопределило бы другие в соответствии со специфичностью и применило полупрозрачную заливку ко всему.
И там у нас есть это, кроссбраузерная, полностью функциональная система звезд-рейтингов с использованием только селекторов «предыдущие элементы одного уровня».
Как вы можете видеть, просто потому, что «это невозможно» не означает, что вы не должны пытаться. Программирование — это раздвижение границ. Поэтому каждый раз, когда вы упираетесь в стену, просто попробуйте надавить немного сильнее. Или лучшей аналогией, я думаю, будет — найдите свой обходной путь? … в любом случае, вы понимаете, что я имею в виду. Продолжайте взламывать!
Замечания относительно доступности
Предыдущий фрагмент — это упрощение для лучшего понимания. Это не то, что я бы рекомендовал использовать в реальной среде из-за многих ограничений доступности.
Чтобы сделать сниппет немного более доступным, первым делом нужно было бы скрыть радио-кнопки с помощью другого способа, а не display: none, чтобы сделать их фокусируемыми. Мы также должны добавить кольцо фокусировки на весь фрагмент звёзд, когда любой элемент внутри выделен фокусом, это делается через псевдо-селектор :focus-in.
Метки «звезды» не имеют смысла для экранных дикторов, поэтому наилучшим подходом будет наличие внутри метки span с текстом «n Stars», который будет скрыт от видящих пользователей.
Кроме того, подход с обратным порядком в HTML-источнике + display:row-reverse делает клавиатуру неудобной для выставления рейтингов. Доступность Flexbox и клавиатуры — довольно сложная тема, но ближе всего к решению подход, когда для каждого элемента добавляется тег aria-flowtotag, что, по крайней мере, устраняет проблему для некоторых экранных дикторов + комбинации браузеров.
Более доступный сниппет (использующий альтернативную технику изменения следующих элементов одного уровня, которые выглядят пустыми) вы можете найти у Патрика Коула, как описано в комментариях ниже.
Автор: Facundo Corradini
Источник: //medium.freecodecamp.org/
Редакция: Команда webformyself.
Практический курс по верстке адаптивного сайта с нуля!
Изучите курс и узнайте, как верстать современные сайты на HTML5 и CSS3
Узнать подробнее
PSD to HTML
Практика верстки сайта на CSS Grid с нуля
Смотреть
Выберите предыдущий брат элемента в CSS с помощью селекторов
Как выбрать указанный выше элемент элемента в CSS с помощью селекторов
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>First</li>
<li>Four</li>
<li>Five</li>
<li>Six</li>
Здесь я хочу использовать класс no-content
, чтобы я мог получить его выше элемента <li>Three</li>
, используя селектор CSS.
css
css-selectors
Поделиться
Источник
Justin John
04 апреля 2012 в 06:56
2 ответа
- проблема: переход к элементу с помощью атрибута CSS селекторов ‘style’ с selenium
У меня возникли проблемы с получением элемента с помощью атрибута ‘style’ с selenium. Проблема в том, что с помощью селекторов xpath я могу это сделать:…
- текст селекторов в css
Мне интересно, есть ли какие-либо другие селекторы, которые выбирают только часть элемента HTML. Я знаю этих двоих: :first-letter :first-line Но AFAIK нет других селекторов, которые делают это. Меня интересуют любые (даже браузерные) селекторы или другие методы манипулирования только частью блока…
34
Это невозможно с чистым CSS…
Поделиться
Gatekeeper
04 апреля 2012 в 07:00
Поделиться
Rohit Azad Malik
04 апреля 2012 в 07:10
Похожие вопросы:
Создание макетов CSS с меньшим количеством селекторов?
Каковы наилучшие методы создания макетов CSS с меньшим количеством селекторов и меньшим количеством DIVs? Меньше селекторов означает меньше HTML и CSS, что облегчает управление. Как мы можем…
Разбор строки HTML с помощью селекторов CSS
Я пытаюсь извлечь некоторые данные из страницы HTML, которая находится в строковой переменной. Я знаю, что код Google Apps Script JavaScript выполняется на стороне сервера, а объект document не…
JQuery: проверьте, является ли предыдущий брат или сестра первенцем
Используя JQuery, как вы проверяете, является ли предыдущий брат элемента первым ребенком? Я попробовал следующий код, но он не работает: if( $(this).prev() === $(this).siblings(:first-child) ){…
проблема: переход к элементу с помощью атрибута CSS селекторов ‘style’ с selenium
У меня возникли проблемы с получением элемента с помощью атрибута ‘style’ с selenium. Проблема в том, что с помощью селекторов xpath я могу это сделать:…
текст селекторов в css
Мне интересно, есть ли какие-либо другие селекторы, которые выбирают только часть элемента HTML. Я знаю этих двоих: :first-letter :first-line Но AFAIK нет других селекторов, которые делают это. Меня…
Чтение DOMDocument и поиск элементов с помощью селекторов CSS
Я должен преобразовать приложение android в iOS, это приложение использует глубоко библиотеку jsoup и element.select(cssQuery) , чтобы найти элементы, начинающиеся с селекторов CSS. Изначально я…
CSS: выберите предыдущий брат или сестра
У меня есть список и я хочу выбрать предыдущий и следующий из тех, на которых я зависаю <ul> <li>Item1</li> <li>Item1</li> <li>Item1</li>…
CSS выберите предыдущий брат или сестра
У меня есть индикатор прогресса, который имеет двух детей (частей). Всякий раз, когда каждый из этих детей парит, общая высота прогресса и его детей будет меняться. Мне удалось решить для первых…
Как найти первого предка элемента, чей родной брат является определенным элементом в jquery?
<div> <input type=text> <span id=ending_point> <label> <span> <input type=text id=starting_point> <span> </span> </span> </label>…
Разбор нескольких селекторов CSS с помощью Boost Spirit X3
Я пытаюсь разобрать несколько селекторов CSS с помощью Boost Spirit X3. Если у меня есть следующее правило CSS, которое применяется, например, к нескольким IDs (селекторам) : #ID1, #ID2, #ID3 {…
Есть и «предыдущий одноуровневый элемент» и селектор?
Нет. Это не возможно с помощью CSS. Он принимает в «Каскад» на сердце ;-).
Однако, если вы сможете добавить язык JavaScript на свою страницу, немного на jQuery может заставить вас к вашей конечной целью.
Вы можете использовать jQuery’ы найти
, чтобы выполнить «и взгляд-вперед» на вашей целевой элемент/класс/ID, затем возвратиться, чтобы выбрать цель.
Затем вы можете использовать jQuery, чтобы переписать дом (CSS) для вашего элемента.
Основываясь на этот ответ Майк Брант,
следующий фрагмент кода в jQuery может помочь.
Это первая выбирает все &л;ул>, которые непосредственно следуют за
<п>. Потом ее "откатывается", чтобы выбрать все предыдущие
<п> из этого набора &л;ул>
ы.
Эффективно, что «предыдущий одноуровневый элемент» и был выбран через jQuery.
Теперь, используйте .функции CSS
, чтобы пройти в новые значения CSS для этого элемента.
В моем случае я искал, чтобы найти способ, чтобы выбрать div с идентификатором #полную ширину, но только если он имел (косвенные) потомком div с классом
.компаний.
Я управлял всеми HTML под `.компаний, но не могли изменять какие-либо HTML-код выше.
И каскад идет только в 1 направлении: вниз.
Таким образом я могу выбрать все #полный-ширину. Или я могу выбрать
.компаний, только после #полный-ширина
.
Но я бы не выберите только #полную ширину, что *приступил*
.компаний.
И, опять же, я не смог добавить.компаний любого выше в HTML. Что часть HTML был написан внешне, и завернул наш код.
Но с помощью jQuery, я могу выберите необходимый#полной ширины, а затем назначить соответствующий стиль:
Это находит все #полный-ширину .компаний, и выбирает только те
.компании, похожие на то, как селекторы используются для работы с конкретными элементами в стандарте в CSS.
Затем он использует .родителей, чтобы "откатить" и выберите все родители
.компаний,
но фильтры эти результаты сохранить только #элементы заполнения-ширина, так что в конце концов, он выбирает единственный элемент а
#полный-ширинаесли есть
.потомок класса компаний.
Наконец, он назначает новый CSS значение (ширина
) для конечного элемента.
в
в
на jQuery справочные документы:
$() или jQuery(): DOM элемент.
.найти: потомки каждого элемента в наборе совпавших элементов, фильтруется с помощью селектора, объект jQuery, или элемент.
.родители: получи самую предшествующий одноуровневый элемент из каждого элемента в наборе совпавших элементов. Если предоставлен выбор, он возвращает предыдущий одноуровневый элемент, только если он соответствует, что селектор (позволяет фильтровать результаты, чтобы включать только перечисленные элементы/селекторов).
.УСБ: совокупность одного или нескольких свойств CSS для набора совпавших элементов.
Комбинатор дочерних элементов | CSS селектор
Поддержка браузерами
Описание
Комбинатор дочерних элементов обозначается знаком «больше чем» (>) и используется внутри селектора, между двумя простыми селекторами указывая взаимосвязь между ними. Задача данного селектора — выбор указанных дочерних элементов внутри родительского элемента, чтобы стало понятнее рассмотрим это на небольшом примере.
div > p { background-color: yellow; }
Селектор состоит из трёх частей: первым указывается простой селектор представляющий родительский элемент, после него указывается комбинатор дочерних элементов (>) и затем простой селектор, определяющий дочерний элемент. Комбинатор определяет взаимосвязь между двумя селекторами, показывая, что ко всем элементам <p>, которые являются дочерними по отношению к элементу <div> будет применен указанный стиль.
Примечание: между простым селектором и комбинатором дочерних элементов допускается ставить пробел, он никак не повлияет на работу селектора:
- div>p
- div> p
- div >p
- div > p
Пример:
<!DOCTYPE html> <html> <head> <style type="text/css"> div > span { background-color: yellow; } </style> </head> <body> <h2>Добро пожаловать!</h2> <div> <h3>Меня зовут Арни.</h3> <span>Я живу в Дакбурге.</span> </div> <div> <p><span>К этому элементу не будет применен стиль.</span></p> </div> <p>Моего кота тоже зовут Арни.</p> </body> </html>
Результат данного примера:
Добро пожаловать!
Меня зовут Арни.
Я живу в Дакбурге.
К этому элементу не будет применен стиль.
Моего кота тоже зовут Арни.
Свойство / Метод | Описание |
---|---|
accessKey | Задает или возвращает атрибут AccessKey элемента |
addEventListener() | Присоединяет обработчик событий к указанному элементу |
appendChild() | Добавляет новый дочерний узел к элементу в качестве последнего дочернего узла |
attributes | Возвращает намеднодемап атрибутов элемента |
blur() | Удаление фокуса из элемента |
childElementCount | Возвращает количество дочерних элементов, которые имеет элемент |
childNodes | Возвращает коллекцию дочерних узлов элемента (включая узлы текста и комментария) |
children | Возвращает коллекцию дочернего элемента элемента (исключая текстовые и комментарии узлы) |
classList | Возвращает имя (имена) класса элемента |
className | Задает или возвращает значение атрибута Class элемента |
click() | Имитирует щелчок мышью по элементу |
clientHeight | Возвращает высоту элемента, включая заполнение |
clientLeft | Возвращает ширину левой границы элемента |
clientTop | Возвращает ширину верхней границы элемента |
clientWidth | Возвращает ширину элемента, включая заполнение |
cloneNode() | Клонирование элемента |
compareDocumentPosition() | Сравнивает положение документа двух элементов |
contains() | Возвращает значение true, если узел является потомком узла, в противном случае — false |
contentEditable | Задает или возвращает ли содержимое элемента редактируемым или нет |
dir | Задает или возвращает значение атрибута DIR элемента |
firstChild | Возвращает первый дочерний узел элемента |
firstElementChild | Возвращает первый дочерний элемент элемента |
focus() | Придает фокус элементу |
getAttribute() | Возвращает указанное значение атрибута узла элемента |
getAttributeNode() | Возвращает указанный узел атрибута |
getElementsByClassName() | Возвращает коллекцию всех дочерних элементов с указанным именем класса |
getElementsByTagName() | Возвращает коллекцию всех дочерних элементов с указанным именем тега |
hasAttribute() | Возвращает значение true, если элемент имеет указанный атрибут, в противном случае false |
hasAttributes() | Возвращает значение true, если элемент имеет какие-либо атрибуты, в противном случае false |
hasChildNodes() | Возвращает значение true, если элемент имеет дочерние узлы, в противном случае — false |
id | Задает или возвращает значение атрибута ID элемента |
innerHTML | Задает или возвращает содержимое элемента |
innerText | Задает или возвращает текстовое содержимое узла и его потомков |
insertAdjacentElement() | Вставляет элемент HTML в заданной позиции относительно текущего элемента |
insertAdjacentHTML() | Вставляет HTML-форматированный текст в заданной позиции относительно текущего элемента |
insertAdjacentText() | Вставка текста в заданную позицию относительно текущего элемента |
insertBefore() | Вставляет новый дочерний узел перед указанным, существующим, дочерним узлом |
isContentEditable | Возвращает значение true, если содержимое элемента является редактируемым, в противном случае — false |
isDefaultNamespace() | Возвращает значение true, если указанное NamespaceURI является значением по умолчанию, в противном случае — false |
isEqualNode() | Проверяет, равны ли два элемента |
isSameNode() | Проверяет, является ли два элемента один и тот же узел |
isSupported() | Возвращает значение true, если указанный элемент поддерживается в элементе |
lang | Задает или возвращает значение атрибута lang элемента |
lastChild | Возвращает последний дочерний узел элемента |
lastElementChild | Возвращает последний дочерний элемент элемента |
namespaceURI | Возвращает URI пространства имен элемента |
nextSibling | Возвращает следующий узел на том же уровне дерева узлов |
nextElementSibling | Возвращает следующий элемент на том же уровне дерева узлов |
nodeName | Возвращает имя узла |
nodeType | Возвращает тип узла узла |
nodeValue | Задает или возвращает значение узла |
normalize() | Соединяет соседние текстовые узлы и удаляет пустые текстовые узлы в элементе |
offsetHeight | Возвращает высоту элемента, включая заполнение, границу и полосу прокрутки |
offsetWidth | Возвращает ширину элемента, включая заполнение, границу и полосу прокрутки |
offsetLeft | Возвращает горизонтальное положение смещения элемента |
offsetParent | Возвращает контейнер смещения элемента |
offsetTop | Возвращает вертикальное положение смещения элемента |
ownerDocument | Возвращает корневой элемент (объект Document) для элемента |
parentNode | Возвращает родительский узел элемента |
parentElement | Возвращает родительский узел элемента |
previousSibling | Возвращает предыдущий узел на том же уровне дерева узлов |
previousElementSibling | Возвращает предыдущий элемент на том же уровне дерева узлов |
querySelector() | Возвращает первый дочерний элемент, соответствующий указанному селектору CSS элемента |
querySelectorAll() | Возвращает все дочерние элементы, соответствующие указанному селектору CSS элемента |
removeAttribute() | Удаляет указанный атрибут из элемента |
removeAttributeNode() | Удаляет указанный узел атрибута и возвращает удаленный узел |
removeChild() | Удаляет дочерний узел из элемента |
removeEventListener() | Удаляет обработчик событий, который был присоединен с помощью метода addEventListener () |
replaceChild() | Заменяет дочерний узел в элементе |
scrollHeight | Возвращает всю высоту элемента, включая заполнение |
scrollIntoView() | Прокручивает указанный элемент в видимой области окна обозревателя |
scrollLeft | Задает или возвращает количество пикселей, в течение которых содержимое элемента прокручивается горизонтально |
scrollTop | Задает или возвращает количество пикселей, в течение которых содержимое элемента прокручивается вертикально |
scrollWidth | Возвращает всю ширину элемента, включая заполнение |
setAttribute() | Задает или изменяет указанный атрибут, к заданному значению |
setAttributeNode() | Задает или изменяет указанный узел атрибута |
style | Задает или возвращает значение атрибута Style элемента |
tabIndex | Задает или возвращает значение атрибута TabIndex элемента |
tagName | Возвращает имя тега элемента |
textContent | Задает или возвращает текстовое содержимое узла и его потомков |
title | Задает или возвращает значение атрибута Title элемента |
toString() | Преобразует элемент в строку |
соседние селекторы Селекторы атрибутов строки и подстроки
Приветствую Вас, уважаемые читатели. В предыдущих статьях мы изучали, в основном, атрибуты стилей CSS. Их очень много. Одни задают параметры шрифтов, другие параметры фона, третьи параметры отступов и рамок.
В этой статье мы поговорим о селекторах стилей. В одной из статье мы уже затрагивали . А сегодня рассмотрим еще несколько видов селекторов, которые не явно привязывают правило стиля к элементу веб-страницы. Это так называемые специальные селекторы. Их бывает несколько видов.
Комбинаторы в CSS (Соседний, дочерний и контекстный селекторы)
Комбинаторы
— это разновидность css селекторов, привязывающие правило стиля к элементу web-страницы на основании его местоположения относительно других элементов.
Первый комбинатор символ плюс
(+) или соседний селектор
. Плюс устанавливается между двумя селекторами:
+ { }
Стиль в этом случае применяется к селектору 2
, но только в том случае если он является соседним для селектора 1
и идет сразу после него. Рассмотрим пример:
strong + i {
}
…
Это обычный текст. Это жирный текст, обычный текст, красный текст
Это обычный текст. Это жирный текст, обычный текст, и это обычный текст.
Результат:
Стиль описанный в примере будет применен только к первому тексту заключенному в тег
, т.к. он следует сразу же после тега
.
Комбинатор тильда
(~) также применяется к соседним селекторам, но в этот раз между ними могут быть другие элементы. При этом оба селектора должны быть вложены в один и тот же родительский тег:
~ { }
Стиль будет применен к селектору 2
, который должен следовать за селектором 1
. Рассмотри пример:
strong ~ i {
color: red; /* Красный цвет текста */
}
…
Это обычный текст. Это жирный текст, обычный текст, красный текст к нему применилось правило соседних селекторов.
Это обычный текст. Это жирный текст, обычный текст, а это красный текст.
Результат:
Как видим, в этот раз правило стиля сработало для обоих текстов заключенных в тег
, несмотря на то, что во втором случае между тегом
и
стоит тег
.
Комбинатор >
относится к дочерним селекторам
. Позволяет привязать стиль CSS к элементу веб-страницы, непосредственно вложенному в другой элемент:
> { }
Стиль
будет привязан к селектору 2
, который непосредственно вложен в селектор 1
.
div > strong {
}
…
Это обычный текст. Это жирный курсивный текст .
Это обычный текст. А это обычный жирный текст.
И результат:
Как видно на рисунке, правило стиля подействовало только на первый тег
, который непосредственно вложен в тег
. А непосредственным родителем второго тега
является тег
, поэтому правило на него не действует.
Следующим рассмотрим контекстный селектор
. Он позволяет привязать CSS стиль к элементу вложенному в другой элемент, причем может быть любой уровень вложенности:
{ }
Стиль будет применен к селектору 2
, если он так или иначе вложен в селектор 1
.
Рассмотрим предыдущий пример, только при описании CSS правила применим контекстный селектор:
div strong {
font-style: italic /* Курсив */
}
…
Это обычный текст. Это жирный курсивный текст .
Это обычный текст. А это тоже курсивный жирный текст.
Обычный текст и просто жирный текст
Результат:
Как видим, на этот раз правило подействовало на оба тега
, даже на тот, который вложен и в контейнер
и в абзац
. На тег
, который просто вложен в абзац
правило css никак не действует.
Селекторы по атрибутам тега
Селекторы атрибутов — это специальные селекторы, которые привязывают стиль к элементу на основании, присутствует ли в нем определенный атрибут или имеет ли он определенное значение. Существует несколько вариантов применения таких селекторов.
1. Простой селектор атрибута
Имеет вид:
[] { }
И привязывает стиль к тем элементам, внутри которых добавлен указанный атрибут. Например:
strong{
color:red;
}
…
Автомобиль это механическое моторное безрельсовое дорожное транспортное средство минимум с 4 колёсами.
Результат:
На рисунке можно заметить, что правило css (красный цвет текста) применяется к элементу strong
, к которому добавлен атрибут title
.
2. Селектор атрибута со значением
Синтаксис этого селектора следующий:
[=] { }
Привязывает стиль
к элементам, теги которых имеют атрибут с указанным именем
и значением
. Пример:
a{
color:red;
font-size:150%;
}
…
.ru» target=»_blank»>Ссылка в новом окне
Результат:
Как видим, оба элемента типа гиперссылка имеют атрибут target
, но правило css, которое увеличивает текст ссылки в полтора раза и изменяет его цвет в красный, применяется к тегу
у которого атрибут target
имеет значение «_blank»
.
3. Одно из нескольких значений атрибута
Некоторые значения атрибутов могут перечисляться через пробел, например имена классов. Чтобы задать правило стиля при наличии в списке значений атрибутов требуемого значения применяется следующий селектор:
[~=] { }
[~=] { }
Стиль применяется в том случае, если у атрибута имеется требуемое значение или оно входит в список значений, разделенных пробелами. Например:
{
color:red;
font-size:150%;
}
…
Наш телефон: 777-77-77
Наш адрес: Москва ул. Советская 5
Получиться следующий результат:
Правило применяется к элементу, у которого среди значений атрибута class
имеется значение tel
.=] { }
В первом случае стиль
применяется ко всем элементам, теги которых имеют атрибут с указанным именем
и значением, начинающимся с указанной подстроки
. Во втором случае тоже самое, только к определенным элементам указанным в основном селекторе
. Пример:
a{
color:green;
font-weight:bold;
}
…
Результат:
В примере показано, как по разному отобразить внешние ссылки и внутренние ссылки. Внешние ссылки всегда начинаются со строки «http://». Поэтому в селекторе указываем, что стиль применять только к ссылкам, у которых атрибут href
начинается со значения http://
.
6. Значение атрибута заканчивается определенным текстом
Привязывает стиль к элементам, у которых значение атрибута заканчивается указанным текстом. Имеет следующий синтаксис:
[$=] { }
[$=] { }
В первом случае стиль
применяется ко всем элементам, у которых имеется атрибут
с указанным именем
и имеет значение оканчивающееся указанной подстрокой
. Во втором случае тоже самое, только к указанным селекторам
. Таким способом, например, можно по разному отображать различные форматы графических изображений. Например:
IMG {
border: 5px solid red;
}
…
Картинка формата gif
Картинка формата png
Результат:
В примере все картинки с расширением gif будут отображаться с красной рамкой толщиной пять пикселей.
7. Значение атрибута содержит указанную строку
Этот селектор привязывает стиль к тегам, значение атрибута которых содержат определенный текст. Синтаксис:
[*=] { }
[*=] { }
Стиль
привязывается к элементам, у которых имеется атрибут
с указанным именем и его значение содержит указанную подстроку
. Например:
IMG {
border: 5px solid red;
}
…
Картинка из папки gallery
Картинка из другой папки
Результат:
В примере стиль применяется к картинкам, которые загружены из папки «gallery»
.
На этом об селекторах атрибутов все. Все перечисленные методы можно комбинировать между собой:
Селектор[атрибут1=»значение1″][атрибут2=»значение2″] { стиль }
Кроме того напомню о специальных селекторах CSS:
- с помощью символов «+» и «~» формируются ;
- символ «>» привязывает css стили к дочерним
тегам; - символ формирует контекстные селекторы.
В следующих статьях мы рассмотрим также псевдоэлементы и псевдоклассы, которые предоставляют мощный инструмент управления стилями.
На этом все, до новых встреч.
В прошлых подглавах мы изучали родственные отношения между тегами HTML-документа, в том числе рассматривали селекторы дочерних элементов. Теперь пришло время познакомиться с селекторами родственных элементов и селекторами соседних элементов.
Соседние селекторы
С помощью соседних селекторов (также их называют смежными) выбираются элементы веб-страницы, у которых есть общий родитель и они находятся рядом друг с другом. Стиль применяется к последнему указанному в селекторе элементу.
Пример:
допустим, вам необходимо, чтобы каждый абзац
Который идет первым после заголовка
h2+p {
font-style: italic;
}
Записывая это правило, в первую очередь необходимо указать имя первого соседа, затем добавить символ + и имя второго соседа (того, к которому мы желаем применить стиль). Можно создавать и более длинные комбинации. Схема написания селектора такая: selector1+selector2+…+selectorN {} (стиль применяется к selectorN).
Примеры написания:
/* Отступ от абзаца до картинки 30px */
p+img {
padding-top: 30px;
}
/* Зеленый цвет для абзаца, который следует после h4 в связке с h3 */
h3+h4+p {
color: green;
}
Родственные селекторы
Родственные селекторы (другие названия: сестринские, сиблинговые) позволяют выбирать элементы HTML-страницы, являющиеся родственными по отношению друг к другу (то есть имеющие общего родителя и находящиеся на одном уровне). Сестринские селекторы похожи на соседние, но отличаются тем, что стиль применяется ко всем элементам выбранного типа, а не только к первому из них. Вместо знака + используется символ тильда ~ .
Пример:
немного изменим предыдущую задачу и представим, что вам нужно сделать наклонный шрифт для всех абзацев
Которые идут после заголовка
h2 ~ p {
font-style: italic;
}
…и немного HTML для примера:
Заголовок 2
Взгляните на HTML-код: стиль применится ко всем тегам
Которые следуют после
тега
Соседние (смежные) и родственные селекторы CSS — учебник CSS
В прошлых подглавах мы изучали родственные отношения между тегами HTML-документа, в том числе рассматривали селекторы дочерних элементов. Теперь пришло время познакомиться с селекторами родственных элементов и селекторами соседних элементов.
Соседние селекторы
С помощью соседних селекторов (также их называют смежными) выбираются элементы веб-страницы, у которых есть общий родитель и они находятся рядом друг с другом. Стиль применяется к последнему указанному в селекторе элементу.
Пример: допустим, вам необходимо, чтобы каждый абзац <p>
, который идет первым после заголовка <h2>
, имел наклонный шрифт. Это можно реализовать с помощью такого кода CSS:
h2+p { font-style: italic; }
Записывая это правило, в первую очередь необходимо указать имя первого соседа, затем добавить символ +
и имя второго соседа (того, к которому мы желаем применить стиль). Можно создавать и более длинные комбинации. Схема написания селектора такая: selector1+selector2+…+selectorN {}
(стиль применяется к selectorN
).
Примеры написания:
/* Отступ от абзаца до картинки 30px */ p+img { padding-top: 30px; } /* Зеленый цвет для абзаца, который следует после h4 в связке с h3 */ h3+h4+p { color: green; }
Родственные селекторы
Родственные селекторы (другие названия: сестринские, сиблинговые) позволяют выбирать элементы HTML-страницы, являющиеся родственными по отношению друг к другу (то есть имеющие общего родителя и находящиеся на одном уровне). Сестринские селекторы похожи на соседние, но отличаются тем, что стиль применяется ко всем элементам выбранного типа, а не только к первому из них. Вместо знака +
используется символ тильда ~
.
Пример: немного изменим предыдущую задачу и представим, что вам нужно сделать наклонный шрифт для всех абзацев <p>
, которые идут после заголовка <h2>
. Код CSS будет выглядеть так:
h2 ~ p { font-style: italic; }
…и немного HTML для примера:
<div> <p>Текст</p> <h2>Заголовок 1</h2> <p>Текст</p> <p>Текст</p> <h3>Заголовок 2</h3> <p>Текст</p> </div> <div> <p>Текст</p> </div>
Взгляните на HTML-код: стиль применится ко всем тегам <p>
, которые следуют после тега <h2>
и находятся до закрывающего тега родителя <div>
. В нашем варианте насчитывается 3 элемента <p>
, к которым применится стиль. Обратите внимание, что тег <h3>
этому никак не помешает. Заметьте также, что в данном случае стиль не будет применен к тому тегу <p>
, который находится над <h2>
, а также к тегу <p>
, имеющему другого родителя <div>
.
Выводы
Используя соседние (смежные) селекторы, вы можете применять стиль к элементу в случае, когда он следует сразу за другим элементом (или группой элементов). Это работает с элементами, которые находятся на одном уровне и имеют общего родителя.
С помощью родственных селекторов можно применять стиль ко всем элементам выбранного типа в случае, когда они следуют сразу за другим элементом (или группой элементов). Это работает с элементами, которые находятся на одном уровне и имеют общего родителя.
Перейдя к следующей подглаве, вы познакомитесь с селекторами атрибутов.
CSS Предыдущие селекторы-родственники и как их подделать | Факундо Коррадини | Мы переехали на freeCodeCamp.org/news
. Если вы когда-либо использовали родственные селекторы CSS, то знаете, что их всего два. Комбинатор родственников +
выбирает первое совпадение, которое идет сразу после, а комбинатор последующих братьев ~
соответствует всем последующим.
Но нет возможности выбрать то, что было раньше. Ни родительские селекторы, ни селекторы предыдущих братьев и сестер просто не имеют значения.
Я знаю, что вы этого хотите, вы знаете, я хочу этого, но суровая правда в том, что их не существует (и, вероятно, никогда не будет). Есть миллион сообщений о том, почему. Есть даже предложения, как их реализовать. Но мы застряли в однонаправленной обработке правил CSS, скорее всего, чтобы защитить нас от «недостатка опыта», из-за которого мы застреваем в повторных потоках и даже в бесконечных циклах.
К счастью, как и большинство ограничений CSS, мы можем подделать .
Первое, что нужно рассмотреть, — это почему мы хотим, чтобы предыдущие братья и сестры начинались с.
На ум приходят два случая:
- Нам нужно выбрать всех братьев и сестер определенного элемента, а последующий комбинатор
~
выбирает только те, которые идут после. - Нам нужно выбрать только братьев и сестер, которые были до
Иногда нам нужно выбрать как предыдущих, так и следующих братьев и сестер. Для этого мы можем выбрать родителя и использовать для этого некоторые хитрости.
Например, чтобы выбрать все промежутки в следующей структуре при наведении курсора на любой из них, мы могли бы просто использовать дочерний селектор при наведении курсора на родительский.Мы обязательно отключили указатель-события
от родителя и сбросили его обратно для дочерних элементов. Таким образом, любое действие, которое мы хотим выполнить, сработает только тогда, когда мы введем дочерний элемент, а не сам родитель.
Если вам нужно выбрать всех братьев и сестер , кроме , на котором наведен курсор, вы можете объединить предыдущий метод с селектором : not
, чтобы исключить его.
Типичный вариант использования для этого — меню:
Приведенный выше код будет уменьшать непрозрачность всех
Кроме того, вы можете использовать такие фильтры, как селекторы типа и nth, чтобы быть более точным на братьях и сестрах, на которых вы хотите повлиять.
С некоторым стилем это должно работать следующим образом:
Обратите внимание на : если вы собираетесь запускать подход pointer-events: none
, имейте в виду, что это может испортить стекирование (может позволить вам выбирать элементы которые находятся «внизу» в порядке наложения). Он также не будет работать в IE10 и ниже, за исключением того, что вам могут понадобиться события указателя для чего-то еще.Так что будьте особенно осторожны при его использовании.
Для этого варианта использования мы можем изменить порядок в HTML, затем отсортировать его обратно в CSS и использовать комбинатор соседних элементов ~
или +
селектор соседних элементов. Таким образом, мы будем выбирать следующих братьев и сестер, но будет выглядеть так, как будто мы выбираем предыдущих.
Есть несколько способов сделать это. Самым простым и, вероятно, самым старым является изменение направления письма нашего контейнера:
Если ваши элементы должны отображать реальный текст, вы всегда можете отменить его обратно:
Но это может выйти из-под контроля разными способами.К счастью, современный набор инструментов CSS делает его намного проще и безопаснее. Мы можем просто использовать Flexbox в контейнере и изменить порядок с помощью flex-direction: row-reverse
:
Самое лучшее в подходе Flexbox — это то, что мы не путаемся с направлением письма. Ребят сбрасывать не нужно, и все гораздо более предсказуемо.
Семантически рейтинговую систему можно рассматривать как простой список переключателей с соответствующими метками. Это пригодится, поскольку позволит нам использовать псевдоселектор : checked
для изменения братьев и сестер.
Итак, начнем с этого:
Как мы обсуждали ранее, элементы расположены в обратном порядке, что позволяет использовать селектор «предыдущий брат». Обратите внимание, что мы используем символ Юникода «белая звезда» (U + 2606) для обозначения пустых звезд.
Давайте отобразим их рядом, в правильном (обратном) порядке:
Теперь скройте сами переключатели, никто не хочет этого видеть:
И примените стили к символам звездочки:
Единственное действительно важное В строке стоит позиция : относительная
.Это позволит нам абсолютно позиционировать псевдоэлемент с закрашенной звездой (U + 2605) поверх него, который изначально будет скрыт.
Когда мы наводим курсор на звезду, закрашенный псевдоэлемент звезды должен стать видимым для нее и всех предыдущих братьев и сестер .
То же самое для выбранного рейтинга, сопоставляя все метки, которые идут с до , с установленным переключателем:
Помните , что использование флага! Important — это , в точности противоположное в хорошей практике.Я делаю это здесь, поскольку без него нет другого способа достичь дополнительных функций, обсуждаемых в следующем разделе.
И последнее, но не менее важное: нам нужно «запомнить» текущий рейтинг на тот случай, если пользователь захочет его изменить. Например, если они выбрали пять звезд и по какой-то причине хотят изменить их на четыре, мы должны отображать звезды с 1 по 4 заполненными, а пятая — полупрозрачной при наведении курсора на четвертую.
Этого можно достичь, изменив непрозрачность предыдущих братьев и сестер проверяемого ввода при наведении курсора на контейнер:
Вот почему нам также потребовалось значение непрозрачности : 1! Important
в начальном объявлении зависания.В противном случае это последнее правило выиграло бы конкурс на конкретность и применило бы полупрозрачную заливку ко всему.
И вот у нас есть кроссбраузерная, полностью функциональная система оценки звездочек только на CSS с использованием селекторов «предыдущие братья и сестры».
Как видите, то, что «это невозможно», не означает, что вам не следует пытаться. Программирование — это раздвигать границы. Так что всякий раз, когда вы ударяетесь о стену, просто нажимайте немного сильнее. Или я думаю, что это может быть лучшая аналогия? … в любом случае, вы понимаете, о чем я.Продолжайте взламывать!
CSS Выбрать предыдущий элемент
Могут быть случаи, когда вы хотите применить определенный стиль для предыдущего элемента в CSS. Но можно ли этого достичь? Я постараюсь разобрать это в этой статье.
Селектор предыдущего элемента или селектор предыдущего родственного элемента недоступен в CSS (см. Список всех доступных селекторов). Однако существует возможное обходное решение, и вы можете имитировать такое поведение с помощью свойства flex.
Наиболее распространенным примером может быть метка
с входом
.На входе
: hover
или : focus
мы также хотели бы выделить метку
, которая в данном случае стоит перед входом
.
HTML :
Чтобы реализовать обходной путь, нам нужно немного изменить HTML. Поменяем местами input
и label
.Таким образом, мы можем настроить таргетинг на элемент label
через родственный селектор ( +
).
HTML :
Что касается стиля, мы можем установить визуальный порядок label
и input
с помощью правила flex-direction: row-reverse
.
CSS :
.field {
дисплей: гибкий;
flex-direction: строка-реверс;
justify-content: гибкий конец; / * для перемещения содержимого влево * /
}
.input: focus + .label {
цвет: # 5a6cce;
}
Результат :
Электронная почта:
В случае, если в контейнере более двух элементов, вы можете установить свойство порядка для каждого из них, чтобы визуально разместить их один за другим. В этом случае не забудьте удалить flex-direction: reverse
на элементе контейнера.
.label {
заказ: 1;
}
.Вход {
заказ: 2
}
Последний совет: если вы работаете с input и состоянием : focus
, вы можете использовать псевдокласс : focus-within
для выбора желаемого элемента.В этом случае вы можете оставить HTML как есть:
CSS :
.field: focus-within .label {
цвет: # 5a6cce;
}
Однако, если вы выходите за рамки : hover
и / или : focus
указывает, что свойства flex-direction
и order
— это ваш основной способ выбрать предыдущий элемент-брат.
Как сделать невозможное возможным в CSS, проявив немного творчества
от Факундо Коррадини
Если вы когда-либо использовали родственные селекторы CSS, то знаете, что их всего два. Комбинатор родственников +
выбирает первое совпадение, которое идет сразу после, а комбинатор последующих братьев ~
соответствует всем последующим.
Но нет возможности выбрать то, что было раньше. Ни родительские селекторы, ни селекторы предыдущих братьев и сестер просто не имеют значения.
Я знаю, что вы этого хотите, вы знаете, я хочу этого, но суровая правда в том, что их не существует (и, вероятно, никогда не будет). Есть миллион сообщений о том, почему. Есть даже предложения, как их реализовать. Но мы застряли в однонаправленной обработке правил CSS, скорее всего, чтобы защитить нас от «недостатка опыта», из-за которого мы застреваем в повторных потоках и даже в бесконечных циклах.
К счастью, как и большинство ограничений CSS, мы можем подделать .
Первое, что нужно рассмотреть, — это почему мы хотим, чтобы предыдущие братья и сестры начинались с.
На ум приходят два случая:
- Нам нужно выбрать всех братьев и сестер определенного элемента, а последующий комбинатор
~
выбирает только те, которые идут после. - Нам нужно выбрать только братьев и сестер, которые были до
1. Выбор всех братьев и сестер
Иногда нам нужно выбрать как предыдущих, так и следующих братьев и сестер. Для этого мы можем выбрать родителя и использовать для этого некоторые хитрости.
Например, чтобы выбрать все промежутки в следующей структуре при наведении курсора на любой из них, мы могли бы просто использовать дочерний селектор при наведении курсора на родительский.Мы обязательно отключили указатель-события
от родителя и сбросили его обратно для дочерних элементов. Таким образом, любое действие, которое мы хотим выполнить, сработает только тогда, когда мы введем дочерний элемент, а не сам родитель.
Если вам нужно выбрать всех братьев и сестер , кроме , на котором наведен курсор, вы можете объединить предыдущий метод с селектором : not
, чтобы исключить его.
Типичным вариантом использования для этого является меню:
Приведенный выше код будет уменьшать непрозрачность всех <
li> ele ment , кроме того, который завис.
Кроме того, вы можете использовать такие фильтры, как селекторы типа и nth, чтобы быть более точным на братьях и сестрах, на которых вы хотите повлиять.
С некоторым стилем это должно работать следующим образом:
Обратите внимание на : если вы собираетесь запускать подход pointer-events: none
, имейте в виду, что это может испортить стекирование (может позволить вам выбирать элементы которые находятся «внизу» в порядке наложения). Он также не будет работать в IE10 и ниже, за исключением того, что вам могут понадобиться события указателя для чего-то еще.Так что будьте особенно осторожны при его использовании.
2. Выбор того, что было раньше
Для этого варианта использования мы можем изменить порядок в HTML, затем отсортировать его в CSS и использовать комбинатор соседних элементов ~
или +
селектор смежных элементов. Таким образом, мы будем выбирать следующих братьев и сестер, но будет выглядеть так, как будто мы выбираем предыдущих.
Есть несколько способов сделать это. Самым простым и, вероятно, самым старым является изменение направления письма нашего контейнера:
Если ваши элементы должны отображать реальный текст, вы всегда можете отменить его обратно:
Но это может выйти из-под контроля разными способами.К счастью, современный набор инструментов CSS делает его намного проще и безопаснее. Мы можем просто использовать Flexbox в контейнере и изменить порядок с помощью flex-direction: row-reverse
:
Самое лучшее в подходе Flexbox - это то, что мы не путаемся с направлением письма. Ребят сбрасывать не нужно, и все гораздо более предсказуемо.
Использование «предыдущих братьев и сестер» для создания рейтинговой системы только для CSS
Семантически рейтинговую систему можно представить себе как простой список переключателей с соответствующими метками.Это пригодится, поскольку позволит нам использовать псевдоселектор : checked
для изменения братьев и сестер.
Итак, начнем с этого:
Как мы обсуждали ранее, элементы расположены в обратном порядке, что позволяет использовать селектор «предыдущий брат». Обратите внимание, что мы используем символ Юникода «белая звезда» (U + 2606) для обозначения пустых звезд.
Давайте отобразим их рядом, в правильном (обратном) порядке:
Теперь скройте сами переключатели, никто не хочет этого видеть:
И примените стили к символам звездочки:
Единственное действительно важное В строке стоит позиция : относительная
.Это позволит нам абсолютно позиционировать псевдоэлемент с закрашенной звездой (U + 2605) поверх него, который изначально будет скрыт.
Когда мы наводим курсор на звезду, закрашенный псевдоэлемент звезды должен стать видимым для нее и всех предыдущих братьев и сестер .
То же самое для выбранного рейтинга, сопоставляя все метки, которые идут с до , с установленным переключателем:
Помните , что использование флага! Important - это , в точности противоположное в хорошей практике.Я делаю это здесь, поскольку без него нет другого способа достичь дополнительных функций, обсуждаемых в следующем разделе.
И последнее, но не менее важное: нам нужно «запомнить» текущий рейтинг на тот случай, если пользователь захочет его изменить. Например, если они выбрали пять звезд и по какой-то причине хотят изменить их на четыре, мы должны отображать звезды с 1 по 4 заполненными, а пятая - полупрозрачной при наведении курсора на четвертую.
Этого можно достичь, изменив непрозрачность предыдущих братьев и сестер проверяемого ввода при наведении курсора на контейнер:
Вот почему нам также потребовалось значение непрозрачности : 1! Important
в начальном объявлении зависания.В противном случае это последнее правило выиграло бы конкурс на конкретность и применило бы полупрозрачную заливку ко всему.
И вот у нас есть кроссбраузерная, полностью функциональная система оценки звездочек только на CSS с использованием селекторов «предыдущие братья и сестры».
Как видите, то, что «это невозможно», не означает, что вам не следует пытаться. Программирование - это раздвигать границы. Так что всякий раз, когда вы ударяетесь о стену, просто нажимайте немного сильнее. Или я думаю, что это может быть лучшая аналогия? ... в любом случае, вы понимаете, о чем я.Продолжайте взламывать!
Примечание о специальных возможностях
Предыдущий фрагмент является упрощением для облегчения понимания. Это , а не , что я бы рекомендовал использовать на производстве из-за многих ограничений доступности.
Чтобы сделать фрагмент более доступным, первым делом нужно скрыть переключатели практически любым способом, кроме отображения : none
, чтобы сделать их фокусируемыми. Мы также должны добавить некоторое кольцо фокусировки на фрагмент целых звезд, когда какой-либо элемент внутри находится в фокусе, с помощью псевдоселектора : focus-within
.
Идентичные метки «☆» не имеют смысла для программ чтения с экрана, поэтому лучше всего будет иметь внутри метки
Также обратный исходный код HTML + display: row-reverse
делает рейтинг клавиатуры неудобным, так как он не возвращается обратно. Доступность Flexbox и клавиатуры - довольно запутанная тема, но наиболее близким к ее решению является добавление тега aria-flowto
к каждому элементу, что, по крайней мере, устраняет проблему для некоторых комбинаций программ чтения с экрана + браузер.
Чтобы получить более доступный фрагмент (с использованием альтернативной техники изменения следующих братьев и сестер, чтобы они выглядели пустыми, вместо попытки оценить предыдущие), проверьте Патрика Коула, как мы обсуждали в ответах ниже.
одноуровневых селекторов в CSS - Сообщество разработчиков
Трудно представить веб-сайт без CSS, а в наши дни - и без JavaScript. JavaScript дает сайту больше функциональных возможностей. Но если вы новичок, вы только начали свою карьеру веб-разработчика и у вас есть творческие идеи, но у вас нет знаний JavaScript, чтобы добавить некоторые из этих функций JavaScript в свой дизайн, поэтому здесь я объясняю вам одну из этих идей, например переключаемое меню или скользящее меню панели задач, или карусельная галерея, или отзывы и все такое, что вы видели, но никогда не пробовали создавать с помощью JavaScript.
Итак, здесь я объясню вам о селекторах элементов-родственников CSS Next и Previous (да PREVIOUS).
Давайте сначала поговорим о селекторах следующих братьев и сестер: -
Используя селектор следующего родственного элемента, вы можете изменить свойства элемента, который находится непосредственно после вашего другого конкретного элемента, или вы можете сказать, что с его помощью вы можете изменить свойства соседнего элемента-брата.
Как вы можете видеть в приведенном выше фрагменте, между тегами h2 и p находится знак + , здесь p является смежным с h2 .Теперь, если вы наведете курсор на h2, вы увидите изменение свойств тега p .
Используя общий селектор следующего родственного брата, вы можете выбрать любой или все последующие родственные элементы, тогда как с помощью селектора следующего родственного элемента мы можем выбрать только соседний родственный элемент.
Как вы можете видеть в приведенном выше фрагменте, между тегами h2 и p есть вход ~ , но между тегами h3 есть еще один родственный тег, но это не повлияет, и вы можете изменить свойства Тег p , хотя p не является следующим соседним родственником h2 .
При желании вы также можете изменить свойства h3 , который находится между h2 и p , а также изменить свойства тега p .
До сих пор мы говорили о соседних селекторах, но как насчет предыдущих родственных селекторов?
К сожалению, в CSS у нас нет таких предыдущих одноуровневых селекторов, но да, в ax (ACSSSS) - синтаксисе расширенной каскадной таблицы стилей у нас есть предыдущие или предшествующие одноуровневые селекторы.
При использовании ACSSSS не забудьте добавить эту библиотеку в свой html файл: -
Войти в полноэкранный режимВыйти из полноэкранного режима
Используя предыдущий родственный селектор, мы можем изменить свойства элемента, который находится непосредственно перед вашим другим конкретным элементом, или вы можете сказать, что с его помощью вы можете изменить свойства непосредственно предшествующего элемента.
Как вы можете видеть в приведенном выше фрагменте, существует ? входит между p и тегом h2 , здесь h2 является непосредственным предшествующим родственником p .Итак, теперь, если вы наведете курсор на тег p , вы увидите изменения в теге h2 .
Используя общий предыдущий одноуровневый селектор, вы можете выбрать любой или все предыдущие или предшествующие одноуровневые элементы, тогда как с помощью предыдущего одноуровневого селектора мы можем выбрать только непосредственно предыдущий одноуровневый элемент.
Как вы можете видеть в приведенном выше фрагменте, существует ! войдите между тегами p и h2 , но между тегами h3 есть еще один родственный тег, но он не повлияет, и вы можете изменить свойства тега h2 , хотя h2 не предшествует непосредственно брат p tag.
При желании вы также можете изменить свойства h3 , который находится между h2 и p , а также изменить свойства тега p . Это будет более понятно на примере ниже: -
Чтобы узнать больше о дизайне, относящемся к этой теме, посмотрите мои ручки на CodePen.
Спасибо, что прочитали, это моя первая статья.
Любая обратная связь будет принята с благодарностью.
Свяжитесь со мной в Twitter или LinkedIn
Другой предыдущий подход к селектору-родственнику
К сожалению, в CSS нет такой вещи, как «предыдущий» селектор.Это означает, что вы не можете выбрать элемент или элементы, которые появляются в коде HTML перед вашим конкретным элементом. Почему? CSS означает каскадные таблицы стилей, а каскад похож на водопад, он идет сверху вниз. Обратного движения нет.
Все, что мы можем сделать, это сопоставить следующего ближайшего родственника (оператор +
) или сопоставить всех следующих братьев и сестер (оператор ~
).
Хорошо, но технологии развиваются очень быстро и действительно нет решения?
Нет, официального решения пока нет.Но мы можем смоделировать наши хорошо известные селекторы братьев и сестер, чтобы они соответствовали предыдущим элементам.
Сценарии использования
А пока зададим вопрос: для чего нам понадобятся предыдущие селекторы? Когда мы могли их использовать?
Я думаю, что наиболее распространенным вариантом использования является «рейтинг в звездах». Когда пользователь наводит курсор на одну звезду, мы хотим, чтобы он активировал все предыдущие звезды.
Конечно, вы можете найти множество других вариантов использования, это зависит от ваших потребностей и воображения.
Решения
Насколько мне известно, наиболее распространенным решением является использование свойства CSS direction: rtl
. Это очень хорошо объяснено в этой статье.
Но я бы хотел представить совершенно другой подход. Он основан на flexbox
и его свойстве order
. Нам нужно изменить визуальный порядок элементов. Вы можете сделать это, установив порядок каждого элемента вручную:
.element-1 {
заказ: 3;
}
.element-2 {
заказ: 2;
}
.element-3 {
заказ: 1;
}
// и так далее...
… но я не думаю, что это хорошая идея. Он производит много кода, который в основном делает то же самое.
Вы можете добиться того же, используя flex-direction: row | column-reverse
.
реверс
слово здесь имеет решающее значение. Вы больше не зависите от количества элементов и можете быть уверены, что все элементы будут в обратном порядке.
Пояснение
Ниже вы можете найти пример с рейтингом звезд на основе flexbox. Не стесняйтесь поиграть с ним:
Таким образом, вы можете поймать следующий элемент с помощью селектора +
, а затем изменить визуальный порядок с помощью flex-direction: row | column -reverse
.
Я также хотел бы показать вам пример с флажком и меткой. Он состоит из небольшого фрагмента кода, показывающего, как изменить флажок в ползунок переключения, используя только CSS, без дополнительных div
. Он работает во всех основных браузерах.
Доступность
Вышеупомянутое решение изменяет только визуальный порядок, но не меняет реальный порядок в HTML-коде, поэтому нет возможности установить фокус на соответствующем элементе. Фокус будет применен от последнего видимого элемента к первому.Поэтому, если вы работаете над страницей, которая требует высокой доступности, помните об этом.
Продолжайте и попробуйте повозиться с кодом ниже.
Подсказка: нажмите на звездочку, а затем используйте клавишу табуляции 🙂
Надеюсь, вам понравится это решение, и если вы знаете еще какие-то хитрые приемы, как добиться чего-то похожего, дайте мне знать, оставив комментарий ниже.
Использование предыдущего CSS «HACK» для создания анимированного звездного рейтинга
Прочтите статью полностью на Medium ...
Образовательные цели:
- Объясните разницу между селектором CSS и комбинатором CSS
- Сравните и сравните «Смежный одноуровневый комбинатор» и «Общий одноуровневый комбинатор»
- Продемонстрируйте, как использовать flex-direction и hover для имитации предыдущего родственного комбинатора
- Продемонстрируйте, как использовать clip-path для создания звезды
Сегодня я рассмотрю простой, но удивительно мощный способ использования предыдущего дочернего селектора CSS «Hack» для создания компонента звездного рейтинга.
Справочная информация об этой статье
Эта статья является частью продолжающейся образовательной серии, которая будет преобразована в книгу с открытым исходным кодом и поэтому считается «живой статьей», которая может быть изменена. Если у вас есть вопросы, вы хотите внести свой вклад или просто поговорить о содержании, оставьте комментарий!
Если вы обнаружили ошибку, опечатку или хотите внести свой вклад непосредственно в эту книгу, вы можете отправить сообщение о проблеме:
Основы CSS в одном GIF
Мне нравится, чтобы мои сообщения были удобными для новичков, без ущерба для продвинутого содержания.Итак, вот гифка Умара Ханса, которая затрагивает некоторые из самых основных правил CSS. Попробуйте полную ссылку здесь.
Что мы будем строить сегодня
Посмотреть код.
Я просто шучу , кто я учитель JavaScript? Мы можем сделать лучше, чем это ... Итак, давайте погрузимся в:
Как это «взлом» CSS?
Нет, это не «взлом», нарушение закона о компьютерном мошенничестве, разновидность взлома. Это незаконных и мы здесь законопослушные граждане.
Это просто творческий способ решения проблемы: перевернуть проблему вверх дном, выполнить прямо противоположное требованиям, а затем безупречно представить нашу ложь пользователю, потому что для него не имеет значения, как вы это сделали.
Если это не «хак» CSS, то определенно волшебная звезда ...
звездный рейтинг только с CSS:
Давайте разберем это с точки зрения требований проекта и доступных селекторов и комбинаторов CSS, чтобы увидеть, возможно ли это вообще.
Спойлер, мы жульничаем… вот почему это «хакерство».
Так каковы же требования к звездочному рейтингу?
Обычно, когда вы видите эту проблему кодирования, она выглядит примерно так:
Компонент Рейтинг состоит из 5 звезд, каждая из которых представлена элементом и хранится в родительском контейнере.
- При щелчке по звездочному элементу или, в данном случае, при наведении указателя на звезду, цвет звезды должен измениться на «активный», и все начнется до того, как ее следует обновить, чтобы сделать то же самое.
- Также звезды после желаемого рейтинга не должны иметь активного цвета.
Решение проблем с помощью CSS-селекторов, типов отображения и комбинаторов
CSS - это не язык программирования, это «язык таблиц стилей, используемый для описания представления документа, написанного на языке разметки, таком как HTML».
Другими словами, мы не можем сказать браузеру, что делать.
Вместо этого мы можем только указать браузеру, как представлять разметку.
Используя псевдоселекторы, такие как: hover,: focus,: focus-within и: checked, мы можем имитировать поведение щелчка и касания элемента в объектной модели документа (DOM) или, проще говоря, визуализированном HTML.
Хорошо, что мы можем выполнить требование №2 достаточно легко. А как насчет требования №1.
Что ж ... вот почему мы должны «обмануть», потому что на самом деле нет способа нацелить на предыдущий родственник , мы можем нацеливаться только на родительский контейнер, дочерний элемент и их родственников каскадным образом.
Вот почему он называется таблицей стилей CASCADING, а не таблицей стилей по возрастанию.
Это также означает, что технически мы не можем выполнить ни одно из этих действий, но мы можем сделать полную противоположность обоим и представить это, как если бы мы действительно выполняли их ... Так что да, это определенно обман, и это будет весело и, надеюсь, заставит вас больше ценить CSS.
Переписывание требований к правилам CSS
- При наведении курсора на звезду звезда должна быть изменена на «активный» цвет, и все запускаемые после нее должны быть обновлены, чтобы сделать то же самое.
- Кроме того, звезды перед желаемым рейтингом не могут быть стилизованы, поэтому мы бросаем детскую форму, переворачиваем чертову штуку вверх ногами и меняем порядок.
- Обманывать пользователя (и читателя) и говорить, что это селектор Previous-Child.
Поскольку мы можем «описать представление документа»,
включает то, как мы представляем порядок элементов.
Есть несколько способов сделать это, но я расскажу только о двух из них, а второй является анти-шаблоном, и вам следует избегать его использования.Он используется только для того, чтобы вручную продемонстрировать другой способ описания происходящего.
Вариант 1. Дисплей Flex и направление гибкости
Поскольку я хочу показать его как строку, мы применим flex-direction: row-reverse; в класс .star-rating, чтобы изменить порядок каждого дочернего элемента.
Модель DOM не меняется. Мы просто меняем то, как мы это представляем.
Итак, наш документ, или HTML, записывается так:
CSS, применяемый в.star-rating class, изменит порядок каждого div.
Затем изменим цвет звезды.
Для этого я собираюсь использовать: hover, чтобы изменить цвет на выбранной звезде, и мы будем использовать общий родственный комбинатор CSS ~ вместо смежного родственного комбинатора +. Если бы мы использовали соседний комбинатор, нам пришлось бы написать:
.star-рейтинг .star: hover,
.star-рейтинг .star: hover + .star,
.star-рейтинг .star: hover + .star + .star,
.star-рейтинг .star: hover + .star +.звезда +. звезда,
.star-рейтинг .star: hover + .star + .star + .star + .star,
.star-рейтинг .star: hover + .star + .star + .star + star + .star
{
цвет фона: красный;
}
Это слишком много для набора текста, у меня в руке пластина и 8 винтов, так что печатать было больно.
Плюс просто плохой CSS, поэтому вместо этого мы просто напишем следующее:
.star-рейтинг .star: hover,
.star-rating .star: hover ~ .star {
цвет фона: красный;
}
Это намного проще.
Но важно помнить, что на самом деле мы не стилизуем предыдущих братьев и сестер, мы стилизуем их после выбранной звезды и просто меняем его представление пользователю.
О Варианте 2 читайте в полной версии:
Чтобы узнать больше, есть два варианта, оба совершенно бесплатные, потому что я не верю, что знания должны быть заблокированы за платным доступом, иначе они медленно умирают в академических кругах ...
- Прочтите исходную полную статью на Medium без стены, потому что мы друзья. И друзья, получите дружеские ссылки.
- Вы можете внести свой вклад в эту книгу, прочитав / обсудив раздел Star-Rating.md. И, если хотите, отправьте PR, проблему и т. Д. На github и прочтите статью о уценке Star-Rating.мкр.
Как выбрать предыдущий элемент в CSS при наведении курсора
Я хочу изменить цвет фона текущего элемента li: hover и всех предыдущих элементов li в этом списке. Предположим, если я наведу курсор на 3-е li, тогда 3-й, 2-й и 1-й li должны иметь цвет фона: # 00f; , Я могу изменить фон текущего зависшего элемента li с помощью этого .Rank li: hover, но не могу понять, как я могу изменить цвет фона для предыдущих элементов этого текущего списка .Rank.,
Переполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегами
ул.классифицировать { маржа: 0; отступ: 0; список - стиль: нет; } ul.rank> li { положение: относительное; маржа: 0; высота: 30 пикселей; фон: #ccc; переход: фон - цвет 350 мс; } ul.rank: hover> li { фон - цвет: # 00f; } ul.rank> li + li { маржа сверху: 10 пикселей; } ul.rank> li: hover ~ li { фон: # ccc; } ul.rank> li + li: before { содержание: ""; дисплей: блок; позиция: абсолютная; верх: -10 пикселей; слева: 0; справа: 0; высота: 10 пикселей; }
загрузить больше v
Нам нужно выбрать всех братьев и сестер определенного элемента, а ~ последующий комбинатор братьев и сестер выбирает только те, которые идут после., Нам нужно выбрать только братьев и сестер, которые были раньше. Иногда нам нужно выбрать как предыдущих, так и следующих братьев и сестер. Для этого мы можем выбрать родителя и использовать для этого некоторые хитрости.
Если вы когда-либо использовали родственные селекторы CSS, то знаете, что их всего два. Комбинатор родственников +
выбирает первое совпадение, которое идет сразу после, а комбинатор последующих братьев ~
соответствует всем последующим.
Но нет возможности выбрать то, что было раньше.Ни родительские селекторы, ни селекторы предыдущих братьев и сестер просто не имеют значения.
Если вы когда-либо использовали родственные селекторы CSS, то знаете, что их всего два. Комбинатор родственников +
выбирает первое совпадение, которое идет сразу после, а комбинатор последующих братьев ~
соответствует всем последующим.
Но нет возможности выбрать то, что было раньше. Ни родительские селекторы, ни селекторы предыдущих братьев и сестер просто не имеют значения.
загрузить еще v
Пожалуйста, подождите, пока мы проверяем ваш браузер..., Если вы находитесь в офисе или в общей сети, вы можете попросить администратора сети запустить сканирование сети в поисках неправильно сконфигурированных или зараженных устройств., Выполнение CAPTCHA доказывает, что вы человек, и дает вам временный доступ к Интернету. имущество.
Pretag team - проблема, исправить, решить, устранить
При наведении курсора на звезду псевдоэлемент с закрашенной звездой должен стать видимым для нее и всех предыдущих братьев и сестер. Иногда нам нужно выбрать как предыдущего, так и следующего брата и сестру.Для этого мы можем выбрать родителя и использовать некоторые приемы для его решения. Нам нужно выбрать только братьев и сестер, которые были до
. Если вы когда-либо использовали родственные селекторы CSS, то знаете, что их всего два. Комбинатор родственников +
выбирает первое совпадение, которое идет сразу после, а комбинатор последующих братьев ~
соответствует всем последующим.
Но нет возможности выбрать то, что было раньше. Ни родительские селекторы, ни селекторы предыдущих братьев и сестер просто не имеют значения.
Если вы когда-либо использовали родственные селекторы CSS, то знаете, что их всего два. Комбинатор родственников +
выбирает первое совпадение, которое идет сразу после, а комбинатор последующих братьев ~
соответствует всем последующим.
Но нет возможности выбрать то, что было раньше. Ни родительские селекторы, ни селекторы предыдущих братьев и сестер просто не имеют значения.
загрузить больше v
Предыдущего селектора одноуровневого не существовало. Вы не можете сделать это с помощью CSS., Кроме того, я уверен, что код, который вы предоставили, был предназначен только для демонстрационных целей, но, похоже, вы используете пользовательские элементы HTML.
Pretag team - проблема, исправить, решить, решить
Используя псевдоселекторы, такие как: hover,: focus,: focus-within и: checked, мы можем имитировать поведение щелчка и касания элемента в объектной модели документа (DOM ) или, проще говоря, визуализированный HTML., Когда звездочку щелкают или, в данном случае, зависают, звездочка должна измениться на «активный» цвет, и все начинается до того, как она должна быть обновлена, чтобы сделать то же самое., Но важно помнить, что на самом деле мы не стилизуем предыдущих братьев и сестер, мы стилизуем братьев и сестер после выбранной звезды и просто меняем его представление пользователю.
Это просто творческий способ решения проблемы: перевернуть проблему вверх дном, выполнить прямо противоположное требованиям, а затем безупречно представить нашу ложь пользователю, потому что для него не имеет значения, как вы это сделали.
Если это не «хак» CSS, то это определенно волшебная звезда...
загрузить больше v
Селектор предыдущего родственника. К сожалению, в CSS нет такой вещи, как «предыдущий» селектор. Это означает, что вы не можете выбрать элемент или элементы, которые появляются в коде HTML перед вашим конкретным элементом. Почему? CSS означает каскадные таблицы стилей, а каскад похож на водопад, он идет сверху вниз. Обратного движения нет., Здесь решающее значение имеет обратное слово. Вы больше не зависите от количества элементов и можете быть уверены, что все элементы будут в обратном порядке.