Как убрать position absolute
Перейти к содержимому

Как убрать position absolute

  • автор:

position

Свойство CSS position указывает, как элемент позиционируется в документе. top , right , bottom и left (en-US) определяют конечное местоположение позиционированных элементов.

Интерактивный пример

Типы позиционирования

  • Позиционируемый элемент — это элемент, у которого вычисленное значение position является relative , absolute , fixed либо sticky . (Другими словами, это все, кроме static .)
  • Относительно позиционируемый элемент является элементом, вычисленное значение position которого является relative . Свойства top и bottom определяют смещение по вертикали от его нормального положения; свойства left (en-US) и right задают горизонтальное смещение.
  • Абсолютно позиционируемый элемент — это элемент, чьё вычисленное значение position является absolute или fixed . top , right , bottom и left (en-US) задают смещения от краёв содержащего блок элемента . (Содержащий блок является предком, относительно которого расположен элемент.) Если элемент имеет поля, они добавляются к смещению. Элемент устанавливает новый контекст форматирования блока (BFC) для своего содержимого.
  • Элемент с липкой позицией — это элемент, у которого значение вычисленного position является sticky . Он рассматривается как относительно позиционированный до тех пор, пока содержащий его блок не пересечёт указанный порог (например, установка top в значение, отличное от auto ) внутри его корня потока (или в контейнере, в котором он прокручивается), после чего он обрабатывается как «застрявший» до тех пор, пока не встретит противоположный край содержащего его блока .

В большинстве случаев абсолютно позиционированные элементы, которые имеют height и width установленные в auto , имеют размер, соответствующий их содержимому. Тем не менее, незамещаемые, абсолютно позиционированные элементы можно сделать такими, чтобы они заполнили доступное вертикальное пространство, указав как top , так и bottom , и оставляя height неопределённым (то есть , auto ). Ими также можно заполнить доступное горизонтальное пространство, указав как left (en-US), так и right , и оставляя width как auto .

За исключением только что описанного случая (абсолютно позиционированных элементов, заполняющих доступное пространство):

  • Если указаны top и bottom (технически, не auto ) — приоритет будет у top .
  • Если указаны left и right : приоритет будет у left , когда direction ltr (английский язык, горизонтальный японский и т. д.), приоритет будет у right , когда direction является rtl (персидский , Арабский, иврит и т. д.).

Синтаксис

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

Значения

Это значение позволяет элементу находиться в обычном его состоянии, расположенном на своём месте в документе. Свойства top , right , bottom , left и z-index не применяются к данному элементу. Это значение по умолчанию.

Элемент позиционируется в соответствии с нормальным потоком документа, а затем смещается относительно себя на основе значений top , right , bottom и left . Смещение не влияет на положение любых других элементов, то есть пространство, выделяемое для элемента в макете страницы, такое же, как если бы позиция была static . Это значение создаёт новый контекст наложения , когда значение z-index не auto . Его влияние на элементы table-*-group , table-row , table-column , table-cell и table-caption не определено.

Элемент удаляется из обычного потока документа, и для элемента в макете страницы не выделяется дополнительное пространство. Он располагается относительно своего ближайшего спозиционированного предка, если такой есть; в противном случае он помещается относительно исходного содержащего блока . Его конечная позиция определяется значениями top , right , bottom , и left . Это значение создаёт новый контекст наложения , когда значение z-index не auto . Внешние отступы абсолютно спозиционированных блоков не схлопываются с отступами других блоков.

Элемент выбивается из обычного потока документа, и для элемента в макете страницы не создаётся пространство. Он позиционируется относительно исходного содержащего блока , установленного viewport, за исключением случаев, когда один из его предков имеет свойство transform , perspective , или filter , установленное на что-то иное, кроме none (см. CSS Transforms Spec), и в этом случае этот предок ведёт себя как содержащий блок. (Обратите внимание, что существуют несогласованности браузера с perspective и filter , способствующими содержанию формирования блоков.) Его конечная позиция определяется значениями top , right , bottom и left . Это значение всегда создаёт новый контекст наложения . При печати fixed -элемент помещается в одно и то же место на каждой странице.

