मैं HTML तत्व की वास्तविक चौड़ाई और ऊंचाई कैसे प्राप्त करूं?


892

मान लीजिए कि मेरे पास एक <div>ऐसा ब्राउज़र है जिसे मैं ब्राउज़र के डिस्प्ले (व्यूपोर्ट) में रखना चाहता हूं। ऐसा करने के लिए, मुझे <div>तत्व की चौड़ाई और ऊंचाई की गणना करने की आवश्यकता है ।

मुझे क्या उपयोग करना चाहिए? कृपया ब्राउज़र संगतता के बारे में जानकारी शामिल करें।


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

जवाबों:


1285

आपको .offsetWidthऔर .offsetHeightगुणों का उपयोग करना चाहिए । ध्यान दें कि वे तत्व से संबंधित हैं, नहीं .style

var width = document.getElementById('foo').offsetWidth;

.getBoundingClientRect()सीएसएस ट्रांसफॉर्म करने के बाद फ़ंक्शन रिटर्न आयाम और तत्व का स्थान फ्लोटिंग-पॉइंट संख्या के रूप में करता है।

> console.log(document.getElementById('id').getBoundingClientRect())
DOMRect {
    bottom: 177,
    height: 54.7,
    left: 278.5,​
    right: 909.5,
    top: 122.3,
    width: 631,
    x: 278.5,
    y: 122.3,
}

174
सावधान रहें! यदि आपने हाल ही में तत्व में कुछ DOM संशोधन किए हैं तो ऑफसेटहाइट / ऑफसेटविट 0 वापस लौट सकता है। तत्व को संशोधित करने के बाद आपको एक सेटटाइम कॉल में इस कोड को कॉल करना पड़ सकता है।
दान फाबेलिच

37
के बारे में दस्तावेज़ीकरण .offsetWidthऔर .offsetHeight: developer.mozilla.org/en/Determining_the_dimensions_of_elements
डेनिल्सन सा मायिया

30
वह किन परिस्थितियों में 0 वापस करता है?
चीता

46
@JDandChips: offsetWidthयदि तत्व है display:none, तो 0 होगा , जबकि गणना में widthअभी भी इस उदाहरण में सकारात्मक मान हो सकता है। visibility:hiddenप्रभावित नहीं करता है offsetWidth
MrWhite

20
@Supuhstar दोनों के अलग-अलग अर्थ हैं। offsetWidthसामग्री, पैडिंग, और बॉर्डर सहित "संपूर्ण" बॉक्स लौटाता है; जबकि clientWidthअकेले सामग्री बॉक्स का आकार लौटाता है (इसलिए जब भी तत्व में कोई शून्य शून्य पैडिंग और / या सीमा होती है तो इसका एक छोटा मूल्य होगा)। (आधुनिकता के लिए संपादित)
एडुने पास्कल

200

देख लेना Element.getBoundingClientRect()

इस विधि एक वस्तु युक्त वापस आ जाएगी width, heightऔर कुछ अन्य उपयोगी मान:

{
    width: 960,
    height: 71,
    top: 603,
    bottom: 674,
    left: 360,
    right: 1320
}

उदाहरण के लिए:

var element = document.getElementById('foo');
var positionInfo = element.getBoundingClientRect();
var height = positionInfo.height;
var width = positionInfo.width;

मेरा मानना है कि इस समस्या है जो नहीं है .offsetWidthऔर .offsetHeightजहां वे कभी कभी लौट कर 0(के रूप में में चर्चा की टिप्पणी यहाँ )

एक और अंतर getBoundingClientRect()भिन्नात्मक पिक्सेल वापस आ सकता है, जहां .offsetWidthऔर .offsetHeightनिकटतम पूर्णांक पर गोल होगा।

IE8 नोट : IE8 और उससे नीचे की getBoundingClientRectऊंचाई और चौड़ाई वापस नहीं आती है । *

यदि आपको IE8 का समर्थन करना चाहिए , तो उपयोग करें .offsetWidthऔर .offsetHeight:

var height = element.offsetHeight;
var width = element.offsetWidth;

