CSS วิธีการตั้ง div ความสูง 100% ลบ nPx


199

ฉันมีกระดาษห่อ Div ซึ่งมี 2 divs ติดกัน เหนือคอนเทนเนอร์นี้ฉันมี div ที่มีส่วนหัวของฉัน Div wrapper ต้อง 100% ลบความสูงของส่วนหัว ส่วนหัวประมาณ 60 px สิ่งนี้ได้รับการแก้ไขแล้ว ดังนั้นคำถามของฉันคือ: ฉันจะตั้งค่าความสูงของ wrapper ของฉันให้เป็น 100% ลบด้วย 60 px ได้อย่างไร

<div id="header"></div>
<div id="wrapper">
  <div id="left"></div>
  <div id="right"></div>
</div>

16
ฉันหวังว่า w3c จะพิจารณาการเพิ่มค่าบางค่าลบคุณสมบัติคงที่ให้กับความกว้างพวกเขาลืมที่จะรวมเส้นขอบในความกว้าง แต่พวกเขาควรจะเปลี่ยนคำจำกัดความของ CSS แฮ็กส่วนใหญ่จะหายไป
samarjit samanta

คำตอบ:


79

นี่คือ css ที่ใช้งานได้ผ่านการทดสอบภายใต้ Firefox / IE7 / Safari / Chrome / Opera

* {margin:0px;padding:0px;overflow:hidden}
div {position:absolute}
div#header {top:0px;left:0px;right:0px;height:60px}
div#wrapper {top:60px;left:0px;right:0px;bottom:0px;}
div#left {top:0px;bottom:0px;left:0px;width:50%;overflow-y:auto}
div#right {top:0px;bottom:0px;right:0px;width:50%;overflow-y:auto}

"overflow-y" ไม่ได้รับการอนุมัติจาก w3c แต่ทุกเบราว์เซอร์หลักรองรับ div ทั้งสองของคุณ #left และ #right จะแสดงแถบเลื่อนแนวตั้งหากเนื้อหาของพวกเขาสูงเกินไป

เพื่อให้การทำงานภายใต้ IE7 คุณต้องเปิดใช้งานโหมดที่ได้มาตรฐานโดยการเพิ่ม DOCTYPE:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
            "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title></title>
<style type="text/css">
	*{margin:0px;padding:0px;overflow:hidden}
	div{position:absolute}
	div#header{top:0px;left:0px;right:0px;height:60px}
	div#wrapper{top:60px;left:0px;right:0px;bottom:0px;}
	div#left{top:0px;bottom:0px;left:0px;width:50%;overflow-y:auto}
	div#right{top:0px;bottom:0px;right:0px;width:50%;overflow-y:auto}
</style>
</head>
<body>
<div id="header"></div>
<div id="wrapper">
  <div id="left"><div style="height:1000px">high content</div></div>
  <div id="right"></div>
</div>
</body>


มันทำงานใน FF แต่ฉันไม่ได้ทำงานภายใต้ IE7 ฉันเห็นเฉพาะรหัส 'ส่วนหัว': <div id = "header"> ส่วนหัว </div> <div id = "wrapper"> <div id = "left"> ซ้าย </div> <div id = "right"> ถูกต้อง </div> </div>
Martijn

คุณเรียกใช้โหมดที่ได้มาตรฐานหรือไม่ ฉันจะเพิ่มหน้าตัวอย่างในการตอบกลับของฉัน
Alsciende

1
นอกจากนี้หากคุณต้องการวาง div เหล่านี้ไว้ตรงกลางของหน้าหรือที่ใดก็ตามเพียงแค่ล้อมพวกมันใน div container และตั้งไว้position: relativeบน container จากนั้นวางคอนเทนเนอร์ได้ทุกที่ที่คุณต้องการบนหน้า
Mrchief

div ภายในมีอะไรบ้างภายใน #left ถ้าฉันต้องการ 2 divs ที่มีความสูงตามลำดับ 40% และ 60%
TecHunter

มีเหตุผลเฉพาะว่าทำไม px ถูกระบุในพารามิเตอร์ค่า 0 หรือไม่
คาสซานดรา

274

ใน CSS3 คุณสามารถใช้

height: calc(100% - 60px);

25
ตรวจสอบให้แน่ใจว่าคุณมีที่ว่างก่อนและหลังเครื่องหมาย "-" Firefox ต้องมีที่ว่างก่อนลงชื่อ "-"
Codler

7
สมบูรณ์ ฉันไม่รู้ CSS3 สามารถทำได้
Tom Beech

ว้าว! สิ่งที่ฉันต้องการอย่างเต็มที่ ขอบคุณ
Sandhu

