nav-down у CSS — застарілий перехід фокуса стрілкою вниз


Властивість nav-down вказує, де здійснювати навігацію за допомогою клавіші зі стрілкою "Вниз".

Щоб зрозуміти використання цієї властивості, подумайте, що на вашій веб-сторінці є деякі елементи HTML. Тепер, якщо один з цих елементів сфокусований (або обраний), і ви хочете передати фокус іншого елементу при натисканні клавіші зі стрілкою «вниз» на клавіатурі, ви можете вказати ідентифікатор останнього для властивості nav-down. Точно так же, як ця властивість, є три інших властивості nav-up, nav-right і nav-left для навігації по фокусу при натисканні клавіш «нагору», «справа» і «вліво» відповідно.

автор: Svitlana

Загальний опис

автор: NagarD

Нотатка

Увага! Ця властивість підтримується лише браузером Opera 11.5-12, в усіх інших браузерах (навіть пізніших версіях Opera) вона не працює!

автор: Svitlana

Синтаксис

nav-down: auto|id|target-name|initial|inherit;

Властивість nav-down може отримувати 5 значень:

auto

Значення без задання. Порядок табуляції елементу присвоюється браузером

автор: Svitlana

id

Визначає ідентифікатор елемента для навігації

автор: Svitlana

target-name

Задає цільової фрейм для навігації

автор: Svitlana

initial

Встановлює властивість у значення без задання

автор: Svitlana

inherit

Вказує на спадковість властивостей від свого батьківського елемента

автор: Svitlana

Значення без задання: auto
Наслідує: Ні
Анімується: Ні
JavaScript синтаксис: object.style.navDown="#div2"

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft Internet Explorer
nav-down Не підтримується Не підтримується Не підтримується 11.5 – 12.0 Не підтримується

Мобільних переглядачів ще не додано.

Приклади

+ запропонувати свій приклад у пісочниці

nav-down вказує, який елемент має дістати фокус за стрілкою вниз: кнопки розставлено ромбом, і навігація мала йти по колу 1 → 2 → 3 → 4. Родину nav-* реалізовували лише стара Opera і ТВ-браузери; у сучасних переглядачах фокус ходить лише клавішею Tab, тож демо ілюструє синтаксис.

HTML

<div class="pad">
    <button id="b1">Кнопка 1</button>
    <button id="b2">Кнопка 2</button>
    <button id="b3">Кнопка 3</button>
    <button id="b4">Кнопка 4</button>
</div>

CSS

.pad {
    position: relative;
    height: 200px;
}

button {
    position: absolute;
}

button#b1 { top: 10%; left: 25%; nav-index: 1; nav-right: #b2; nav-left: #b4; nav-down: #b2; nav-up: #b4; }
button#b2 { top: 40%; left: 50%; nav-index: 2; nav-right: #b3; nav-left: #b1; nav-down: #b3; nav-up: #b1; }
button#b3 { top: 70%; left: 25%; nav-index: 3; nav-right: #b4; nav-left: #b2; nav-down: #b4; nav-up: #b2; }
button#b4 { top: 40%; left: 0;   nav-index: 4; nav-right: #b1; nav-left: #b3; nav-down: #b1; nav-up: #b3; }
автор: Svitlana

Вертикальне меню двічі: угорі — з правилами nav-down і nav-up, які переглядач мовчки викинув, унизу — те саме на рухомому tabindex. Клацніть перший пункт нижнього меню й тисніть ↓ ↑ Home End. Скрипт друкує кожен крок і показує, що саме викинув розбирач.

HTML

<h4 class="cap">1. Меню з правилами <code>nav-down</code></h4>
<ul class="menu dead">
    <li><a href="#" id="m1">Головна</a></li>
    <li><a href="#" id="m2">Довідник</a></li>
    <li><a href="#" id="m3">Статті</a></li>
    <li><a href="#" id="m4">Контакти</a></li>
</ul>
<p class="note">Клацніть «Головна» і натисніть ↓ — фокус лишиться на місці,
    зате прогорнеться сторінка.</p>

<h4 class="cap">2. Те саме, що справді працює</h4>
<ul class="menu live" id="live">
    <li><a href="#" tabindex="0">Головна</a></li>
    <li><a href="#" tabindex="-1">Довідник</a></li>
    <li><a href="#" tabindex="-1">Статті</a></li>
    <li><a href="#" tabindex="-1">Контакти</a></li>
</ul>
<p class="note" id="stan">Клацніть «Головна» і тисніть ↓ ↑ Home End.</p>

<pre id="log">Тут з'являться кроки.</pre>

CSS

.menu {
    max-width: 260px;
    margin: 0 0 6px;
    padding: 6px;
    border: 1px solid #b9c6d8;
    border-radius: 6px;
    list-style: none;
}

.menu a {
    display: block;
    padding: 6px 10px;
    border-radius: 4px;
    color: #1d3a6b;
    text-decoration: none;
}

.menu a:focus {
    outline: 3px solid #3a9a4f;
    outline-offset: -1px;
    background: #fff;
}

