Атрибут height в HTML: что это и как задать высоту

Атрибут height (от английского height, «высота») прописывают тегу, чтобы задать высоту занимаемой им области в пикселях. Закрывающей части у атрибута нет, он записывается внутри открывающего тега: height="200". Закрывающий тег нужен самому элементу не всегда: у <img>, <source>, <embed> и <input> его нет, а у <iframe>, <video>, <object> и <canvas> он обязателен.

Главное, что нужно знать сразу: в HTML это целое число без единиц измерения, а не «высота как в CSS». Проценты, auto и значения вроде 200px стандарт не допускает, хотя браузер часть из них принимает. У высоты есть и вторая задача: вместе с width она сообщает браузеру пропорции картинки до загрузки файла, и страница не прыгает. Обычно атрибут пишут рядом с src и alt.

HTML
<img src="photo.jpg" alt="Кот" width="400" height="300">
<iframe src="map.html" width="600" height="400"></iframe>
<canvas width="300" height="150"></canvas>

Что такое атрибут height в HTML и что он задаёт

Атрибут отвечает на вопрос «какой высоты должен быть этот элемент на странице». Значение записывают числом, и браузер считает его пикселями. Это не то же самое, что line-height в CSS: тот задаёт высоту строки текста, а не размер элемента. Подсказку при наведении курсора показывает атрибут title.

Для браузера height служит подсказкой о размере, самой слабой из возможных: если в CSS высота задана, побеждает CSS. Поэтому атрибут удобно считать значением по умолчанию и сведениями о файле, а подгонкой размера под макет заниматься в таблице стилей.

Атрибут height бывает не у каждого тега: у <img> он есть, а у a, p и div нет, и браузер его пропустит. В тестовых вопросах вроде «каких атрибутов не бывает: alt, href, meta, name, height, id» нужно помнить, что meta это тег, а не атрибут.

Для каких тегов работает height: img, video, iframe, canvas и другие

В современном HTML атрибут height есть у восьми тегов. Смысл у него одинаковый, но у каждого тега есть своя особенность.

Теги, у которых работает height
ТегЧто задаёт heightПример записи
<img>Высоту картинки на странице<img src="cat.jpg" alt="Кот" height="300">
<video>Высоту плеера: без атрибута 150 пикселей<video src="clip.webm" height="240" controls></video>
<iframe>Высоту фрейма: без атрибута 150 пикселей плюс рамка<iframe src="map.html" width="600" height="400"></iframe>
<canvas>Высоту холста в точках, а не только его размер на странице<canvas width="300" height="150"></canvas>
<embed>Высоту области встроенного файла<embed src="doc.pdf" width="500" height="600">
<object>Высоту области встроенного объекта<object data="doc.pdf" width="500" height="600"></object>
<input> с type="image"Высоту кнопки-картинки<input type="image" src="go.png" alt="Отправить" height="40">
<source> внутри <picture>Не высоту, а пропорции картинки до загрузки<source srcset="wide.webp" width="800" height="400">

У <input> атрибут работает только при type="image": у текстового поля он ничего не меняет, а размер поля задают атрибутом size или CSS. У <embed> без адреса файла область получается нулевой, поэтому проверять высоту нужно уже с настоящим файлом.

Отдельно рассмотрим устаревший height у таблиц: <table>, <td>, <th> и tr. Он описан в одном из последних разделов. У <svg> тоже есть свой height, но он принадлежит языку SVG, а правила записи там те же, что у width в разделе про SVG.

Какие значения принимает height: число, px, проценты и auto

По стандарту значением height служит неотрицательное целое число. Браузеры к ошибкам снисходительны и часть неверных записей применяют, но валидатор покажет ошибку, а другой браузер может поступить иначе. Ниже результаты для картинки размером 400 на 300 пикселей, замеренные в браузере, на котором я проверял.

Что делает браузер с разными значениями height
ЗаписьЧто показал браузерВалидатор
height="60"Высота 60, ширина подобрана по пропорциям (80)Верно
height="60px"Высота 60: единицы отброшеныОшибка
height="150.4"Округлено до 150Ошибка
height="50%"Половина высоты родителя, если она задана. Если нет, значение игнорируетсяОшибка
height="auto"Значение проигнорировано, картинка в своём размереОшибка
height="-10", height="+60"Значение проигнорированоОшибка
height="1e2"Прочитано только «1»: высота 1 пиксельОшибка
height="0"Картинка исчезает: размер 0 на 0Верно, но смысла нет
height=""Значение проигнорированоОшибка

Проценты ведут себя иначе, чем у width. Ширина у блока всегда известна, а высота обычно считается по содержимому. Поэтому height="50%" работает, только когда у родителя высота задана явно. Если родитель растёт по содержимому, браузеру не от чего брать половину, и значение пропускается.

HTML
<img src="photo.png" height="60">

<div style="height: 200px">
  <img src="photo.png" height="50%">
</div>

Пример: когда проценты в height сработают

Нажимайте на варианты. Картинка в файле 160 на 120, поэтому высота 120 в результате означает, что значение не применилось.

Результат

