Ghi đè! Phong cách quan trọng


127

Tiêu đề khá nhiều tổng hợp nó lên.

Biểu định kiểu bên ngoài có mã sau:

td.EvenRow a {
  display: none !important;
}

Tôi đã thử sử dụng:

element.style.display = "inline";

element.style.display = "inline !important";

Nhưng không hoạt động. Có thể ghi đè một phong cách quan trọng bằng cách sử dụng javascript.

Đây là một phần mở rộng greasemonkey, nếu điều đó tạo ra sự khác biệt.



@Pacerier tiết kiệm thời gian!
Eduard

Câu trả lời:


49

Tôi tin rằng cách duy nhất để làm điều này là thêm kiểu như một khai báo CSS mới với hậu tố '! Quan trọng'. Cách dễ nhất để làm điều này là nối phần tử <style> mới vào phần đầu của tài liệu:

function addNewStyle(newStyle) {
    var styleElement = document.getElementById('styles_js');
    if (!styleElement) {
        styleElement = document.createElement('style');
        styleElement.type = 'text/css';
        styleElement.id = 'styles_js';
        document.getElementsByTagName('head')[0].appendChild(styleElement);
    }
    styleElement.appendChild(document.createTextNode(newStyle));
}

addNewStyle('td.EvenRow a {display:inline !important;}')

Các quy tắc được thêm vào bằng phương pháp trên sẽ (nếu bạn sử dụng hậu tố! Quan trọng) ghi đè lên kiểu dáng đã đặt trước đó. Nếu bạn không sử dụng hậu tố thì hãy đảm bảo tính đến các khái niệm như ' tính đặc hiệu '.


8
Điều này có thể được thay thế bằng một lớp lót. Xem bên dưới: stackoverflow.com/questions/462537/
Mạnh

2
Làm thế nào bạn sẽ tìm thấy bộ chọn thực sự kích hoạt phong cách? Tôi nghĩ rằng điều này đòi hỏi phải phân tích tất cả các bảng định kiểu, đây là một công việc khá khó khăn.
dùng123444555621

252

Có một vài lớp lót đơn giản mà bạn có thể sử dụng để làm điều này.

1) Đặt thuộc tính "style" trên thành phần:

element.setAttribute('style', 'display:inline !important');

hoặc là...

2) Sửa đổi thuộc cssTexttính của styleđối tượng:

element.style.cssText = 'display:inline !important';

Hoặc là sẽ làm công việc.

===

BTW - nếu bạn muốn một công cụ hữu ích để thao tác !importantcác quy tắc trong các phần tử, tôi đã viết một plugin jQuery có tên là "quan trọng": http://github.com/premasagar/important


Tôi nghĩ rằng việc sử dụng cssText đơn giản hơn sau đó thêm một stylethẻ.
Guss

1
@Guss - Ví dụ đầu tiên tôi đưa ra là cho một stylethuộc tính, không phải thẻ / phần tử.
Premasagar

53
Để ngăn chặn ghi đè các thuộc tính khác, người đàn ông của bạn muốn sử dụngelement.style.cssText += ';display:inline !important;';
user123444555621

5
Đây là một câu trả lời tốt hơn câu trả lời được chọn, chắc chắn, +1 để làm cho nó cao hơn.
Nathan C. Tresch

2
@ user123444555621, Premasagar. Cũng có thể sử dụng tùy chọn tốt hơn : element.style.setProperty.
Pacerier

184

element.stylecó một setPropertyphương thức có thể ưu tiên như một tham số thứ ba:

element.style.setProperty("display", "inline", "important")

không hoạt động trong các IE cũ nhưng nó sẽ ổn trong các trình duyệt hiện tại.



4
Giải pháp tốt nhất, vì nó không ghi đè toàn bộ thuộc tính style và là cách W3C có nghĩa là nó hoạt động.
stfn

Nhược điểm của nó là tôi không thể sử dụng tên tài sản trong camelCase nhưboxShadow
Pavan