यह ध्यान देने योग्य है कि इस विधि द्वारा लौटाया गया वस्तु वास्तव में सामान्य वस्तु नहीं है। इसके गुण प्रवर्तनीय नहीं हैं (इसलिए, उदाहरण के लिए, Object.keysयह काम नहीं करता है।)

इसके बारे में अधिक जानकारी यहां दी गई है: क्लाइंटर / डोमरेक्ट को प्लेन ऑब्जेक्ट में कैसे परिवर्तित किया जाए

संदर्भ:


8
getboundingClientRect () वास्तविक चौड़ाई और जबकि सीएसएस के माध्यम से बढ़ाया तत्वों की ऊंचाई वापस आ जाएगी offsetHeightऔर offsetWidthनहीं होगा।
ल्यूक

66

नोट : यह उत्तर 2008 में लिखा गया था। उस समय अधिकांश लोगों के लिए सबसे अच्छा क्रॉस-ब्राउज़र समाधान वास्तव में jQuery का उपयोग करना था। मैं उत्तर देने के लिए यहाँ उत्तर दे रहा हूँ और, यदि आप jQuery का उपयोग कर रहे हैं, तो यह एक अच्छा तरीका है। यदि आप कुछ अन्य ढांचे या शुद्ध जावास्क्रिप्ट का उपयोग कर रहे हैं तो स्वीकृत उत्तर संभवतः जाने का रास्ता है।

1.2.6 jQuery के रूप में, आप कोर सीएसएस कार्यों में से एक का उपयोग कर सकते हैं , heightऔर width(या , outerHeightऔर outerWidth, उपयुक्त)।

var height = $("#myDiv").height();
var width = $("#myDiv").width();

var docHeight = $(document).height();
var docWidth = $(document).width();

45

बस अगर यह किसी के लिए उपयोगी है, तो मैं एक ही सीएसएस के साथ एक टेक्स्टबॉक्स, बटन और डिव डाल देता हूं:

width:200px;
height:20px;
border:solid 1px #000;
padding:2px;

<input id="t" type="text" />
<input id="b" type="button" />
<div   id="d"></div>

मैंने इसे क्रोम, फ़ायरफ़ॉक्स और आई-एज में आज़माया, मैंने jquery के साथ और बिना कोशिश की, और मैंने इसके साथ और बिना कोशिश की box-sizing:border-box। हमेशा साथ<!DOCTYPE html>

परिणाम:

                                                               Firefox       Chrome        IE-Edge    
                                                              with   w/o    with   w/o    with   w/o     box-sizing

$("#t").width()                                               194    200    194    200    194    200
$("#b").width()                                               194    194    194    194    194    194
$("#d").width()                                               194    200    194    200    194    200

$("#t").outerWidth()                                          200    206    200    206    200    206
$("#b").outerWidth()                                          200    200    200    200    200    200
$("#d").outerWidth()                                          200    206    200    206    200    206

$("#t").innerWidth()                                          198    204    198    204    198    204
$("#b").innerWidth()                                          198    198    198    198    198    198
$("#d").innerWidth()                                          198    204    198    204    198    204

$("#t").css('width')                                          200px  200px  200px  200px  200px  200px
$("#b").css('width')                                          200px  200px  200px  200px  200px  200px
$("#d").css('width')                                          200px  200px  200px  200px  200px  200px

$("#t").css('border-left-width')                              1px    1px    1px    1px    1px    1px
$("#b").css('border-left-width')                              1px    1px    1px    1px    1px    1px
$("#d").css('border-left-width')                              1px    1px    1px    1px    1px    1px

$("#t").css('padding-left')                                   2px    2px    2px    2px    2px    2px
$("#b").css('padding-left')                                   2px    2px    2px    2px    2px    2px
$("#d").css('padding-left')                                   2px    2px    2px    2px    2px    2px

document.getElementById("t").getBoundingClientRect().width    200    206    200    206    200    206
document.getElementById("b").getBoundingClientRect().width    200    200    200    200    200    200
document.getElementById("d").getBoundingClientRect().width    200    206    200    206    200    206