Высоту считает ваш браузер, она может отличаться от моих замеров. Во втором варианте у родителя задана высота, в первом нет.

Height и width вместе: пропорции и искажение картинки

Если задать картинке только height, ширина подберётся по пропорциям файла: для файла 400 на 300 высота 60 даёт размер 80 на 60. Если задать оба атрибута, браузер вписывает файл в эту рамку, и при неверных числах картинка сплющивается или растягивается. Подробно эти случаи разобраны на странице про width, поэтому здесь главное правило: пару берут из настоящих размеров файла или в тех же пропорциях.

HTML
<img src="photo.png" height="60">
<img src="photo.png" width="200" height="50">
<img src="photo.png" width="200" height="50"
  style="height:auto">

Если запись содержит оба атрибута, а в CSS записано height: auto, высота снова считается по пропорциям файла. Такой приём нужен для адаптивных картинок, и он описан в следующих разделах.

Height и CSS: чем отличается от height, min-height, line-height и aspect-ratio

Когда в атрибуте и в CSS указаны разные высоты, браузер выбирает CSS: атрибут для него только подсказка. Проверено на файле 400 на 300 пикселей.

Атрибут против CSS на картинке 400 на 300
Что записаноРазмер на странице
height="100"133 на 100
height="100" и style="height:50px"высота 50, побеждает CSS, ширина подобрана по пропорциям
height="100" и style="max-height:50px"высота ограничена до 50
height="100" и style="width:100%"ширина по контейнеру, высота остаётся 100: картинка искажена
height="100" и style="width:100%;height:auto"высота снова считается по пропорциям файла

Теперь о путанице с похожими названиями. В поисковых запросах часто смешивают четыре разные вещи.

Что чем задаётся
НазваниеЧто делаетПример записи
Атрибут heightРазмер элемента в HTML, подсказка для браузера<img height="300">
Свойство heightВысота блока в CSS, сильнее атрибутаimg { height: 300px; }
Свойство min-heightНижняя граница высоты блока: блок не станет ниже.box { min-height: 200px; }
Свойство line-heightВысота строки текста, а не размер элементаp { line-height: 1.5; }
Свойство aspect-ratioПропорции блока, из которых получается недостающий размерimg { aspect-ratio: 4 / 3; }

Для адаптивной картинки используют пару: атрибуты сообщают пропорции, а правило CSS не даёт картинке выйти за колонку.

HTML
<img src="photo.jpg" alt="Кот" width="800" height="600">

img {
  max-width: 100%;
  height: auto;
}

Без height: auto сжатая по ширине картинка сохранит высоту из атрибута и исказится.

Height и скачки страницы при загрузке

Пока файл картинки не пришёл, браузер не знает её размеров. Если высоты нет, место под картинку равно нулю, а когда файл загрузится, весь текст ниже резко уезжает вниз. Это тот же эффект, о котором рассказано на странице width: из-за него страница «прыгает», а у поисковиков такое поведение измеряет показатель CLS.

Высота здесь играет ту же роль, что и ширина. Браузер делит одно число на другое, получает пропорции и заранее оставляет место. В браузере, на котором я проверял, картинка с атрибутами width="160" height="120" получает в вычисленном стиле пропорции auto 160 / 120. Если число высоты неверное, место оставят, но не той высоты, и скачок случится всё равно. Причём ошибиться можно в обе стороны: слишком большая высота сдвинет текст вверх.

HTML
<img src="photo.png" alt="Кот" width="160">

<img src="photo.png" alt="Кот"
  width="160" height="120">

img { width: 100%; height: auto; }

Пример: сдвигается ли текст, когда картинка загрузилась

Выберите вариант и нажмите «Файл получен». До этого момента у картинки нет адреса, как будто файл ещё идёт по сети. Знак перед числом показывает направление сдвига текста.

Результат

Сеть заменена кнопкой: пока файл «не получен», у картинки нет адреса, но размеры из атрибутов уже работают. Картинка занимает 45 процентов ширины фрейма демонстрации.

Height у iframe, canvas и video: размеры по умолчанию и особенности

У этих трёх тегов нет файла-картинки, из которого можно взять размер, поэтому у них есть значения по умолчанию. В браузере, на котором я проверял, у <iframe>, <canvas> и <video> без атрибута высота 150. У фрейма к этому прибавляется рамка, и вместе получается 154 пикселя.

Проценты у них считаются так же, как у картинки: от высоты родителя. Исключение составляет <canvas>: запись height="50%" холст читает как число 50. Это ещё одна причина не писать в атрибут ничего, кроме цифр. Для холста height задаёт ещё и число точек, об этом подробно рассказано в разделе про холст на странице width.

HTML
<iframe src="map.html" height="100"></iframe>
<canvas height="100"></canvas>
<video src="clip.webm" height="100"></video>

Пример: высота iframe, canvas и video с разными значениями

Результат

Родитель в демонстрации высотой 200 пикселей. Высоту считает ваш браузер.

Устаревший height у table, td, th и tr: что заменить на CSS

