এইচটিএমএল উপাদানটির আসল প্রস্থ এবং উচ্চতা কীভাবে পুনরুদ্ধার করব?


892

মনে করুন যে আমার কাছে <div>ব্রাউজারের ডিসপ্লেতে (ভিউপোর্ট) কেন্দ্র করতে চান। এটি করতে, আমাকে <div>উপাদানটির প্রস্থ এবং উচ্চতা গণনা করতে হবে ।

আমার কী ব্যবহার করা উচিত? দয়া করে ব্রাউজারের সামঞ্জস্যের তথ্য অন্তর্ভুক্ত করুন।


9
মনে রাখবেন যে কোনও পদ্ধতির মাধ্যমে কোনও উপাদানের উচ্চতা পাওয়া সর্বদা একটি কার্যকারিতা প্রভাব ফেলে কারণ এটি ব্রাউজারটিকে পৃষ্ঠার সমস্ত উপাদানগুলির অবস্থান পুনরায় গণনা করে (রিফ্লো)। অতএব, এটি খুব বেশি করে এড়িয়ে চলুন। কী ধরণের জিনিসগুলি রিফ্লোকে ট্রিগার করে তার জন্য এই তালিকাটি চেকআউট করুন ।
মার্সেলো লাজারোনি

উত্তর:


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
Denilson SA Maia,

30
কোন পরিস্থিতিতে এটি 0 ফিরে আসে?
চিতা

46
@ জেডিএন্ডসিপশনস: offsetWidthযদি উপাদানটি থাকে তবে 0 হবে display:none, যদিও গণনাগুলির widthএখনও এই উদাহরণে একটি ইতিবাচক মান থাকতে পারে। visibility:hiddenপ্রভাবিত করে না offsetWidth
মিঃ হোয়েট

20
@ সুপুহস্তার উভয়েরই আলাদা অর্থ রয়েছে। 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নিকটতম পূর্ণসংখ্যার সাথে গোল হবে।

আইই 8 দ্রষ্টব্য : আইই 8 এবং এর নীচে getBoundingClientRectউচ্চতা এবং প্রস্থ ফিরে আসে না *

আপনার যদি অবশ্যই IE8 সমর্থন করে তবে ব্যবহার করুন .offsetWidthএবং .offsetHeight:

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

এটি লক্ষণীয় যে এই পদ্ধতিতে প্রত্যাবর্তিত অবজেক্টটি আসলে কোনও সাধারণ বস্তু নয়। এর বৈশিষ্ট্যগুলি গণনাযোগ্য নয় (সুতরাং উদাহরণস্বরূপ, Object.keysবাক্সের বাইরে কাজ করে না))

এখানে আরও তথ্য: একটি ক্লায়েন্টরেক্ট / ডমরেক্টকে কীভাবে একটি সরল অবজেক্টে রূপান্তর করা যায় তা সেরা best

রেফারেন্স:


8
getboundingClientRect () CSS এর মাধ্যমে স্কেল করা উপাদানগুলির প্রকৃত প্রস্থ এবং উচ্চতা ফিরে আসবে offsetHeightএবং offsetWidthকরবে না।
লুক

66

দ্রষ্টব্য : এই উত্তরটি ২০০৮ সালে লেখা হয়েছিল the সেই সময়ে বেশিরভাগ লোকের জন্য সেরা ক্রস ব্রাউজার সমাধানটি ছিল সত্যিই jQuery ব্যবহার করা। আমি উত্তর এখানে উত্তরোত্তর জন্য রেখে দিচ্ছি এবং আপনি যদি jQuery ব্যবহার করেন তবে এটি করার এটি একটি ভাল উপায়। আপনি যদি অন্য কোনও কাঠামো ব্যবহার করছেন বা খাঁটি জাভাস্ক্রিপ্ট গ্রহণযোগ্য উত্তর সম্ভবত যাওয়ার উপায়।

JQuery এর 1.2.6 এর হিসাবে আপনি কোর ব্যবহার করতে পারেন সিএসএস ফাংশন , 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
কেবল পরিষ্কার করার জন্য ... এই ব্রাউজারগুলির মধ্যে কেউ কি অন্যের থেকে আলাদা কিছু করে? আমি কোনো পার্থক্য খুঁজে পাচ্ছি না ... এছাড়াও, আমি নই নিচে- ভোটিং (এখনও), কিন্তু এই না সত্যিই সরাসরি প্রশ্নের উত্তর যদিও এটা সহজে তা করতে editted যেতে পারে।
জাচ লিসোবেই

