Отримайте значення CSS за допомогою JavaScript


199

Я знаю, що я можу встановити значення CSS через JavaScript, наприклад:

document.getElementById('image_1').style.top = '100px';

Але чи можу я отримати поточне значення певного стилю? Я читав, де я можу отримати весь стиль для елемента, але мені не хочеться розбирати весь рядок, якщо мені цього не потрібно.


Яке «конкретне значення стилю» ви намагаєтеся отримати?
BryanH

поточні значення позиціонування: висота, ширина, верх, запас тощо
Майкл Пол

2
Ваше запитання дає змогу вірити, що ви хочете чогось на зразок, можливо, захочете var top = document.getElementById('image_1').style.top; перефразовувати це, якщо це не те, що ви хочете
Марк

Thx All, обидва методи працюють ідеально, саме те, що мені було потрібно. Метод Jquery трохи компактніший, тому я, мабуть, цим скористаюся.
Майкл Пол

Відповіді:


358

Можна використовувати getComputedStyle().

var element = document.getElementById('image_1'),
    style = window.getComputedStyle(element),
    top = style.getPropertyValue('top');

jsFiddle .


10
Якщо ви хочете змінити колір тла, наприклад, будьте обережні, щоб НЕ ВИКОРИСТАТИ "backgroundColor" замість "backgroung-color";)
baptx

4
SLW це абревіатура чи ти мав на увазі повільний?
Девід Віньєцький

3
getComputedStyle не підтримується в IE 8 і нижче.
Девід Віньєцький

6
Дещо поза темою: деякі (всі?) Скорочення css-властивостей недоступні в JavaScript. Наприклад, ви можете отримати накладки зліва, але не накладки. JSFiddle
David Winiecki

4
@DavidWiniecki я не вірю, що webdevs все ще повинен вважати IE8 основним браузером. вважаючи, що його більше не підтримує microsoft
Кевін Куйл

23

Властивість element.style дозволяє вам знати лише властивості CSS, які були визначені як вбудовані в цьому елементі (програмно або визначено в атрибуті стилю елемента), ви повинні отримати обчислений стиль.

Це не так просто зробити крос-браузерним способом, IE має свій власний шлях через властивість element.currentStyle, а стандартний спосіб DOM рівня 2, реалізований іншими браузерами, здійснюється методом document.defaultView.getComputedStyle.

Два способи мають відмінності, наприклад, властивість IE element.currentStyle очікує, що ви отримаєте доступ до імен властивостей CSS, що складаються з двох або більше слів у camelCase (наприклад, maxHeight, fontSize, backgroundColor тощо), стандартний спосіб очікує властивості з слова, розділені тире (наприклад, максимальна висота, розмір шрифту, колір тла тощо). ......

function getStyle(el, styleProp) {
    var value, defaultView = (el.ownerDocument || document).defaultView;
    // W3C standard way:
    if (defaultView && defaultView.getComputedStyle) {
        // sanitize property name to css notation
        // (hyphen separated words eg. font-Size)
        styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase();
        return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
    } else if (el.currentStyle) { // IE
        // sanitize property name to camelCase
        styleProp = styleProp.replace(/\-(\w)/g, function(str, letter) {
            return letter.toUpperCase();
        });
        value = el.currentStyle[styleProp];
        // convert other units to pixels on IE
        if (/^\d+(em|pt|%|ex)?$/i.test(value)) { 
            return (function(value) {
                var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
                el.runtimeStyle.left = el.currentStyle.left;
                el.style.left = value || 0;
                value = el.style.pixelLeft + "px";
                el.style.left = oldLeft;
                el.runtimeStyle.left = oldRsLeft;
                return value;
            })(value);
        }
        return value;
    }
}

Основний еталонний потік потоку



16

Рішення між переглядачами для перевірки значень CSS без маніпуляції з DOM:

function get_style_rule_value(selector, style)
{
 for (var i = 0; i < document.styleSheets.length; i++)
 {
  var mysheet = document.styleSheets[i];
  var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;

  for (var j = 0; j < myrules.length; j++)
  {
   if (myrules[j].selectorText && myrules[j].selectorText.toLowerCase() === selector)
   {
    return myrules[j].style[style];
   }
  }
 }
};

Використання:

get_style_rule_value('.chart-color', 'backgroundColor')

