จัด DIV ให้อยู่กึ่งกลางโดยใช้ CSS


23

ฉันอยู่ตรงกลาง DIV ในอีก DIV โดยใช้ flexbox นึกถึงหน้าต่างข้อความที่ปรากฏขึ้นตรงกลางหน้าจอเมื่อจำเป็น

มันใช้งานได้ดี แต่มันจะดูดีขึ้นมากถ้าพื้นที่ด้านบนและด้านล่างของกล่องโต้ตอบไม่เท่ากันโดยมี 40% ของพื้นที่ที่เหลืออยู่ด้านบนและด้านล่างของกล่องโต้ตอบ 60% มันซับซ้อนมากเนื่องจากความสูงของกล่องโต้ตอบจะแตกต่างกันไปตามจำนวนข้อความภายใน

ตัวอย่างเช่นหากความสูงของเบราว์เซอร์คือ 1,000 px และความสูงของหน้าต่างข้อความโต้ตอบคือ 400 px ฉันต้องการพื้นที่แนวตั้งที่เหลือ (600 px) เป็น 240 px ด้านบนและด้านล่างกล่องโต้ตอบ 360 px ฉันสามารถใช้ 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ส่วน "ทั้งแนวนอนและแนวตั้ง / เป็นองค์ประกอบของความกว้างและความสูงที่ไม่รู้จักหรือไม่" และแก้ไขค่าเปอร์เซ็นต์การแปล (และแม้ว่าคุณจะต้องการขนาดวิวพอร์ตเต็มของผู้ปกครอง [ฉากหลัง?] คุณควรจะรวมทั้งสองอย่างเข้าด้วยกันกับสิ่งที่โค้งงอและพักได้)
04FS

ใช่ฉันมีเอฟเฟกต์การหรี่แสงที่แผงด้านนอกดังนั้นจึงต้องครอบคลุมวิวพอร์ตทั้งหมด แต่ฉันสามารถเพิ่ม DIV อีกอันไว้ข้างในและทางออกของคุณก็ใช้ได้ดี ขอบคุณ 04FS!
BjörnMorén

เพื่อความถูกต้องคุณกำลังพูดถึงการจัดเรียงแนวตั้งไม่ใช่ศูนย์กลาง
Michael Benjamin

คำตอบ:


11

ใช้องค์ประกอบปลอมและทิศทางคอลัมน์เพื่อจำลองพื้นที่สีขาว เพียงแค่ปรับflex-growองค์ประกอบของหลอกเพื่อควบคุมพื้นที่ว่างที่แต่ละคนควรใช้ Flex-Grow ที่เท่าเทียมกันจะให้พื้นที่เท่ากัน

นอกจากนี้คุณยังสามารถใช้และ2 3เราเพียงแค่ต้องรักษาอัตราส่วนเดิมไว้:

แนวคิดอื่นคือการใช้ค่าสูงสุดเท่ากับ40%และแก้ไขตำแหน่งที่มีการแปล (ตรรกะเดียวกันกับ50%เมื่ออยู่ตรงกลาง)

#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örnMoré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ฉันจะพิจารณาการใช้งานของ สิ่งที่คุณมีผลงาน แต่ wiith ล้นตั้งแต่ 40% + 60% + 1fr มักจะมีขนาดใหญ่กว่า 100% และคุณจะอยู่ตรงกลางเพื่อให้ overlow จะแบ่งเท่า ๆ กันจากด้านบนและด้านล่าง: jsfiddle.net/cobutn0e/2 คุณจะสังเกตเห็นว่าไม่ใช่ 100% เหมือนที่คาดไว้
Temani Afif

ฉันเพิ่งเปลี่ยน 1fr เป็น auto ฉันควรปล่อยให้มันเป็น% เพื่อจับคู่กับค่าคำถาม ขอบคุณมากสำหรับการชี้ข้อผิดพลาด!
rafaelcastrocouto

อัตโนมัติและ 1fr จะให้ผลลัพธ์เดียวกันในกรณีของคุณปัญหาคือการใช้เปอร์เซ็นต์ 1fr=minmax(auto,1fr)และในกรณีของคุณมันจะตกautoเพราะไม่มีพื้นที่ว่างตั้งแต่ 40% + 60% = 100% (นั่นคือเหตุผลที่คุณจะมีน้ำล้นอยู่เสมอ)
Temani Afif

1
นี่คือซออื่นเพื่อแสดงให้เห็นถึงจุดของฉัน: jsfiddle.net/cobutn0e/3 สังเกตเห็นว่า 3 ครั้งแรกเหมือนกันคนที่สามล้มลงถึง 0 และคนสุดท้ายคือสิ่งที่ฉันแนะนำ
Temani Afif

ตอนนี้ฉันเข้าใจแล้ว จะใช้ 40fr และ 60fr เพราะมันเหมือนกันในตอนท้ายของวัน ขอขอบคุณอีกครั้งที่สละเวลาสอนฉัน!
rafaelcastrocouto

4

คุณสามารถเพิ่มตัวเว้นวรรคและตั้งค่าอัตราส่วนการขยายได้ด้วยอัตราส่วน 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.