1
প্রশ্নের উত্তর দেওয়ার লক্ষ্য ছিল না - এর ইতিমধ্যে উত্তর দেওয়া হয়েছে। কেবলমাত্র কিছু সহায়ক তথ্য এবং হ্যাঁ সমস্ত মূল সর্বশেষ সংস্করণ ব্রাউজারগুলি এই মানগুলিতে সম্মত হয় - যা একটি ভাল জিনিস thing
গ্রাহাম

3
ঠিক আছে ... যদি আপনার উদ্দেশ্যটি প্রশ্নের উত্তর না দেওয়া হয়, তবে এটি আসলে এখানে অন্তর্ভুক্ত নয় (একটি "উত্তর" হিসাবে)। আমি এটিকে কিছু বাহ্যিক সংস্থান (সম্ভবত একটি গিটহাব গিস্ট, বা একটি ব্লগ পোস্ট) এ রাখার এবং মূল প্রশ্ন বা উত্তরগুলির একটিতে একটি মন্তব্যে এটি লিঙ্ক করার বিষয়টি বিবেচনা করব।
জাচ লিসোবেই

21
@ জাচলাইসোবি প্রতিটি নিয়মের ব্যতিক্রম আছে - এবং এটি দেখতে একটি দুর্দান্ত, দরকারী জিনিস।
ড্যান নিসেনবাউম

16

এমডিএন অনুসারে : উপাদানগুলির মাত্রা নির্ধারণ করা

offsetWidthএবং offsetHeight"দৃশ্যমান সামগ্রীর প্রস্থ, স্ক্রোলবারগুলি (যদি থাকে), প্যাডিং এবং সীমানার সহ কোনও উপাদান দখল করা মোট পরিমাণের পরিমাণ ফেরত দিন"

clientWidthএবং clientHeight"আসল প্রদর্শিত সামগ্রীটি প্যাডিং সহ কিন্তু সীমানা, মার্জিন, বা স্ক্রোলবারগুলি সহ না করে কতটা জায়গা নেয় তা ফিরিয়ে দিন"

scrollWidthএবং scrollHeight"সামগ্রীর প্রকৃত আকার, এটি বর্তমানে কতটা দৃশ্যমান তা নির্বিশেষে" ফিরিয়ে দিন

সুতরাং এটি পরিমাপ করা সামগ্রীটি বর্তমান দেখার ক্ষেত্রের বাইরে থাকবে কি না তার উপর নির্ভর করে।


5

আপনার কেবল এটি আই 7 এবং তার চেয়ে বেশি বয়সের জন্য গণনা করতে হবে (এবং কেবল আপনার সামগ্রীর স্থির আকার না থাকলে)) আমি সিএসএস 2 সমর্থন করে না এমন পুরানো আইইগুলিতে হ্যাক সীমাবদ্ধ করতে এইচটিএমএল শর্তযুক্ত মন্তব্যগুলি ব্যবহার করার পরামর্শ দিচ্ছি। অন্যান্য সমস্ত ব্রাউজারের জন্য এটি ব্যবহার করুন:

<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

উপাদানগুলির শৈলীর সংশোধন করা সহজ তবে মানটি পড়ার জন্য কৌশলপূর্ণ y

জাভাস্ক্রিপ্ট সিএসএস (অভ্যন্তরীণ / বাহ্যিক) থেকে আগত কোনও উপাদান শৈলীর সম্পত্তি (ইলেম.স্টাইল) পড়তে পারে না যদি আপনি জাভাস্ক্রিপ্টে বিল্ট ইন মেথড কল গেটকম্পিউডস্টাইল ব্যবহার না করেন।

getComputesStyle (উপাদান [, ছদ্ম]]

উপাদান: মানটি পড়ার উপাদান।
সিউডো: প্রয়োজনে একটি সিউডো-উপাদান, উদাহরণস্বরূপ :: আগে। একটি খালি স্ট্রিং বা কোনও যুক্তি মানে উপাদান নিজেই।

ফলাফল হ'ল স্টাইলের মতো স্টাইলের বৈশিষ্ট্যযুক্ত একটি বস্তু, তবে এখন সমস্ত সিএসএস শ্রেণিতে সম্মান।

উদাহরণস্বরূপ, এখানে স্টাইলটি মার্জিনটি দেখতে পাচ্ছে না:

<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>

সুতরাং আপনার জাভাস্ক্রিপ্ট কোডটি পরিমার্জন করে আপনি যে উপাদানটির প্রস্থ / উচ্চতা বা অন্যান্য বৈশিষ্ট্য পেতে চান তার গেটকম্পটেড স্টাইল অন্তর্ভুক্ত করুন

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);
    }

}

গণিত এবং সমাধান করা মান

সিএসএসে দুটি ধারণা রয়েছে:

সিএসএস ক্যাসকেডের ফলস্বরূপ সমস্ত সিএসএস বিধি এবং সিএসএস উত্তরাধিকার প্রয়োগের পরে একটি গণিত শৈলীর মান। এটি উচ্চতার মতো দেখতে পারে: 1 মিমি বা হরফ আকার: 125%।