Элемент позиционируется в соответствии с нормальным потоком документа, а затем смещается относительно его ближайшего прокручивающего предка и содержащего блока (ближайший родительский уровень блока), включая элементы, связанные с таблицей, на основе значений top , right , bottom , и left . Смещение не влияет на положение любых других элементов.Это значение всегда создаёт новый контекст наложения . Обратите внимание, что липкий элемент «прилипает» к его ближайшему предшественнику, имеющему «механизм прокрутки» (созданный при overflow равном hidden , scroll , auto или overlay ), даже если тот не является ближайшим фактически прокручивающим предком. Это эффективно препятствует любому «липкому» поведению (см. Github issue on W3C CSSWG).

Формальный синтаксис

position =
static | (en-US)
relative | (en-US)
absolute | (en-US)
sticky | (en-US)
fixed | (en-US)
running( )

Примеры

Относительное позиционирование

Относительно позиционированные элементы смещены на определённую величину от их обычной позиции в документе, но без смещения, влияющего на другие элементы. В приведённом ниже примере обратите внимание, как размещаются другие элементы, как если бы «Two» занимало пространство своего обычного расположения.

HTML
div class="box" id="one">Onediv> div class="box" id="two">Twodiv> div class="box" id="three">Threediv> div class="box" id="four">Fourdiv> 
CSS
.box  display: inline-block; width: 100px; height: 100px; background: red; color: white; > #two  position: relative; top: 20px; left: 20px; background: blue; > 

Абсолютное позиционирование

Элементы, расположенные относительно друг друга, остаются в нормальном потоке документа. В противоположность этому, элемент с абсолютным позиционированием, выбивается из потока; таким образом, другие элементы располагаются без учёта абсолютных. Абсолютно позиционируемый элемент располагается относительно его ближайшего предка (который не является static ). Если такого предка не существует, то абсолютный элемент позиционируется относительно ICB (начальный содержащий блок — см. также определение W3C), который содержит блок корневого элемента документа.

h1>Абсолютное позиционированиеh1> p> Я базовый элемент уровня блока. Мои соседи сидят на новых строках ниже меня. p> p class="positioned"> По умолчанию моя ширина 100% ширины родителя и я достиг такого же высокого уровня, как и весь дочерний контент. Наша общая ширина и высота - это наш контент+заполнение+ширина/высота границы. p> p> Мы отделены нашей маржой. Из-за развала края мы отделены шириной одного из наших полей, а не обоих. p> p> встроенные элементы span>как этотspan> и span>вот этотspan> будут сидеть в одной строке друг с другом и соседними текстовыми узлами, если в ней есть место. Переполнение встроенных элементов span >перейдёт на новую строку, если это возможно, - как содержимое этого текстаspan >, или просто перейдёт к новой строке, а если нет, то встанет, как это изображение:img src="long.jpg" /> p> 
body  width: 500px; margin: 0 auto; > p  background: aqua; border: 3px solid blue; padding: 10px; margin: 10px; > span  background: red; border: 1px solid black; > .positioned  position: absolute; background: yellow; top: 30px; left: 30px; > 

Фиксированное позиционирование

Фиксированное позиционирование аналогично абсолютному, за исключением того, что блок, содержащий элемент, является начальным содержащим блоком, установленным в окне просмотра, если только у какого-либо предка не было transform , perspective , или свойства filter , отличное от none (см. CSS Transforms Spec), из-за чего этот предок занимает место элементов, содержащих блок. Это можно использовать для создания «плавающего» элемента, который остаётся в том же положении независимо от прокрутки. В приведённом ниже примере окно c id=»one» фиксируется в 80 пикселях от верхней части страницы и в 10 пикселях слева. Даже после прокрутки оно остаётся в том же месте относительно окна просмотра.

HTML
div class="outer"> p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi, laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit. Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id ultrices ultrices, tempor et tellus. p> p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi, laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit. Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id ultrices ultrices, tempor et tellus. p> p> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam congue tortor eget pulvinar lobortis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Nam ac dolor augue. Pellentesque mi mi, laoreet et dolor sit amet, ultrices varius risus. Nam vitae iaculis elit. Aliquam mollis interdum libero. Sed sodales placerat egestas. Vestibulum ut arcu aliquam purus viverra dictum vel sit amet mi. Duis nisl mauris, aliquam sit amet luctus eget, dapibus in enim. Sed velit augue, pretium a sem aliquam, congue porttitor tortor. Sed tempor nisl a lorem consequat, id maximus erat aliquet. Sed sagittis porta libero sed condimentum. Aliquam finibus lectus nec ante congue rutrum. Curabitur quam quam, accumsan id ultrices ultrices, tempor et tellus. p> div class="box" id="one">Onediv> div> 
CSS
.box  background: red; width: 100px; height: 100px; margin: 20px; color: white; > #one  position: fixed; top: 80px; left: 10px; > .outer  width: 500px; height: 500px; overflow: scroll; padding-left: 150px; > 

