Div의 중앙 대형 이미지


175

CSS 만 사용하여 div 내에서 대형 이미지를 가운데에 배치하는 방법을 정렬하려고했습니다.

유동적 인 레이아웃을 사용하고 있으므로 이미지 컨테이너의 너비는 페이지 너비에 따라 달라집니다 (div의 높이는 고정되어 있음). 이미지는 페이지에서 페이지를 보는 것처럼 보이도록 삽입 상자 그림자가있는 div 안에 있습니다.

이미지 자체는 가능한 가장 넓은 값 (디자인에 max-width값이 있음)으로 주변 div를 채우도록 크기가 조정되었습니다 .

이미지가 주변 div보다 작은 경우 매우 쉽습니다.

margin-left: auto;
margin-right: auto;
display: block; 

그러나 이미지가 div보다 크면 왼쪽 가장자리에서 시작하여 오른쪽 중앙에서 벗어납니다 (우리는 사용 중입니다 overflow: hidden).

우리는을 할당 할 수 width=100%있지만 브라우저는 이미지의 크기를 조정하고 웹 디자인 센터는 고품질 이미지를 중심으로합니다.

이미지를 overflow:hidden중앙에 배치하여 양쪽 가장자리를 고르게 자르는 아이디어가 있습니까?


2
이 문제를 @Tom으로 해결 한 적이 있습니까? 현재 같은 문제가 발생합니다. :)
ctrlplusb

이미지 너비가 다양하다고 가정합니다.
otherDewi

답변:


365

이와 같은 것을 시도하십시오. 크기에 관계없이 부모와 관련하여 세로 및 가로 가운데에 큰 요소가 가운데에 있어야합니다.

.parent {
    position: relative;
    overflow: hidden;
    //optionally set height and width, it will depend on the rest of the styling used
}

.child {
    position: absolute;
    top: -9999px;
    bottom: -9999px;
    left: -9999px;
    right: -9999px;
    margin: auto;

}

4
훌륭합니다 : 이것은 어떤 요소와도 작동합니다. HTML 5 비디오에서도 ... 감사합니다!
taseenb

3
내가 이해하는 것처럼 : 그것은 이미지 (2 * 9999px x 2 * 9999px)보다 큰 요소를 생성하고 (요소 : 자동) 이미지의 중심에 있기 때문에 작동합니다. 따라서 이미지가 2 * 9999px를 초과하지 않는 한 작동합니다.
Michael Krupp 2016 년

16
-100%위 / 오른쪽 / 아래 / 왼쪽에 사용하지 않습니까? 이를 통해 컨테이너는 문자 그대로 모든 너비를 가질 수 있습니다 .
Simon

15
그래도 -100%문제 가 발생했습니다 ^^. BTW : 추가하는 경우 min-widthmin-height100%당신 기본적으로 얻을 background-size: cover;-> 이미지 태그와 동작을 jsfiddle
사이먼

3
@HarrisonPowers 글쎄요 부모님은 물론 고정적이든 동적이든 높이를 가져야합니다. 다른 콘텐츠가 div를 채우고 높이를 가져 오는 경우에도 작동합니다 (예 : 텍스트).
hyounis 2011

162

이것은 오래된 Q이지만 flexbox 또는 위치 절대가없는 현대적인 솔루션은 다음과 같이 작동합니다.

margin-left: 50%;
transform: translateX(-50%);

왜 작동합니까?
언뜻보기에 우리는 오른쪽으로 50 %, 왼쪽으로 다시 50 % 이동합니다. 그러면 제로 시프트가 발생하므로 어떻게해야합니까?
그러나 상황이 중요하기 때문에 50 %는 동일하지 않습니다. 상대 단위를 사용하는 경우 여백은 부모 요소 너비의 백분율로 계산되며 변환은 동일한 요소에 대해 50 % 입니다.

CSS를 추가하기 전에 이런 상황이 있습니다

       +-------------------------------------------+
       | Parent element P of E                     |
       |                                           |
       +-----------------------------------------------------------+
       | Element E                                                 |
       +-----------------------------------------------------------+
       |                                           |
       +-------------------------------------------+

추가 된 스타일로 margin-left: 50%우리가

       +-------------------------------------------+
       | Parent element P of E                     |
       |                                           |
       |                     +-----------------------------------------------------------+
       |                     | Element E                                                 |
       |                     +-----------------------------------------------------------+
       |                     |                     |
       +---------------------|---------------------+
       |========= a ========>|

       a is 50% width of P

그리고 transform: translateX(-50%)왼쪽으로 이동

       +-------------------------------------------+
       | Parent element P of E                     |
       |                                           |
