Как центрировать горизонтальную линию по вертикали до первой строки многострочного абзаца с помощью CSS?

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

Я пробовал использовать CSS Flexbox для выравнивания элементов, но кажется, что линия центрируется относительно всего абзаца. Как я могу настроить CSS для достижения такого выравнивания?

Вот код HTML и CSS, который у меня есть:

body {
  font-family: Arial, sans-serif;
  margin: 20px;
}

.container {
  display: flex;
  column-gap: 20px;
  align-items: flex-start;
}

.line {
  flex-shrink: 0;
  width: 50px;
  height: 2px;
  background-color: red;
}

p {
  margin: 0;
  margin-bottom: 20px;
}
<div class = "container">
  <div class = "line"></div>
  <div class = "text-container">
    <p class = "text">
      Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    </p>
    <p class = "text">
      Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    </p>
  </div>
</div>
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
0
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте половину высоты одной строки .5lh

body {
  font-family: Arial, sans-serif;
  margin: 20px;
  font-size: 20px;
}

.container {
  display: flex;
  column-gap: 20px;
  align-items: flex-start;
}

.line {
  /* new code */
  margin-top: .5lh;
  translate: 0 -50%;
  /**/
  flex-shrink: 0;
  width: 50px;
  height: 2px;
  background-color: red;
}

p {
  margin: 0;
  margin-bottom: 20px;
}
<div class = "container">
  <div class = "line"></div>
  <div class = "text-container">
    <p class = "text">
      Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    </p>
    <p class = "text">
      Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
    </p>
  </div>
</div>

Вы также можете упростить код, как показано ниже:

body {
  font-family: Arial, sans-serif;
  margin: 20px;
}
.text {
  padding-left: 70px;
}
.text:first-of-type {
  background:
    linear-gradient(red 0 0) no-repeat
    0 calc(.5lh - 1px)/50px 2px;
}
p {
  margin: 0 0 20px;
  font-size: 20px;
}
<p class = "text">
  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
</p>
<p class = "text">
  Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
</p>

По какой-то причине у меня это не работает локально, хотя у меня тот же код. Можете ли вы придумать другое решение?

coder 08.08.2024 03:49

@coder — это правильный путь. Вам лучше выяснить, почему это не работает для вас. Что происходит, когда вы пытаетесь это использовать?

Alohci 08.08.2024 03:57

Я не знаю, почему это не работает. Или у меня не работает от размера шрифта 20px. Все, что меньше 20 пикселей, центрируется по вертикали. Я использую Lato в качестве шрифта и использую Chrome.

coder 08.08.2024 04:00

@coder — Да, общий совет при сообщении о проблемах: указывайте, что происходит, а не то, что не происходит. Где появляется линия, когда шрифт больше?

Alohci 08.08.2024 04:03

Я не установил высоту строки для элемента p. Если я явно задаю высоту строки, то она выглядит так, как будто она центрирована по вертикали.

coder 08.08.2024 04:10

Похоже, установка высоты строки помогла, но у меня все еще есть проблема, описанная выше.

coder 08.08.2024 04:45

не устанавливайте какие-либо свойства line-height/font-size или какие-либо свойства, связанные со шрифтом, для элемента p. Вы должны установить их в контейнер или верхний элемент, иначе трюк не сработает.

Temani Afif 08.08.2024 11:03

Именно по этой причине это не сработало. Однако у меня есть файл style.css, в котором я определил медиа-запросы, чтобы установить размер шрифта для элементов <p>. Мне очень нужен этот файл. Возможно, у вас есть другое решение, учитывающее как размер шрифта, так и высоту строки элементов <p>?

coder 08.08.2024 11:34

@coder проверь обновление

Temani Afif 08.08.2024 11:39

@TemaniAfif Если вы опустите отступ слева, вы увидите, что обводка не полностью центрирована по вертикали.

coder 08.08.2024 12:04

Супер ленивый вариант — использовать просто псевдо-тире (/em-dash/three-em-dash) из того же шрифта. Теоретически такое тире должно определяться с учетом вертикального типографского баланса, обычно располагаться на середине высоты x или около него и естественным образом настраиваться с помощью преобразования на основе ex, если результат в конечном итоге окажется визуально неоптимальным при использовании в качестве « лидер». Все решение может представлять собой один элемент с одним псевдо:

p {
 display: flex;
 gap: 1ch;
 &::before {
  content: '⸻';
  color: mark;
  transform: translatey(-.1ex); /* Maybe? */
 }
}

html {
 color-scheme: light dark;
 font-size: 20px;
 font-family: system-ui;
}
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Переведя его по вертикали на +.5ex, он должен поместиться рядом с базовой линией, -.5ex должен поместиться около высоты x. Скорее всего, это будет сильно зависеть от шрифта, но общее правило, согласно которому такое тире должно «хорошо выглядеть между обычными глифами», может установить предположение о том, что не должно быть слишком резких изменений вертикального положения относительно базовой линии между разными шрифтами.

В некоторых средах это решение может даже иметь некоторые незначительные преимущества по сравнению с фоновыми вариантами:

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

Кроме того, чтобы разместить вторую, третью и т. д. строку, можно добавить white-space: pre и поставить перед псевдоконтентом разрыв строки (\a). А замена планки каким-нибудь флёроновым орнаментом (например, ) должна быть интуитивно понятной.

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

Другие вопросы по теме