1
นี่มันสุดยอดมาก
Mirko

47

หากคุณต้องการรองรับ IE6 ให้ใช้ JavaScript เพื่อจัดการขนาดของ wrapper div (ตั้งค่าตำแหน่งขององค์ประกอบเป็นพิกเซลหลังจากอ่านขนาดหน้าต่าง) หากคุณไม่ต้องการใช้ JavaScript ก็ไม่สามารถทำได้ มีวิธีแก้ไขปัญหา แต่คาดว่าสัปดาห์หรือสองสัปดาห์เพื่อให้ทำงานในทุกกรณีและทุกเบราว์เซอร์

สำหรับเบราว์เซอร์สมัยใหม่อื่น ๆ ให้ใช้ css นี้:

position: absolute;
top: 60px;
bottom: 0px;

เว็บไซต์นี้รองรับ IE 7 เท่านั้น เมื่อฉันใช้ความสูง: 100% และสูงสุด: 60px; ฉันยังคงเป็นแถบเลื่อน ฉันสามารถเลื่อน 60px ลง
Martijn

4
อย่าระบุความสูงใช้ด้านบนและด้านล่างและให้เบราว์เซอร์คำนวณความสูง
Aaron Digulla

แต่ฉันต้องการให้หน้าของฉันมีความสูงสูงสุด 100% ลบ 60px; หากเนื้อหามีขนาดใหญ่กว่านั้นฉันต้องการ scrollbars ใน div โดยใช้ overflow: scroll;
Martijn

4
สำหรับแถบเลื่อนให้เพิ่ม div ด้านในของ wrapper ที่เติมเต็มและทำให้เกิด overflow นั้น: scroll;
Aaron Digulla

โปรดทราบว่าเนื่องจากข้อบกพร่องใน IE7 นี้อาจยังคงล้มเหลว หากคุณไม่สามารถใช้งานได้ให้ใช้ JavaScript ฉันรู้ว่าคุณไม่ชอบ แต่ให้น้ำหนักกับสัปดาห์ของการดิ้นรนกับข้อผิดพลาดที่แปลก
Aaron Digulla

6

เยี่ยมมาก ... ตอนนี้ฉันหยุดใช้เขาแล้วเขา ... ยกเว้นภาชนะหลักดังที่แสดงด้านล่าง:

<div id="divContainer">
    <div id="divHeader">
    </div>
    <div id="divContentArea">
        <div id="divContentLeft">
        </div>
        <div id="divContentRight">
        </div>
    </div>
    <div id="divFooter">
    </div>
</div>

และนี่คือ CSS:

#divContainer {
    width: 100%;
    height: 100%;
}
#divHeader {
    position: absolute;
    left: 0px;
    top: 0px;
    right: 0px;
    height: 28px;
}
#divContentArea {
    position: absolute;
    left: 0px;
    top: 30px;
    right: 0px;
    bottom: 30px;
}
#divContentLeft {
    position: absolute;
    top: 0px;
    left: 0px;
    width: 250px;
    bottom: 0px;
}
#divContentRight {
    position: absolute;
    top: 0px;
    left: 254px;
    right: 0px;
    bottom: 0px;
}
#divFooter {
    position: absolute;
    height: 28px;
    left: 0px;
    bottom: 0px;
    right: 0px;
}

ฉันทดสอบสิ่งนี้ในเบราว์เซอร์ที่รู้จักและทำงานได้ดี มีข้อเสียใด ๆ ที่ใช้วิธีนี้?


4

คุณสามารถทำสิ่งที่ชอบ ความสูง: Calc (100% - nPx); ตัวอย่างเช่น ความสูง: Calc (100% - 70px);


2
div {
    height: 100%;
    height: -webkit-calc(100% - 60px);
    height: -moz-calc(100% - 60px);
    height: calc(100% - 60px);
}

ตรวจสอบให้แน่ใจว่าใช้น้อยลง

height: ~calc(100% - 60px);

มิฉะนั้นน้อยกว่าจะไม่มีการรวบรวมอย่างถูกต้อง


0

สิ่งนี้ไม่ได้ตอบคำถามอย่างถูกต้อง แต่มันสร้างเอฟเฟ็กต์ภาพแบบเดียวกับที่คุณพยายามทำ

<style>

body {
  border:0;
  padding:0;
  margin:0;
  padding-top:60px;
}

#header {
  position:absolute;
  top:0;
  height:60px;
  width:100%;
}

#wrapper {
  height:100%;
  width:100%;
}
</style>

0

ในตัวอย่างนี้คุณสามารถระบุพื้นที่ต่าง ๆ :

<html>
<style>
#divContainer {
    width: 100%;
    height: 100%;
}
#divHeader {
    position: absolute;
    left: 0px;
    top: 0px;
    right: 0px;
    height: 28px;
    background-color:blue;
}
#divContentArea {
    position: absolute;
    left: 0px;
    top: 30px;
    right: 0px;
    bottom: 30px;
}
#divContentLeft {
    position: absolute;
    top: 0px;
    left: 0px;
    width: 200px;
    bottom: 0px;
    background-color:red;
}
#divContentCenter {
    position: absolute;
    top: 0px;
    left: 200px;
    bottom: 0px;
    right:200px;
    background-color:yellow;
}
#divContentRight {
    position: absolute;
    top: 0px;
    right: 0px;
    bottom: 0px;
    width:200px;
    background-color:red;
}
#divFooter {
    position: absolute;
    height: 28px;
    left: 0px;
    bottom: 0px;
    right: 0px;
    background-color:blue;
}
</style>
<body >

<div id="divContainer">
    <div id="divHeader"> top
    </div>
    <div id="divContentArea">
        <div id="divContentLeft">left
        </div>
        <div id="divContentCenter">center
        </div>
        <div id="divContentRight">right
        </div>
    </div>
    <div id="divFooter">bottom
    </div>
</div>

</body>
</html>

0

ฉันยังไม่เห็นอะไรเลยที่โพสต์นี้ แต่ฉันคิดว่าฉันจะเอามันออกไป

<div class="main">
<header>Header</header>
<div class="content">Content</div>

จากนั้น CSS:

body, html {
    height: 100%;
    margin: 0;
    padding: 0;
}

.main {
    height: 100%;
    padding-top: 50px;
    box-sizing: border-box;
}

header {
    height: 50px;
    margin-top: -50px;
    width: 100%;
    background-color: #5078a5;
}

.content {
    height: 100%;
    background-color: #999999;
}

นี่คือjsfiddle ที่ใช้งานได้

หมายเหตุ: ฉันไม่รู้ว่าการใช้งานร่วมกันได้ของเบราว์เซอร์นี้คืออะไร ฉันเพิ่งเล่นไปกับทางเลือกอื่นและดูเหมือนว่ามันจะทำงานได้ดี


-1

ใช้ชุด wrapper ด้านนอกตั้งค่าเป็น 100% จากนั้น wrapper ด้านในของคุณ div 100% ควรจะสัมพันธ์กับตอนนี้

ฉันคิดว่าสิ่งนี้เคยทำงานให้ฉัน แต่ดูเหมือนจะไม่:

<html>
<body>
<div id="outerwrapper" style="border : 1px solid red ; height : 100%">
<div id="header" style="border : 1px solid blue ; height : 60px"></div>
<div id="wrapper"  style="border : 1px solid green ; height : 100% ; overflow : scroll ;">
  <div id="left" style="height : 100% ; width : 50% ; overflow : scroll; float : left ; clear : left ;">Some text 

on the left</div>
  <div id="right" style="height : 100% ; width 50% ; overflow : scroll; float : left ;">Some Text on the 

right</div>
</div>
</div>
</body>
</html>

สามารถยกตัวอย่างของที่ ฉันไม่เข้าใจ
Martijn

ฉันโพสต์สิ่งที่ฉันคิด แต่ไม่สามารถทำงานได้เร็ว / ช้า บางทีถ้าฉันนอนอีกหน่อย
Cade Roux

-1

หากคุณไม่ต้องการใช้การจัดตำแหน่งที่แน่นอนและแจ๊สทั้งหมดนี่คือวิธีแก้ไขที่ฉันต้องการใช้:

html ของคุณ:

<body>    
   <div id="header"></div>
   <div id="wrapper"></div>
</body>

CSS ของคุณ:

body {
     height:100%;
     padding-top:60px;
}
#header {
     margin-top:60px;
     height:60px;
}
#wrapper {
     height:100%;
}

1
ฉันไม่คิดว่ามันจะทำงานได้ตามที่คาดไว้ ครั้งแรกที่ควรจะเป็น#header margin-top:-60px;ประการที่สองheight:100%หมายความว่าความสูงจะเป็น 100% ของความสูงองค์ประกอบหลักไม่รวมระยะขอบการขยายและขอบ สิ่งนี้จะทำให้แถบเลื่อนปรากฏหรือเนื้อหาของคุณถูกครอบตัดทั้งนี้ขึ้นอยู่กับการตั้งค่าการเลื่อนของคุณ
Kylos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.