Липкое позиционирование

Липкое позиционирование можно рассматривать как гибрид относительного и фиксированного позиционирования. Липкий позиционированный элемент обрабатывается как относительно позиционированный до тех пор, пока он не пересечёт заданный порог, после чего он будет считаться фиксированным, пока не достигнет границы его родителя. Например.

#one  position: sticky; top: 10px; > 

. позиционирует элемент с id «one» относительно до тех пор, пока видовой экран не будет прокручен таким образом, чтобы элемент был меньше 10 пикселей от вершины. Помимо этого порога элемент будет зафиксирован на 10 пикселей сверху.

Типичное использование для липкого позиционирования — для заголовков в алфавитном списке. Заголовок «B» появится чуть ниже элементов, начинающихся с «A», пока они не будут прокручиваться за кадром. Вместо того, чтобы скользить за кадром с остальной частью содержимого, заголовок «B» затем останется фиксированным в верхней части окна просмотра, пока все элементы «B» не будут прокручиваться на экране, и в этот момент он будет закрыт «C», заголовок и т. д.

Вы должны указать порог с по крайней мере одним из top , right , bottom , или left (en-US) для того, чтобы липкое позиционирование могло вести себя так, как ожидалось. В противном случае он будет неотличим от относительного позиционирования.

HTML
div> dl> dt>Adt> dd>Andrew W.K.dd> dd>Apparatdd> dd>Arcade Firedd> dd>At The Drive-Indd> dd>Aziz Ansaridd> dl> dl> dt>Cdt> dd>Chromeodd> dd>Commondd> dd>Convergedd> dd>Crystal Castlesdd> dd>Cursivedd> dl> dl> dt>Edt> dd>Explosions In The Skydd> dl> dl> dt>Tdt> dd>Ted Leo & The Pharmacistsdd> dd>T-Paindd> dd>Thricedd> dd>TV On The Radiodd> dd>Two Gallantsdd> dl> div> 
CSS
*  box-sizing: border-box; > dl  margin: 0; padding: 24px 0 0 0; > dt  background: #b8c1c8; border-bottom: 1px solid #989ea4; border-top: 1px solid #717d85; color: #fff; font: bold 18px/21px Helvetica, Arial, sans-serif; margin: 0; padding: 2px 0 0 12px; position: -webkit-sticky; position: sticky; top: -1px; > dd  font: bold 20px/45px Helvetica, Arial, sans-serif; margin: 0; padding: 0 0 0 12px; white-space: nowrap; > dd + dd  border-top: 1px solid #ccc; > 

Доступность

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

  • MDN Understanding WCAG, Guideline 1.4 explanations (en-US)
  • Visual Presentation: Understanding SC 1.4.8 | Understanding WCAG 2.0

Производительность и доступность

Элементы прокрутки, содержащие fixed или sticky контент, могут вызвать проблемы с производительностью и доступностью. Когда пользователь прокручивает страницу, браузер должен перерисовать sticky или fixed контент в новом месте. В зависимости от содержимого, которое необходимо перерисовать, производительности браузера и скорости обработки устройства, браузер может не справиться с перерисовкой со скоростью 60 кадров в секунду, что вызывает проблемы с доступностью для людей с чувствительностью и раздражением для всех. Одним из решений является добавление will-change: transform к позиционированным элементам для визуализации элемента на его собственном уровне, повышения скорости перерисовки и, следовательно, повышения производительности и доступности.

Характеристики

Specification
CSS Positioned Layout Module Level 3
# position-property

Совместимость с браузером

BCD tables only load in the browser

Found a content problem with this page?

  • Edit the page on GitHub.
  • Report the content issue.
  • View the source on GitHub.

This page was last modified on 18 окт. 2023 г. by MDN contributors.

position

Устанавливает способ позиционирования элемента относительно окна браузера или других объектов на веб-странице.

Синтаксис

position: absolute | fixed | relative | static | inherit

Значения