/* експонат: жодного з цих оголошень переглядач не прийме */
.dead #m1 { nav-down: #m2; nav-up: #m4; }
.dead #m2 { nav-down: #m3; nav-up: #m1; }
.dead #m3 { nav-down: #m4; nav-up: #m2; }
.dead #m4 { nav-down: #m1; nav-up: #m3; }

.dead {
    border-color: #d64545;
    background: #fdeeee;
}

.live {
    border-color: #3a9a4f;
    background: #edf9ef;
}

pre {
    max-width: 560px;
    margin-top: 12px;
    padding: 10px 14px;
    border: 1px solid #b9c6d8;
    border-radius: 6px;
    background: #f6f9ff;
    font-size: .85rem;
    white-space: pre-wrap;
}

.cap {
    margin: 22px 0 8px;
    font-size: 1rem;
    color: #5a6472;
}

.note {
    max-width: 560px;
    color: #5a6472;
    font-size: .9em;
}

code {
    background: #eef4ff;
    border-radius: 3px;
    padding: 0 4px;
}

JS

const log = document.getElementById('log');
const pysaty = (t) => { log.textContent += '\n' + t; console.log(t); };

log.textContent = 'Що переглядач думає про правила з першого меню:';
for (const zapys of ['nav-down: #m2', 'nav-up: #m4', 'nav-left: #m1', 'nav-right: #m3']) {
    const [vlas, znach] = zapys.split(': ');
    pysaty('  ' + zapys + ' -> ' + (CSS.supports(vlas, znach) ? 'прийнято' : 'ВИКИНУТО')); // → ВИКИНУТО
}

// перевіряємо ще й через таблицю стилів: чи лишилося оголошення в правилі
const vsiPravyla = [...document.styleSheets].flatMap((s) => [...s.cssRules]);
const pravylo = vsiPravyla.find((r) => r.selectorText === '.dead #m1');
pysaty('текст правила «.dead #m1» після розбору: ' + JSON.stringify(pravylo.style.cssText)); // → ""

// робоча заміна: рухомий tabindex
const menu = document.getElementById('live');
const punkty = [...menu.querySelectorAll('a')];
const stan = document.getElementById('stan');

menu.addEventListener('keydown', (e) => {
    const zaraz = punkty.indexOf(document.activeElement);
    if (zaraz === -1) {
        return;
    }

    let nastupnyj = null;
    if (e.key === 'ArrowDown') { nastupnyj = (zaraz + 1) % punkty.length; }
    if (e.key === 'ArrowUp') { nastupnyj = (zaraz - 1 + punkty.length) % punkty.length; }
    if (e.key === 'Home') { nastupnyj = 0; }
    if (e.key === 'End') { nastupnyj = punkty.length - 1; }
    if (nastupnyj === null) {
        return;
    }

    e.preventDefault(); // ⚠️ без цього стрілка ще й гортатиме сторінку
    punkty.forEach((a, i) => { a.tabIndex = i === nastupnyj ? 0 : -1; });
    punkty[nastupnyj].focus();

    stan.textContent = 'Фокус на пункті «' + punkty[nastupnyj].textContent + '»';
    pysaty(e.key + ' -> ' + punkty[nastupnyj].textContent);
});
автор: NagarD

Приклад використання властивості

HTML

<p>Увага! Ця властивість підтримується лише браузером Opera 11.5-12, в усіх інших браузерах (навіть пізніших версіях Opera) вона не працює!</p>

<hr>

<div class="wrapper">
  <button id="b1">Button 1</button>
  <button id="b2">Button 2</button>
  <button id="b3">Button 3</button>
  <button id="b4">Button 4</button>
</div>

CSS

body {
  line-height: 1.5;
  font-size: 18px;
  color: #444;
  font-family: sans-serif;
}

button {
    position: absolute;
}

button#b1 {
    top: 25%; left: 45%;
    nav-index: 1;
    nav-right: #b2; nav-left: #b4;
    nav-down: #b2; nav-up: #b4;
}

button#b2 {
    top: 45%; left: 75%;
    nav-index: 2;
    nav-right: #b3; nav-left: #b1;
    nav-down: #b3; nav-up: #b1;
}

button#b3 {
    top: 75%; left: 45%;
    nav-index: 3;
    nav-right: #b4; nav-left: #b2;
    nav-down: #b4; nav-up: #b2;
}

button#b4 {
    top: 45%; left: 15%;
    nav-index: 4;
    nav-right: #b1; nav-left: #b3;
    nav-down: #b1; nav-up: #b3;
}
автор: Svitlana

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле веде сходинками (розділ → тип → сторінка), а хибний ключ підкреслить хвилею.
[[!sandbox/S0oh1hBm]] Живий приклад окремим рядком — саме вікно результату. Той самий ключ зі знаком !: наберіть [[! і дійдіть сходинками до потрібної сторінки, список покаже її приклади.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Правка
Зворотний зв'язок
Вхід