একটি সমাধান করা শৈলীর মান হ'ল শেষ পর্যন্ত উপাদানটিতে প্রয়োগ করা। 1 ম বা 125% এর মতো মানগুলি আপেক্ষিক। ব্রাউজারটি গণিত মান গ্রহণ করে এবং সমস্ত ইউনিটকে স্থির ও নিখুঁত করে তোলে, উদাহরণস্বরূপ: উচ্চতা: 20px বা ফন্ট-আকার: 16px। জ্যামিতির বৈশিষ্ট্যগুলির জন্য সমাধান হওয়া মানগুলির প্রস্থ: 50.5px এর মতো একটি ভাসমান পয়েন্ট থাকতে পারে।

একটি দীর্ঘ সময় আগে getComputesStyle গণিত মান পেতে তৈরি করা হয়েছিল, কিন্তু দেখা গেল যে সমাধান করা মানগুলি আরও বেশি সুবিধাজনক এবং মান পরিবর্তিত হয়েছে।
সুতরাং আজকাল getComputesStyle প্রকৃতপক্ষে সম্পত্তিটির সমাধান করা মান প্রদান করে।

দয়া করে নোট করুন:

getComputesStyle এর সম্পূর্ণ সম্পত্তির নাম প্রয়োজন

প্যাডিং লেফট বা উচ্চতা বা প্রস্থের মতো আপনি যা চান ঠিক তার জন্য আপনার জিজ্ঞাসা করা উচিত। অন্যথায় সঠিক ফলাফল গ্যারান্টিযুক্ত হয় না।

উদাহরণস্বরূপ, যদি লেডিং / প্যাডিংপপ বৈশিষ্ট্যগুলি থাকে, তবে আমাদের getComputesStyle (এলেম) .প্যাডিংয়ের জন্য কী পাওয়া উচিত? কিছুই নেই, বা সম্ভবত পরিচিত প্যাডিংস থেকে একটি "উত্পন্ন" মান? এখানে কোনও মান নিয়ম নেই।

অন্যান্য অসঙ্গতি রয়েছে। উদাহরণ হিসাবে, কিছু ব্রাউজার (ক্রোম) নীচের দস্তাবেজে 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- ক্লাসগুলি


1

এলিমেন্ট.অফসেটউইথ এবং এলিমেন্ট.অফসেটহাইটটি আগের পোস্টে প্রস্তাবিত হিসাবে করা উচিত।

তবে, আপনি যদি কেবল বিষয়বস্তুটিকে কেন্দ্র করে রাখতে চান, তবে এটি করার আরও ভাল উপায় আছে। ধরে নিচ্ছি আপনি এক্সএইচটিএমএল কঠোরভাবে 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
হুম, ক্রোম এবং আইই 9 এ কাজ করে, ফায়ারফক্সে কাজ করছে বলে মনে হয় না। এটি কি কিছু নির্দিষ্ট ডক ধরণের জন্য কাজ করে?
BrainSlugs83

1
pixelHeight হল Internet Explorer এর উদ্ভাবন যা আর ব্যবহার করা উচিত ছিল stackoverflow.com/q/17405066/2194590
HolgerJeromin

0

আপনার যদি ব্রাউজারের ডিসপ্লে পোর্টে এটি কেন্দ্রের প্রয়োজন হয়; আপনি কেবল সিএসএস দিয়ে এটি অর্জন করতে পারেন

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

-2

নির্দিষ্ট ডম উপাদানটির উচ্চতা নির্ধারণ করে (পুরো পৃষ্ঠার জন্য সঠিকভাবে কাজ করে না) ডব্লিউকেউইউভিউয়ের কোড এখানে is

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কোড, তাই না? জাভাস্ক্রিপ্ট নয়। আমি একটি ডাউনভোটটি সহিংস করছি (খ / সি এটি আসলে বেশ কার্যকর হতে পারে) তবে দয়া করে মনে রাখবেন যে এটি প্রশ্নের উত্তর দেয় না এবং সম্ভবত আইওএস নির্দিষ্ট, প্রশ্নে আরও উপযুক্ত হবে। যদি ইতিমধ্যে কোনও উপস্থিত না থাকে তবে সম্ভবত একজনকে জিজ্ঞাসা করা এবং স্ব-উত্তর দেওয়া বিবেচনা করুন।
Zach Lysobey

-3

অফসেটউইথ যদি 0 ফেরত দেয় তবে আপনি উপাদানটির স্টাইলের প্রস্থের সম্পত্তি পেতে পারেন এবং এটি একটি সংখ্যার জন্য অনুসন্ধান করতে পারেন। "100px" -> 100

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.