absolute Указывает, что элемент абсолютно позиционирован, при этом другие элементы отображаются на веб-странице словно абсолютно позиционированного элемента и нет. Положение элемента задается свойствами left , top , right и bottom , также на положение влияет значение свойства position родительского элемента. Так, если у родителя значение position установлено как static или родителя нет, то отсчет координат ведется от края окна браузера. Если у родителя значение position задано как fixed , relative или absolute , то отсчет координат ведется от края родительского элемента. fixed По своему действию это значение близко к absolute , но в отличие от него привязывается к указанной свойствами left , top , right и bottom точке на экране и не меняет своего положения при прокрутке веб-страницы. Браузер Firefox вообще не отображает полосы прокрутки, если положение элемента задано фиксированным, и оно не помещается целиком в окно браузера. В браузере Opera хотя и показываются полосы прокрутки, но они никак не влияют на позицию элемента. relative Положение элемента устанавливается относительно его исходного места. Добавление свойств left , top , right и bottom изменяет позицию элемента и сдвигает его в ту или иную сторону от первоначального расположения. static Элементы отображаются как обычно. Использование свойств left , top , right и bottom не приводит к каким-либо результатам. inherit Наследует значение родителя.

HTML5 CSS2.1 IE Cr Op Sa Fx

    position    

Результат данного примера показан на рис. 1.

Применение свойства position

Рис. 1. Применение свойства position

Объектная модель

[window.]document.getElementById(» elementID «).style.position

Браузеры

Браузер Internet Explorer 6 значение fixed не поддерживает. Internet Explorer до версии 8.0 не поддерживает значение inherit .

HTML. Как отменить абсолютное позиционирование по родительскому элементу?

Как сделать так чтобы элемент по id my_elem позиционировался по body, т.е. нужно как-то проигнорировать position: relative у родительского элемента, возможно для этого есть какое-то специальное свойство, найти ответ в гугле если честно не получилось? P.S. Убрать у родительского элемента position: relative нельзя, т.к. на этом завязаны другие элементы, также как и нельзя перенести элемент my_elem

Отслеживать

задан 2 авг 2018 в 16:08

665 1 1 золотой знак 10 10 серебряных знаков 20 20 бронзовых знаков

position: fixed — не подойдет?

2 авг 2018 в 16:13

position: fixed также идёт по родительскому элементу.

2 авг 2018 в 16:14

написать position: relative !important ну или, то что вам актуально

2 авг 2018 в 16:20

А зачем здесь position: relative !important , он будет просто перебивать все назначенные стили, но тут дело не в этом. Или я как-то не так понял вас, какому элементу нужно добавить данное свойство?

2 авг 2018 в 16:29

не меняя разметку — никак

Как избавиться от position: absolute в CSS

Пару месяцев назад автора этого материала спросили о проблеме, которая возникла именно из-за этой строки CSS. В решении свойства position не оказалось вообще.

Пока у нас стартует новый поток курса по фронтенду, рассказываем о случаях, когда position: absolute вполне заменим современным CSS.

Введение

Вернёмся на 5 лет назад. Тогда CSS flexbox был новинкой и не мог работать на 100 %, а CSS grid не поддерживался. Мы работали с позиционированием CSS. Но сегодня проблемы тех лет решаются при помощи CSS flexbox или grid.

Наложение карточек

Когда у нас есть карточка, содержащая текст поверх изображения, мы часто используем position: absolute для размещения содержимого поверх изображения. Это больше не нужно при использовании CSS grid.

Вот типичная карточка с текстом над изображением:

 

Title

Subtitle

Чтобы разместить содержимое над изображением, нужно позиционировать .card__content абсолютно:

