Nhận giá trị CSS bằng JavaScript


199

Tôi biết tôi có thể đặt giá trị CSS thông qua JavaScript, chẳng hạn như:

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

Nhưng, tôi có thể nhận được một giá trị kiểu cụ thể hiện tại không? Tôi đã đọc nơi tôi có thể lấy toàn bộ kiểu cho phần tử, nhưng tôi không muốn phải phân tích toàn bộ chuỗi nếu tôi không phải.


"Giá trị kiểu cụ thể" nào bạn đang cố gắng đạt được?
BryanH

các giá trị định vị hiện tại: chiều cao, chiều rộng, đỉnh, lề, v.v.
Michael Paul

2
Câu hỏi của bạn cho rằng bạn muốn một cái gì đó như var top = document.getElementById('image_1').style.top; May muốn viết lại câu hỏi nếu đó không phải là điều bạn muốn
Marc

Tất cả, cả hai phương pháp đều hoạt động hoàn hảo, đúng như những gì tôi cần. Phương pháp Jquery nhỏ gọn hơn một chút, vì vậy có lẽ tôi sẽ sử dụng phương pháp đó.
Michael Paul

Câu trả lời:


358

Bạn có thể sử dụng getComputedStyle().

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

jsFiddle .


10
Ví dụ: nếu bạn muốn thay đổi màu nền của div, hãy cẩn thận KHÔNG SỬ DỤNG "backgroundColor" thay vì "backgroung-color";)
baptx

4
Slw là một từ viết tắt hoặc bạn có nghĩa là chậm?
David Winiecki

3
getComputingStyle không được hỗ trợ trong IE 8 trở xuống.
David Winiecki

6
Hơi lạc đề: một số (tất cả?) Thuộc tính tốc ký css không thể truy cập được trong JavaScript. Ví dụ, bạn có thể nhận được đệm-trái nhưng không đệm. JSFiddle
David Winiecki

4
@DavidWiniecki Tôi không thực sự tin webdevs vẫn nên coi IE8 là trình duyệt chính. xem xét nó không còn được hỗ trợ bởi microsoft
Kevin Kuyl

23

Thuộc tính Element.style cho phép bạn chỉ biết các thuộc tính CSS được xác định là nội tuyến trong phần tử đó (theo chương trình hoặc được xác định trong thuộc tính kiểu của phần tử), bạn sẽ có được kiểu tính toán.

Không dễ để thực hiện theo cách đa trình duyệt, IE có cách riêng của mình, thông qua thuộc tính Element.civerseStyle và cách tiêu chuẩn DOM Cấp 2, được các trình duyệt khác triển khai là thông qua phương thức document.defaultView.getComputingStyle.

Hai cách có sự khác biệt, ví dụ, thuộc tính IE Element.civerseStyle mong đợi rằng bạn truy cập vào tên thuộc tính CSS gồm hai hoặc nhiều từ trong camelCase (ví dụ: maxHeight, fontSize, backgroundColor, v.v.), cách tiêu chuẩn mong đợi các thuộc tính với các từ được phân tách bằng dấu gạch ngang (ví dụ: chiều cao tối đa, cỡ chữ, màu nền, v.v.). ......

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

Luồng ngăn xếp tham chiếu chính



16

Giải pháp trình duyệt chéo để kiểm tra các giá trị CSS mà không cần thao tác 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];
   }
  }
 }
};

Sử dụng:

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

Phiên bản khử trùng (buộc đầu vào bộ chọn thành chữ thường và cho phép sử dụng mà không cần dẫn ".")

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

Tôi đã có một ngày dài và điều này đã không làm việc vì một số lý do. pastie.org/9754599 hoạt động tốt hơn rất nhiều bằng cách loại bỏ danh sách quy tắc không hợp lệ và hạ thấp cả hai mặt của trận chung kết ===. Rất cám ơn giải pháp của bạn vẫn còn lưu trong ngày!
Richard Fox