document.getElementById("t").offsetWidth                      200    206    200    206    200    206
document.getElementById("b").offsetWidth                      200    200    200    200    200    200
document.getElementById("d").offsetWidth                      200    206    200    206    200    206

1
बस स्पष्ट होने के लिए ... उन ब्राउज़रों में से कोई भी प्रत्येक से अलग कुछ भी करता है? मुझे कोई अंतर नहीं मिल रहा है ... साथ ही, मैं डाउन-वोटिंग (अभी तक) नहीं हूं, लेकिन यह वास्तव में सीधे सवाल का जवाब नहीं देता है , हालांकि ऐसा करने के लिए इसे आसानी से संपादित किया जा सकता है।
ज़च लिसोबाई

1
प्रश्न का उत्तर देने के उद्देश्य से नहीं था - इसका पहले से ही उत्तर दिया गया था। बस कुछ उपयोगी जानकारी और हाँ सभी मुख्य नवीनतम संस्करण ब्राउज़र इन मूल्यों पर सहमत हैं - जो एक अच्छी बात है।
ग्राहम

3
खैर ... यदि आपका इरादा सवाल का जवाब देने का नहीं है, तो यह वास्तव में यहाँ नहीं है ("उत्तर" के रूप में)। मैं इसे किसी बाहरी संसाधन (शायद एक GitHub gist, या एक ब्लॉग पोस्ट) में डालने पर विचार करूंगा और इसे मूल प्रश्न या किसी एक उत्तर पर टिप्पणी में जोड़ूंगा।
Zach Lysobey

21
@ZachLysobey हर नियम का अपवाद है - और यह देखने के लिए एक शांत, उपयोगी चीज है।
डैन निसेनबाम

16

एमडीएन के अनुसार : तत्वों के आयामों का निर्धारण

offsetWidthऔर offsetHeight"तत्व की कुल राशि एक तत्व में रहती है, जो दृश्य सामग्री की चौड़ाई, स्क्रॉलबार (यदि कोई हो), गद्दी और सीमा पर वापस लौटें"

clientWidthऔर clientHeight"वास्तविक प्रदर्शन की गई सामग्री कितनी जगह लेती है, जिसमें पैडिंग भी शामिल है लेकिन सीमा, मार्जिन या स्क्रोलबार सहित वापस नहीं"

scrollWidthऔर scrollHeight"वर्तमान में दिखाई देने वाली सामग्री की परवाह किए बिना" सामग्री का वास्तविक आकार लौटाएं

तो यह इस बात पर निर्भर करता है कि मापी गई सामग्री वर्तमान देखने योग्य क्षेत्र से बाहर होने की उम्मीद है या नहीं।


5

आपको केवल IE7 और पुराने के लिए इसकी गणना करने की आवश्यकता है (और केवल अगर आपकी सामग्री का निश्चित आकार नहीं है)। मेरा सुझाव है कि HTML सशर्त टिप्पणियों का उपयोग हैक को पुराने IEs में सीमित करने के लिए करें जो CSS2 का समर्थन नहीं करते हैं। अन्य सभी ब्राउज़रों के लिए इसका उपयोग करें:

<style type="text/css">
    html,body {display:table; height:100%;width:100%;margin:0;padding:0;}
    body {display:table-cell; vertical-align:middle;}
    div {display:table; margin:0 auto; background:red;}
</style>
<body><div>test<br>test</div></body>

यह अचूक उपाय है। यह <div>किसी भी आकार का केंद्र है, और अपनी सामग्री के आकार के लिए इसे छोटा कर देता है।


3

तत्वों की शैलियों को संशोधित करना आसान है लेकिन मूल्य को पढ़ने के लिए थोड़े मुश्किल।

जावास्क्रिप्ट किसी भी तत्व शैली की संपत्ति (elem.style) को css (आंतरिक / बाहरी) से नहीं पढ़ सकता है जब तक कि आप जावास्क्रिप्ट में निर्मित मेक कॉल getComputedStyle का उपयोग न करें।

getComputedStyle (तत्व [, छद्म])

