У меня есть сайт Gatsby.js, использующий gatsby-remark-images для обработки изображений в моих статьях с уценкой.
Статьи имеют фиксированную ширину, но изображения переполняются с обеих сторон:
margin: 0 -15rem;
Это отлично работает для больших изображений, занимающих всю ширину, но изображения меньшего размера не центрируются внутри родительского.
Я бы хотел использовать решение flexbox, например этот ответ, но оно не работает, потому что gatsby-remark-images полагается на display: block; правильно позиционирует изображение заполнителя base64 вместе с изображением высокого разрешения.
Текущий сгенерированный html выглядит так:
<span class = "gatsby-resp-image-wrapper">
<span class = "gatsby-resp-image-background-image"> <!-- the base64 image is a background of this span -->
<img
class = "gatsby-resp-image-image"
alt = "My image"
src = "/static/b07bc/my-image.jpg"
srcset = "
/static/d942e/my-image.jpg 320w,
/static/c1221/my-image.jpg 640w,
/static/b07bc/my-image.jpg 1280w"
sizes = "(max-width: 1280px) 100vw, 1280px"
>
</span>
</span>
И стили:
.gatsby-resp-image-wrapper {
position: relative;
display: block; /* for base64 image placeholder */
margin: 0 -15rem; /* overflowing parent container */
max-width: 1280px;
}
.gatsby-resp-image-background-image { /* this is the base64 image */
padding-bottom: 75%;
position: relative;
bottom: 0;
left: 0;
background-image: url('data:image/jpeg;base64,/some/url/');
background-size: cover;
display: block;
}
.gatsby-resp-image-image {
width: 100%;
height: 100%;
margin: 0;
vertical-align: middle;
position: absolute;
top: 0;
left: 0;
}
Как я могу центрировать все это по горизонтали?
Я думаю, что есть два возможных способа решить эту проблему:
margin: 0 auto; и найдите другой способ заставить его переполнить родительскийmargin и без flexboxЛюбые идеи?
Спасибо @godfather, точка была опечаткой :) Проблема с левым полем в том, что я должен добавить его как к изображению-заполнителю base64 (фон <span>, так и к фактическому изображению, которое является потомком <span>. Мне интересно, нет ли более простого и чистого решения






Вы можете добавить внешнюю оболочку, которая обрабатывает центрирование, и позволить существующей оболочке изображения обрабатывать отрицательное переполнение поля.
.outer-wrapper {
margin: 0 auto;
max-width: 600px;
position: relative;
}
.gatsby-resp-image-wrapper {
position: relative;
display: block; /* for base64 image placeholder */
margin: 0 -15rem; /* overflowing parent container */
}
.gatsby-resp-image-background-image {
/* this is the base64 image */
padding-bottom: 75%;
position: relative;
bottom: 0;
left: 0;
background-size: cover;
display: block;
}
.gatsby-resp-image-image {
width: 100%;
height: 100%;
margin: 0;
vertical-align: middle;
position: absolute;
top: 0;
left: 0;
}<div class = "outer-wrapper">
<span class = "gatsby-resp-image-wrapper">
<span class = "gatsby-resp-image-background-image"> <!-- the base64 image is a background of this span -->
<img
class = "gatsby-resp-image-image"
alt = "My image"
src = "https://picsum.photos/600/400"
srcset = "https://picsum.photos/600/400 320w,
https://picsum.photos/600/400 640w,
https://picsum.photos/600/400 1280w"
sizes = "(max-width: 1280px) 100vw, 1280px"
>
</span>
</span>
</div>Спасибо! Мне это не совсем подходит, но работает наоборот: внешняя оболочка обрабатывает отрицательные поля, а дочерняя оболочка обрабатывает центрирование.
здесь отсутствует точка .gatsby-resp-image-image, вы пытались добавить left: 50% к изображениям