Я пытался разобраться, как центрировать увеличенное изображение внутри div, используя только CSS.
Мы используем гибкий макет, поэтому ширина контейнеров с изображениями зависит от ширины страницы (высота div фиксирована). Изображение находится внутри элемента div со значением вставной тени, чтобы оно выглядело так, как будто вы просматриваете страницу на изображении.
Само изображение было изменено по размеру, чтобы заполнить окружающий элемент с максимально широким значением (дизайн имеет max-width
значение).
Это довольно легко сделать, если изображение меньше окружающего элемента div:
margin-left: auto;
margin-right: auto;
display: block;
Но когда изображение больше, чем div, оно просто начинается с левого края и смещается от центра вправо (мы используем overflow: hidden
).
Мы могли бы назначить width=100%
, но браузеры делают паршивую работу по изменению размера изображений, а веб-дизайн сосредотачивается вокруг высококачественных изображений.
Какие-нибудь идеи по центрированию изображения так, чтобы overflow:hidden
обрезать оба края равномерно?
Ответы:
Попробуйте что-то вроде этого. Это должно центрировать любой огромный элемент по центру по вертикали и горизонтали относительно его родителя независимо от их размеров.
источник
-100%
для верхней / правой / нижней / левой? При этом контейнер может иметь буквально любую ширину.-100%
проблемой ^^. Btw: если вы добавляетеmin-width
иmin-height
из100%
вас в основном получитьbackground-size: cover;
поведение с тегами изображения -> jsfiddleЭто старый Q, но современное решение без flexbox или абсолютного положения работает следующим образом.
Показать фрагмент кода
Так почему же это работает?
На первый взгляд кажется, что мы сдвигаемся на 50% вправо, а затем снова на 50% влево. Это приведет к смещению нуля, и что?
Но 50% - это не одно и то же, потому что важен контекст. Если вы используете относительные единицы измерения, поле будет рассчитываться в процентах от ширины родительского элемента, а преобразование будет на 50% относительно того же элемента.
У нас есть такая ситуация, прежде чем мы добавим CSS
С добавленным стилем
margin-left: 50%
мы имеемИ
transform: translateX(-50%)
сдвиг назад влевоК сожалению, это работает только для горизонтального центрирования, так как процентное соотношение маржи всегда зависит от ширины. Т.е. не только
margin-left
иmargin-right
, но такжеmargin-top
иmargin-bottom
рассчитываются по ширине.Совместимость браузера не должна быть проблемой: https://caniuse.com/#feat=transforms2d
источник
margin-top: 50%
будет 50% ширины . не высота, как хотелось бы.-webkit-transform: translateX(-50%);
для хорошей меры)Поместите большой div внутри div, центрируйте его, и центр изображения внутри этого div.
Это центрирует его горизонтально:
HTML:
CSS:
Демо: http://jsfiddle.net/Guffa/L9BnL/
Чтобы отцентрировать его по вертикали, вы можете использовать то же самое для внутреннего div, но вам понадобится высота изображения, чтобы поместить его абсолютно внутри него.
источник
width
настройку для контейнера, это будет ширина родительского элемента, и изображение будет отцентрировано, даже если страница уже, чем изображение, то есть столько левого края, сколько правого края будет скрыто : jsfiddle.net/Guffa/L9BnL/2Поздно к игре, но я нашел этот метод чрезвычайно интуитивно понятным. https://codepen.io/adamchenwei/pen/BRNxJr
CSS
HTML
источник
display: flex
на родительском контейнере иalign-self: center
на изображении. Вот оптимизированная версия: codepen.io/anon/pen/dWKyeyНе используйте фиксированную или явную ширину или высоту для тега изображения. Вместо этого кодируйте это:
Например: http://jsfiddle.net/xwrvxser/1/
источник
Я большой поклонник создания изображения в качестве фона div / узла - тогда вы можете просто использовать
background-position: center
атрибут для его центрирования независимо от размера экранаисточник
Ширина и высота только для примера:
Это должно работать для вас, если левая и верхняя часть вашего родительского div не являются самой верхней и левой частью окна вашего экрана. Меня устраивает.
источник
Я обнаружил, что это более элегантное решение без flex:
источник
Опираясь на отличный ответ @ yunzen:
Я предполагаю, что многие люди, ищущие эту тему, пытаются использовать большое изображение в качестве фонового изображения «героя», например, на домашней странице. В этом случае они часто хотят, чтобы текст появлялся поверх изображения и чтобы он хорошо масштабировался на мобильных устройствах.
Вот идеальный CSS для такого фонового изображения (используйте его на
<img>
теге):источник
Один из вариантов, который вы можете использовать, -
object-fit: cover
он немного похожbackground-size: cover
. Подробнее об объекте .игнорируйте все JS ниже, это только для демонстрации.
Ключевым моментом здесь является то, что вам нужно установить изображение внутри оболочки и дать ему следующие свойства.
Я создал демо ниже, где вы меняете высоту / ширину обертки и видите в игре. Изображение всегда будет вертикально и горизонтально. Это займет 100% его родительской ширины и высоты, и не будет растягиваться / сдавливаться. Это означает, что соотношение сторон изображения сохраняется. Изменения применяются путем увеличения / уменьшения масштаба.
Единственным недостатком
object-fit
является то, что он не работает на IE11.источник