ऊर्ध्वाधर स्क्रॉलबार प्रदर्शित करते हुए शरीर की ऊंचाई 100%


84

जिज्ञासा से बाहर, नीचे दिए गए उदाहरण पर विचार करते हुए, #container div पर मार्जिन होने के कारण ब्राउज़र में वर्टिकल स्क्रॉलबार क्यों दिखाई देता है? कंटेनर शरीर की ऊंचाई की तुलना में ऊंचाई में बहुत छोटा है जो 100% पर सेट है।

मैंने #container को छोड़कर सभी तत्वों के लिए पैडिंग और मार्जिन 0 पर सेट किया है। ध्यान दें कि मैंने जानबूझकर #container div पर पूर्ण स्थिति छोड़ दी है। इस मामले में ब्राउज़र शरीर की ऊंचाई की गणना कैसे कर रहा है और मार्जिन इसे कैसे प्रभावित कर रहा है?

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
* { padding:0; margin:0;}
html, body { height:100%; }
#container
{
  padding:10px;
  margin:50px;
  border:1px solid black;
  width: 200px;
  height: 100px;
}
</style>
</head>
<body>
  <div id='container'>
  </div>
</body>
</html>

JSFiddle पर उदाहरण भी


जवाबों:


65

यदि आप ( htmlऔर bodyप्रत्येक को अपना रंग दे रहे हैं) की पृष्ठभूमि पेंट करते हैं , तो आप जल्दी से ध्यान देंगे कि bodyइसे नीचे स्थानांतरित किया जा रहा है #container, और #containerखुद को ऊपर से ऑफसेट नहीं किया गया है body। यह मार्जिन पतन का एक साइड इफेक्ट है , जिसे मैं यहां विस्तार से कवर करता हूं (हालांकि यह जवाब थोड़ा अलग सेटअप का वर्णन करता है)।

यह वह व्यवहार है जिसके कारण स्क्रॉलबार दिखाई दे रहा है, जब से आपने body100% ऊँचाई घोषित की है html। ध्यान दें कि वास्तविक ऊंचाई bodyअप्रभावित है, क्योंकि मार्जिन को कभी भी गणना में शामिल नहीं किया जाता है।


इसका मतलब यह है कि एक पृष्ठ पर तत्वों की ऊंचाइयों की गणना खिड़की, फिर शरीर, फिर शरीर के अंदर या ऊपर के तत्वों के साथ शुरू की जाती है? क्या सभी प्रतिशत px या pt या em मानों में परिवर्तित हो गए हैं?
टीएमबी

5
@ टीएमबी: इस पर 100% ऊंचाई htmlव्यूपोर्ट (ब्राउज़र के देखने का क्षेत्र) का 100% है, और 100% ऊंचाई पर bodyयह अपने माता-पिता के 100% बनाता है, जो है html। किसी भी प्रतिशत का अनुसरण हमेशा एक तत्व के पूर्वज (ओं) का होता है। यदि आप 100% ऊंचाई पर सेट नहीं करते हैं htmlया bodyफिर वे किसी अन्य ब्लॉक तत्व की तरह व्यवहार करते हैं। देखें w3.org/TR/CSS21/syndata.html#percentage-units जानकारी के लिए। % s और ems को आखिरकार रेंडरिंग के दौरान कुछ निरपेक्ष मान में बदलना होगा, ताकि ब्राउज़र को यह पता चल सके कि स्क्रीन पर चीजों को मापने और रेंडर करने के लिए कितना बड़ा या छोटा है।
BoltClock

1
@neodymium: यह सही है। दोनों htmlऔर bodyकिसी अन्य ब्लॉक स्तर तत्व की तरह के रूप में अच्छी व्यवहार करते हैं।
BoltClock


1
@ डैनियल अल्बुशचैट: मैं सम्मानित हूं!
BoltClock

19

थोड़ा देर से, लेकिन शायद यह किसी की मदद करता है।

स्क्रॉलबार हटाने के float: left;लिए जोड़ना #container, जैसा कि W3C कहता है:

• एक फ्लोट किए गए बॉक्स और किसी अन्य बॉक्स के बीच मार्जिन नहीं होता है (फ्लोट और इसके इन-फ्लो बच्चों के बीच भी नहीं)।


18

@ BoltClock के उत्तर के आधार पर, मैंने इसे मार्जिन शून्य करके तय किया ...
इसलिए

html,body, #st-full-pg {
   height: 100%;
   margin: 0;
}

जहां आईडी "st-full-pg" एक पैनल डिव को सौंपा गया है (जिसमें आगे पैनल-हेडिंग और पैनल-बॉडी शामिल है)


3

जोड़ना float:left;अच्छा है, लेकिन केंद्रीय क्षैतिज स्थिति का उपयोग करके हस्तक्षेप करेगाmargin:auto;

यदि आप जानते हैं कि आपका मार्जिन कितना बड़ा है, तो आप कैल्क का उपयोग करके अपनी ऊंचाई प्रतिशत में इसका हिसाब कर सकते हैं:

height: calc(100% - 50px);

ब्राउज़र का समर्थन अच्छा है, लेकिन केवल IE11 + https://caniuse.com/#feat=calc


50px क्यों? जादुई संख्या।
इवान रुबिन्सन

"यदि आप जानते हैं कि आपका मार्जिन कितना बड़ा है।" मेरा मानना ​​है कि ओपी 50px
क्ले

2
html,body {
   height: 100%;
   margin: 0;
   overflow: hidden;
}

