ฉันจะลบสไตล์ที่เพิ่มด้วยฟังก์ชัน. css () ได้อย่างไร


868

ฉันกำลังเปลี่ยนCSSด้วยjQueryและฉันต้องการลบสไตล์ที่ฉันเพิ่มตามค่าอินพุต:

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

ฉันจะทำสิ่งนี้ได้อย่างไร
โปรดทราบว่าบรรทัดด้านบนจะทำงานเมื่อใดก็ตามที่มีการเลือกสีโดยใช้เครื่องมือเลือกสี (เช่นเมื่อเมาส์เคลื่อนที่เหนือวงล้อสี)

หมายเหตุที่สอง: ฉันไม่สามารถทำได้css("background-color", "none")เนื่องจากจะลบการกำหนดค่าเริ่มต้นออกจากไฟล์CSS
ผมแค่อยากจะเอาbackground-colorรูปแบบอินไลน์ที่เพิ่มขึ้นโดยjQuery



ดีกว่าให้ลอง addClass / removeClass ตาม fcuntionality ของคุณ สิ่งนี้จะไม่ส่งผลกระทบต่อสไตล์อื่น ๆ
Prabhakaran

คำตอบ:


1333

การเปลี่ยนคุณสมบัติเป็นสตริงว่างจะปรากฏขึ้นเพื่อทำงาน:

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

4
@ baacke มันเป็นความอัปยศเมื่อคาดว่า "มาตรฐาน" ล้าสมัยไปมากและเสียเวลาในการพัฒนาไปมาก ฉันมีความเห็นอกเห็นใจเพียงเล็กน้อยสำหรับ บริษัท ที่เลือกใช้ซอฟต์แวร์ที่ล้าสมัยฉันไม่เห็นว่าทำไมฉันจึงควรใช้เวลาเพิ่มเติมเพื่อพัฒนาพวกเขา
andrewb

33
ฉันต้องไปกับ @baacke ที่นี่ ลูกค้าของเรายังคงมีข้อกำหนดขั้นต่ำอย่างเป็นทางการของ IE6 (!!) ปัญหาคือลูกค้าของพวกเขาทั่วโลกรวมถึงประเทศที่พัฒนาน้อยกว่า "ลูกค้าของลูกค้า" อาจใช้คอมพิวเตอร์ที่เก่าแก่มากในการทำธุรกิจกับลูกค้าของเรา ดังนั้นเบราว์เซอร์รุ่นเก่าจะต้องได้รับการสนับสนุนอย่างน้อยที่สุดหรือเสี่ยงต่อการสูญเสียธุรกิจ ...
user1429080

8
พวกคุณไม่ได้ตั้งข้อกำหนดของโซลูชันใด ๆ ที่คุณพัฒนาขึ้นสำหรับลูกค้า หากไคลเอนต์นั้นต้องการหรือต้องการการสนับสนุนสำหรับเบราว์เซอร์รุ่นเก่านั่นเป็นหน้าที่ของคุณที่จะต้องจัดทำ พวกคุณกำลังพูดถึง "ใครสนใจ" ให้ชื่อจริงกับวิศวกรที่ไม่ดี
Ed DeGagne

5
@EdDeGagne - คุณต้องหยุดการสนับสนุน IE เวอร์ชันเก่าอย่างต่อเนื่อง สิ่งนี้จะช่วยปรับปรุง codebase ของคุณและกระตุ้นให้ผู้เยี่ยมชมไม่ใช้ IE เก่า สิ่งเดียวที่ยากคือการหาว่าเมื่อไหร่ที่คุณจะทิ้งการสนับสนุน เว็บไซต์ของ Google ที่มีผู้เข้าชมจำนวนมากหากพวกเขาตัดสินใจที่จะทิ้ง IE เก่าไว้คุณสามารถเชื่อใจได้ว่าเป็นการตัดสินใจที่ดี บริษัท หนึ่งถึงกับบอกผู้ใช้ว่าพวกเขาจ่ายเงินให้กับพวกเขามากกว่าที่จะซื้อผู้ใช้ IE เก่าแต่ละเครื่องด้วยคอมพิวเตอร์ที่ทันสมัยกว่าเพื่อรักษารหัส IE ของตน (ซึ่งเป็นสิ่งที่พวกเขาเสนอ)
janko-m

5
ฉันหยุดอ่านเมื่อฉันเห็นว่า "IE8 ยังคงเป็นมาตรฐานแม้ใน Windows 7"
Capsule