câu trả lời tốt, thêm một phiên bản vệ sinh ở cuối để khắc phục một số vấn đề sử dụng trường hợp cạnh.
không đồng bộ

7

Nếu bạn đặt nó theo chương trình, bạn có thể gọi nó như một biến (tức là document.getElementById('image_1').style.top). Mặt khác, bạn luôn có thể sử dụng 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
Tôi không nghĩ rằng ví dụ jQuery của bạn rất rõ ràng (hoặc chính xác).
alex

thuộc tính kiểu trả về tất cả kiểu nội tuyến áp dụng cho phần tử, không được xác định bởi quy tắc css.
Steven Koch

2

Nếu bạn vào thư viện, tại sao không phải MyL LibrarygetStyle .

Phương thức css của jQuery được đặt tên sai, CSS chỉ là một cách thiết lập kiểu và không nhất thiết phải biểu thị các giá trị thực của các thuộc tính kiểu của phần tử.


2

Năm 2020

kiểm tra trước khi sử dụng

Bạn có thể sử dụng computeStyleMap ()

Câu trả lời là hợp lệ nhưng đôi khi bạn cần kiểm tra đơn vị nào trả về, bạn có thể nhận được đơn vị đó mà không cần bất kỳ slice()hoặc substring()chuỗi nào.

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

Để đảm bảo an toàn, bạn có thể muốn kiểm tra xem phần tử có tồn tại trước khi bạn cố đọc từ nó không. Nếu nó không tồn tại, mã của bạn sẽ đưa ra một ngoại lệ, điều này sẽ dừng thực thi trên phần còn lại của JavaScript và có khả năng hiển thị thông báo lỗi cho người dùng - không tốt. Bạn muốn có thể thất bại một cách duyên dáng.

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
Đó là một ý tưởng tồi, trừ khi bạn thực sự mong đợi rằng nút có thể không có trong DOM. Kiểm tra null mù khi không có giá trị null có thể khiến bạn không có lỗi, nhưng nhiều khả năng nó đang ẩn một lỗi. Nếu bạn mong đợi nút ở đó, đừng mã cho nó không ở đó, hãy để xảy ra lỗi để bạn có thể sửa mã của mình. Câu trả lời này không liên quan gì đến bản thân câu hỏi và vì đó là một gợi ý (xấu) hơn, nên nó là một nhận xét.
Juan Mendes

2
Cám ơn bạn đã góp ý. Tôi làm điều đó bởi vì tôi có xu hướng phát triển phòng thủ. Đây là câu hỏi: làm thế nào bạn sẽ thấy lỗi trên máy của người dùng? Hãy nhớ rằng, những gì hoạt động cho bạn trên máy của bạn có thể không hoạt động cho người khác (các trình duyệt và hệ điều hành khác nhau, các plugin ảnh hưởng đến hành vi của trang, nhiều thứ khác bị tắt, v.v.). Vấn đề là làm cho nó thất bại một cách duyên dáng vì vậy trang vẫn làm một cái gì đó gần với những gì được dự định thay vì xuất hiện một lỗi vô dụng cho người dùng.
BryanH

@BryanH Có một lỗi trình duyệt trong đó nó không hiển thị một phần tử có id là "image_1"? ;)
alex

@alex Không. Nếu không có phần tử nào có id đó, thì mã của OP sẽ bị lỗi. Ví dụ . Đề nghị của tôi là mã để điều này không bao giờ có thể xảy ra.
BryanH

0

Giải pháp trình duyệt chéo không có thao tác DOM được đưa ra ở trên không hoạt động vì nó đưa ra quy tắc khớp đầu tiên, không phải quy tắc cuối cùng. Quy tắc kết hợp cuối cùng là quy tắc áp dụng. Đây là một phiên bản làm việc:

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

Tuy nhiên, tìm kiếm đơn giản này sẽ không hoạt động trong trường hợp bộ chọn phức tạp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.