Санітована версія (примушує введення селектора в малі регістри та дозволяє використовувати регістр без "". ")

function get_style_rule_value(selector, style)
{
 var selector_compare=selector.toLowerCase();
 var selector_compare2= selector_compare.substr(0,1)==='.' ?  selector_compare.substr(1) : '.'+selector_compare;

 for (var i = 0; i < document.styleSheets.length; i++)
 {
  var mysheet = document.styleSheets[i];
  var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;

  for (var j = 0; j < myrules.length; j++)
  {
    if (myrules[j].selectorText)
    {
     var check = myrules[j].selectorText.toLowerCase();
     switch (check)
     {
      case selector_compare  :
      case selector_compare2 : return myrules[j].style[style];
     }
    }
   }
  }
 }

У мене був довгий день, і це не працювало з ряду причин. pastie.org/9754599 працює набагато краще, викидаючи недійсні списки правил і зменшуючи обидві сторони остаточного ===. Дякую, що ваше рішення все-таки зберегло день!
Річард Фокс

Хороша відповідь, додав санітарну версію наприкінці, щоб виправити декілька проблем із використанням кращих справ
несинхронізований

7

Якщо встановити його програмно, ви можете просто назвати його як змінну (тобто document.getElementById('image_1').style.top). В іншому випадку ви завжди можете використовувати jQuery:

<html>
    <body>
        <div id="test" style="height: 100px;">Test</div>
        <script type="text/javascript" src="jquery.min.js"></script>
        <script type="text/javascript">
            alert($("#test").css("height"));
        </script>
    </body>
</html>

7
Я не думаю, що ваш приклад jQuery дуже зрозумілий (або правильний).
алекс

властивість стилю return all style inline застосовується до елемента, не визначеного правилами css.
Стівен Кох

2

Якщо ви перебуваєте в бібліотеках, чому б не MyLibrary і getStyle .

Метод jQuery css неправильно називається, CSS - лише один із способів встановлення стилів і не обов'язково представляє фактичні значення властивостей стилю елемента.


2

У 2020 році

перевірити перед використанням

Ви можете використовувати computedStyleMap ()

Відповідь є дійсною, але іноді вам потрібно перевірити, яку одиницю вона повертає, ви можете отримати її без будь-якого slice()або substring()рядка.

var element = document.querySelector('.js-header-rep');
element.computedStyleMap().get('padding-left');

var element = document.querySelector('.jsCSS');
var con = element.computedStyleMap().get('padding-left');
console.log(con);
.jsCSS {
  width: 10rem;
  height: 10rem;
  background-color: skyblue;
  padding-left: 10px;
}
<div class="jsCSS"></div>


1

В цілях безпеки ви можете перевірити, чи існує елемент, перш ніж спробувати прочитати з нього. Якщо його не існує, ваш код видасть виняток, який зупинить виконання на іншій частині вашого JavaScript і, можливо, відобразить повідомлення про помилку користувачеві - не добре. Ви хочете мати можливість вийти з ладу витончено.

var height, width, top, margin, item;
item = document.getElementById( "image_1" );
if( item ) {
  height = item.style.height;
  width = item.style.width;
  top = item.style.top;
  margin = item.style.margin;
} else {
  // Fail gracefully here
}

5
Це погана ідея, якщо ви дійсно не очікуєте, що вузол може бути не в DOM. Сліпі перевірки нуля, коли нуль не очікується, можуть призвести до появи помилок, але, швидше за все, прихована помилка. Якщо ви очікуєте, що вузол буде там, не кодуйте його, щоб він не був там, нехай виникне помилка, щоб ви могли виправити свій код. Ця відповідь не має нічого спільного з самим питанням, і оскільки це більше (погана) пропозиція, це має бути коментарем.
Хуан Мендес

2
Дякуємо за ваш коментар Я роблю це, тому що я прагну розвиватися оборонно. Ось питання: як би ви бачили помилку на машині користувача? Пам’ятайте: те, що працює на вашій машині, може не працювати для інших (різні браузери та ОС, плагіни, які впливають на поведінку сторінки, різні інші речі вимкнено тощо). Сенс полягав у тому, щоб він вийшов вишукано, тому сторінка все-таки зробила щось близьке до того, що було призначено замість того, щоб вискакувати непотрібну помилку для користувача.
BryanH

@BryanH Є помилка в браузері, де не відображається елемент з ідентифікатором "image_1"? ;)
alex

@alex Ні. Якщо немає елемента з цим ідентифікатором, код OP відмовиться з помилкою. Приклад . Моя пропозиція полягала в кодуванні, щоб цього ніколи не відбулося.
BryanH

0

Рішення крос-браузера без маніпуляцій з DOM, наведеним вище, не працює, оскільки воно дає перше правило узгодження, а не останнє. Останнє правило узгодження - це те, що застосовується. Ось робоча версія:

function getStyleRuleValue(style, selector) {
  let value = null;
  for (let i = 0; i < document.styleSheets.length; i++) {
    const mysheet = document.styleSheets[i];
    const myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
    for (let j = 0; j < myrules.length; j++) {
      if (myrules[j].selectorText && 
          myrules[j].selectorText.toLowerCase() === selector) {
        value =  myrules[j].style[style];
      }
    }
  }
  return value;
}  

Однак цей простий пошук не спрацює у випадку складних селекторів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.