Làm cách nào để xóa kiểu được thêm bằng hàm .css ()?


868

Tôi đang thay đổi CSS bằng jQuery và tôi muốn xóa kiểu dáng tôi đang thêm dựa trên giá trị đầu vào:

if(color != '000000') $("body").css("background-color", color); else // remove style ?

Tôi có thể làm cái này như thế nào?
Lưu ý rằng dòng trên chạy bất cứ khi nào một màu được chọn bằng cách sử dụng bộ chọn màu (nghĩa là khi chuột di chuyển qua một bánh xe màu).

Lưu ý thứ 2: Tôi không thể làm điều này với css("background-color", "none")vì nó sẽ xóa kiểu mặc định khỏi các tệp CSS .
Tôi chỉ muốn loại bỏ background-colorkiểu nội tuyến được thêm bởi jQuery .



tốt hơn hãy thử addClass / removeClass dựa trên fcuntionality của bạn. Điều này sẽ không ảnh hưởng đến phong cách khác.
Bohhakaran

Câu trả lời:


1333

Thay đổi thuộc tính thành một chuỗi trống xuất hiện để thực hiện công việc:

$.css("background-color", "");

4
@baacke Thật xấu hổ khi "tiêu chuẩn" được cho là lỗi thời khủng khiếp và lãng phí rất nhiều thời gian phát triển. Tôi không mấy thiện cảm với các tập đoàn chọn sử dụng phần mềm lỗi thời, tôi không hiểu tại sao tôi nên dành thêm thời gian để phát triển cho họ.
andrewb

33
Tôi phải ở bên cạnh @baacke ở đây. Khách hàng của chúng tôi vẫn có yêu cầu tối thiểu chính thức là IE6 (!!). Vấn đề là, khách hàng của họ ở khắp nơi trên thế giới, kể cả các nước kém phát triển. "Khách hàng của khách hàng" có thể đang sử dụng máy tính rất cũ để làm ăn với khách hàng của chúng tôi. Vì vậy, trình duyệt cũ ít nhất phải được hỗ trợ tối thiểu hoặc họ có nguy cơ mất doanh nghiệp ...
user1429080

8
Các bạn không được đặt yêu cầu của bất kỳ giải pháp nào bạn phát triển cho khách hàng. Nếu khách hàng đó muốn hoặc cần hỗ trợ cho một trình duyệt cũ hơn, thì công việc của bạn là cung cấp nó, theo thời gian. Các bạn nói về "ai quan tâm" đặt cho các kỹ sư thực sự một cái tên xấu.
Ed DeGagne

5
@EdDeGagne - Bạn liên tục cần ngừng hỗ trợ các phiên bản IE cũ hơn. Điều này cải thiện cơ sở mã của bạn và thúc đẩy khách truy cập không sử dụng IE cũ. Điều khó khăn duy nhất là tìm ra khi nào bạn có thể bỏ hỗ trợ. Các trang web của Google, có rất nhiều khách truy cập, nếu họ quyết định bỏ IE cũ, thì bạn có thể tin tưởng họ rằng đó là một quyết định tốt. Một công ty thậm chí còn đi xa hơn khi nói với người dùng của họ rằng họ trả tiền cho họ nhiều hơn để mua cho mỗi người dùng IE cũ một máy tính hiện đại hơn là duy trì mã IE của họ (đó chính xác là những gì họ cung cấp).
janko-m

5
Tôi đã ngừng đọc khi thấy "IE8 vẫn là tiêu chuẩn, ngay cả trên Windows 7"
Capsule

544

Câu trả lời được chấp nhận hoạt động nhưng để lại một stylethuộc tính trống trên DOM trong các thử nghiệm của tôi. Không có vấn đề lớn, nhưng điều này loại bỏ tất cả:

removeAttr( 'style' );

Điều này giả định rằng bạn muốn loại bỏ tất cả các kiểu dáng động và quay trở lại kiểu dáng của biểu định kiểu.


Đây là một ý tưởng hay nhưng có lỗi trong jQuery, hãy xem lỗi đã gửi: bug.jquery.com/ticket/9500
Tosh

4
@Tosh Lỗi đó đã được giải quyết vào 25/8/2011
ThinkingStiff

