CSS를 사용하여 DIV를 불균등하게 중앙에 배치


23

flexbox를 사용하여 다른 DIV 내부에 DIV를 배치하고 있습니다. 필요할 때 화면 중앙에 나타나는 대화 상자를 생각해보십시오.

잘 작동하지만 대화 상자 위와 아래의 공간이 정확히 같지 않으면 나머지 공간의 40 %가 대화 상자보다 높고 60 % 아래에 있습니다. 대화 상자 높이는 내부 텍스트의 양에 따라 달라지기 때문에 까다로워집니다.

예를 들어 브라우저 높이가 1000px이고 대화 상자 높이가 400px이면 나머지 수직 공간 (600px)은 대화 상자보다 240px 이상, 360px 아래로 설정하고 싶습니다. Javascript로 할 수는 있지만 CSS에 영리한 방법이 있는지 궁금합니다. #dialogBox DIV에 아래쪽 여백을 추가하려고 시도했지만 대화 상자 높이가 브라우저 높이에 가까워지면 작동하지 않습니다.

#dialogBoxPanel
  {
  position:absolute;
  display:flex;
  align-items:center;
  justify-content:center;
  left:0px;
  top:0px;
  width:100%;
  height:100%;
}
#dialogBox
  {
  width:350px;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Text</div>
</div>


전체 뷰포트를 덮기 위해 외부 패널이 필요합니까? 그렇지 않은 경우 css-tricks.com/centering-css-complete-guide 의 솔루션을 사용하여 "수평 및 수직 / 알 수없는 너비와 높이의 요소입니까?"섹션을 참조하고 변환 백분율 값을 수정하십시오. (그리고 부모의 전체 뷰포트 크기가 필요한 경우에도 [배경?], 둘 다 결합 할 수 있어야합니다. 플렉스 항목을 사용하지
말고

예, 외부 패널에 흐리게 효과가 있으므로 전체 뷰포트를 덮어야합니다. 그러나 그 안에 다른 DIV를 추가 할 수 있으며 솔루션이 제대로 작동합니다. 감사합니다 04FS!
Björn Morén

정확성을 위해 가운데 맞춤이 아니라 세로 맞춤에 대해 이야기하고 있습니다.
Michael Benjamin

답변:


11

의사 요소와 열 방향을 사용하여 공백을 시뮬레이션하십시오. flex-grow의사 요소의 조정 만으로 여유 공간이 얼마나 필요한지 제어 할 수 있습니다. 동일한 플렉스 성장은 동일한 공간을 제공합니다.

2및 을 사용할 수도 있습니다 3. 우리는 단순히 같은 비율을 유지해야합니다.

또 다른 아이디어는 40%translate와 동일한 위치를 사용하고 위치를 수정하는 것입니다 ( 50%cent centring 과 동일한 논리 )

#dialogBoxPanel {
  position: absolute;;
  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
  /* the center */
  background:linear-gradient(red,red) center/100% 1px no-repeat;
}

#dialogBox {
  position:relative;
  top:40%;
  width: 350px;
  transform:translateY(-40%);
  margin:auto;
  border:1px solid;
}
<div id="dialogBoxPanel">
  <div id="dialogBox">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc hendrerit diam eu nisl fringilla ornare. Pellentesque aliquam quam et tellus egestas sodales. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin bibendum,</div>
</div>


많은 Temani 감사합니다! 두 솔루션 모두 완벽하게 작동하며 대화 상자가 브라우저보다 큰 특수한 경우를 제외하고는 동일하게 보입니다. 첫 번째 솔루션은 대화 상자의 맨 위에 브라우저의 맨 위에 정렬되어 맨 아래에 잘립니다. 두 번째는 아래쪽과 위쪽을 모두 자릅니다. 단지 선호의 문제.
Björn Morén

5