@Pavan Thật dễ dàng chỉ sử dụng biểu mẫu gạch nối thay thế hoặc nếu bạn cần tự động chuyển đổi nó chỉ cần viết một hàm.
nyuszika7h

3

Dựa trên câu trả lời tuyệt vời của @ Premasagar; nếu bạn không muốn xóa tất cả các kiểu nội tuyến khác, hãy sử dụng kiểu này

//accepts the hyphenated versions (i.e. not 'cssFloat')
addStyle(element, property, value, important) {
    //remove previously defined property
    if (element.style.setProperty)
        element.style.setProperty(property, '');
    else
        element.style.setAttribute(property, '');

    //insert the new style with all the old rules
    element.setAttribute('style', element.style.cssText +
        property + ':' + value + ((important) ? ' !important' : '') + ';');
}

Không thể sử dụng removeProperty()vì nó sẽ không xóa !importantcác quy tắc trong Chrome.
Không thể sử dụng element.style[property] = ''vì nó chỉ chấp nhận camelCase trong FireFox.


Cũng có thể sử dụng tùy chọn tốt hơn : element.style.setProperty.
Pacerier

1

Phương pháp tốt hơn tôi vừa khám phá: cố gắng cụ thể hơn CSS trang với các bộ chọn của bạn. Tôi chỉ phải làm điều này ngày hôm nay, và nó hoạt động như một cơ duyên! Thông tin thêm về trang web W3C: http://www.w3.org/TR/CSS2/cascade.html#specificity


2
Nuck, cảm ơn vì đã đăng câu trả lời sâu sắc. Sẽ hữu ích hơn nữa nếu bạn dành thời gian để cung cấp một ví dụ sử dụng mã của câu hỏi ban đầu.
Leif Wickland

1

Nếu bạn muốn cập nhật / thêm kiểu đơn trong thuộc tính kiểu Phần tử DOM, bạn có thể sử dụng chức năng này:

function setCssTextStyle(el, style, value) {
  var result = el.style.cssText.match(new RegExp("(?:[;\\s]|^)(" +
      style.replace("-", "\\-") + "\\s*:(.*?)(;|$))")),
    idx;
  if (result) {
    idx = result.index + result[0].indexOf(result[1]);
    el.style.cssText = el.style.cssText.substring(0, idx) +
      style + ": " + value + ";" +
      el.style.cssText.substring(idx + result[1].length);
  } else {
    el.style.cssText += " " + style + ": " + value + ";";
  }
}

style.cssText được hỗ trợ cho tất cả các trình duyệt chính .

Ví dụ trường hợp sử dụng:

var elem = document.getElementById("elementId");
setCssTextStyle(elem, "margin-top", "10px !important");

Đây là liên kết đến bản demo


Những thông tin bổ sung hoặc cải thiện nào câu trả lời này cung cấp?
Pogrindis

Chức năng này ngắn gọn, đơn giản và dễ hiểu. Bạn có thể thêm tùy chọn quan trọng. Nó không loại bỏ tất cả các kiểu phần tử. Nó ghi đè hoặc thêm kiểu đơn trong các kiểu phần tử tùy chỉnh. Bạn không cần bất kỳ khung công tác JS nào. Và điều quan trọng nhất là chức năng này đang hoạt động trong mọi trình duyệt.
Marek Skrzyniarz

0

Nếu tất cả những gì bạn đang làm là thêm css vào trang, thì tôi sẽ khuyên bạn nên sử dụng addon thời trang và viết kiểu người dùng thay vì tập lệnh người dùng, bởi vì kiểu người dùng hiệu quả và phù hợp hơn.

Xem trang này với thông tin về cách tạo kiểu người dùng


Sửa đổi css chỉ là một phần của những gì tiện ích mở rộng gm của tôi làm
Enrico

0

https://developer.mozilla.org/en-US/docs/Web/CSS/initial

sử dụng tài sản ban đầu trong css3

 <p style="color:red!important"> 
    this text is red 
       <em style="color:initial"> 
          this text is in the initial color (e.g. black)
       </em>
    this is red again
 </p>

