Skip to content

Instantly share code, notes, and snippets.

@pepelsbey
Last active October 30, 2019 12:00
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save pepelsbey/9f9236e290eab507264e29e8e73be0f2 to your computer and use it in GitHub Desktop.
Save pepelsbey/9f9236e290eab507264e29e8e73be0f2 to your computer and use it in GitHub Desktop.
Вопросы к разделу «Доступность и формы»

Вопросы к разделу «Доступность и формы»

1. <button> или <input type="submit">?

В формах для кнопок лучше использовать элемент button или input[type="submit"] и аналогичные? В чем разница между и . Почему в Барбершопе для создания просто кнопок использовали второй вариант?

Лучше использовать button, так как button парный тег. У парных тегов есть псевдоэлементы, которые иногда пригождаются, например для того, чтобы повесить иконку. Вообще, тег button вышел позже input[type="submit"] и расширил возможности input. Более того, если ничего не указывать в атрибуте type тега button, то тип по умолчанию является submit, но вы всё равно указывайте тип. Сейчас нет никакого смысла пользоваться input[type="submit"].

Почему в Барбершопе для создания просто кнопок использовали второй вариант?

В этому случае у нас стоял выбор между <a> и <button>. Если элемент никуда не ссылается, то это button.

2. Как поменять фон страницы по радиокнопке?

В слайдере Глейси смена мороженок и фона всей страницы осуществляется с помощью радиокнопок. Как с помощью селектора, учитывающего состояние checked, не просто поменять слайд, но и фон всей страницы? Разве цвет фона не будет параметром body?

Как поменять фон страницы по радиокнопке?

Такие сложные стилистические изменения делают с помощью JavaScript. CSS применяется только для стилизации каких-то простых смен состояний, например :hover, :disabled. Как только появляется чуть более сложная логика, то от изменения стилями отказываются. Ведь вам придётся специально подстраивать разметку под стили.

Конкретнее. Все селекторы в CSS работают в глубь DOM-дерева, а не на наружу. Получается, что при изменение :checked состояния нам нужно, чтобы input находился рядом с body. И тогда у вас может возникнуть мысль создать новый div у которого будет меняться фон, который будет находится рядом с input, а сами input переместить выше. Хотя на макете всё наоборот. Появляется дополнительная разметка. Усложняется понимание CSS-стилей. Также у вас сразу же возникнут проблемы, когда вы захотите добавить новый слайд, ведь придётся писать дополнительные CSS-стили.

3. Как использовать <label>?

С какими типами форм можно использовать label - input, select, еще какие-то? Как все же правильно делать, обворачивать в , или же прописывать for и id для каждого из них? В каких случаях label и поле ввода нужно связывать по id, а когда можно лишний раз не усложнять код и расположить input внутри label?

Спецификация прямо говорит с каким элементами может быть ассоциирован <label>. Посмотреть можно тут. image Нас интересует самый правый ряд.

<label> можно использовать и так и так. Всё зависит от того как удобнее вам в конкретном месте. Использовать связку for и id удобно, когда вам не нужно, чтобы элементы находились вместе, например при использовании в таблицах. Часто же, элементы форм оборачивают в <label> и это нормально.

Только есть одно предостережение, когда вы оборачиваете ссылки с помощью <label> делайте это правильно.

<!-- плохой пример -->
<label>
  <input type="checkbox" name="tac">
  <a href="tandc.html">Я согласен с пользовательским соглашением</a>
</label>

Этот пример плох тем, что при клике на текст вы переходите по ссылке и никак не меняете состояние чекбокса.

<!-- хороший пример -->
<label>
  <input type="checkbox" name="tac">
  Я согласен с <a href="tandc.html">пользовательским соглашением</a>
</label>
<!-- хороший пример -->
<label>
  <input type="checkbox" name="tac">
  Я согласен с пользовательским соглашением
</label>
(прочитать <a href="tandc.html">пользовательское соглашение</a>)
@lazyrider
Copy link

Вадим, привет!
У меня вопрос по теме доступности появился.