544

คำตอบที่ได้รับการยอมรับใช้งานได้ แต่ปล่อยให้styleแอตทริบิวต์ที่ว่างเปล่าใน DOM ในการทดสอบของฉัน ไม่ใช่เรื่องใหญ่ แต่นี่เป็นการลบทั้งหมด:

removeAttr( 'style' );

สิ่งนี้จะถือว่าคุณต้องการลบการจัดแต่งทรงผมแบบไดนามิกทั้งหมดและกลับไปที่การจัดแต่งสไตล์ชีต


นี่เป็นความคิดที่ดี แต่มีข้อผิดพลาดใน jQuery โปรดดูข้อผิดพลาดที่ส่งแล้ว: bugs.jquery.com/ticket/9500
Tosh

4
@Tosh ข้อผิดพลาดที่ได้รับการแก้ไข 8/25/2011: bugs.jquery.com/ ...
ThinkingStiff

ฉันรู้ แต่อย่างน้อยในรุ่น 1.7 ยังเป็นรถฉันยังไม่ได้ทดสอบ 1.8
Tosh

7
สิ่งนี้จะลบคุณสมบัติอื่น ๆ ทั้งหมดในแอตทริบิวต์ style ด้วย ดังนั้นเลือกอย่างชาญฉลาด
codingrhythm

1
นี่มันฉลาด! คำตอบที่ยอมรับจะไม่ทำงานในสถานการณ์ที่รูปแบบอินไลน์ทำโดย jquery ควรเขียนทับสไตล์ css แต่วิธีนี้ใช้ได้ดีในทุกสถานการณ์
Farzad YZ

170

มีหลายวิธีในการลบคุณสมบัติ CSS โดยใช้ jQuery:

1. การตั้งค่าคุณสมบัติ CSS เป็นค่าเริ่มต้น (เริ่มต้น)

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

ดูค่าเริ่มต้นสำหรับ CSS ทรัพย์สินที่ MDN transparentที่นี่คุ้มค่าเริ่มต้นคือ คุณยังสามารถใช้inheritสำหรับคุณสมบัติ CSS หลายอย่างเพื่อสืบทอดแอตทริบิวต์จากพาเรนต์ ใน CSS3 / CSS4 คุณยังอาจจะใช้initial, revertหรือunsetแต่คำเหล่านี้อาจมีการสนับสนุนเบราว์เซอร์ จำกัด

2. การลบคุณสมบัติ CSS

สตริงว่างลบคุณสมบัติ CSS เช่น

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

แต่ระวังตามที่ระบุในjQuery .css) เอกสาร (นี้เอาทรัพย์สิน แต่ก็มีปัญหาที่เข้ากันได้กับ IE8 สำหรับคุณสมบัติของ CSS ชวเลขบางอย่างรวมถึงพื้นหลัง

การตั้งค่าของคุณสมบัติสไตล์เป็นสตริงว่าง - เช่น $ ('# mydiv'). css ('color', '') - ลบคุณสมบัตินั้นออกจากองค์ประกอบถ้ามันถูกนำไปใช้โดยตรงไม่ว่าจะเป็นสไตล์ HTML คุณลักษณะผ่านวิธี. css () ของ jQuery หรือผ่านการจัดการ DOM โดยตรงของคุณสมบัติสไตล์ อย่างไรก็ตามจะไม่ลบสไตล์ที่ใช้กับกฎ CSS ในสไตล์ชีทหรือองค์ประกอบ คำเตือน: หนึ่งที่น่าสังเกตก็คือว่าสำหรับ IE 8 และด้านล่างเอาคุณสมบัติชวเลขเช่นชายแดนหรือพื้นหลังจะเอาสไตล์ที่ทั้งหมดจากองค์ประกอบโดยไม่คำนึงถึงสิ่งที่ตั้งอยู่ในสไตล์หรือองค์ประกอบ

3. การลบสไตล์ทั้งหมดขององค์ประกอบ

.removeAttr("style")

49

ฉันมีวิธีลบแอตทริบิวต์สไตล์ด้วย JavaScript ที่บริสุทธิ์เพื่อแจ้งให้คุณทราบวิธีการใช้ JavaScript ที่บริสุทธิ์

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

11
คนที่แต่งตัวประหลาดใช้ jQuery แล้วทำไมต้องยุ่งกับการใช้ cross-browser อีกครั้ง!?!?
billy

32
เพราะ jquery ไม่ใช่ทุกสิ่งเพราะเธอหรือฉันควรจะพูดว่าพวกเราทุกคนในฐานะนักพัฒนาควรรู้ว่าการใช้งานร่วมกันได้นั้นหมายถึงอะไรและวิธีการทำสิ่งที่มีภาษาแกนกลางเป็นจาวาสคริปต์บางทีนี่อาจเป็นทฤษฎีของฉัน จากความรู้ของฉันเกี่ยวกับหลักจาวาสคริปต์ฉันปฏิเสธที่จะใช้สิ่งอื่น ๆ ที่ฉันมีแนวคิดของตัวเองและวิธีการคิดของฉัน :) และโดยวิธีขอบคุณสำหรับ (-) ของคุณฉันแค่ต้องเพิ่มมูลค่า :) และโดยวิธีผู้ชาย ไม่ใช่ผู้ชายเธอคือเธอชื่อ Alex
Marwan

