Подтвердить что ты не робот

Получите высоту элемента минус заполнение, маржа, ширина границы

Кто-нибудь знает, возможно ли получить только высоту элемента (минус вертикальное заполнение, граница и маржа), когда нет объявления встроенной высоты? Мне нужно поддерживать IE8 и выше.

el.style.height не работает, потому что стили устанавливаются во внешней таблице стилей.

el.offsetHeight или el.clientHeight не работает, потому что они содержат не только высоту элемента. И я не могу просто вычесть элемент padding и т.д., Потому что эти значения также заданы в таблице стилей CSS, а не в строке (и поэтому el.style.paddingTop не работает).

Также не удается выполнить window.getComputedStyle(el), потому что IE8 не поддерживает это.

jQuery имеет метод height(), который предлагает это, но я не использую jQuery в этом проекте, плюс я просто хочу знать, как это сделать в чистом JavaScript.

У кого-нибудь есть мысли? Очень ценится.

4b9b3361

Ответ 1

Здесь вы идете:

var style = window.getComputedStyle(document.getElementById("Example"), null);
style.getPropertyValue("height");

Вышеприведенная версия будет работать в современных браузерах. Проверьте текущие версии браузеров IE.

Кросс-браузер:

try {
 el = window.getComputedStyle(document.getElementById('example'), null)
     .getPropertyValue('height');
} catch(e) {
 el = document.getElementById('example').currentStyle.height;
} 

источник

Ответ 2

Здесь решение, которое работает для обоих случаев box-sizing: content-box и border-box.

var computedStyle = getComputedStyle(element);

elementHeight = element.clientHeight;  // height with padding
elementWidth = element.clientWidth;   // width with padding

elementHeight -= parseFloat(computedStyle.paddingTop) + parseFloat(computedStyle.paddingBottom);
elementWidth -= parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight);

Работает в IE9 +

Вы можете использовать обнаружение функций

if (!getComputedStyle) { alert('Not supported'); } 

Это не будет работать, если элемент display равен inline. Используйте inline-block или используйте getBoundingClientRect.

Ответ 3

Улучшен код Дэн для работы с встроенными элементами (используя offset* вместо client*):

var cs = getComputedStyle(element);

var paddingX = parseFloat(cs.paddingLeft) + parseFloat(cs.paddingRight);
var paddingY = parseFloat(cs.paddingTop) + parseFloat(cs.paddingBottom);

var borderX = parseFloat(cs.borderLeftWidth) + parseFloat(cs.borderRightWidth);
var borderY = parseFloat(cs.borderTopWidth) + parseFloat(cs.borderBottomWidth);

// Element width and height minus padding and border
elementWidth = element.offsetWidth - paddingX - borderX;
elementHeight = element.offsetHeight - paddingY - borderY;

Ответ 4

Попробуйте element.currentStyle в IE8. Но помните, что borderRightWidth (borderLeftWidth) возвращает не пиксели, а "тонкие", "средний", "толстый".

Ответ 5

Превратил ответ Дана в функцию

export const innerDemensions = (node) => {
  var computedStyle = getComputedStyle(node)

  let height = node.clientHeight // height with padding
  let width = node.clientWidth // width with padding

  height -= parseFloat(computedStyle.paddingTop) + parseFloat(computedStyle.paddingBottom)
  width -= parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight)
  return { height, width }
}