+-----------------------------------------------------------+
| Element E                 |                               |
+-----------------------------------------------------------+
|<============ b ===========|                      |
       |                    |                      |
       +--------------------|----------------------+
       |========= a =======>|

       a is 50% width of P
       b is 50% width of E

불행하게도 이것은 마진 백분율 계산이 항상 너비를 기준으로하기 때문에 수평 중심에 대해서만 작동합니다. 즉뿐만 margin-left하고 margin-right, 또한 margin-topmargin-bottom폭에 대해 계산된다.

브라우저 호환성은 문제가되지 않습니다 : https://caniuse.com/#feat=transforms2d


수직 정렬에는 작동하지 않습니다 (. 내부의 높이가 외부보다 클 때)
cronfy

1
@cronfy 아니요. 세로로 작동 margin-top: 50%하면 너비의 50 % 이므로 작동하지 않습니다 . 원하는 높이가 아닙니다.
yunzen

2
그것이 가장 우아한 해결책입니다
Souhaieb Besbes

한동안, 가장, 가장 간단한 솔루션을 찾는 것; 건배
lauWM

2
이것은 순수한 마법사 마법입니다. 감사합니다! 사파리와 크롬에서 완벽하게 작동합니다 ( -webkit-transform: translateX(-50%);좋은 측정을 위해 추가됨 )
Nick Schneble

22

div 안에 큰 div를 넣고 가운데에 이미지를 중앙에 배치하십시오.

가로로 가운데에 배치됩니다.

HTML :

<div class="imageContainer">
  <div class="imageCenterer">
    <img src="http://placekitten.com/200/200" />
  </div>
</div>

CSS :

.imageContainer {
  width: 100px;
  height: 100px;
  overflow: hidden;
  position: relative;
}
.imageCenterer {
  width: 1000px;
  position: absolute;
  left: 50%;
  top: 0;
  margin-left: -500px;
}
.imageCenterer img {
  display: block;
  margin: 0 auto;
}

데모 : http://jsfiddle.net/Guffa/L9BnL/

수직으로 중앙에 배치하려면 내부 div에 동일한 것을 사용할 수 있지만 이미지를 절대적으로 안에 넣으려면 이미지의 높이가 필요합니다.


결국 "imageContainer"내에서 이미지의 왼쪽 가장자리가 나타납니다. 위에서 언급했듯이 이미지 컨테이너 div는 유체 너비와 고정 높이입니다.
Tom

1
@Tom : width컨테이너 의 설정을 제거하면 부모의 너비가되고 페이지가 이미지보다 좁아도 이미지가 중앙에 나타납니다. 즉, 오른쪽 가장자리만큼 왼쪽 가장자리가 숨겨집니다 : jsfiddle.net/Guffa/L9BnL/2
Guffa

영감을 주셔서 감사합니다. .imageCenter에 position : relative을 사용합니다. 이렇게하면 부모 컨테이너에 상대적인 위치가 필요하지 않습니다.
user3153298 2016 년

이 질문에는 많은 영리한 속임수가 있으며 모두 단점이 있습니다. 일부 작업은 "더 나은"작업이지만 전혀 이해하기 쉽지 않습니다. 이 솔루션은 완벽하게 이해됩니다. 이미지는 자르는 더 넓은 div의 중심에 있습니다. 느낌이 잘못되었지만 웹 물리 법칙을 어 기지 않으면 서 확실히 작동합니다. 조금 더러워 져도 이해하기 어려운 몇 가지 다른 트릭보다이 옵션을 선택했습니다.
Radley Sustaire

9

게임에 늦었지만이 방법이 매우 직관적이라는 것을 알았습니다. https://codepen.io/adamchenwei/pen/BRNxJr

CSS

.imageContainer {
  border: 1px black solid;

  width: 450px;
  height: 200px;
  overflow: hidden;
}
.imageHolder {
  border: 1px red dotted;

  height: 100%;
  display:flex;
  align-items: center;
}
.imageItself {
  height: auto;
  width: 100%;
  align-self: center;

}

HTML

<div class="imageContainer">
  <div class="imageHolder">
    <img class="imageItself" src="http://www.fiorieconfetti.com/sites/default/files/styles/product_thumbnail__300x360_/public/fiore_viola%20-%202.jpg" />
  </div>
</div>

3
좋은! 또한 단순화 될 수 있습니다. 트릭은 display: flex부모 컨테이너와 align-self: center이미지에서 수행됩니다. : 여기에 최적화 된 버전의 codepen.io/anon/pen/dWKyey
caiosm1005

5