इसने मेरे लिए काम किया


2
यदि आपके पास एक पाद है, तो वह इसे हटा देता है
अलेक्जेंडर

1

मुझे एक समाधान मिला है: पैडिंग जोड़ें: 1 पीएक्स 0; शरीर को प्रदर्शित करने के लिए ऊर्ध्वाधर स्क्रॉलबार रोकता है


0
html, body {
    height: 100%;
    overflow: hidden;
}

यदि आप बॉडी स्क्रॉलिंग को हटाना चाहते हैं, तो निम्नलिखित शैली जोड़ें:

body {
    height: 100%;
    overflow: hidden;
}

इससे मेरी समस्या ठीक हो गई जहां मुझे 2 ऊर्ध्वाधर स्क्रॉल बार थे। HTML को सेट करना overflow: hiddenऔर शरीर को अकेला छोड़ना तय है। मेरे शरीर और HTML दोनों में है height: 100%
करई

0

मैंने इस समस्या को तय होने से पहले देखा, जहां आपने bodyएक रैप नामक सभी सामग्री को रखा था । लपेट की शैली को सेट किया जाना चाहिए position: relative; min-height: 100%;#containerशीर्ष से 50x पर विभक्त करने के लिए और बाएँ के अंदर एक div को 50px पर सेट करने के लिए पैडिंग के साथ रखें। मार्जिन केवल रैप और डिव के साथ काम नहीं करेगा जो हमने अभी बनाया है, लेकिन वे #containerइसके अंदर और सब कुछ में काम करेंगे ।

यहाँ jsfiddle पर मेरा तय है


0

@BoltClock से प्रेरित होकर, मैंने यह कोशिश की और यह काम किया, तब भी जब ज़ूम आउट और इन किया।

Browser: Chrome 51

html{
  height: 100%;
}
body{
  height: 100%;
  margin: 0px;
  position: relative;
  top: -20px;
}

मुझे लगता है कि body20px नीचे स्थानांतरित कर दिया गया था।


0
/*removes default margin & padding*/
html, body{
    padding: 0px !important;
    margin: 0px !important;
}

/*sets body height to max; and allows scrollbar as page content grows*/
body{
    min-height: 100vh;
}

0

उन लोगों के लिए जो उत्तर को समझने में आसान हैं, यहां तक ​​कि कोड के नमूने भी शामिल हैं, यह उत्तर ( यहां से कॉपी किया गया ) आपके लिए है।

कोई जावास्क्रिप्ट या निश्चित पिक्सेल मान (जैसे 100px) की आवश्यकता नहीं है, बस, शुद्ध सीएसएस और प्रतिशत।

यदि आपका div बस अपने आप वहां बैठा है, height: 50%तो इसका मतलब शरीर की ऊंचाई का 50% होगा। आम तौर पर, किसी भी दृश्य सामग्री के बिना शरीर की ऊंचाई शून्य होती है, इसलिए इसमें से 50% बस, ठीक है, शून्य है।

यह समाधान है ( इस पर आधारित ) ( backgroundपैडिंग का एक दृश्य प्राप्त करने के लिए लाइनों को अनलॉक्ड करें ):

/* Makes <html> take up the full page without requiring content to stretch it to that height. */

html
{
  height: 100%;
  
  /* background: green; */
}

body
{
  /*
    100% the height of <html> minus 1 multiple of the total extra height from the padding of <html>.
    This prevents an unnecessary vertical scrollbar from appearing.
  */
  height: calc(100% - 1em);
  
  /* background: blue; */
}

/* In most cases it's better to use stylesheets instead of inline-CSS. */
div
{
  width: 50%;
  height: 50%;
  
  background: red;
}
<div></div>

ऊपर लिखा गया था ताकि अभी भी सामान्य पैडिंग हो। आप लाल के आयाम निर्धारित कर सकते हैं divकरने के लिए 100%और अभी भी हर तरफ / अंत पर गद्दी देखते हैं। यदि आप यह पैडिंग नहीं चाहते हैं, तो इसका उपयोग करें (हालांकि यह अच्छा नहीं लगता है, मैं आपको पहले उदाहरण के साथ रहने की सलाह देता हूं):

/* Makes <html> take up the full page without requiring content to stretch it to that height. */

html, body
{
  height: 100%;
}

/* You can uncomment it but you wouldn't be able to see it anyway. */

/*
html
{
  background: green;
}
*/

body
{
  margin: 0;
  
 /* background: blue; */
}

/* In most cases it's better to use stylesheets instead of inline-CSS */
div
{
  width: 50%;
  height: 50%;
  
  background: red;
}
<div></div>


-2

overflow: hidden;Html और बॉडी में जोड़ें ।

html, body {
  height: 100%;
  overflow: hidden;
}

42
यह समाधान स्क्रॉलबार को पूरी तरह से हटा देता है। यहां तक कि जिन पन्नों पर पुस्तक की जरूरत है पर
विल

1
टाइपो पहली पंक्ति में, अतिप्रवाह: hidded
टिम ग्रांट

-9

मुझे एक त्वरित समाधान मिला: सेट की ऊंचाई 100% के बजाय 99.99% करने की कोशिश करें


कई कारण हैं कि यह एक भयानक विचार है, जिसमें उपयोगकर्ता विंडो के प्रति मनमाना ऊंचाई अंतर भी शामिल है, और यह कि आंतरिक गोलाई के तरीके ब्राउज़र द्वारा भिन्न होते हैं।
टेरा एशले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.