x
 
Сергей
28 декабря 2017
Советы почтой каждую неделю
Пожалуйста, получите наше письмо, чтобы подтвердить свой адрес:
Вы подписаны на «Советы за неделю»:

Руст, пытаюсь сверстать меню с помощью инлайн-блоков, но между элементами появляются мусорные пробелы. Откуда они берутся? Я победил их отрицательными отступами, но кажется, что должен быть способ получше.


Это и есть пробелы. Такие же как между словами.

Чтобы убедиться в этом, возьмём два инлайн-блока, поставим рядом и поиграем размером шрифта:

<!-- index.html -->;
<div class="menu">;
  <a class="menu-item">;</a>
  <a class="menu-item">;</a>
</div>
/* style.css */
.menu {
  font-size: 20px;
}

.menu-item {
  display: inline-block;
  width: 200px;
  height: 50px;
  background: #7da578;
}
Размер кегля:
20 пк
При уменьшении кегля размер пробела тоже уменьшается

Дело в том, что инлайновые элементы с точки зрения браузера — обычные слова. Поэтому если между ними есть пробел или пробельный символ (в нашем случае перенос), то браузер и нарисует между ними пробел.

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

<!-- index.html -->
<div class="menu">
  <a class="menu-item">Новое</a>
  <a class="menu-item">Фото</a>
  <a class="menu-item">Видео</a>
</div>
/* style.css */
.menu {
  font-size: 0;
}

.menu-item {
  font-size: 20px;
  display: inline-block;
  padding: .5em;
  background: #7da578;
}
Новое
Фото
Видео

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

<!-- index.html -->
<div class="menu">
  <a class="menu-item">Новое
  </a><a class="menu-item">Фото
  </a><a class="menu-item">Видео</a>
</div>

Или поставив между ними комментарий:

<!-- index.html -->
<div class="menu">
  <a class="menu-item">Новое</a><!--
  --><a class="menu-item">Фото</a><!--
  --><a class="menu-item">Видео</a>
</div>

Также можно победить пробел вашим способом, с помощью отрицательного отступа:

/* style.css */
.menu-item {
  margin-left: -4px;
}

Или с помощью подгонки расстояния между словами:

/* style.css */
.menu {
  word-spacing: -4px;
}

.menu-item {
  word-spacing: 0;
}

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

Наконец, лучший способ — сверстать с помощью флексбокса:

/* style.css */
.menu {
  display: flex;
  justify-content: flex-start;
}

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

.menu { justify-content: flex-start; }
Новое
Фото
Видео
.menu { justify-content: flex-end; }
Новое
Фото
Видео
.menu { justify-content: center; }
Новое
Фото
Видео
.menu { justify-content: space-between; }
Новое
Фото
Видео
.menu { justify-content: space-around; }
Новое
Фото
Видео

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

.menu { flex-direction: column; }
Новое
Фото
Видео
.menu { flex-direction: column-reverse; }
Новое
Фото
Видео
.menu-item:first-child { order: 10; }
Новое
Фото
Видео
Вёрстка и прототипирование — дисциплина Школы дизайнеров. Набор открыт до 13 августа или пока есть свободные места.
 

Поделиться
Отправить

Комментарии

Иван Колесников
28 декабря 2017

> Также можно победить пробел вашим способом, с помощью отрицательного отступа

А если в em задать отрицательный отступ?


15 января 2018

Так тоже можно, но это не избавит от необходимости знать ширину пробела в конкретном шрифте. А она может отличаться:
https://codepen.io/stfoo/pen/jYpzbO


Цель рубрики — обсуждение вопросов дизайна всех видов, текста в дизайне и взаимоотношений дизайнеров с клиентами.

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

Решение о публикации принимается один раз; мы не имеем возможности комментировать или пересматривать свое решение, хотя оно может быть ошибочно. Уже опубликованные комментарии могут быть удалены через некоторое время, если без них обсуждение не становится менее ценным или интересным.

Вот такой веб 2.0.

Как бороться с багами? Часть шестая: изолировать 4 Как бороться с багами? Часть пятая: повторить Почему вы используете jQuery для хождения по дереву и управления событиями? 2




Недавно всплыло

2 4 2 4