Tôi biết nhưng ít nhất trong phiên bản 1.7 vẫn còn lỗi, tôi chưa thử nghiệm 1.8
Tosh

7
Điều này cũng sẽ loại bỏ tất cả các thuộc tính khác trong thuộc tính style. Vì vậy, hãy chọn một cách khôn ngoan.
tiền mã hóa

1
Điều này thật thông minh! câu trả lời được chấp nhận sẽ không hoạt động trong các tình huống trong đó kiểu nội tuyến được tạo bởi jquery sẽ ghi đè lên kiểu css, nhưng phương thức này hoạt động tốt trong mọi tình huống.
Farzad YZ

170

Có một số cách để xóa thuộc tính CSS bằng jQuery:

1. Đặt thuộc tính CSS thành giá trị mặc định (ban đầu)

.css("background-color", "transparent")

Xem giá trị ban đầu cho thuộc tính CSS tại MDN . Ở đây giá trị mặc định là transparent. Bạn cũng có thể sử dụng inheritcho một số thuộc tính CSS để kế thừa thuộc tính từ cha của nó. Trong CSS3 / CSS4, bạn cũng có thể sử dụng initial, reverthoặc unsetnhưng các từ khóa này có thể hỗ trợ trình duyệt hạn chế.

2. Xóa thuộc tính CSS

Một chuỗi rỗng loại bỏ thuộc tính CSS, tức là

.css("background-color","")

Nhưng hãy cẩn thận, như được chỉ định trong tài liệu jQuery .css () , việc này sẽ loại bỏ thuộc tính nhưng nó có vấn đề tương thích với IE8 đối với các thuộc tính tốc ký CSS nhất định, bao gồm cả nền .

Đặt giá trị của thuộc tính kiểu thành một chuỗi trống - ví dụ $ ('# mydiv'). Css ('color', '') - xóa thuộc tính đó khỏi một thành phần nếu nó đã được áp dụng trực tiếp, cho dù theo kiểu HTML thuộc tính, thông qua phương thức .css () của jQuery hoặc thông qua thao tác DOM trực tiếp của thuộc tính style. Tuy nhiên, nó không xóa một kiểu đã được áp dụng với quy tắc CSS trong biểu định kiểu hoặc phần tử. Cảnh báo: một ngoại lệ đáng chú ý là, đối với IE 8 trở xuống, việc xóa thuộc tính tốc ký như đường viền hoặc nền sẽ xóa hoàn toàn kiểu đó khỏi thành phần, bất kể được đặt trong biểu định kiểu hoặc thành phần .

3. Loại bỏ toàn bộ phong cách của phần tử

.removeAttr("style")

49

Tôi có cách xóa thuộc tính style bằng JavaScript thuần chỉ để cho bạn biết cách của JavaScript thuần

var bodyStyle = document.body.style;
if (bodyStyle.removeAttribute)
    bodyStyle.removeAttribute('background-color');
else        
    bodyStyle.removeProperty('background-color');

11
Anh chàng đã sử dụng jQuery ... tại sao phải thực hiện lại một phương thức trình duyệt chéo!?!?
billy

32
bởi vì jquery không phải là tất cả mọi thứ, bởi vì cô ấy hoặc có lẽ tôi nên nói rằng mỗi người trong chúng ta là nhà phát triển nên biết khả năng tương thích có nghĩa là gì và làm thế nào để tạo ra những thứ như vậy với ngôn ngữ cốt lõi như JavaScript, có lẽ đây là lý thuyết của tôi, tôi đã tạo ra khuôn khổ của riêng mình từ kiến ​​thức về JavaScript cốt lõi của tôi, tôi từ chối sử dụng những thứ khác, tôi có khái niệm và cách suy nghĩ riêng của mình :) và nhân tiện cảm ơn bạn (-) tôi chỉ cần trở thành giá trị gia tăng :) và cũng bằng cách anh chàng không phải là một chàng trai cô ấy là cô ấy tên Alex
Marwan

1
Tôi chỉ muốn lưu ý rằng bạn không nên kiểm tra tài liệu. Tất cả nếu bạn không sử dụng nó. Có lẽ bạn sẽ kiểm tra nó như thế này: if (elm.style.removeProperty) {elm.style.removeProperty (propertyName); } if if (elm.style.removeAttribution) {elm.style.removeAttribution (propertyName); }
Richard

