У меня есть макет, в котором мне нужно расположить горизонтальную линию рядом с многострочным абзацем. Строка должна располагаться вертикально по центру первой строки абзаца, а не всего абзаца.
Я пробовал использовать 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>
Используйте половину высоты одной строки .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 — это правильный путь. Вам лучше выяснить, почему это не работает для вас. Что происходит, когда вы пытаетесь это использовать?
Я не знаю, почему это не работает. Или у меня не работает от размера шрифта 20px. Все, что меньше 20 пикселей, центрируется по вертикали. Я использую Lato в качестве шрифта и использую Chrome.
@coder — Да, общий совет при сообщении о проблемах: указывайте, что происходит, а не то, что не происходит. Где появляется линия, когда шрифт больше?
Я не установил высоту строки для элемента p. Если я явно задаю высоту строки, то она выглядит так, как будто она центрирована по вертикали.
Похоже, установка высоты строки помогла, но у меня все еще есть проблема, описанная выше.
не устанавливайте какие-либо свойства line-height/font-size или какие-либо свойства, связанные со шрифтом, для элемента p. Вы должны установить их в контейнер или верхний элемент, иначе трюк не сработает.
Именно по этой причине это не сработало. Однако у меня есть файл style.css, в котором я определил медиа-запросы, чтобы установить размер шрифта для элементов <p>. Мне очень нужен этот файл. Возможно, у вас есть другое решение, учитывающее как размер шрифта, так и высоту строки элементов <p>?
@coder проверь обновление
@TemaniAfif Если вы опустите отступ слева, вы увидите, что обводка не полностью центрирована по вертикали.
Супер ленивый вариант — использовать просто псевдо-тире (/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
). А замена планки каким-нибудь флёроновым орнаментом (например, ❧
) должна быть интуитивно понятной.
Возможный недостаток заключается в том, что для шрифта, используемого для поддержки данного тире, очень важно; если тире будет выбрано из какого-то запасного шрифта, скорее всего, метрики будут неправильными.
По какой-то причине у меня это не работает локально, хотя у меня тот же код. Можете ли вы придумать другое решение?