1
ฉันแค่ต้องการทราบว่าคุณไม่ควรตรวจสอบ document.all หากคุณไม่ได้ใช้มัน บางทีคุณอาจจะตรวจสอบเช่นนี้: if (elm.style.removeProperty) {elm.style.removeProperty (propertyName); } else if (elm.style.removeAttribute) {elm.style.removeAttribute (attributeName); }
Richard

ดีคุณถูกต้องควรเป็นเช่นนี้หาก (navigator.appName == "Microsoft Internet Explorer") document.body.style.removeAttribute ('พื้นหลังสี'); else document.body.style.removeProperty ('background-color'); และในทางกลับกันโซลูชันของคุณก็ถูกต้องเช่นกัน :) ขอบคุณสำหรับบันทึกย่อของคุณ
Marwan

9
ไม่คุณควรตรวจสอบว่ามีฟังก์ชั่นนั้นอยู่มากกว่าที่จะตรวจสอบเบราว์เซอร์หรือไม่ จะเป็นอย่างไรถ้า MS ตัดสินใจเปลี่ยนชื่อฟังก์ชั่นใน IE เวอร์ชั่นถัดไป คุณไปตรวจสอบเวอร์ชั่นของ IE ด้วยหรือไม่
j03w

24

สิ่งนี้จะลบแท็กทั้งหมด:

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

มันเป็นวิธีการแก้ปัญหาอย่างคร่าวๆและจะไม่ทำงานเสมอไปเพราะมันจะลบสไตล์ที่สมบูรณ์ขององค์ประกอบออกไป
Konstantin Zadiran

19

ฟังก์ชัน jQuery เหล่านี้ควรทำงาน:

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

22
ในการลบคุณสมบัติ css เพียงรายการเดียว:var cssObject = $('selector').prop('style'); cssObject.removeProperty('background-color');
ilgaar

igaar - โซลูชันของคุณประณีตที่สุด ฉันวางไว้ในวง '.each' สำหรับเซลล์ตารางจำนวนมากที่มี "display: none" ที่ต้องไป แต่มีคุณสมบัติอื่น ๆ ที่ต้องคงอยู่ มันทำงานได้อย่างไร้ที่ติเพียงแค่ถอดหน้าจอออก: ไม่มีและปล่อยให้ส่วนที่เหลือ
Rob Von Nesselrode

9

เพียงแค่ใช้:

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

หรือ

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

สิ่งนี้จะลบสไตล์อื่น ๆ ที่เพิ่มเข้ามาด้วยไม่ใช่แค่สี
ลอง

7

เกี่ยวกับสิ่งที่ชอบ:

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

ฉันชอบอันนี้! คุณลบคุณสมบัติที่ระบุและไม่มีอะไรอื่น
Joel

7

ใช้ปลั๊กอินของฉัน:

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

สำหรับกรณีของคุณใช้ดังต่อไปนี้:

$(<mySelector>).removeCss();

หรือ

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

ถ้าคุณต้องการลบ CSS ที่กำหนดในคลาสด้วย:

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

$(this).removeAttrซ้ำซ้อนและthis.removeAttrควรจะเพียงพอ
Emile Bergeron

ไม่removeAttr จะลบยังclassattr? ฉันไม่คิดอย่างนั้น
Abdennour TOUMI

ฉันกำลังพูดถึงremoveAttrปลั๊กอินด้านในของคุณซึ่งthisมีองค์ประกอบ jQuery อยู่แล้ว $(this)ซ้ำซ้อน
Emile Bergeron