Ban đầu không thiết lập lại quan trọng. Bạn không đặt màu của p mà là màu của em. Thật vậy, thay đổi màu sắc: ban đầu thành màu sắc: màu xanh lá cây và nó cũng sẽ hoạt động.
Pacerier

0

https://jsfiddle.net/xk6Ut/256/

Một tùy chọn để ghi đè lớp CSS trong JavaScript là sử dụng ID cho thành phần kiểu để chúng tôi có thể cập nhật lớp CSS

function writeStyles(styleName, cssText) {
    var styleElement = document.getElementById(styleName);
    if (styleElement) document.getElementsByTagName('head')[0].removeChild(
        styleElement);
    styleElement = document.createElement('style');
    styleElement.type = 'text/css';
    styleElement.id = styleName;
    styleElement.innerHTML = cssText;
    document.getElementsByTagName('head')[0].appendChild(styleElement);
}

..

   var cssText = '.testDIV{ height:' + height + 'px !important; }';
    writeStyles('styles_js', cssText)

0

Thay vì tiêm kiểu, nếu bạn tiêm một lớp (ví dụ: 'show') thông qua tập lệnh java, nó sẽ hoạt động. Nhưng ở đây bạn cần css như dưới đây. quy tắc css lớp được thêm vào phải nằm dưới quy tắc ban đầu của bạn.

td.EvenRow a{
  display: none !important;
}

td.EvenRow a.show{
  display: block !important;
}

0

Ở đó chúng ta có một khả năng khác để loại bỏ một giá trị thuộc tính khỏi CSS.

Giống như sử dụng phương pháp thay thế trong js. Nhưng bạn phải biết chính xác ID của kiểu hoặc bạn có thể viết vòng lặp for để phát hiện điều đó bằng cách (đếm kiểu trên trang, sau đó kiểm tra xem có bất kỳ giá trị nào trong số 'bao gồm' hoặc 'khớp' không !important. & Bạn có thể đếm cũng vậy - bao nhiêu chứa chúng, hoặc chỉ đơn giản là viết một phương thức thay thế toàn cầu [regapi: / str / gi])

Của tôi rất đơn giản, nhưng tôi đính kèm một jsBin, ví dụ:

https://jsbin.com/geqodeg/edit?html,css,js,output

Đầu tiên tôi đặt nền cơ thể trong CSS thành màu vàng !important, sau đó tôi ghi đè bằng JS cho darkPink.


-1

Dưới đây là một đoạn mã để đặt tham số quan trọng cho thuộc tính style bằng jquery.

$.fn.setFixedStyle = function(styles){
    var s = $(this).attr("style");
    s = "{"+s.replace(/;/g,",").replace(/'|"/g,"");
    s = s.substring(0,s.length-1)+"}";
    s = s.replace(/,/g,"\",\"").replace(/{/g,"{\"").replace(/}/g,"\"}").replace(/:/g,"\":\"");
    var stOb = JSON.parse(s),st;
    if(!styles){
     $.each(stOb,function(k,v){
      stOb[k] +=" !important";
     });
    }
    else{
     $.each(styles,function(k,v){
      if(v.length>0){
        stOb[k] = v+" !important";
      }else{
        stOb[k] += " !important";  
      }
     });
    }
    var ns = JSON.stringify(stOb);
    $(this).attr("style",ns.replace(/"|{|}/g,"").replace(/,/g,";"));
};

Cách sử dụng khá đơn giản. Chỉ cần vượt qua một đối tượng chứa tất cả các thuộc tính bạn muốn đặt là quan trọng.

$("#i1").setFixedStyle({"width":"50px","height":""});

Có hai lựa chọn bổ sung.

1. Chỉ cần thêm tham số quan trọng để trình bày thuộc tính style vượt qua chuỗi trống.

2.Để thêm param quan trọng cho tất cả các thuộc tính hiện tại không vượt qua bất cứ điều gì. Nó sẽ đặt tất cả các thuộc tính là quan trọng.

Đây là nó sống trong hành động. http://codepen.io/agaase/pen/nkvjr

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.