이미지 태그에 고정 된 너비 나 높이를 사용하지 마십시오. 대신 코드를 작성하십시오.

      max-width:100%;
      max-height:100%;

예 : http://jsfiddle.net/xwrvxser/1/


1
그런 다음 피하려고하는 이미지 주위에 공간을 남겨 둡니다.
Eoin

3

나는 이미지를 div / node의 배경으로 만드는 것을 좋아합니다. 그런 다음 background-position: center화면 크기에 관계없이 속성을 사용하여 중앙에 배치 할 수 있습니다


9
이것은 이미지를 사용하는 접근 방법이 아닙니다. 장식용 이미지에는 잘 작동하지만 유익한 이미지는 대체 텍스트가 필요합니다.
user2532030

0

너비와 높이는 예를 들어 다음과 같습니다.

parentDiv{
    width: 100px;
    height: 100px;
    position:relative; 
}
innerDiv{
    width: 200px;
    height: 200px;
    position:absolute; 
    margin: auto;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}

부모 div의 왼쪽과 상단이 화면 창의 맨 위와 왼쪽이 아닌 경우 작동해야합니다. 그것은 나를 위해 작동합니다.


차이를 보이지 않는 것 같습니다. 너비가 유동적이므로 높이가 부모 div에 고정되어 있기 때문에 어떤 것이 있는지 확실하지 않습니다.
Tom

2
이 기술은 이미지가 컨테이너보다 작은 경우 작동합니다.
otherDewi

0

나는 이것이 플렉스가없는보다 우아한 솔루션이라는 것을 알았습니다.

.wrapper {
    overflow: hidden;
}
.wrapper img {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    /* height: 100%; */ /* optional */
}

0

@yunzen의 위대한 대답을 바탕으로 :

이 주제를 검색하는 많은 사람들이 예를 들어 홈페이지에서 "영웅"배경 이미지로 큰 이미지를 사용하려고하는 것 같습니다. 이 경우 종종 이미지 위에 텍스트가 나타나고 모바일 장치에서 잘 축소되도록하려고합니다.

이러한 배경 이미지에 대한 완벽한 CSS는 다음과 같습니다 ( <img>태그에 사용).

/* Set left edge of inner element to 50% of the parent element */
margin-left: 50%;

/* Move to the left by 50% of own width */
transform: translateX(-50%);

/* Scale image...(101% - instead of 100% - avoids possible 1px white border on left of image due to rounding error */
width: 101%;

/* ...but don't scale it too small on mobile devices - adjust this as needed */
min-width: 1086px;

/* allow content below image to appear on top of image */
position: absolute;
z-index: -1;

/* OPTIONAL - try with/without based on your needs */
top: 0;

/* OPTIONAL - use if your outer element containing the img has "text-align: center" */
left: 0;

-1

사용할 수있는 옵션 중 하나는 object-fit: cover다음과 같이 동작합니다 background-size: cover. object-fit 에 대한 추가 정보 .

아래의 모든 JS는 무시하십시오. 데모 용입니다.

여기서 핵심은 래퍼 내부에 이미지를 설정하고 다음 속성을 제공해야한다는 것입니다.

.wrapper img {
  height: 100%;
  width: 100%;
  object-fit: cover;
}

래퍼의 높이 / 너비를 변경하고 게임에서 볼 수있는 데모를 아래에서 만들었습니다. 이미지는 항상 수직 및 수평 중앙에 위치합니다. 부모 너비와 높이의 100 %를 차지하며 늘어나거나 찌그러지지 않습니다. 이것은 이미지의 종횡비가 유지됨을 의미합니다. 대신 확대 / 축소하여 변경 사항이 적용됩니다.

유일한 단점 object-fit은 IE11에서 작동하지 않는다는 것 입니다.

// for demo only
const wrapper = document.querySelector('.wrapper');
const button = document.querySelector('button');
const widthInput = document.querySelector('.width-input');
const heightInput = document.querySelector('.height-input');


const resizeWrapper = () => {
  wrapper.style.width = widthInput.value + "px";
  wrapper.style.height = heightInput.value + "px";
}

button.addEventListener("click", resizeWrapper);
.wrapper {
  overflow: hidden;
  max-width: 100%;
  margin-bottom: 2em;
  border: 1px solid red;
}

.wrapper img {
  display: block;
  height: 100%;
  width: 100%;
  object-fit: cover;
}
<div class="wrapper">
  <img src="https://i.imgur.com/DrzMS8i.png">
</div>


<!-- demo only -->
<lable for="width">
  Width: <input name="width" class='width-input'>
</lable>
<lable for="height">
  height: <input name="height" class='height-input'>
</lable>
<button>change size!</button>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.