부모 컨테이너의 높이 백분율로 여백 또는 패딩을 설정하는 방법은 무엇입니까?


236

나는 다음을 사용하여 CSS에서 수직 정렬을 만드는 것에 대해 내 두뇌를 쌓아 두었다.

.base{
        background-color:green;
	    width:200px;
	    height:200px;
	    overflow:auto;
	    position:relative;
	}

    .vert-align{
		padding-top:50%;
		height:50%;
	}
<!-- and used the following div structure. -->

    <div class="base">
       <div class="vert-align">
    	   Content Here
       </div>
    </div>

이것이이 경우에는 효과가있는 것처럼 보이지만 기본 div의 너비를 늘리거나 줄이면 세로 정렬이 스냅됩니다. padding-top 속성을 설정할 때 부모 컨테이너 높이의 백분율로 패딩을 취할 것으로 기대했지만 우리의 경우 기본 값이지만 위의 50 % 값은 폭. :(

JavaScript를 사용하지 않고 패딩 및 / 또는 여백을 높이의 백분율로 설정하는 방법이 있습니까?

답변:


223

수정 네, 수직 패딩과 마진의 폭을 기준이지만,이다 topbottom 아니다.

그래서 또 다른 내부 사업부를 배치하고 같은 내부 사업부에서 사용 무언가 top:50%(기억 position이 여전히 작동하지 않으면 문제를)


3
top브라우저 / 창 높이를 기준으로 크기를 조정하는 데 효과적입니다. 그 div 아래에 div가 있습니까? clear두 번째 div가 어떻게 div 아래로 이동 합니까 top:50%?
Federico

sth new를 배우십시오. 수직 패딩과 여백을 알지 못했기 때문에 너비와 관련이 있습니다. 감사합니다.
shaosh

5
설정된 백분율 높이로 '스페이서'div를 추가 할 수도 있습니다. 조금 더러워 보이지만 작동합니다. 이 답변을 참조하십시오 .
WCByrne

4
영속적 인 @ %! ^? 왜 수직 여백과 패딩이 너비에 상대적 입니까? 뭐? 이 결정이 내려진 이유는 무엇입니까?
temporary_user_name

귀하의 답변은 아래의 알랭의 답변과 비교하여 상당히 불균형 적으로 투표되어 일반적인 해결책을 제시하며 매우 도움이되었고 거의 보지 못했습니다. top: 50%자신의 중심으로 내용을 정렬 해야하는 경우별로 유용하지 않습니다.
okovko

35

약간 다른 질문에 대한 답변 : vh단위를 사용 하여 요소를 뷰포트 중앙에 채울 수 있습니다 .

.centerme {
    margin-top: 50vh;
    background: red;
}

<div class="centerme">middle</div>

왜이 답변이 더 높은 투표를하지 않습니까? vh 사용에 문제가 있습니까?
AlanH

3
원래 질문에 맞는 답변이 아니기 때문에 몇 가지 관련 사례에서만 작동하는 유용한 트릭입니다.
willoller

사용 vh은 백분율과 거의 동일합니다. 어떤 경우에는 더 나쁩니다. 이 답변은 질문과 관련이 없습니다
vsync

33

필요한 동작을 에뮬레이트하는 두 가지 옵션이 있습니다. 일반적인 해결책은 아니지만 경우에 따라 도움이 될 수 있습니다. 여기서 수직 간격은 부모가 아닌 외부 요소의 크기를 기준으로 계산되지만이 크기 자체는 부모를 기준으로 할 수 있으며 간격도 상대적입니다.

<div id="outer">
    <div id="inner">
        content
    </div>
</div>

첫 번째 옵션 : 의사 요소를 사용하십시오. 여기서 세로 및 가로 간격은 바깥 쪽을 기준으로합니다. 데모

#outer::before, #outer::after {
    display: block;
    content: "";
    height: 10%;
}
#inner {
    height: 80%;
    margin-left: 10%;
    margin-right: 10%;
}

수평 간격을 외부 요소로 이동하면 외부 요소의 부모를 기준으로합니다. 데모

#outer {
    padding-left: 10%;
    padding-right: 10%;
}

두 번째 옵션 : 절대 위치 지정을 사용하십시오. 데모

#outer {
    position: relative;
}
#inner {
    position: absolute;
    left: 10%;
    right: 10%;
    top: 10%;
    bottom: 10%;
}

10

자식 요소를 부모 요소에서 절대적으로 배치하려면 부모 요소의 상대 위치와 자식 요소의 절대 위치를 설정해야합니다.

그런 다음 자식 요소 'top'은 부모의 높이와 관련이 있습니다. 따라서 자녀의 키를 자신의 키의 50 %로 상향 변환해야합니다.

.base{
    background-color: green;
    width: 200px;
    height: 200px;
    overflow: auto;
    position: relative;
}
    
.vert-align {
    position: absolute;
    top: 50%;
    transform: translate(0, -50%);
}
    <div class="base">
        <div class="vert-align">
            Content Here
        </div>
    </div>

플렉스 박스를 사용하는 또 다른 해결책이 있습니다.

.base{
    background-color:green;
    width: 200px;
    height: 200px;
    overflow: auto;
    display: flex;
    align-items: center;
}
<div class="base">
    <div class="vert-align">
        Content Here
    </div>
</div>

당신은 둘 다에 대한 장점 / 불만을 찾을 수 있습니다.