Добавил карточкам товаров tabindex="0".
Но, после того, как фокус переходит с самой карточки в появившийся блок, одновременно с этим - блок закрывается.

.templates-item:hover .template-info,
.templates-item:focus .template-info {
	visibility: visible;

	opacity: 1;
}

При следующем нажатии на Tab , в фокусе появляется следующая карточка.

Я понимаю из за чего это происходит.
Но, как сделать, чтобы блоки не закрывались, когда фокус переходит внутрь карточки, в сам появившийся блок?

Не могу найти решение, дай хотя бы какую-нибудь наводку, плз)

https://user-images.githubusercontent.com/54942030/67787424-78b23b00-fa68-11e9-8f30-e63804a0653d.png

@egorpariah
Copy link

egorpariah commented Oct 29, 2019

@lazyrider Я знаю только одно решение, не кроссбраузерное. Это использовать псевдокласс :focus-within
Здесь подробнее — https://developer.mozilla.org/ru/docs/Web/CSS/:focus-within

@lazyrider
Copy link

@egolikov, вот прям то что нужно! Спасибо большое, буду использовать!

@egorpariah
Copy link

@lazyrider, пожалуйста! Надеюсь, со временем хотя бы Edge начнёт его поддерживать)

@pepelsbey
Copy link
Author

@lazyrider, но зачем вы добавили карточкам товаров tabindex=0?

@lazyrider
Copy link

lazyrider commented Oct 30, 2019

@pepelsbey,
При hover на карточку товара, меняется оформление и открывается блок с информацией.

Добавил карточкам tabindex="0", чтобы они попадали в фокус.
И после этого добавил карточкам правило для focus, по аналогии с hover, чтобы появлялся скрытый блок, когда карточка в фокусе.

Чтобы, при последующем нажатии на Tab, фокус уходил не на следующую карточку, а на ссылки в появившемся блоке внутри этой карточки, поменял focus на focus-within.
Вот так у меня сейчас сделано.

https://lazyrider.github.io/Nerds_asd/catalog.html

Без tabindex="0" на карточках, карточки не попадают в фокус, а следовательно, скрытый блок никак не отобразить.

Объясните, пожалуйста!

@pepelsbey
Copy link
Author

@lazyrider, карточка — это не интерактивный элемент, попав на неё, вы ничего не можете сделать. Лучше регистрировать фокус на интерактивном элементе внутри карточки и отображать содержимое. Что-то вроде:

.templates-item:not(:focus-within) .template-info {
  /* стили для пряток */
}

@lazyrider
Copy link

lazyrider commented Oct 30, 2019

@pepelsbey , Спасибо, примерно понял идею, но видимо не до конца. Что-то тяжело в этот селектор въехать.

Если правильно понимаю. обозначает он это:
Не показывать блок .template-info , когда ни сам родитель (а tabindex="0" я убрал) ни внутри родителя, ни один из интерактивных элементов не в фокусе.

Я вроде бы понял как работает этот принцип с hover:

по умолчанию блок отображается:

.template-info {
visibility: visible;
}

если на родителе нет hover, то блок скрыт.

.templates-item:not(:hover) .template-info {
	visibility: hidden;
} 

Ломаю голову уже больше часа, но не могу понять как фокус может попасть на интерактивный элемент внутри .template-info, если изначально он скрыт он скрыт, когда мы используем такой селектор

.templates-item:not(:focus-within) .template-info { visibility: hidden; }

@pepelsbey
Copy link
Author

@lazyrider, а вы не используйте для пряток visibility, у вас же там вроде для .template-info стоит доступный клип.

@lazyrider
Copy link

lazyrider commented Oct 30, 2019

@pepelsbey, ну тоесть вместо visibility, просто прятать и показывать с помощью opacity это нормальное решение будет?

(Я просто не совсем понял терминологию про "доступный клип")

Спасибо большое за помощь!

@pepelsbey
Copy link
Author

Я про стили из visually-hidden, который мы используем на интенсивах.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment