ฉันมีองค์ประกอบส่วนหัวและองค์ประกอบเนื้อหา:
#header
#content
overflow-y: scroll;
ฉันต้องการส่วนหัวจะเป็นของความสูงคงที่และเนื้อหาที่จะเติมทุกความสูงที่เหลือที่มีอยู่บนหน้าจอด้วย
เป็นไปได้โดยไม่ต้องใช้ Javascript?
ฉันมีองค์ประกอบส่วนหัวและองค์ประกอบเนื้อหา:
#header
#content
overflow-y: scroll;
ฉันต้องการส่วนหัวจะเป็นของความสูงคงที่และเนื้อหาที่จะเติมทุกความสูงที่เหลือที่มีอยู่บนหน้าจอด้วย
เป็นไปได้โดยไม่ต้องใช้ Javascript?
คำตอบ:
เคล็ดลับนี้คือการระบุความสูง 100% บน html และองค์ประกอบของร่างกาย เบราว์เซอร์บางตัวมองไปที่องค์ประกอบหลัก (html, body) เพื่อคำนวณความสูง
<html>
<body>
<div id="Header">
</div>
<div id="Content">
</div>
</body>
</html>
html, body
{
height: 100%;
}
#Header
{
width: 960px;
height: 150px;
}
#Content
{
height: 100%;
width: 960px;
}
ลืมคำตอบทั้งหมด CSS บรรทัดนี้ใช้ได้กับฉันใน 2 วินาที:
height:100vh;
1vh
= 1% ของความสูงของหน้าจอเบราว์เซอร์
สำหรับการปรับขนาดเค้าโครงที่ตอบสนองคุณอาจต้องการใช้:
min-height: 100vh
[อัปเดตพฤศจิกายน 2018] ตามที่ระบุไว้ในความคิดเห็นการใช้ความสูงต่ำสุดอาจหลีกเลี่ยงปัญหาในการออกแบบที่ไม่เหมาะสม
[อัปเดตเมษายน 2018]ตามที่กล่าวไว้ในความคิดเห็นย้อนกลับไปในปี 2011 เมื่อมีการถามคำถามเบราว์เซอร์บางตัวไม่รองรับหน่วยวิวพอร์ต คำตอบอื่น ๆ คือวิธีแก้ปัญหาในตอนนั้น - vmax
ยังไม่รองรับใน IE ดังนั้นนี่อาจไม่ใช่ทางออกที่ดีที่สุดสำหรับทุกคน
min-height: 100vh
จะดีกว่ามาก มันจะปรับขนาดสำหรับการออกแบบที่ตอบสนองเช่นกัน
แนวทางที่ดีที่สุดคือ:
html {
height:100%;
}
body {
min-height:100%;
}
สิ่งนี้ช่วยแก้ปัญหาทุกอย่างสำหรับฉันและช่วยให้ฉันควบคุมส่วนท้ายของฉันได้และสามารถมีส่วนท้ายคงที่ได้ไม่ว่าจะเลื่อนหน้าลง
โซลูชันทางเทคนิค - แก้ไข
ในอดีต "ความสูง" เป็นสิ่งที่ยุ่งยากในการขึ้นรูปเมื่อเทียบกับ "ความกว้าง" ซึ่งเป็นวิธีที่ง่ายที่สุด เนื่องจาก css มุ่งเน้นไปที่<body>
การจัดแต่งทรงผมในการทำงาน รหัสด้านบน - เราให้<html>
และ<body>
ความสูง นี่คือจุดที่มายากลเข้ามาในภาพ - เนื่องจากเรามี 'ความสูงต่ำสุด' บนโต๊ะเล่นเราจึงบอกว่าเบราว์เซอร์นั้น<body>
เหนือกว่า<html>
เพราะ<body>
มีความสูงต่ำสุด ในทางกลับกันอนุญาตให้<body>
ลบล้างได้<html>
เนื่องจาก<html>
มีความสูงก่อนหน้านี้แล้ว กล่าวอีกนัยหนึ่งคือเรากำลังหลอกล่อให้เบราว์เซอร์ "ชน" <html>
ออกจากโต๊ะดังนั้นเราจึงสามารถจัดสไตล์ได้อย่างอิสระ
min-height
และheight
?
<body>
การจัดแต่งทรงผมให้ทำงาน รหัสนี้: เราให้<html>
และ<body>
ความสูง นี่คือจุดที่เวทมนตร์เข้ามาในภาพ - เนื่องจากเรามี 'ความสูงต่ำสุด' บนโต๊ะเล่นเราจึงบอกเซิร์ฟเวอร์ที่<body>
เหนือกว่า<html>
เพราะ<body>
มีความสูงต่ำสุด ในทางกลับกันอนุญาตให้<body>
ลบล้างได้<html>
เนื่องจาก<html>
มีความสูงก่อนหน้านี้แล้ว กล่าวอีกนัยหนึ่งคือเรากำลังหลอกล่อเซิร์ฟเวอร์ให้ "ชน" <html>
ออกจากโต๊ะดังนั้นเราจึงสามารถจัดสไตล์ได้อย่างอิสระ
คุณสามารถใช้ vh กับคุณสมบัติ min-height
min-height: 100vh;
คุณสามารถทำได้ดังนี้ขึ้นอยู่กับว่าคุณใช้ระยะขอบอย่างไร ...
min-height: calc(100vh - 10px) //Considering you're using some 10px margin top on an outside element
โซลูชันที่ยอมรับจะใช้ไม่ได้จริง คุณจะสังเกตเห็นว่าเนื้อหาdiv
จะเท่ากับความสูงของระดับบนbody
สุด ดังนั้นการตั้งค่าbody
ความสูงเป็น100%
จะกำหนดให้เท่ากับความสูงของหน้าต่างเบราว์เซอร์ สมมติว่าหน้าต่างเบราว์เซอร์ได้768px
ในความสูงโดยการตั้งค่าเนื้อหาdiv
ความสูง100%
ที่div
's 768px
ความสูงจะเปลี่ยนเป็น ดังนั้นคุณจะจบลงด้วยการเป็นส่วนหัว div 150px
และ div 768px
เป็นเนื้อหา ในตอนท้ายคุณจะมีเนื้อหา150px
ที่ด้านล่างของหน้า สำหรับวิธีแก้ปัญหาอื่นโปรดดูที่ลิงค์นี้
ด้วย HTML5 คุณสามารถทำได้:
CSS:
body, html{ width:100%; height:100%; padding: 0; margin: 0;}
header{ width:100%; height: 70px; }
section{ width: 100%; height: calc(100% - 70px);}
HTML:
<header>blabablalba </header>
<section> Content </section>
สำหรับฉันสิ่งต่อไปทำงานได้ดี:
ฉันรวมส่วนหัวและเนื้อหาไว้ใน div
<div class="main-wrapper">
<div class="header">
</div>
<div class="content">
</div>
</div>
ฉันใช้การอ้างอิงนี้เพื่อเติมความสูงด้วย flexbox CSS จะเป็นดังนี้:
.main-wrapper {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.header {
flex: 1;
}
.content {
flex: 1;
}
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเทคนิค flexbox โปรดไปที่ข้อมูลอ้างอิง
display: inline
นอกจากนี้คุณยังสามารถตั้งค่าแม่เพื่อ ดูhttp://codepen.io/tommymarshall/pen/cECyH
อย่าลืมตั้งค่าความสูงของ html และ body เป็น 100% ด้วย
คำตอบที่ยอมรับใช้ไม่ได้ และคำตอบที่ได้รับการโหวตสูงสุดไม่ตอบคำถามที่แท้จริง ด้วยส่วนหัวความสูงพิกเซลคงที่และฟิลเลอร์ในการแสดงผลที่เหลือของเบราว์เซอร์และเลื่อนสำหรับ owerflow นี่คือวิธีแก้ปัญหาที่ใช้งานได้จริงโดยใช้การกำหนดตำแหน่งที่แน่นอน ฉันยังคิดว่าความสูงของส่วนหัวนั้นเป็นที่รู้จักด้วยเสียงของ "ส่วนหัวคงที่" ในคำถาม ฉันใช้ 150px เป็นตัวอย่างที่นี่:
HTML:
<html>
<body>
<div id="Header">
</div>
<div id="Content">
</div>
</body>
</html>
CSS: (การเพิ่มสีพื้นหลังสำหรับเอฟเฟกต์ภาพเท่านั้น)
#Header
{
height: 150px;
width: 100%;
background-color: #ddd;
}
#Content
{
position: absolute;
width: 100%;
top: 150px;
bottom: 0;
background-color: #aaa;
overflow-y: scroll;
}
สำหรับรายละเอียดเพิ่มเติมว่ามันทำงานอย่างไรพร้อมเนื้อหาจริงภายใน#Content
โปรดดูที่jsfiddleนี้โดยใช้แถวและคอลัมน์ bootstrap
bottom
คุณสมบัติทำให้แน่ใจว่า#Content
การเข้าพักที่ติดอยู่ที่ปลายสุดของหน้า ขอขอบคุณที่สละเวลาอธิบาย
ในกรณีนี้ฉันต้องการให้ div เนื้อหาหลักของฉันมีความสูงเป็นของเหลวเพื่อให้ทั้งหน้าใช้ความสูง 100% ของเบราว์เซอร์
height: 100vh;
โปรดให้ฉันเพิ่ม 5 เซ็นต์ของฉันที่นี่และเสนอวิธีแก้ปัญหาแบบคลาสสิก:
html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
<div id="idOuter">
<div id="idHeader" style="height:30px; top:0;">Header section</div>
<div id="idContent" style="top:36px; bottom:0;">Content section</div>
</div>
สิ่งนี้จะทำงานได้ในทุกเบราว์เซอร์ไม่มีสคริปต์ไม่ดิ้น เปิดตัวอย่างข้อมูลในโหมดเต็มหน้าและปรับขนาดเบราว์เซอร์: สัดส่วนที่ต้องการจะยังคงอยู่แม้ในโหมดเต็มหน้าจอ
idHeader.height
และได้idContent.top
รับการปรับให้รวมเส้นขอบและควรมีค่าเท่ากันหากไม่ได้ใช้เส้นขอบ มิฉะนั้นองค์ประกอบจะดึงออกจากวิวพอร์ตเนื่องจากความกว้างที่คำนวณได้ไม่รวมขอบระยะขอบและ / หรือช่องว่างภายในleft:0; right:0;
สามารถแทนที่ได้ด้วยwidth:100%
เหตุผลเดียวกันหากไม่มีการใช้เส้นขอบpadding-top
และ / หรือ
padding-bottom
แอตทริบิวต์ให้กับ#idOuter
องค์ประกอบเพื่อให้คำตอบของฉันสมบูรณ์นี่คือเค้าโครงส่วนท้าย:
html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
<div id="idContent" style="bottom:36px; top:0;">Content section</div>
<div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>
และนี่คือเค้าโครงที่มีทั้งส่วนหัวและส่วนท้าย:
html {height:100%;}
body {height:100%; margin:0;}
#idOuter {position:relative; width:100%; height:100%;}
#idHeader {position:absolute; left:0; right:0; border:solid 3px red;}
#idContent {position:absolute; overflow-y:scroll; left:0; right:0; border:solid 3px green;}
#idFooter {position:absolute; left:0; right:0; border:solid 3px blue;}
<div id="idOuter">
<div id="idHeader" style="height:30px; top:0;">Header section</div>
<div id="idContent" style="top:36px; bottom:36px;">Content section</div>
<div id="idFooter" style="height:30px; bottom:0;">Footer section</div>
</div>
ถ้าคุณไม่จำเป็นต้องรองรับ IE 9 และต่ำกว่าฉันจะใช้ flexbox
body { display: flex; flex-direction: column; }
.header { height: 70px; }
.content { flex: 1 1 0 }
คุณต้องได้รับร่างกายเพื่อเติมเต็มทั้งหน้า
body, html{ width:100%; height:100%; padding: 0; margin: 0;}
CSS PLaY | ข้ามเบราว์เซอร์คงที่ส่วนหัว / ส่วนท้าย / เค้าโครงคอลัมน์เดียวที่อยู่ตรงกลาง
CSS Frames เวอร์ชัน 2: ตัวอย่างที่ 2 ระบุความกว้าง | 456 ถนน Berea
สิ่งสำคัญอย่างหนึ่งก็คือแม้ว่ามันจะฟังดูง่าย แต่ก็มีโค้ดที่น่าเกลียดอยู่เล็กน้อยในไฟล์ CSS ของคุณเพื่อให้ได้เอฟเฟกต์เช่นนี้ น่าเสียดายจริงๆมันเป็นตัวเลือกเดียว
#Header
{
width: 960px;
height: 150px;
}
#Content
{
min-height:100vh;
height: 100%;
width: 960px;
}
ทางออกที่ดีที่สุดที่ฉันพบคือการตั้งค่าองค์ประกอบส่วนท้ายที่ด้านล่างของหน้าจากนั้นประเมินความแตกต่างของออฟเซ็ตของส่วนท้ายและองค์ประกอบที่เราต้องการขยาย เช่น
<div id="contents"></div>
<div id="footer"></div>
#footer {
position: fixed;
bottom: 0;
width: 100%;
}
var contents = $('#contents');
var footer = $('#footer');
contents.css('height', (footer.offset().top - contents.offset().top) + 'px');
คุณอาจต้องการอัปเดตความสูงขององค์ประกอบเนื้อหาในการปรับขนาดหน้าต่างแต่ละครั้งดังนั้น ...
$(window).on('resize', function() {
contents.css('height', (footer.offset().top -contents.offset().top) + 'px');
});
ง่ายมาก:
#content {
max-height: 100%;
}
คุณเคยลองอะไรแบบนี้ไหม?
CSS:
.content {
height: 100%;
display: block;
}
HTML:
<div class=".content">
<!-- Content goes here -->
</div>