तत्व: के लिए मान पढ़ने के लिए तत्व।
छद्म: एक छद्म तत्व यदि आवश्यक हो, उदाहरण के लिए :: पहले। एक रिक्त स्ट्रिंग या कोई तर्क का अर्थ तत्व ही नहीं है।

परिणाम शैली गुणों के साथ एक वस्तु है, जैसे एलएम.स्टाइल, लेकिन अब सभी सीएसएस वर्गों के संबंध में।

उदाहरण के लिए, यहाँ शैली मार्जिन नहीं देखती है:

<head>
  <style> body { color: red; margin: 5px } </style>
</head>
<body>

  <script>
    let computedStyle = getComputedStyle(document.body);

    // now we can read the margin and the color from it

    alert( computedStyle.marginTop ); // 5px
    alert( computedStyle.color ); // rgb(255, 0, 0)
  </script>

</body>

तो अपने javaScript कोड को संशोधित करने के लिए इसमें उस तत्व का getComputedStyle शामिल करें जिसे आप प्राप्त करना चाहते हैं, यह चौड़ाई / ऊंचाई या अन्य विशेषता है

window.onload = function() {

    var test = document.getElementById("test");
    test.addEventListener("click", select);


    function select(e) {                                  
        var elementID = e.target.id;
        var element = document.getElementById(elementID);
        let computedStyle = getComputedStyle(element);
        var width = computedStyle.width;
        console.log(element);
        console.log(width);
    }

}

संगणित और सुलझे हुए मूल्य

CSS में दो अवधारणाएँ हैं:

सीएसएस कैस्केड के परिणामस्वरूप सभी सीएसएस नियमों और सीएसएस वंशानुक्रम लागू होने के बाद एक गणना शैली मूल्य मूल्य है। यह ऊंचाई की तरह दिख सकता है: 1em या फ़ॉन्ट-आकार: 125%।

एक हल की गई स्टाइल वैल्यू वह है जो अंततः तत्व पर लागू होती है। मान जैसे 1em या 125% सापेक्ष हैं। ब्राउज़र गणना मूल्य लेता है और सभी इकाइयों को निश्चित और निरपेक्ष बनाता है, उदाहरण के लिए: ऊँचाई: 20px या फ़ॉन्ट-आकार: 16px। ज्यामिति गुणों के लिए हल किए गए मानों में एक अस्थायी बिंदु हो सकता है, जैसे चौड़ाई: 50.5px।

एक लंबे समय पहले getComputedStyle को कम्प्यूटेड मान प्राप्त करने के लिए बनाया गया था, लेकिन यह पता चला कि हल किए गए मान बहुत अधिक सुविधाजनक हैं, और मानक बदल गया है।
इसलिए आजकल getComputedStyle वास्तव में संपत्ति का सुलझा हुआ मूल्य लौटाता है।

कृपया ध्यान दें:

getComputedStyle को पूरी प्रॉपर्टी के नाम की आवश्यकता होती है

आपको हमेशा सटीक संपत्ति के लिए पूछना चाहिए जो आप चाहते हैं, जैसे पेडिंग लाईट या ऊंचाई या चौड़ाई। अन्यथा सही परिणाम की गारंटी नहीं है।

उदाहरण के लिए, अगर वहाँ गुण गद्दी / गद्दी से ऊपर हैं, तो हमें getComputedStyle (हाथी) के लिए क्या मिलना चाहिए। कुछ भी नहीं, या शायद ज्ञात पैडिंग से "उत्पन्न" मूल्य? यहां कोई मानक नियम नहीं है।

अन्य विसंगतियां हैं। एक उदाहरण के रूप में, कुछ ब्राउज़र (क्रोम) नीचे दिए गए दस्तावेज़ में 10px दिखाते हैं, और उनमें से कुछ (फ़ायरफ़ॉक्स) - नहीं:

<style>
  body {
    margin: 30px;
    height: 900px;
  }
</style>
<script>
  let style = getComputedStyle(document.body);
  alert(style.margin); // empty string in Firefox
</script>

अधिक जानकारी के लिए https://javascript.info/styles-and-classes


1

element.offsetWidth और element.offsetHeight करना चाहिए, जैसा कि पिछली पोस्ट में बताया गया है।