1
번역을 사용하는 것은 요소를 자신의 크기에 대해 수직으로 움직이는 유일한 방법입니다.
Eran Goldin

고마워 이것이 정답입니다.
Wessam El Mahdy

6

이것은 writing-mode속성 으로 달성 할 수 있습니다 . 요소 writing-mode를 세로 쓰기 모드 (예 :와 같이)로 설정하면 vertical-lr두 차원에서 패딩 및 여백에 대한 하위 항목의 백분율 값이 너비 대신 높이를 기준으로합니다.

로부터 사양 :

. . . CSS2.1의 포함 블록 너비와 관련하여 항상 계산되는 margin 및 padding 속성의 백분율 은 CSS3의 포함 블록 의 인라인 크기 와 관련하여 계산됩니다 .

인라인 크기 의 정의 :

인라인 치수 측정 : 가로 쓰기 모드의 실제 너비 (가로 치수) 및 세로 쓰기 모드의 실제 높이 (세로 치수)를 나타냅니다.

예를 들어, 크기 조정 가능한 요소가있는 경우, 가로 여백은 너비를 기준으로하고 세로 여백은 높이를 기준으로합니다.

.resize {
  width: 400px;
  height: 200px;
  resize: both;
  overflow: hidden;
}

.outer {
  height: 100%;
  background-color: red;
}

.middle {
  writing-mode: vertical-lr;
  margin: 0 10%;
  width: 80%;
  height: 100%;
  background-color: yellow;
}

.inner {
  writing-mode: horizontal-tb;
  margin: 10% 0;
  width: 100%;
  height: 80%;
  background-color: blue;
}
<div class="resize">
  <div class="outer">
    <div class="middle">
      <div class="inner"></div>
    </div>
  </div>
</div>

세로 쓰기 모드를 사용하면 요소의 가로 세로 비율을 일정하게 유지하려고하지만 너비 대신 높이에 따라 크기를 조정하려는 경우에 특히 유용 할 수 있습니다.


이것은 IMO가 더 우아한 솔루션이지만 (2018-05-05 기준) 세로 쓰기 모드는 잘 지원되지 않습니다 . 잘만되면 그것은 곧 바뀐다.
zanerock

1
@zanerock MDN compat 테이블이 오래되었다고 확신합니다. 예를 들어, Safari에는 -webkit-접두사가 필요 하지만 Caniuse 에 따르면 Safari 11부터 접두사가 필요하지 않았습니다. 작동하지 않는 브라우저로 시도 했습니까?
James T

1
아니, 나는 그것이 좋고 자동화되었다고 생각했음을 인정해야합니다.
zanerock

4

한 줄 텍스트를 가운데에 맞추는 다른 방법은 다음과 같습니다.

.parent{
  position: relative;
}

.child{
   position: absolute;
   top: 50%;
   line-height: 0;
}

아니면 그냥

.parent{
  overflow: hidden; /* if this ins't here the parent will adopt the 50% margin of the child */
}

.child{
   margin-top: 50%;
   line-height: 0;
}

0

50 % 패딩은 자녀를 중앙에 배치하지 않으며 중앙 아래에 배치합니다. 나는 당신이 정말로 25 %의 패딩 탑을 원한다고 생각합니다. 콘텐츠가 커질수록 공간이 부족할 수 있습니다. 또한 padding-top 대신 margin-top을 설정해 보셨습니까?

편집 : 신경 쓰지 마라, w3schools 사이트는 말합니다

% 포함 요소 너비의 백분율로 패딩을 지정합니다.

어쩌면 항상 너비를 사용합니까? 나는 눈치 채지 못했다.

display : table을 사용하여 수행 할 수 있습니다 (적어도 최신 브라우저에서는). 이 기술은 여기에 설명되어 있습니다 .


1
고마워요 50 %가 div의 컨텐츠를 중심으로하지 않을 것임을 이해합니다. 실제로 세로로 가운데에 맞춰야하는 한 줄의 텍스트 만 있습니다. 그래도 링크 주셔서 감사합니다!
Ryan

3
한 줄의 텍스트라면 엄청나게 큰 것을 사용하는 것을 고려해 line-height보았습니다. 예를 들어 줄 높이를 200px로 만드시겠습니까?
SpliFF

텍스트를 세로로 가운데 맞추려면 @Ryan, stackoverflow.com/questions/8865458/…를
사용자

귀하의 링크가 깨진
quemeful

0

이것은 매우 흥미로운 버그입니다. (제 생각에는, 그것은 버그입니다) Nice find!

그것을 설정 하는 방법 에 관해서 는 Camilo Martin의 답변을 추천합니다. 그러나 , 나는 당신이 마음에 들지 않으면 이것을 조금 설명하고 싶습니다.


에서 CSS의 사양 내가 발견

'패딩'
백분율 : 포함 블록의 너비 참조

… 이상하지만 괜찮습니다.

따라서 부모 width: 210px와 자식의 padding-top: 50%경우 계산 / 계산 된 값 padding-top: 96.5px– – 예상치가 아닙니다 105px.

Windows (다른 OS에 대해서는 잘 모르겠습니다)에서 공통 스크롤 막대의 크기는 기본 17px × 100%(또는 100% × 17px가로 막대)입니다. 이들은 17pxsubstracted되어 전에 를 산출 50%따라서 50% of 193px = 96.5px.


사양에 대한 이유가 있으며, 더 잘 설명합니다. hongkiat.com/blog/calculate-css-percentage-margins
manikanta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.