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

Открыть результат в отдельной вкладке

Какие файлы понадобятся

Возьми финал истории с промежуточной сценой. В ней nav class="choices" содержит абзацы со ссылками в начале и у терминала. Если делаешь свою историю, добавь такой контейнер к группе вариантов. Содержимое файлов и адреса ссылок не меняем.

Почему блоки сейчас идут сверху вниз

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

Flexbox меняет расположение непосредственных детей контейнера. У нас контейнер — .choices, дети — абзацы со ссылками. Добавь в конец общего style.css:

/* Контейнер управляет расположением вариантов выбора. */
.choices {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: stretch;
  justify-content: flex-start;
  gap: 12px;
}
.choices p {
  flex: 1 1 220px;
  min-width: 0;
  margin: 0;
}
.choices a {
  display: block;
  padding: 12px;
  min-height: 48px;
  border: 1px solid #b9acce;
  background: #f2edff;
  overflow-wrap: anywhere;
}

Разберись в осях и переносе

display: flex включает расположение по одной главной оси. flex-direction: row направляет её по строке. В данном интерфейсе это слева направо. justify-content: flex-start собирает элементы у начала главной оси, а align-items: stretch растягивает их по поперечной — здесь вертикальной. Если поменять направление на column, главной станет вертикальная ось.

gap: 12px задаёт промежутки между элементами. flex-wrap: wrap разрешает перенести элемент, когда он не помещается. Свойство flex: 1 1 220px у абзаца означает: разрешено расти, разрешено сжиматься, исходный размер 220px. Это настройка элемента, а не контейнера. min-width: 0 позволяет ему ужиматься; перенос длинного слова разрешён у ссылки через overflow-wrap.

У ссылки display: block расширяет кликабельную область. padding создаёт место вокруг текста, min-height сохраняет удобную высоту короткого варианта. Мы не фиксируем высоту: длинный вариант увеличит блок и останется читаемым.

Проверка step-01: открой начало и терминал, сузь окно. Варианты должны переноситься без горизонтальной прокрутки. Ссылки всё ещё ведут по прежним адресам.

Расположи варианты в колонку на узком экране

Для совсем узкого окна расположим варианты строго в колонку и уменьшим поля. @media применяет правила только при выполнении условия ширины. Добавь:

@media (max-width: 420px) {
  body {
    padding: 12px;
  }
  .story {
    margin: 12px auto;
    padding: 16px;
  }
  .choices {
    flex-direction: column;
  }
  .choices p {
    flex: none;
  }
}

Здесь 420px — граница оформления этого примера, а не обязательная ширина всех телефонов. flex: none отменяет размер 220px: после перехода в колонку исходный flex-размер относится уже к высоте. Проверь: карточки не стали огромными вертикальными плитками.

Проверь фокус и все страницы

Клавишей Tab выбери первую ссылку, Enter открой её, затем вернись. Рамка :focus-visible из прошлого урока должна оставаться видимой. Проверь начало, промежуточную сцену и каждое окончание на ширинах 320px и 1280px. На узком окне допускается вертикальная прокрутка: нельзя скрывать часть истории через overflow: hidden у body.

Самостоятельно: настрой варианты выбора

На копии истории добавь один очень длинный вариант действия. Затем сделай так, чтобы до 520px варианты шли строго в колонку, а выше возвращались в строку с переносом. Прежде чем обновить страницу, предположи, как расположатся варианты. Проверь все переходы клавиатурой и сравни поведение на 500px и 700px. Убедись, что длинную подпись можно прочитать целиком и ссылка по-прежнему открывается.

Подсказка 1

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

Подсказка 2

Когда меняется главная ось, проверь, к какому размеру относится flex-basis. Для колонки в нашем примере нужен flex: none.

Пример решения

Образец другой границы ширины лежит в solutions/narrow-choices. Свой длинный текст добавь самостоятельно.

Проверь свою первую игру

Найди в своей истории ветку, которую ты добавил самостоятельно. Объясни её схему, найди CSS-правило для предупреждения и покажи, почему ссылка открывает нужный файл. Затем попроси другого человека пройти историю без твоих подсказок или пройди все пути по записанной схеме сам. Наблюдай, понятны ли другому человеку варианты выбора и легко ли ему вернуться к началу.

Готово: история имеет начало, осмысленные выборы, разные исходы и возврат; оформление единое, длинный текст доступен, при выборе ссылки с клавиатуры видна рамка фокуса. Тебе не нужно помнить каждое CSS-свойство: важно найти правило, предсказать изменение и проверить его.

Исходники урока

Выбирай стартовую версию, промежуточный этап или финал в просмотрщике. Во вкладке «Инструкция» — как запустить проект и чем отличаются версии. Решения самостоятельных заданий открывай после своей попытки.

Скачать ZIP

Подробнее о свойствах: Flexbox в MDN. Читать справочник целиком перед следующим шагом не нужно.