Заметки с тегом «html» (страница 3)

Режимы и квази-режимы

На занятиях в методологическом кружке мы как-то обсуждали то, что режимы в интерфейсах могут являться источниками ошибок пользователей и иногда приводят к увеличению количества действий вместо ожидаемого уменьшения. Например, пользователю потребуется некоторое время, чтобы разглядеть индикатор раскладки клавиатуры или он попробует что-то напечатать и будет удалять введенный текст, если была установлена неверная раскладка. С другой стороны, когда пользователь осознанно активирует какой-то функционал и получает физическую обратную связь (например, переключает регистр, удерживая клавишу Shift), то он однозначно понимает, какой режим сейчас включен. Это называется квази-режимом.

Квази-режимы являются весьма эффективными с точки зрения устранения режимов и уменьшению количества ошибочных действий.

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


<div>
    <div id="mode1" style="display: block;">Режим 1</div>
    <div id="mode2" style="display: none;">Режим 2</div>
    <div id="mode3" style="display: none;">Режим 3</div>
    <div id="mode4" style="display: none;">Режим 4</div>
</div>

Замена атрибута style на class у каждого блока особо ситуацию не меняет. Это все равно остается явное определение.

Мне нравится другой метод.


<div class="mode1">
    <div id="mode1">Режим 1</div>
    <div id="mode2">Режим 2</div>
    <div id="mode3">Режим 3</div>
    <div id="mode4">Режим 4</div>
</div>

Устанавливая класс у внешнего div в значения «mode1», «mode2», «mode3» или «mode4» активируются те или иные CSS-правила.


#mode1 {
    display: block;
}
#model2, #model3, #model4 {
    display: none;
}
.mode2 #mode1, .mode3 #mode1, .mode4 #mode1 {
    display: none;
}
.mode2 #mode2, .mode3 #mode3, .mode4 #mode4 {
    display: block;
}

Блок #mode1 будет видим по умолчанию, а остальные при соответствующем классе у внешнего блока.

Этот простой пример не учитывает случай, когда внешнему блоку назначают несколько классов. Чтобы полностью обезопасить себя от таких ситуаций нужно описать все возможные комбинации селекторов. В моей примере таких комбинаций будет 16.

Плюсы такого способа:

  1. Вся логика переключения представлений сконцентрирована в CSS-файле
  2. Удобно вести отладку. Нужно заменить только одной значение, чтобы полностью поменялся внешний вид.
  3. Уменьшается количество однотипного JavaScript-кода
Комментарии к заметке: 2

Навигация с помощью клавиатуры

Часто Web-приложения используют Javascript для того, чтобы подражать обычным программам и использовать элементы управления, такие как деревья, закладки и т.п. Важную часть взаимодействия пользователя и интерфейса при таком подражании составляет навигация по элементам управления с помощью клавиатуры.

Любой элемент в документе может получить фокус, если у него указан атрибут tabindex . Он не является частью спецификации HTML 4.01, но фактически реализован во всех современных браузерах.

Значение атрибута tabindex

Атрибут может принимать любые числовые значения. Явное указание атрибута позволяет получить фокус с помощью указателя мыши или программно через метод focus(). Отсутствие атрибута устанавливает обычную реакцию элемента. В этом случае фокус могут получить только элементы формы, ссылки и некоторые другие.

Поведение при навигации с помощью клавиши «Tab»

  • Отрицательное

    Элемент игнорируется

  • Нулевое

    Последовательность задается положением элемента в документе

  • Положительное

    Значение явно задает порядок элементов при перемещении фокуса

Отслеживание сфокусированного элемента

События focus и blur могут быть использованы для любого элемента. Но так как нет стандартного интерфейса, для определения получил элемент фокус или нет, то нужно будет самостоятельно обрабатывать и запоминать это состояние.

Не следует предполагать, что фокус может меняться только с помощью клавиатуры или мышки, потому что вспомогательные технологии, такие как «чтение с экрана» могут самостоятельно устанавливать фокус на элементы.

Динамическое изменение атрибута tabIndex

Изменение атрибута может использоваться в случае, когда элемент управления может отключаться, и его следует пропускать при перемещении между элементам.

Отслеживание фокуса у элемента document

Что касается событий focus и blur , то их может генерировать не только конкретный элемент, но и весь документ в целом. В jQuery 1.4 разработчики добавили синтетические события focusin и focusout для корректной делегации родительским элементам DOM-событий focus и blur соответственно. Прикрепив обработчик этих событий к документу, можно отслеживать активность окна браузера.

Оставте свой комментарий

Навигация внутри страницы по якорям

Перечитывал спецификацию HTML 4.01 и открыл для себя удивительное свойство ссылок. Чтобы обеспечить навигацию по якорям внутри страниц не обязательно объявлять эти их через <a name="#section"></a> . Достаточно назначить этот идентификатор любому подходящему элементу.


<h1>Table of Contents</h1>
<p><a href="#section1">Introduction</a><br />
<a href="#section2">Some background</a><br />
<a href="#section2.1">On a more personal note</a><br />
…the rest of the table of contents…
…the document body…
<h2><a name="section1">Introduction</a></h2>
…section 1…
<h2><a name="section2">Some background</a></h2>
…section 2…
<h3><a name="section2.1">On a more personal note</a></h3>
…section 2.1…

Аналогичного эффекта можно достичь с помощью более простого кода:


<h1>Table of Contents</h1>
<p><a href="#section1">Introduction</a><br />
<a href="#section2">Some background</a><br />
<a href="#section2.1">On a more personal note</a><br />
…the rest of the table of contents…
…the document body…
<h2 id="section1">Introduction</h2>
…section 1…
<h2 id="section2">Some background</h2>
…section 2…
<h3 id="section2.1">On a more personal note</h3>
…section 2.1…

Оставте свой комментарий