Определение истинной границы, отступов и полей из Javascript

Есть ли способ определить истинную границу, отступы и поля элементов из кода Javascript? Если вы посмотрите на следующий код:

<html>
    <head>
        <style>
        <!--
        .some_class {
            padding-left: 2px;
            border: 2px solid green;
        }   
        -->
        </style>
        <script>
        <!--
        function showDetails()
        {
            var elem = document.getElementById("my_div");
            alert("elem.className = " + elem.className);
            alert("elem.style.padding = " + elem.style.padding);
            alert("elem.style.paddingLeft = " + elem.style.paddingLeft);
            alert("elem.style.margin = " + elem.style.margin);
            alert("elem.style.marginLeft = " + elem.style.marginLeft);
            alert("elem.style.border = " + elem.style.border);
            alert("elem.style.borderLeft = " + elem.style.borderLeft);
        }
        -->
        </script>
    </head>
    <body>
        <div id = "my_div" class = "some_class" style = "width: 300px; height: 300px; margin-left: 4px;">
            some text here
        </div>
        <button onclick = "showDetails();">show details</button>
    </body>
</html>

вы можете увидеть, если вы нажмете кнопку, что заполнение не отображается правильно. Сообщаются только свойства, определенные непосредственно через "style", а те, которые определены через класс CSS, не сообщаются.

Есть ли способ вернуть окончательные значения этих свойств? Я имею в виду значения, полученные после вычисления и применения браузером всех настроек CSS.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
10
0
23 632
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это возможно, но, конечно, у каждого браузера есть своя реализация. К счастью, PPK проделала за нас всю тяжелую работу:

http://www.quirksmode.org/dom/getstyles.html

С jQuery:

var $elm = $('.box');
var hPadding = $elm.outerWidth() - $elm.width();
var vPadding = $elm.outerHeight() - $elm.height();
var hBorder = $elm.outerWidth() - $elm.innerWidth();
var vBorder = $elm.outerHeight() - $elm.innerHeight();

console.info("Horizontal padding & border: ", hPadding);
console.info("Vertical padding & border: ", vPadding);
console.info("Horizontal border: ", hBorder);
console.info("Vertical border: ", vBorder);
.box{ 
  width: 50%;
  padding:10vw; 
  border:10px solid red; 
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='box'></div>

По-своему (но вы должны указать paddingLeft, paddingRight .. не просто padding):

var elm = $('.box');
console.info("padding left (PX): ", elm.css("paddingLeft"));
.box { 
  padding:0 50px 0 5vw; 
  border: 2px solid green; 
  width: 300px; 
  height: 300px; 
  margin-left: 4px;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class = "box">some text here</div>

А чтобы получить отступ без границ, используйте вместо этого .innerWidth () и .innerHeight ().

Bob Denny 10.09.2011 02:41

свойство style может получать стили, которые назначены встроенными, например

<div id = "target" style = "color:#ddd;margin:10px">test</div> если вы хотите получить стили, назначенные во внешнем файле css или элементе <style/>, попробуйте следующее:

var div = document.getElementById("target");
var style = div.currentStyle || window.getComputedStyle(div);
display("Current marginTop: " + style.marginTop);

если вы используете jQuery, решение @vsync подойдет.

Обратите внимание, что при использовании document.defaultView.getComputedStyle(div,null).getPropertyV‌​alue('margin-top') есть прочерк, а для div.currentStyle['marginTop'] это camelCase. Вы можете исправить это программно, используя var prop='margin-top';prop.replace(/^-/,'').replace(/-[a-z]/g,fu‌​nction(s){return s.substring(1).toUpperCase();});, что приводит к prop==='marginTop' (также работает с префиксами поставщиков).

Yeti 10.08.2017 14:43

Другие вопросы по теме