Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Собираем лендинг ресторана

Лендинг — одностраничный сайт, который рассказывает о чём-то одном и ведёт к одному действию. Для ресторана это действие — забронировать стол. Соберём такую страницу из элементов курса, не написав ни строчки своего CSS: только классы Bulma и короткий скрипт для бургера.

План страницы

ЧастьЭлементы Bulma
Шапкаnavbar с бургером
Баннерhero is-primary is-medium
Преимуществаcolumns и has-text-centered
Менюgrid с карточками card
Бронированиеbox, field, control, columns
Подвалfooter

Каждая часть, кроме шапки, — отдельная section с container внутри, как в уроке о каркасе страницы.

Страница целиком

Создайте файл index.html — или замените разметку в проекте Vite:

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@1.0.4/css/bulma.min.css">
 
<nav class="navbar" aria-label="Главное меню">
  <div class="container">
    <div class="navbar-brand">
      <a class="navbar-item has-text-weight-bold" href="#">Trattoria Oliva</a>
      <a role="button" class="navbar-burger" aria-label="Открыть меню" aria-expanded="false" data-target="nav">
        <span aria-hidden="true"></span>
        <span aria-hidden="true"></span>
        <span aria-hidden="true"></span>
        <span aria-hidden="true"></span>
      </a>
    </div>
    <div class="navbar-menu" id="nav">
      <div class="navbar-end">
        <a class="navbar-item" href="#menu">Меню</a>
        <a class="navbar-item" href="#booking">Бронирование</a>
      </div>
    </div>
  </div>
</nav>
 
<section class="hero is-primary is-medium">
  <div class="hero-body">
    <div class="container has-text-centered">
      <h1 class="title is-1">Trattoria Oliva</h1>
      <p class="subtitle">Паста ручной работы и хлеб из собственной печи</p>
      <a class="button is-dark is-medium" href="#booking">Забронировать стол</a>
    </div>
  </div>
</section>
 
<section class="section">
  <div class="container">
    <div class="columns has-text-centered">
      <div class="column">
        <p class="title is-4">С 2012 года</p>
        <p>Готовим по рецептам из Тосканы.</p>
      </div>
      <div class="column">
        <p class="title is-4">Свежая паста</p>
        <p>Раскатываем тесто каждое утро.</p>
      </div>
      <div class="column">
        <p class="title is-4">Терраса</p>
        <p>Летом — 12 столов на улице.</p>
      </div>
    </div>
  </div>
</section>
 
<section class="section has-background-light" id="menu">
  <div class="container">
    <h2 class="title">Меню</h2>
    <div class="grid is-col-min-10">
      <div class="cell card">
        <div class="card-image">
          <figure class="image is-16by9"><img src="/media/photo-800x500.jpg" alt="Карбонара"></figure>
        </div>
        <div class="card-content">
          <p class="title is-5">Карбонара <span class="tag is-warning">Хит</span></p>
          <p>€12</p>
        </div>
      </div>
      <div class="cell card">
        <div class="card-image">
          <figure class="image is-16by9"><img src="/media/photo-800x500.jpg" alt="Ризотто"></figure>
        </div>
        <div class="card-content">
          <p class="title is-5">Ризотто</p>
          <p>€14</p>
        </div>
      </div>
      <div class="cell card">
        <div class="card-image">
          <figure class="image is-16by9"><img src="/media/photo-800x500.jpg" alt="Тирамису"></figure>
        </div>
        <div class="card-content">
          <p class="title is-5">Тирамису</p>
          <p>€7</p>
        </div>
      </div>
    </div>
  </div>
</section>
 
<section class="section" id="booking">
  <div class="container is-max-tablet">
    <div class="box">
      <h2 class="title is-4">Бронирование</h2>
      <div class="columns">
        <div class="column field">
          <label class="label" for="b-name">Имя</label>
          <div class="control"><input class="input" id="b-name" placeholder="Анна"></div>
        </div>
        <div class="column field">
          <label class="label" for="b-date">Дата</label>
          <div class="control"><input class="input" id="b-date" type="date"></div>
        </div>
      </div>
      <button class="button is-primary is-fullwidth">Забронировать</button>
    </div>
  </div>
</section>
 
<footer class="footer">
  <p class="has-text-centered">Trattoria Oliva · Ул. Садовая, 12 · ежедневно 12:00–23:00</p>
</footer>
 
<script>
  document.querySelectorAll('.navbar-burger').forEach((burger) => {
    burger.addEventListener('click', () => {
      const isOpen = burger.classList.toggle('is-active');
      document.getElementById(burger.dataset.target).classList.toggle('is-active', isOpen);
      burger.setAttribute('aria-expanded', String(isOpen));
    });
  });
</script>

В превью — целая страница: белая шапка с бургером, бирюзовый баннер с кнопкой, три преимущества (в узком превью — друг под другом, на широком экране — в ряд), серая секция с карточками блюд, форма в белом блоке и подвал. Ссылки шапки прокручивают страницу к секциям с id="menu" и id="booking".

Что здесь важно

  • Шапка обёрнута в container, поэтому логотип и ссылки на широком экране выровнены по краям остального содержимого.
  • Ячейки сетки — это сами карточки (cell card): лишняя обёртка не нужна.
  • Форма ограничена container is-max-tablet, чтобы поля не растягивались на весь монитор.
  • Кнопка в баннере is-dark: на бирюзовом фоне она заметнее, чем вторая бирюзовая.

Дальше страницу можно перекрасить уроками о CSS-переменных или Sass: классы останутся прежними.

Частая ошибка

Добавлять свои стили ради мелочей, для которых есть хелпер: style="text-align: center", style="margin-top: 24px". Такие правила разбросаны по разметке, и их трудно найти. Сначала ищите хелпер — has-text-centered, mt-5, — а свой CSS оставьте для того, чего в Bulma нет.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.