Горизонтально центрируйте изображение, которое выходит за пределы своего контейнера в gatsby-comment-images

У меня есть сайт 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;
}

Как я могу центрировать все это по горизонтали?

Я думаю, что есть два возможных способа решить эту проблему:

  1. центрируйте изображение с помощью margin: 0 auto; и найдите другой способ заставить его переполнить родительский
  2. найти способ центрировать образ без margin и без flexbox

Любые идеи?

здесь отсутствует точка .gatsby-resp-image-image, вы пытались добавить left: 50% к изображениям

godfather 24.12.2018 12:50

Спасибо @godfather, точка была опечаткой :) Проблема с левым полем в том, что я должен добавить его как к изображению-заполнителю base64 (фон <span>, так и к фактическому изображению, которое является потомком <span>. Мне интересно, нет ли более простого и чистого решения

Robin Métral 24.12.2018 17:37
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
2
2 304
1

Ответы 1

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

.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>

Спасибо! Мне это не совсем подходит, но работает наоборот: внешняя оболочка обрабатывает отрицательные поля, а дочерняя оболочка обрабатывает центрирование.

Robin Métral 24.12.2018 18:56

Другие вопросы по теме