Размеры блочных элементов в css
Содержание:
Правила расчета высоты строк
Высота линейного блока определяется по следующим правилам:
-
Если элемент содержит текст, отображаемый несколькими шрифтами, браузермаксимальнаяРазмер шрифта для определения «нормального» значения «line-height»
-
При вычислении высоты каждого блока встроенного уровня в линейном блоке для заменяемого элемента элемент встроенного блока вычисляется в соответствии с высотой поля полей; Для встроенного блока он рассчитывается в соответствии с его фактическим значением высоты строки.
-
Высота линейного блока — это расстояние между верхом самого верхнего ящика и нижней частью самого нижнего ящика (включая виртуальную стойку) Пример: Как показано на рисунке, элемент замены использует поле поля для участия в вычислении высоты, высота линейного блока — от верхней части первого изображения до нижней части второго изображения, а текстовые сегменты s1 и s2 соответственно выровнены по вертикали. : верх / низ выровнены по вертикали и соответственно прикреплены к верхнему и нижнему краям линейного блока.
Пустые встроенные элементы генерируют пустые встроенные блоки, но атрибуты этих блоков по-прежнему влияют на вычисление высоты строки. Пример: В элементе div есть пустой интервал. Хотя в нем нет содержимого, высота строки настроена так, чтобы влиять на высоту линейного блока.
базисный
В западном тексте базовая линия — это позиция, где большинство букв «сидят», как показано ниже. Среди них строчная буква x является наиболее представительной. Ее нижняя часть расположена на базовой линии, а верхняя часть прикреплена к центральной линии. Ее высота называется x-height
В CSSвертикальное выравнивание: значение середины заключается в выравнивании исходного центра соответствующего поля с базовой линией + 1/2 * x-height(Обратите внимание, что это не средняя линия, а половина средней линии)
Ведущий и межстрочный интервал
CSS считает, что любой шрифт имеет спецификацию шрифта, которая определяет высоту выше и глубину ниже базовой линии. Здесь мы используем H для высоты и D. для глубины. Расстояние от вершины до основания глифа HD = H + D.
При фактическом рендеринге браузер выравнивает глифы в незаменяемом встроенном блоке в соответствии с соответствующей базовой линией, а затем определяет A и D для каждого глифа. Если встроенный блок не содержит глифов, считается, что он содержит распорку (невидимый глиф шириной 0), в которой по умолчанию используется шрифт A и D
Затем для каждого символа определите начальный L, который будет добавлен, где L = «line-height» -HD. Половина межстрочного интервала добавляется выше H, а другая половина добавляется ниже D. Общая высота глифа и его межстрочный интервал над базовой линией составляет H ’= H + L / 2, а общая глубина D’ = D + L / 2. (Поэтому, когда мы добавляем высоту строки к незаменяемым элементам в строке, по умолчанию возникает эффект центрирования текста по вертикали.) Пример выглядит следующим образом: L = ‘line-height’-HD> 0, полуразрыв строки добавляется к частям высоты и глубины соответственно.
Обратите внимание, что L может быть отрицательным
Примеры следующие: В этом случае «line-height» — «font-size» <0, поэтому полупространство строки отрицательное, и соответствующие визуальные эффекты выглядят следующим образом:
Высота встроенного блока включает все глифы и интервал между строками с обеих сторон, который равен ‘line-height’.Дочерний элементАтрибуты коробкиНе повлияет на высоту ряда Пример: На основе вышеприведенного примера, заполнение добавляется в span, но это не влияет на высоту строки родительского div. Конечно, только атрибуты box (margin, padding …) не будут влиять на это. Если вы добавите большую высоту строки к диапазону, это естественным образом изменит высоту строки родительского div.
Хотя границы, а также внутренние и внешние поля встроенного блока не участвуют в вычислении высоты строки, они все равно отображаются вокруг встроенного блока. Это означает, что если высота строки меньше, чем высота содержимого вмещающего блока, фон, внутренние и внешние поля будут перетекать в смежный линейный блок, в результате чего граница следующей линии будет отрисована на границе и тексте предыдущей строки (наложение) Пример выглядит следующим образом: На рисунке ниже высота строки составляет 80 пикселей, а фактическая высота блока содержимого, содержащего поле, составляет 160 пикселей, что означает, что последующие строки покрыты.
Отступ текста
Отступ в первой строке абзаца, имитирующий красную строку, — это один из самых распространенных эффектов для текста. В CSS для указания отступа предназначено свойство text-indent.
В случае применения свойства первая строка любого элемента может быть смещена на заданную величину, даже если эта величина отрицательная. Чаще всего это свойство применяется для создания эффекта красной строки у абзацев:
p { text-indent: 30px; }
Согласно коду нашего примера первая строка любого абзаца будет сдвинута на 30px.
Свойство работает только с блочными элементами, его нельзя применять к строчным элементам или вставляемому контенту, такому как картинки. Но если в первой строке блочного элемента, например абзаца, есть картинка, то она будет сдвинута вместе со всем остальным текстом строки.
Отрицательные значения свойства, позволяют сделать текст с выступающей первой строкой. Но, задавая отрицательные значения, нужно учитывать, что часть выступающей строки может выйти за границы элемента или даже может быть обрезана левым краем окна браузера, если элемент находится вплотную к краю. Для избежания таких неприятностей, можно применить внутренний отступ с левой стороны элемента равный выступу:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Название документа</title> <style> p { text-indent: -40px; padding-left: 40px; } </style> </head> <body> <p>У этого абзаца первая строка будет выступать над остальными на 40px, для просмотра выхода строки за границу элемента и ее усечение вследствии этого, просто удалите строку CSS-кода добавляющую внутренний отступ к абзацу (padding-left: 40px;).</p> </body> </html>
Попробовать »
Примечание: свойство padding-left было приведено только для примера, как можно выйти из неприятной ситуации
На данный момент на нем можно не заострять внимание. Внутренние отступы и свойство подробно разбираются в главе — Блочная модель. С могут применяться любые единицы измерения длины, в том числе и процентные значения
Размер отступа, установленный в процентах, связан с шириной родительского элемента. Например, если установлен отступ равный 50% и абзац занимает всю ширину окна браузера, то первая строка будет начинаться посередине экрана
С могут применяться любые единицы измерения длины, в том числе и процентные значения. Размер отступа, установленный в процентах, связан с шириной родительского элемента. Например, если установлен отступ равный 50% и абзац занимает всю ширину окна браузера, то первая строка будет начинаться посередине экрана.
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Название документа</title> <style> .test1 { text-indent: 25px; } .test2 { text-indent: 50%; } </style> </head> <body> <p class="test1">Абзац с отступом в 25px. Абзац с отступом в 25px. Абзац с отступом в 25px. Абзац с отступом в 25px. Абзац с отступом в 25px. Абзац с отступом в 25px.</p> <p class="test2">Абзац с отступом в 50%. Абзац с отступом в 50%. Абзац с отступом в 50%. Абзац с отступом в 50%. Абзац с отступом в 50%. Абзац с отступом в 50%.</p> </body> </html>
Попробовать »
Примечание: стоит обратить внимание, что свойство наследуется, что может приводить к непредвиденным результатам:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Название документа</title> <style> .test1 { text-indent: 15%; } </style> </head> <body> <div class="test1"> Первая строка текста элемента div будет иметь отступ равный 15% ширины его родительского элемента или ширины окна браузера. <p>Первая строка текста элемента p будет иметь отступ, который был унаследован от его родительского элемента.</p> </div> </body> </html>
Попробовать »
Межстрочный интервал line-height | CSS — Примеры
Высота строки CSS
line-height: normal | <number> | <length> | <проценты> | inherit | initial | unset
normal | Расстояние между строчками вычисляется браузером самостоятельно |
---|---|
<number> | Число от 0.line-height: 1.5; = font-size * 1.5 = 20px * 1.5 = line-height: 30px; Текст легче читать, при значении от 1.5 до 2 . |
<length> | Любые единицы измерения: px, em, rem, sm. |
<проценты> | % от em |
initial | То же, что normal |
inherit | Наследуется значение родителей |
unset | Наследуется значение родителей |
Когда в товарищах согласья нет,На лад их дело не пойдет,И выйдет из него не дело, только мука.Однажды Лебедь, Рак да ЩукаВезти с поклажей воз взялисьИ вместе трое все в него впряглись;Из кожи лезут вон, а возу все нет ходу!Поклажа бы для них казалась и легка:Да Лебедь рвется в облака,Рак пятится назад, а Щука тянет в воду.Кто виноват из них, кто прав — судить не нам;Да только воз и ныне там.
<style> #nol { font-size: 11px; line-height: 13px; padding: 10px; border: 5px solid #456; } </style> <div></div> height = количество_строк * line-height height = 12 * 13px = 156px
Чем отличается от или
— это отступ от до границы элемента.
(по умолчанию) — это
- если присутствует текст, то сумма всех строк
- если есть дочерние элементы, то сумма их , , и
Когда в товарищах согласья нет,На лад их дело не пойдет,И выйдет из него не дело, только мука.Однажды Лебедь, Рак да ЩукаВезти с поклажей воз взялисьИ вместе трое все в него впряглись;Из кожи лезут вон, а возу все нет ходу!Поклажа бы для них казалась и легка:Да Лебедь рвется в облака,Рак пятится назад, а Щука тянет в воду.Кто виноват из них, кто прав — судить не нам;Да только воз и ныне там.
<style> #nol1 { font-size: 11px; height: 156px; line-height: 13px; padding: 10px; border: 5px solid #456; } </style> <div></div>
Расстояние между строк HTML
Междустрочный интервал можно узнать, если из вычесть . Причём значение межстрочного расстояния делится на два. Одна половина увеличивает отступ от буквы до верхнего края, другая — до нижнего. То есть получается, что текст располагается ровно по середине блока.
Пример
Пример
<div>line-height</div> <div>padding</div>
Это отличный инструмент, чтобы однострочный текст или картинку выравнивать вертикально по центру блока.
наследуется от предка к потомку
Зелёный потомок
Синий потомок
<div> <div>Зелёный потомок</div> <div>Синий потомок</div> </div>
Значение, заданное потомку, будет главнее того, что задано родителю.
Зелёный потомок
Синий потомок
<div> <div>Зелёный потомок</div> <div>Синий потомок</div> </div>
Значение <number> единственное, которое отталкивается от значения font-size элемента, а не от его родителя.
Случается нередко намИ труд и мудрость видеть там,
<div> <div>текст<br>текст</div> текст<br>текст </div> Для <number> line-height родителя: 16px * 2 = 32px Для <number> line-height потомка: 30px * 2 = 60px Для px line-height родителя: 32px Для px line-height потомка: 32px Для em line-height родителя: 16px * 2 = 32px Для em line-height потомка: 16px * 2 = 32px Для % line-height родителя: 16px * 200 / 100 = 32px Для % line-height потомка: 16px * 200 / 100 = 32px
и HTML тег
Элемент с не может иметь . Поэтому, ежели родителя меньше дочернего элемента, строчный потомок увеличивает высоту строки предка, на которой он находится. Между нескольких строчных элементов, находящихся на одной строке, также выбирается то, что больше.
span
<div> <span>span</span> </div>
Иными словами, если строчного элемента отличается от блочного, то первый может увеличить высоту строки родителя, на которой он находится.
span
<div> <span>span</span> </div>
Откуда взялся вертикальный отступ у картинки? Как убрать межстрочный интервал?
У блочного элемента нет высоты строки.
<div> <img alt="16*16" src="http://2.bp.blogspot.com/-KpOxK0BzM-w/U0ZIUo4PF7I/AAAAAAAAEUI/PO4MiuWxy1o/s320/16.png" /> </div>
Практическое использование: Как убрать отступ под картинкой.
- Flexible typography with CSS locks
Делаем так, чтобы CSS принимал высоту строки за интерлиньяж
Если мы хотим использовать в CSS более традиционные настройки вместо линейного блока, нам нужно будет сделать так, чтобы у строки текста не было отступов сверху и снизу, а элементы могли занять всю её высоту.
Можно научить CSS делать интерлиньяж, если приложить немного усилий. Майкл Таранто создал инструмент Basekick, который применяется для достижения именно этой цели. Он придает свойству margin псевдоэлемента ::before отрицательное значение, а к самому элементу применяет функцию translateY. В результате этого мы получаем строку текста, которая не имеет никаких лишних отступов.
Последнюю версию формулы инструмента Basekick можно найти в исходном кодедизайнерской системы Braid от компании SEEK. В примере, приведенном ниже, мы используем примесь Sass, которая сделает всю тяжелую работу за нас. Такую же формулу можно создать с помощью примесей в JavaScript, Less, PostCSS или в чем-то другом, имеющем подобные математические функции.
@function calculateTypeOffset($lh, $fontSize, $descenderHeightScale) { $lineHeightScale: $lh / $fontSize; @return ($lineHeightScale - 1) / 2 + $descenderHeightScale; } @mixin basekick($typeSizeModifier, $baseFontSize, $descenderHeightScale, $typeRowSpan, $gridRowHeight, $capHeight) { $fontSize: $typeSizeModifier * $baseFontSize; $lineHeight: $typeRowSpan * $gridRowHeight; $typeOffset: calculateTypeOffset($lineHeight, $fontSize, $descenderHeightScale); $topSpace: $lineHeight - $capHeight * $fontSize; $heightCorrection: 0; @if $topSpace > $gridRowHeight { $heightCorrection: $topSpace - ($topSpace % $gridRowHeight); } $preventCollapse: 1; font-size: #{$fontSize}px; line-height: #{$lineHeight}px; transform: translateY(#{$typeOffset}em); padding-top: $preventCollapse; &::before { content: ""; margin-top: #{-($heightCorrection + $preventCollapse)}px; display: block; height: 0; } }
На первый взгляд, кажется, что этот код состоит из кучи каких-то волшебных чисел. Но будет намного проще его разобрать, представляя в контексте определенной системы. Давайте разберёмся в том, что нам необходимо знать:
- $baseFontSize: Это стандартный размер шрифта в нашей системе, вокруг которого будет выстраиваться всё остальное. Мы установим 16px как значение по умолчанию.
- $typeSizeModifier: Это коэффициент, применяемый к свойству font-size, который устанавливает правило размера шрифта. Например, если применить значение 2 к нашему стандартному размеру шрифта в 16px, то значение font-size будет равняться 32px.
- $descenderHeightScale: Это высота нижнего выносного элемента, выраженная в пропорции. Для шрифта Lato она составляет приблизительно 0,11.
- $capHeight: Это высота верхнего выносного элемента, выраженная в пропорции. Для шрифта Lato она равна примерно 0,75.
- $gridRowHeight: Системы вёрстки обычно опираются на вертикальный ритм, установленный по умолчанию, чтобы сделать процесс чтения приятным и равномерным. Например, все элементы страницы могут быть равноудалены друг от друга на величины, кратные четырём или пяти пикселям. Мы будем использовать значение 4, потому что оно хорошо делится на наш $baseFontSize, составляющий 16px.
- $typeRowSpan: Как и $typeSizeModifier, эта переменная служит коэффициентом для высоты ряда сетки и устанавливает правило высоты строки. Если по умолчанию величина ряда сетки равна 4, а в $typeRowSpan мы установим 8, то высота строки составит 32px.
Теперь мы можем вставить эти цифры в формулу Basekick, приведенную выше (с помощью функций и примесей SCSS). И это даст нам следующий результат:
Это именно то, что нам нужно. В любом наборе элементов текстовых блоков без отступов, два элемента будут касаться друг друга. В этом случае любой отступ между двумя объектами будет идеально соответствовать заданному количеству пикселей, потому что ему не придется конфликтовать с отступами линейных блоков.
Что следует помнить
- Абзац HTML может быть выровнен с помощью атрибута align или стиля text-align;
- HTML будет отображаться по-разному в зависимости от размеров экрана, размеров окна браузера;
- Добавление дополнительных пробелов или пустых строк в HTML-код не влияет на вывод. Браузер удаляет все лишние пробелы;
- Теги задают, что должно отображаться, а стили определяют, как это должно выводиться;
- Стили могут быть заданы тремя различными способами — встроенные (внутри тегов), внутренние (внутри того же HTML-файла с помощью элемента <style>) и внешние (в отдельном файле);
- Лучшей практикой при разработке веб-сайтов считается использование внешнего файла CSS. Таким образом, мы можем разделить контент и представление;
- Style является глобальным атрибутом, поэтому его можно использовать с любыми другими элементами, а не только с элементом <p>;
- Стиль text-align выравнивает абзац по левому краю, по центру, по правому краю или по ширине;
- Междустрочный интервал для абзаца можно задать с помощью стиля line-height. Он может принимать различные значения;
- Вы можете указать для line-height кратные значения (1 для одинарного междустрочного интервала, 1,5 для полуторного, 2 для двойного, 3 для тройного и так далее), а также пиксели, проценты и т.д.;
- Отступ для абзаца в HTML можно задать с помощью стиля padding-left или padding-right. Может принимать значения в пикселях, процентах и т.д.;
- Интервалы между абзацами в HTML можно задать с помощью стилей padding-top или padding-bottom. Для этого также допустимы значения в пикселях, процентах и т.д.
Вадим Дворниковавтор-переводчик статьи «HTML Paragraph Formatting»
CSS Reference
CSS ReferenceCSS Browser SupportCSS SelectorsCSS FunctionsCSS Reference AuralCSS Web Safe FontsCSS Fallback FontsCSS AnimatableCSS UnitsCSS PX-EM ConverterCSS ColorsCSS Color ValuesCSS Default ValuesCSS Entities
CSS Properties
align-content
align-items
align-self
all
animation
animation-delay
animation-direction
animation-duration
animation-fill-mode
animation-iteration-count
animation-name
animation-play-state
animation-timing-function
backface-visibility
background
background-attachment
background-blend-mode
background-clip
background-color
background-image
background-origin
background-position
background-repeat
background-size
border
border-bottom
border-bottom-color
border-bottom-left-radius
border-bottom-right-radius
border-bottom-style
border-bottom-width
border-collapse
border-color
border-image
border-image-outset
border-image-repeat
border-image-slice
border-image-source
border-image-width
border-left
border-left-color
border-left-style
border-left-width
border-radius
border-right
border-right-color
border-right-style
border-right-width
border-spacing
border-style
border-top
border-top-color
border-top-left-radius
border-top-right-radius
border-top-style
border-top-width
border-width
bottom
box-decoration-break
box-shadow
box-sizing
break-after
break-before
break-inside
caption-side
caret-color
@charset
clear
clip
clip-path
color
column-count
column-fill
column-gap
column-rule
column-rule-color
column-rule-style
column-rule-width
column-span
column-width
columns
content
counter-increment
counter-reset
cursor
direction
display
empty-cells
filter
flex
flex-basis
flex-direction
flex-flow
flex-grow
flex-shrink
flex-wrap
float
font
@font-face
font-family
font-feature-settings
font-kerning
font-size
font-size-adjust
font-stretch
font-style
font-variant
font-variant-caps
font-weight
gap
grid
grid-area
grid-auto-columns
grid-auto-flow
grid-auto-rows
grid-column
grid-column-end
grid-column-gap
grid-column-start
grid-gap
grid-row
grid-row-end
grid-row-gap
grid-row-start
grid-template
grid-template-areas
grid-template-columns
grid-template-rows
hanging-punctuation
height
hyphens
image-rendering
@import
isolation
justify-content
@keyframes
left
letter-spacing
line-height
list-style
list-style-image
list-style-position
list-style-type
margin
margin-bottom
margin-left
margin-right
margin-top
mask-image
mask-mode
mask-origin
mask-position
mask-repeat
mask-size
max-height
max-width
@media
min-height
min-width
mix-blend-mode
object-fit
object-position
opacity
order
orphans
outline
outline-color
outline-offset
outline-style
outline-width
overflow
overflow-wrap
overflow-x
overflow-y
padding
padding-bottom
padding-left
padding-right
padding-top
page-break-after
page-break-before
page-break-inside
perspective
perspective-origin
pointer-events
position
quotes
resize
right
row-gap
scroll-behavior
tab-size
table-layout
text-align
text-align-last
text-decoration
text-decoration-color
text-decoration-line
text-decoration-style
text-indent
text-justify
text-overflow
text-shadow
text-transform
top
transform
transform-origin
transform-style
transition
transition-delay
transition-duration
transition-property
transition-timing-function
unicode-bidi
user-select
vertical-align
visibility
white-space
widows
width
word-break
word-spacing
word-wrap
writing-mode
z-index
line-height: к проблемам и за ее пределами
Ранее я ввел два понятия: контент-область (content-area) и line-box. Если вы читали внимательно, то я сказал, что высота line-box вычисляется в соответствии с его дочерней высотой, я не сообщал дочерним элементам высоту их контент-области. В этом и заключается больше различие.
Хотя это может показаться странным, inline-элемент имеет две разные высоты: высоту content-area и высоту virtual-area (Я изобрел термин virtual-area , обозначая таким образом высоту, невидимую для нас. Этого термина Вы не найдете в спецификации).
- высота content-area определяется показателями шрифта (как показано выше)
- высота virtual-area — это , а также это высота, которая используется для вычисления высоты line-box
Inline-элементы, имеющие две разные высоты
Это ломает распространенное мнение о том, что это расстояние между базовыми линиями (baselane). В CSS это не так.
В CSS, the line-height — это не расстояние между двумя базовыми линиями
Рассчитанная разность высот между virtual-area и content-area называется ведущей. Половина этой ведущей добавляется к верхней части content-area, другая часть — к нижней. Content-area располагается всегда в центре virtual-area.
На основе его значений, (virtual-area) может быть больше, меньше или равной content-area. В случае меньшего размера virtual-area, ведущее значение станет отрицательным и line-box стане визуально меньше его дочернего элемента.
Существуют также другие виды inline-элементов:
- inline-элементы (, , , etc.)
- и все элементы
- inline-элементы, которые используются в качестве форматирования текста (например, во flexbox-элементах)
Для этих inline-элементов, высота вычисляется на основе , и . Если имеет значение , то используется в content-area и строго равна .
Inline замещаемые элементы, inline-block/inline-* и blocksified inline элементы имеют контент-область, равную их высоте или высоте линии
Итак, вернемся к FontForge. Em-квадрат шрифта Catamaran равен 1000, но мы видим значения ascender/descender:
- Ascent/Descent: ascender — 770 и descender — 230. Используется для символьных рисунков. (табл. “OS/2”)
- показатели Ascent/Descent: ascender — 1100 и descender — 540. Используется для высоты content-area. (табл. “hhea” и табл. “OS/2”)
- показатель Line Gap. Используется дл , путем добавления этого значения показателей Ascent/Descent. (табл. “hhea”)
В нашем случае, шрифт Catamaran определяет разрыв в 0 единиц для line gap, поэтому будет равен content-area, который составляет 1640 единиц, иначе 1.64.
В качестве сравнения, шрифт Arial описывает em-квадрат в 2048 единиц, ascender — 1854, descender — 434 и line gap составляет 67. Это означает, что дает content-area — 112px (1117 единиц) и — 115px (1150 единиц, иначе 1.15). Все эти показатели шрифта устанавливаются разработчиком шрифта.
Становится очевидным, что установка плохая практика.Я хотел бы напомнить вам, что безразмерное значение относительно для и virtual-area меньше, чем content-area. Именно это и является источником многих наших проблем.
Используя line-height: можно создать line-box меньше, чем контент-область
Уточнения о вычислении line-box:
- для inline-элементов, и увеличивают область фона, но не высоту content-area (или высоту line-box).Сontent-area — это не всегда то, что ты видишь на экране. и не имеют ни какого эффекта.
- для inline-элементов, и blocksified inline-элементы: , и увеличивают , а значит увеличивают content-area и высоту line-box