이 솔루션의 사용은 display: grid, 그것은 새로운 기능이 있으므로 반드시 확인의 브라우저 지원을 하고 여기를 클릭하여 더 배울 수 있습니다.

이것은 상단과 하단 공간을 제어하는 ​​선입니다.

grid-template-rows: 40fr [content-start] auto [content-end] 60fr;

스 니펫 텍스트 컨텐츠를 편집하여 높이가 변경 되더라도 상자가 가운데에 유지되는지 확인할 수 있습니다.

#dialogBoxPanel {
    display: grid;
    place-content: center;
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    grid-template-rows: 40fr [content-start] auto [content-end] 60fr;
}
#dialogBox {
    border: 1px solid;
    width: 350px;
    grid-area: content;
}
<div id="dialogBoxPanel">
   <div id="dialogBox" contenteditable>Text</div>
</div>


1
의 사용을 고려할 것입니다 4fr auto 6fr. 작동하지만 40 % + 60 % + 1fr 이후 약간의 오버플로가 발생하면 항상 100 %보다 커서 오버 센터가 위와 아래에서 균등하게 분할됩니다 : jsfiddle.net/cobutn0e/2 . 또한 예상과 100 % 같지 않음을 알 수 있습니다
Temani Afif

방금 1fr을 auto로 변경했습니다. 질문 값과 일치하도록 %로 남겨 두십시오. 오류를 지적 해 주셔서 감사합니다!
rafaelcastrocouto

auto와 1fr은 귀하의 경우에 동일한 결과를 제공하며, 문제는 백분율 사용입니다. 1fr=minmax(auto,1fr)그리고 귀하의 경우 auto40 % + 60 % = 100 % 이후 여유 공간이 없기 때문에 떨어집니다 (따라서 항상 오버플로가 발생합니다)
Temani Afif

1
jsfiddle.net/cobutn0e/3 다음은 제 요점을 설명하기위한 또 다른 바이올린입니다. jsfiddle.net/cobutn0e/3 세 번째가 어떻게 같은지, 세 번째가 0으로 떨어지고 마지막이 내가 제안한 것입니다
Temani Afif

이제 이해합니다. Gonna는 하루 종일 똑같이 40fr과 60fr을 사용합니다. 시간을내어 가르쳐 주셔서 다시 한번 감사합니다!
rafaelcastrocouto

4

스페이서 div를 추가하고 4 : 6 비율로 플렉스 성장을 설정할 수 있습니다.

#dialogBoxPanel {
  position: absolute;
  display: flex;
  flex-direction: column;
  align-items: center;

  left: 0px;
  top: 0px;
  width: 100%;
  height: 100%;
}

#dialogBox {
  width: 350px;
  border: 1px solid black;
}

.spacer-top{
  flex-grow: 4;
}
.spacer-bottom{
  flex-grow: 6;
<div id="dialogBoxPanel">
  <div class="spacer-top"></div>
  <div id="dialogBox">Text</div>
  <div class="spacer-bottom"></div>
</div>


이제 @Temani Afif의 답변을 보았지만 "after"및 "before"와 동일하게 작동합니다.
Itay Gal

0

위치와 여백을 사용하는 간단한 방법으로 대화 높이가 항상 브라우저 높이의 40 %라고 가정했습니다.

.modal{
            max-height:50%;
            width:400px;
            margin: 10% auto 5% auto;
            position:absolute;
            top:0;
            bottom:0;
            right:0;
            left:0;
            overflow-y: auto
        }
        .modal-body{
            background-color: beige;
            padding: 20px;
            line-height: 21px
        }

HTML

<div class="modal">
 <div class="modal-body">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea </div>
</div>

다음에 질문을주의 깊게 읽어보십시오. "대화 상자 높이는 텍스트의 양에 따라 다릅니다."
rafaelcastrocouto

1
@rafaelcastrocouto-높이없이 최대 높이를 통해 제어 할 수 있습니다.
Anshul Chaurasia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.