bạn cũng đúng, nó sẽ như thế này nếu (navigator.appName == "Microsoft Internet Explorer") document.body.style.removeAttribution ('màu nền'); tài liệu khác.body.style.removeProperty ('màu nền'); và mặt khác, giải pháp của bạn cũng đúng :) cảm ơn bạn đã ghi chú
Marwan

9
Không, bạn chắc chắn nên kiểm tra xem chức năng đó có tồn tại không thay vì kiểm tra trình duyệt. Điều gì xảy ra nếu MS quyết định thay đổi tên hàm trong phiên bản IE tiếp theo? Bạn có đi và kiểm tra phiên bản IE không?
j03w

24

Điều này sẽ xóa thẻ hoàn chỉnh:

  $("body").removeAttr("style");

Đó là giải pháp thô và không phải lúc nào cũng hoạt động vì nó loại bỏ phong cách của thành phần hoàn chỉnh
Konstantin Zadiran

19

một trong hai hàm jQuery này sẽ hoạt động:

$("#element").removeAttr("style");
$("#element").removeAttr("background-color") 

22
Để chỉ xóa một thuộc tính css:var cssObject = $('selector').prop('style'); cssObject.removeProperty('background-color');
ilgaar

igaar - giải pháp của bạn là gọn gàng nhất. Tôi đặt nó trong một vòng lặp '.each' cho một đống các ô bảng có "display: none" phải đi nhưng với các thuộc tính khác phải tồn tại. Nó hoạt động hoàn hảo, chỉ cần loại bỏ màn hình: không có và bỏ phần còn lại.
Rob Von Nesselrode

9

Chỉ cần sử dụng:

$('.tag-class').removeAttr('style');

hoặc là

$('#tag-id').removeAttr('style');

Điều này cũng sẽ loại bỏ các phong cách khác được thêm vào nội tuyến, không chỉ màu sắc.
LongInt

7

Làm thế nào về một cái gì đó như:

var myCss = $(element).attr('css');
myCss = myCss.replace('background-color: '+$(element).css('background-color')+';', '');
if(myCss == '') {
  $(element).removeAttr('css');
} else {
  $(element).attr('css', myCss);
}

Tôi thích cái này! Bạn loại bỏ các tài sản được chỉ định và không có gì khác.
Joel

7

Sử dụng Plugin của tôi:

$.fn.removeCss=function(all){
        if(all===true){
            $(this).removeAttr('class');
        }
        return $(this).removeAttr('style')
    }

Đối với trường hợp của bạn, sử dụng nó như sau:

$(<mySelector>).removeCss();

hoặc là

$(<mySelector>).removeCss(false);

nếu bạn muốn loại bỏ CSS cũng được định nghĩa trong các lớp của nó:

$(<mySelector>).removeCss(true);

$(this).removeAttrlà dư thừa và this.removeAttrnên là đủ.
Emile Bergeron

Liệu removeAttr sẽ loại bỏ cũng classattr? tôi không nghĩ vậy
Abdennour TOUMI

Tôi đang nói về phần removeAttrbên trong plugin của bạn, nơi thisđã là một phần tử jQuery. $(this)là dư thừa.
Emile Bergeron

2
AH! OK OK .. @EmileBergeron, các jquery cũ cung cấp thisnhư HTMLElementdụ ánh xạ tới các yếu tố jQuery ... Như bạn thấy, câu trả lời của tôi là cũ ... đó là lý do tại sao .. dù sao, tôi có thể nói với u tại sao họ thay đổi điều đó, họ làm điều đó bởi vì chức năng mũi tên mới xuất hiện trong ES6. .. và thistrở nên vô dụng và nó đã được thay thế bởievent.currentTarget
Abdennour TOUMI

1
Đủ công bằng! ;) Hài hước làm sao 3 tuổi trong thế giới JS.
Emile Bergeron

7

Thử cái này:

$('#divID').css({"background":"none"});// remove existing

$('#divID').css({"background":"#bada55"});// add new color here.

Cảm ơn


Vấn đề duy nhất với "loại bỏ hiện tại" của bạn là nó cũng sẽ ghi đè nền của biểu định kiểu nếu có một bộ.
Jtbs