.card < position: relative; >.card__content < position: absolute; left: 0; top: 0; width: 100%; height: 100%; background: linear-gradient(to top, #000, rgba(0, 0, 0, 0) bottom/100% 60% no-repeat; padding: 1rem; >

Нет ничего плохого в position: absolute из примера выше, но почему не написать проще? Первый шаг — добавить display: grid к компоненту card. Задавать столбцы или строки не нужно:

.card < position: relative; display: grid; >.card__content

По умолчанию CSS grid создаёт строки автоматически, на основе контента. В нашей карточке основных элементов два, и поэтому получится две строки контента. Чтобы перекрыть содержимое с изображением, нужно разместить оба элемента на первой области сетки:

.card__thumb, .card__content < grid-column: 1/2; grid-row: 1/2; >

А лучше воспользоваться сокращением grid-area :

.card__thumb, .card__content < grid-area: 1/2; >

Наконец, мы также можем использовать grid-area: 1/-1 . -1 — последний столбец и строку в сетке, поэтому она всегда будет простираться до конца столбца или строки.

Метка карточки (must try)

Хочется расширить предыдущий пример и включить тег в верхнюю левую область карточки. Для этого нам нужно использовать ту же технику — grid-area: 1/-1 , но не хочется, чтобы тег заполнил всю карточку.

Чтобы исправить проблему заполнения, нам нужно указать метке выравнивание по началу контейнера:

.card__tag < align-self: start; justify-self: start; /* Other styles */ >

Познакомьтесь с меткой, которая позиционируется над своим родителем без position: absolute :

Раздел Hero

Ещё один идеальный вариант — раздел hero с контентом, который перекрывает изображение.

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

  • изображение;
  • градиентное наложение;
  • контент.

Это можно сделать разными способами. Если изображение исключительно декоративное, то подходит background-image . В противном случае можно воспользоваться :

.hero < position: relative; min-height: 500px; >.hero__thumb < position: absolute; left: 0; top: 0; width: 100%; height: 100%; object-fit: cover; >/* The overlay */ .hero:after < content: ""; position: absolute; left: 0; top: 0; width: 100%; height: 100%; background-color: #000; opacity: 0.5; >.hero__content

Вот так hero реализуется при помощи абсолютного позиционирования. Но можно сделать лучше.

Прежде всего добавим к hero свойство display: grid . И применим тот же принцип, что в компоненте карточки, то есть пропишем grid-area: 1/-1 в каждом прямом потомке элемента hero .

К сожалению, чтобы .hero__thumb работал, высоту hero придётся фиксировать. Если потомок элемента имеет свойство height: 100% , то его родитель должен иметь явное фиксированное свойство height , а не min-height .

.hero < display: grid; height: 500px; >.hero__content < z-index: 1; /* [1] */ grid-area: 1/-1; display: flex; flex-direction: column; margin: auto; /* [2] */ text-align: center; >.hero__thumb < grid-area: 1/-1; object-fit: cover; /* [3] */ width: 100%; height: 100%; min-height: 0; /* [4] */ >.hero:after < content: ""; background-color: #000; opacity: 0.5; grid-area: 1/-1; >

Пройду по отмеченным строкам, они важны:

  1. Мы можем использовать z-index для элементов grid или flex. При этом нет необходимости добавлять position: relative .
  2. Поскольку .hero__content — элемент grid, свойство margin: auto центрирует его по горизонтали и вертикали.
  3. Не забудьте включить object-fit: cover при работе с изображениями.
  4. Я использовал min-height: 0 для изображения на случай, если оно окажется большим. Это нужно, чтобы заставить grid соблюдать height: 100% и не делать изображение больше, чем секция hero, когда используется огромное изображение. Подробнее об этом читайте в статье о минимальном размере контента в CSS grid.

Заметили, что решение стало намного чище?

CSS display: contents

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

Вот HTML-код примера:

 

Order now

До сих пор ничего странного. На мобильных устройствах хочется добиться такого расположения:

Обратите внимание: изображение теперь расположено между заголовком и описанием. Как решить эту проблему? Можно подумать, что разметку нужно изменить так:

 

Order now

Этот код может работать согласно ожиданиям, а на десктопе нужно расположить справа. Он работает, но есть решение с display: contents и оно проще. Чтобы показать его, вернёмся к исходной разметке:

 

Order now

Обратите внимание: содержимое обёрнуто внутри .hero__content . Как сообщить браузеру о нашем желании, чтобы ,

и стали прямыми потомками ? При помощи display: contents :

.hero__content

Элемент .hero__content теперь — скрытый призрак. Браузер будет парсить разметку вот так:

   

Order now

И вот всё, что нам нужно сделать в CSS:

.hero < display: flex; flex-direction: column; >.hero__content < display: contents; >.hero h2, .hero img

При правильном применении display: contents — это мощная техника, позволяющая добиться того, что ещё несколько лет назад было невозможно. Конечно, мы хотим так же обращаться со стилями десктопа:

@media (min-width: 750px) < .hero < flex-direction: row; >.hero__content < display: initial; >.hero h2, .hero img < order: initial; >>

Упорядочиваем элементы компонента карточки

Ниже код варианта карточки, где заголовок размещается в её верхней части. Посмотрим на HTML:

 

Title

Description

Actions

Обратите внимание: у нас есть два прямых потомка card : изображение thumb.jpg и div с классом card__content . Как с такой разметкой расположить заголовок вверху? Это можно сделать с помощью абсолютного позиционирования:

.card < position: relative; padding-top: 3rem; /* Accommodate for the title space */ >.card h3

Однако это решение может не работать, когда заголовок слишком длинный.

Это происходит потому, что заголовок находится вне обычного потока, а значит, браузеру не важна его длина. При помощи display: contents можно добиться большего:

.card < display: flex; flex-direction: column; padding: 1rem; >.card__content < display: contents; >.card h3

Это позволяет контролировать все дочерние элементы, при необходимости гибко настраивая их порядок свойством order .

Есть небольшая проблема: мы добавили padding: 1rem к родительскому элементу, поэтому изображение должно прилипать к краям. Вот как исправить ситуацию:

.card img

Центрирование

Можно встретить много шуток о том, что центрирование — это сложно. Но в наши дни центрировать элемент проще, чем когда-либо. Больше не нужно использовать position: absolute с transform . К примеру, для центрирования flex-элемента по горизонтали и по вертикали можно воспользоваться margin: auto :

.card < display: flex; >.card__image

Я написал полное руководство по центрированию в CSS.

Соотношение сторон изображения

Новое свойство CSS aspect-ratio сегодня поддерживается во всех основных браузерах. Чтобы заставить бокс соблюдать определённое соотношение сторон, раньше мы использовали этот хак с padding :

.card__thumb < position: relative; padding-top: 75%; >.card__thumb img

С aspect-ratio соблюдать соотношения проще:

/* */ .card__thumb < position: relative; aspect-ratio: 4/3; >

Иногда лучше position: absolute

В этом примере содержимое (аватар, имя и ссылка) перекрывается обложкой карточки. У нас есть два варианта:

  1. position: absolute для обложки карточки;
  2. отрицательный margin для содержимого.

Посмотрим на два других решения. Какое из них больше подходит для нашего случая?

Использование абсолютного позиционирования

Так мы можем позиционировать прямоугольник абсолютно, а затем добавить padding: 1rem к содержимому карточки:

.card__cover < position: absolute; left: 0; top: 0; width: 100%; height: 50px; >.card__content

Таким образом, когда обложка карточки будет убрана, нам не придётся изменять CSS.

Использование отрицательного margin

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

.card__content

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

Обратите внимание, что аватар находится за пределами своего родителя (карточки). Чтобы исправить это, изменим CSS и уберём отрицательный margin :

.card--no-cover .card__content

Лучшим решением оказалось position: absolute . Здесь это свойство избавляет от лишнего CSS.

Дополнительные материалы

  • Райан Маллиган опубликовал отличную статью о позиционировании оверлейного контента с помощью CSS-grid.
  • Стефани Эклз написала замечательную статью об использовании CSS-grid для построения разделов hero.

Разобраться в современном CSS вы сможете на наших курсах:

  • Узнать подробности акции
  • Профессия Frontend-разработчик (7 месяцев)
  • Профессия Fullstack-разработчик на Python (15 месяцев)

Другие профессии и курсы

Data Science и Machine Learning

  • Профессия Data Scientist
  • Профессия Data Analyst
  • Курс «Математика для Data Science»
  • Курс «Математика и Machine Learning для Data Science»
  • Курс по Data Engineering
  • Курс «Machine Learning и Deep Learning»
  • Курс по Machine Learning

Python, веб-разработка

  • Профессия Fullstack-разработчик на Python
  • Курс «Python для веб-разработки»
  • Профессия Frontend-разработчик
  • Профессия Веб-разработчик

Мобильная разработка

  • Профессия iOS-разработчик
  • Профессия Android-разработчик

Java и C#

  • Профессия Java-разработчик
  • Профессия QA-инженер на JAVA
  • Профессия C#-разработчик
  • Профессия Разработчик игр на Unity

От основ — в глубину

  • Курс «Алгоритмы и структуры данных»
  • Профессия C++ разработчик
  • Профессия Этичный хакер

А также

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *