Обман с флажками с помощью CSS / Coder’s Block
Флажки — это здорово. Объедините их с правильным CSS, и вы сможете реализовать несколько действительно крутых трюков. Эта статья призвана продемонстрировать некоторые творческие вещи, которые вы можете делать с помощью флажков. Читайте дальше и имейте в виду, что в демонстрациях в этой статье используется без JavaScript .
Все начинается с HTML.
Здесь нет ничего сложного. на 9Атрибут 0013 на
соответствует id
на
, поэтому нажатие на
переключит флажок
. Это важно, потому что наш следующий шаг — скрыть
.
ввод {
позиция: абсолютная;
слева: -9999px;
}
Почему не отображается : нет
? Потому что это приведет к его игнорированию программами чтения с экрана и табуляцией клавиатуры. Этот метод сохраняет
в потоке, но скрывает его за кадром.
Сокрытие
облегчает нам выполнение собственных задач. Нам по-прежнему нужно передать состояние проверено/не проверено, но мы можем сделать это с помощью
. Здесь начинается вечеринка.
input:checked + label {
/* awesome styles */
}
Мы используем комбинацию псевдокласса :checked
и соседнего селектора +
, чтобы сказать «когда флажок установлен , найти <метка>
сразу после него и примените потрясающие стили». Вы даже можете использовать псевдоэлементы ( ::before
и ::after
) внутри
для большей свободы творчества.
input:checked + label::before {
/* стили для индикатора «включено» */
}
Хорошо, давайте посмотрим на это в действии. В этой демонстрации используется базовая формула, которую мы только что обсуждали, чтобы превратить обычные флажки во что-то более впечатляющее.
См. Обман с флажком пера: простой переключатель Уилла Бойда (@lonekorean) на CodePen.
Самое приятное то, что они все еще флажки. Оберните их в , и они будут отправлены, как вы и ожидали. Мы меняем внешность, но не поведение.
До сих пор речь шла о стиле
, но мы можем пойти дальше. Эта демонстрация динамически скрывает/показывает части формы в зависимости от выбора пользователя.
См. «Обман с флажком пера: раскрытие формы» Уилла Бойда (@lonekorean) на CodePen.
Псевдокласс :checked
работает с переключателями так же, как и с флажками. Имея это в виду, вот HTML для «Как вы узнали о нас?» Радио-кнопки.
Индикаторы радиокнопок отображаются в пределах
с использованием комбинации ::before
(для внешнего кольца) и ::after
(для зеленой точки). Отображение/скрытие ::после
, когда переключатель установлен/снят, достаточно просто.
.side-label::after {
display: none;/* другие стили */
}input:checked + .side-label::after {
display: block;
}
До сих пор мы использовали селектор соседнего брата Мы можем повторно использовать методы из предыдущей демонстрации для создания виджета дерева папок, который имеет аналогичное поведение скрытия/отображения. См. «Обман пера с флажком: дерево папок» Уилла Бойда (@lonekorean) на CodePen. HTML для одной папки приведен ниже. Значки Font Awesome используются для обозначения проверенного (открытого) и непроверенного (закрытого) состояний. label::before { input:checked + label::before { a::before { Содержимое папки переключается с помощью общего родственного селектора Естественно, папки могут быть вложенными. Просто перетащите HTML для другой папки в Наконец, давайте поговорим о кнопке сброса. Кнопки сброса формы теперь редко используются, но для одного это достойный случай. В этой демонстрации элементы разбиваются на два отдельных списка в зависимости от того, отмечены они как выполненные или нет. См. Обман с флажком пера: список дел от Уилла Бойда (@lonekorean) на CodePen. Обновление: некоторые люди отмечают, что по соглашению флажки должны быть квадратными, в отличие от того, что я сделал в этой демонстрации. Они не ошибаются. HTML выглядит следующим образом. Механика разделения списка реализована с помощью CSS flexbox. .done { input:checked + label { .undone { этикетка { CSS flexbox позволяет напрямую переставлять элементы с помощью свойства К сожалению, навигация с помощью клавиатуры и многие средства чтения с экрана будут следовать порядку элементов в DOM, даже если они были визуально изменены с помощью CSS flexbox. Это делает заголовки «Готово» и «Не выполнено» бесполезными для программ чтения с экрана, поэтому я добавил Если вам интересны счетчики рядом с «Готово» и «Не выполнено», они генерируются с помощью счетчиков CSS. Прочтите эту статью, если хотите узнать больше. Последняя демонстрация. Здесь показано, как выделить сечение данных, которое соответствует выбранному критерию. См. Обман с флажком пера: групповой фильтр Уилла Бойда (@lonekorean) на CodePen. Вот сокращенный HTML. Обратите внимание, что атрибут Что касается доступности, я использую пустые атрибуты Вот CSS, который выделяет персонажей, когда выбрана их команда. #original:checked ~ . символы [data-teams~="original"] img, Я знаю, что эти селекторы выглядят неубедительно, но они не так уж плохи. Давайте разберем строку 1 в качестве примера. Говоря об этом, «когда проверяется элемент с Надеюсь, вы получили такое же удовольствие, играя с этими демонстрационными примерами, как и я, создавая их. Мне было очень интересно посмотреть, что я могу сделать с чем-то таким скромным, как флажок. Я не стесняюсь использовать JavaScript, когда это уместно, но приятно иметь возможность делать так много без него. Aurelia поддерживает двустороннюю привязку различных типов данных к элементам ввода флажков. Привяжите логическое свойство к Набор элементов-флажков представляет собой интерфейс множественного выбора. Чтобы определить «значение» входа, привяжите 9 входов0012 модель атрибут: Числа — не единственный тип значений, которые вы можете хранить в массиве «выбранных элементов». Система привязки поддерживает все типы, включая объекты. Вот пример, который добавляет и удаляет объекты «продукт» из Вы можете столкнуться с ситуациями, когда объект, к которому привязана модель вашего входного элемента, не имеет ссылочного равенства ни на один из объектов в проверенном массиве. Объекты могут совпадать по идентификатору, но они могут не быть одним и тем же экземпляром объекта. Чтобы поддержать этот сценарий, вы можете переопределить «сопоставитель» Aurelia по умолчанию, который представляет собой функцию сравнения на равенство, которая выглядит следующим образом: Наконец, вот пример добавления и удаления строк из массива display: none
, потому что на этот раз я хочу, чтобы содержимое игнорировалось программами чтения с экрана и табуляцией клавиатуры до тех пор, пока оно не будет раскрыто. CSS для отображения
#how-other:checked ~ .how-other-disclosure {
display: block;
} +
, но на этот раз мы используем ~
общий селектор родственных элементов. Он похож, но может найти несмежных братьев и сестер, например, наш
— это папка, а два элемента
— это «файлы» внутри нее.
label::before, a::before {
display: block;
позиция: абсолютная;
сверху: 6px;
осталось: -25px;
семейство шрифтов: «FontAwesome»;
}
content: '\f07b'; /* закрытая папка */
}
content: '\f07c'; /* открыть папку */
}
content: '\f068'; /* тире */
} ~
. Вот почему в HTML есть дополнительные обертки ввод: проверено ~ .sub {
дисплей: блок;
}
Нажатие на нее возвращает все флажки в исходное неотмеченное состояние, закрывая все папки. Аккуратный.
Выполнено
Не выполнено
Вот соответствующий CSS.
.items {
display: flex;
flex-direction: столбец;
}
заказ: 1;
}
order: 2;
}
заказ: 3;
}
порядок: 4;
} order
. Значение заказа <метка>
изменяется с 4
на 2
, когда его флажок установлен, перемещая его из-под «Не выполнено» под «Готово»
.
aria-hidden="true"
им — лучше их игнорировать, чем вызывать путаницу. Кроме того, разделенным списком по-прежнему можно полностью управлять с помощью клавиатуры, а средства чтения с экрана по-прежнему сообщают о состоянии элемента (отмечен/не отмечен). data-teams
представляет собой список разделенных пробелами атрибутов переключателя id
. Вот как мы сопоставляем персонажей с командами.
<ул>
Ангел
png" alt="">
alt
, потому что имена персонажей уже находятся в тегах — нет смысла читать каждое имя дважды. Кроме того, поскольку я на самом деле не скрываю
элементов
(просто сжимаю и исчезаю), это упрощает работу программ чтения с экрана, чтобы они пропускали невыделенные символы. Мне нужно только скрыть
.
#original:checked ~ .characters [data-teams~="original"] h3,
#force:checked ~ .characters [data-teams~="force"] h3,
#factor:checked ~ .characters [ data-teams~="factor"] h3,
#hellfire:checked ~ .characters [data-teams~="hellfire"] h3 {
/* стили для отображения имени персонажа */
}
#force:checked ~ . characters [data-teams~="force"] img,
#factor:checked ~ .characters [data-teams~="factor"] img,
#hellfire:checked ~ .characters [data-teams~="hellfire"] img {
/* стили для отображения аватара персонажа */
} id
«оригинал», найдите в элементе «символы» родственного элемента что-либо с атрибутом data-teams
, содержащим «оригинал», затем найдите внутри. Повторите для слов «сила», «фактор» и «адский огонь» в строках 2–4. Теперь проделайте все это снова по строкам 8-11, но для
вместо
.
Спасибо за чтение!
Привязка: Флажки | Aurelia
Введение
Логические значения
проверенному
атрибуту элемента ввода, используя checked.bind="myBooleanProperty"
.
приложение класса экспорта {
материнская плата = ложь;
процессор = ложь;
память = ложь;
}
приложение класса экспорта {
материнская плата = ложь;
процессор = ложь;
память = ложь;
}
<шаблон>
<форма>
Товары
материнская плата = ${материнская плата}
ЦП = ${ЦП}
память = ${память}
форма>
шаблон>
Массив чисел
model.bind="product.id"
.
приложение класса экспорта {
продукты = [
{идентификатор: 0, имя: «Материнская плата»},
{идентификатор: 1, имя: 'ЦП'},
{идентификатор: 2, имя: «Память»},
];
выбранныепродуктидс = [];
}
интерфейс экспорта IProduct {
идентификационный номер;
имя: строка;
}
приложение класса экспорта {
продукты: IProduct[] = [
{идентификатор: 0, имя: «Материнская плата»},
{идентификатор: 1, имя: 'ЦП'},
{идентификатор: 2, имя: «Память»},
];
selectedProductIds: число[] = [];
}
<шаблон>
<форма>
Товары
for="продукт продуктов">
${product.id} - ${product.name}
метка>
Выбранные идентификаторы продуктов: ${selectedProductIds}
форма>
шаблон>
Массив объектов
массив selectedProducts
приложение класса экспорта {
продукты = [
{идентификатор: 0, имя: «Материнская плата»},
{идентификатор: 1, имя: 'ЦП'},
{идентификатор: 2, имя: «Память»},
];
выбранные продукты = [];
}
интерфейс экспорта IProduct {
идентификационный номер;
имя: строка;
}
приложение класса экспорта {
продукты: IProduct[] = [
{идентификатор: 0, имя: «Материнская плата»},
{идентификатор: 1, имя: 'ЦП'},
{идентификатор: 2, имя: «Память»},
];
selectedProducts: IProduct[] = [];
}
<шаблон>
<форма>
Товары
for="продукт продуктов">
${product.id} - ${product.name}
метка> Выбранные продукты:
<ул>
Массив объектов с Matcher
(a, b) => a === b
. Вы можете заменить функцию по вашему выбору, которая имеет правильную логику для сравнения ваших объектов.
приложение класса экспорта {
выбранные продукты = [
{идентификатор: 1, имя: 'ЦП'},
{id: 2, имя: 'Память'}
];
productMatcher = (a, b) => a.
интерфейс экспорта IProduct {
идентификационный номер;
имя: строка;
}
приложение класса экспорта {
selectedProducts: IProduct[] = [
{идентификатор: 1, имя: 'ЦП'},
{id: 2, имя: 'Память'}
];
productMatcher = (a, b) => a.id === b.id;
}
<шаблон>
<форма>
for="product of selectedProducts">${product.id} - ${product.name}
форма>
шаблон>
Товары
<метка>
Системная плата
метка>
<метка>
Процессор
метка>
<метка>
Память
метка>
Выбранные продукты:
<ул>
Массив строк
selectedProducts
с использованием привязки данных флажка. Этот пример уникален, потому что он не использует model.bind
для присвоения значения каждому флажку. Вместо этого используется стандартный входной атрибут value
. Обычно мы не можем использовать стандартный атрибут value
в сочетании с привязкой checked, потому что он принуждает все, что ему назначено, к строке. В этом примере используется массив строк, поэтому все работает нормально.
приложение класса экспорта {
products = ['Материнская плата', 'ЦП', 'Память'];
выбранные продукты = [];
}
приложение класса экспорта {
products: string[] = ['Материнская плата', 'ЦП', 'Память'];
selectedProducts: строка[] = [];
}
<шаблон> <форма>
Товары