Когда-то высоту таблиц, строк и ячеек задавали только атрибутом. Сегодня список устаревших возможностей в стандарте относит height у таблиц, ячеек и строк к устаревшим, а валидатор выдаёт предупреждение. Браузеры по-прежнему понимают его, поэтому старые страницы выглядят как раньше.

Устаревший height и замена
ТегРаботает ли атрибутЧем заменить
<table>Даheight: 300px; у таблицы
<td>, <th>Да, строка растягивается вместе с ячейкойheight: 80px; у ячейки
trДаheight: 80px; у строки

Если в одном месте заданы и атрибут, и CSS, побеждает CSS. Для таблиц высота в CSS ведёт себя как минимальная: содержимое всё равно не обрежется, а строка станет выше, если текста много.

HTML
<!-- устарело -->
<table height="300">...</table>
<td height="80">...</td>

/* сегодня */
table { height: 300px; }
td { height: 80px; }

Пример: старый атрибут height и его аналог в CSS

Результат

Для каждого тега можно переключиться между атрибутом и CSS. Числа в обоих режимах совпадают.

Атрибут height в JavaScript: свойство height, offsetHeight и naturalHeight

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

Какую высоту возвращает каждый способ
СпособЧто возвращаетПример записи
getAttributeСтроку из разметки как есть, а если атрибута нет, то nullimg.getAttribute('height')
Свойство heightЧисло: записанное в атрибуте, а без него высоту на страницеimg.height
offsetHeightФактическую высоту на странице вместе с рамкойimg.offsetHeight
naturalHeightВысоту самого файлаimg.naturalHeight

Запись в свойство height меняет атрибут в разметке. Конструктор new Image(30, 20) создаёт картинку сразу с атрибутами width="30" и height="20". У холста свойство height всегда равно числу точек, а размер на странице нужно смотреть через offsetHeight. Присвоение canvas.height очищает холст, даже если число не изменилось.

HTML
const img = document.querySelector('img');

img.getAttribute('height'); // "60" или null
img.height;                 // число
img.offsetHeight;           // высота на странице
img.naturalHeight;          // высота файла

img.height = 77;            // запишет height="77"

Пример: четыре способа прочитать высоту картинки

Результат

Файл в демонстрации высотой 120 пикселей, поэтому naturalHeight не меняется, а остальные значения зависят от того, как задан размер.

Частые ошибки в атрибуте height

Большинство ошибок связано с тем, что в height пытаются написать значение из CSS или ждут от него больше, чем он даёт.

ОшибкаЧто происходитКак исправить
height="100%"Работает только если у родителя задана высота, валидатор показывает ошибкуЗадать height: 100%; в CSS и убедиться, что у родителя есть высота
height="200px"Единицы отбрасываются, валидатор показывает ошибкуПисать только цифры: height="200"
height="auto"Значение игнорируется, ошибка валидатораУбрать атрибут или написать height: auto; в CSS
height="1e2", height="150.4"Первое читается как 1, второе округляется до 150Целое число из цифр
width="200" height="50" для файла 4 к 3Картинка сплющенаЧисла в пропорциях файла или height: auto в CSS
Только width без height у картинки в потокеПока файл не пришёл, высота равна нулю, и текст ниже прыгаетУказать и width, и height
height="120" для файла с другими пропорциямиМесто оставлено не той высоты, текст сдвигаетсяВзять числа из свойств файла
height="100" у большого файлаФайл скачивается целиком, меняется только его видПодготовить файл нужного размера или несколько через srcset
canvas { height: 300px; } вместо атрибутаХолст остаётся 150 точек в высоту, рисунок размытЗадать height холста атрибутом
canvas height="50%"Холст читает это как число 50Писать только число точек
<table height="500">Работает, но устарелоЗадать height: 500px; в CSS
<div height="300">, <p height="300">У этих тегов атрибута нет, браузер его пропускаетИспользовать CSS
<input type="text" height="40">Атрибут не действует: размер поля прежнийЗадать высоту в CSS
p { height: 1.5; } вместо line-heightВысота «1.5 пикселя»: не та величинаДля высоты строки писать line-height

Шпаргалка по атрибуту height

Всё главное из статьи в одной таблице.

Атрибут height: что и как писать
ЗадачаКак записатьПример записи
Высота картинкиЦелое число без единиц<img src="cat.jpg" alt="Кот" height="300">
Избежать скачков страницыИ width, и height из размеров файла<img src="cat.jpg" alt="Кот" width="400" height="300">
Адаптивная картинкаАтрибуты плюс CSSimg { max-width: 100%; height: auto; }
Размер фреймаЧисло у iframe<iframe src="map.html" width="600" height="400"></iframe>
Размер плеераЧисло у video<video src="clip.webm" height="240" controls></video>
Разрешение холстаЧисло точек у canvas<canvas width="300" height="150"></canvas>
Пропорции в pictureЧисла у source<source srcset="wide.webp" width="800" height="400">
Проценты и autoТолько в CSSimg { height: auto; }
Высота таблицы или ячейкиТолько в CSStd { height: 80px; }
Высота строки текстаСвойство line-heightp { line-height: 1.5; }
Прочитать высотуСвойства height, offsetHeight, naturalHeightimg.offsetHeight
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×