2
อา! ตกลงตกลง .. @EmileBergeron jquery เก่าให้thisเป็นHTMLElementอินสแตนซ์ที่แมปไปยังองค์ประกอบ jQuery ... อย่างที่คุณเห็นคำตอบของฉันเก่า ... นั่นคือเหตุผลที่ .. .. ฉันบอกคุณได้ว่าทำไมพวกเขาถึงเปลี่ยนพวกเขาทำอย่างนั้น เนื่องจากฟังก์ชั่นลูกศรซึ่งมาใหม่ใน ES6 .. และthisกลายเป็นไร้ประโยชน์และมันถูกแทนที่ด้วยevent.currentTarget
Abdennour TOUMI

1
ยุติธรรมพอ! ;) ตลกว่า 3 ปีในโลก JS
Emile Bergeron

7

ลองสิ่งนี้:

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

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

ขอบคุณ


ปัญหาเดียวของ "การลบที่มีอยู่" ของคุณก็คือมันจะแทนที่พื้นหลังสไตล์ชีตหากมีหนึ่งชุด
Jtbs

6

หากคุณใช้สไตล์ CSS คุณสามารถใช้:

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

แล้วแทนที่ด้วย:

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

หากคุณไม่ได้ใช้สไตล์ CSS และคุณมีคุณสมบัติในองค์ประกอบ HTML คุณสามารถใช้:

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



2

ทำไมไม่สร้างสไตล์ที่คุณต้องการลบคลาส CSS? ตอนนี้คุณสามารถใช้: .removeClass(). สิ่งนี้จะเปิดโอกาสในการใช้:.toggleClass()

(ลบคลาสถ้ามีอยู่และเพิ่มถ้าไม่ได้)

การเพิ่ม / ลบคลาสนั้นยังทำให้สับสนน้อยลงในการเปลี่ยน / แก้ไขปัญหาเมื่อจัดการกับปัญหาการจัดวาง



1

สิ่งนี้ซับซ้อนกว่าโซลูชันอื่น ๆ แต่อาจมอบความยืดหยุ่นในสถานการณ์:

1) สร้างนิยามคลาสเพื่อแยก (แค็ปซูล) สไตล์ที่คุณต้องการใช้ / ลบโดยเลือก อาจว่างเปล่า (และสำหรับกรณีนี้อาจเป็น):

.myColor {}

2) ใช้รหัสนี้ตามhttp://jsfiddle.net/kdp5V/167/จากคำตอบนี้ โดย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
                }
            }
        }
    }
}

ตัวอย่างการใช้งาน: http://jsfiddle.net/qvkwhtow/

คำเตือน:

  • ไม่ผ่านการทดสอบอย่างกว้างขวาง
  • ไม่สามารถรวม! สำคัญหรือคำสั่งอื่น ๆ ในค่าใหม่ คำสั่งที่มีอยู่เช่นนี้จะหายไปจากการจัดการนี้
  • การเปลี่ยนแปลงแรกเท่านั้นที่พบการเกิดขึ้นของ styleSelector ไม่ได้เพิ่มหรือลบสไตล์ทั้งหมด แต่สามารถทำได้ด้วยสิ่งที่ซับซ้อนกว่านี้
  • ค่าที่ไม่ถูกต้อง / ใช้ไม่ได้จะถูกละเว้นหรือผิดพลาด
  • ใน Chrome (อย่างน้อย) กฎ CSS แบบไม่ใช้งานในเครื่อง หนึ่งจะต้องเพิ่มการแทนที่ท้องถิ่นและจัดการที่โดยคำนึงถึงพฤติกรรม "พบครั้งแรก" ของรหัสนี้
  • document.styleSheets ไม่เป็นมิตรกับการจัดการโดยทั่วไปอย่าคาดหวังว่าสิ่งนี้จะใช้งานได้ในเชิงรุก

การแยกการจัดแต่งทรงผมด้วยวิธีนี้คือสิ่งที่เป็นเรื่องเกี่ยวกับ CSS แม้ว่าจะไม่ได้จัดการอะไรก็ตาม การจัดการกฎ CSS ไม่ใช่สิ่งที่ jQuery เป็นเรื่องเกี่ยวกับ jQuery ใช้งานองค์ประกอบ DOM และใช้ตัวเลือก CSS เพื่อทำ



โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.