हालांकि, यदि आप केवल सामग्री को केंद्र में रखना चाहते हैं, तो ऐसा करने का एक बेहतर तरीका है। मान लें कि आप xHTML सख्त DOCTYPE का उपयोग करते हैं। मार्जिन सेट करें: 0, ऑटो प्रॉपर्टी और बॉडी टैग के लिए px में आवश्यक चौड़ाई। सामग्री पृष्ठ के लिए केंद्र से जुड़ जाती है।


1
मुझे लगता है कि वह इसे लंबवत रूप से भी केन्द्रित करना चाहते हैं, जो सीएसएस के साथ एक सही दर्द है जब तक कि आप कुछ विशिष्ट मानदंडों (जैसे ज्ञात-आकार की सामग्री) को पूरा नहीं कर सकते
ग्रेग

1

... लगता है कि सीएसएस को केंद्र में रखने में मदद ...

<style>
 .monitor {
 position:fixed;/* ... absolute possible if on :root */
 top:0;bottom:0;right:0;left:0;
 visibility:hidden;
 }
 .wrapper {
 width:200px;/* this is size range */
 height:100px;
 position:absolute;
 left:50%;top:50%;
 visibility:hidden;
 }

 .content {
 position:absolute;
 width: 100%;height:100%;
 left:-50%;top:-50%;
 visibility:visible;
 }

</style>

 <div class="monitor">
  <div class="wrapper">
   <div class="content">

 ... so you hav div 200px*100px on center ...

  </div>
 </div>
</div>

0

भी आप इस कोड का उपयोग कर सकते हैं:

var divID = document.getElementById("divid");

var h = divID.style.pixelHeight;

1
हम्म, क्रोम और IE9 में काम करता है, फ़ायरफ़ॉक्स में काम नहीं करता है। क्या यह केवल कुछ डॉक्स प्रकारों के लिए काम करता है?
BrainSlugs83

1
पिक्सेलहाइट एक इंटरनेट एक्सप्लोरर का आविष्कार था जिसका अब और नहीं किया जाना चाहिए stackoverflow.com/q/17405066/2194590
HolgerJeromin

0

यदि आपको इसे ब्राउज़र के डिस्प्ले पोर्ट में केंद्रित करने की आवश्यकता है; आप इसे केवल CSS के साथ प्राप्त कर सकते हैं

yourSelector {
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
} 

-2

यहाँ WKWebView के लिए कोड है जो विशिष्ट डोम तत्व की ऊंचाई निर्धारित करता है (पूरे पृष्ठ के लिए ठीक से काम नहीं करता है)

let html = "<body><span id=\"spanEl\" style=\"font-family: '\(taskFont.fontName)'; font-size: \(taskFont.pointSize - 4.0)pt; color: rgb(\(red), \(blue), \(green))\">\(textValue)</span></body>"
webView.navigationDelegate = self
webView.loadHTMLString(taskHTML, baseURL: nil)

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    webView.evaluateJavaScript("document.getElementById(\"spanEl\").getBoundingClientRect().height;") { [weak self] (response, error) in
        if let nValue = response as? NSNumber {

        }
    }
}

बस स्पष्ट होने के लिए, यह आईओएस swiftकोड है, है ना? जावास्क्रिप्ट नहीं। मैं एक डाउनवोट (b / c यह वास्तव में बहुत उपयोगी हो सकता है) तह कर रहा हूं, लेकिन कृपया ध्यान दें कि यह प्रश्न का उत्तर नहीं देता है , और संभवतः दूसरे, iOS विशिष्ट, प्रश्न पर अधिक उपयुक्त होगा। यदि कोई पहले से मौजूद नहीं है, तो शायद एक और स्व-उत्तर देने पर विचार करें।
ज़च लिसोबाई

-3

यदि ऑफसेटविट 0 रिटर्न करता है, तो आप तत्व की शैली चौड़ाई संपत्ति प्राप्त कर सकते हैं और इसे एक नंबर के लिए खोज सकते हैं। "100px" -> 100

/\d*/.exec(MyElement.style.width)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.