6

Nếu bạn sử dụng kiểu CSS, bạn có thể sử dụng:

$("#element").css("background-color","none"); 

và sau đó thay thế bằng:

$("#element").css("background-color", color);

Nếu bạn không sử dụng kiểu CSS và bạn có thuộc tính trong phần tử HTML, bạn có thể sử dụng:

$("#element").attr("style.background-color",color);

6

2018

có API gốc cho điều đó

element.style.removeProperty(propery)


2

Tại sao không tạo kiểu bạn muốn xóa lớp CSS? Bây giờ bạn có thể sử dụng : .removeClass(). Điều này cũng mở ra khả năng sử dụng:.toggleClass()

(loại bỏ lớp nếu nó hiện diện và thêm nó nếu không.)

Thêm / xóa một lớp cũng ít gây nhầm lẫn hơn khi thay đổi / khắc phục sự cố khi xử lý các vấn đề về bố cục (trái ngược với việc cố gắng tìm hiểu tại sao một kiểu cụ thể biến mất.)


2
let el = document.querySelector(element)
let styles = el.getAttribute('style')

el.setAttribute('style', styles.replace('width: 100%', ''))

1

Điều này phức tạp hơn một số giải pháp khác, nhưng có thể mang lại sự linh hoạt hơn trong các tình huống:

1) Tạo một định nghĩa lớp để cô lập (đóng gói) kiểu dáng bạn muốn áp dụng / loại bỏ có chọn lọc. Nó có thể trống (và trong trường hợp này, có lẽ nên):

.myColor {}

2) sử dụng mã này, dựa trên http://jsfiddle.net/kdp5V/167/ từ câu trả lời này của gilly3 :

function changeCSSRule(styleSelector,property,value) {
    for (var ssIdx = 0; ssIdx < document.styleSheets.length; ssIdx++) {
        var ss = document.styleSheets[ssIdx];
        var rules = ss.cssRules || ss.rules;
        if(rules){
            for (var ruleIdx = 0; ruleIdx < rules.length; ruleIdx++) {
                var rule = rules[ruleIdx];
                if (rule.selectorText == styleSelector) {
                    if(typeof value == 'undefined' || !value){
                        rule.style.removeProperty(property);
                    } else {
                        rule.style.setProperty(property,value);
                    }
                    return; // stops at FIRST occurrence of this styleSelector
                }
            }
        }
    }
}

Ví dụ sử dụng: http://jsfiddle.net/qvkwhtow/

Hãy cẩn thận:

  • Không được thử nghiệm rộng rãi.
  • Không thể bao gồm ! Các chỉ thị quan trọng hoặc khác trong giá trị mới. Bất kỳ chỉ thị hiện có như vậy sẽ bị mất thông qua thao tác này.
  • Chỉ những thay đổi đầu tiên được tìm thấy của styleSelector. Không thêm hoặc xóa toàn bộ kiểu, nhưng điều này có thể được thực hiện với một cái gì đó phức tạp hơn.
  • Bất kỳ giá trị không hợp lệ / không thể sử dụng sẽ bị bỏ qua hoặc ném lỗi.
  • Trong Chrome (ít nhất), các quy tắc CSS không cục bộ (như trong nhiều trang web) không được hiển thị thông qua đối tượng document.styleSheets, vì vậy điều này sẽ không hoạt động trên chúng. Người ta sẽ phải thêm một phần ghi đè cục bộ và thao tác điều đó, ghi nhớ hành vi "tìm thấy đầu tiên" của mã này.
  • document.styleSheets không đặc biệt thân thiện với thao tác nói chung, đừng mong đợi nó hoạt động để sử dụng tích cực.

Cô lập kiểu dáng theo cách này là tất cả những gì về CSS, ngay cả khi thao tác nó không phải là. Thao tác với các quy tắc CSS KHÔNG phải là tất cả những gì về jQuery, jQuery thao tác các phần tử DOM và sử dụng các bộ chọn CSS để thực hiện.


1

Đơn giản là rẻ trong phát triển web. Tôi khuyên bạn nên sử dụng chuỗi rỗng khi xóa một kiểu cụ thể

$(element).style.attr = '  ';

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.