!Css () kullanarak!


735

Bir stili uygulamakta zorlanıyorum !important. Denedim:

$("#elem").css("width", "100px !important");

Bu hiçbir şey yapmaz ; herhangi bir genişlik stili uygulanmaz. Üzerine yazmak zorunda kalmadan böyle bir stil uygulamak için bir jQuery-ish yolu var mı cssText(bu ilk önce ayrıştırmak gerekir anlamına gelir, vb)?

Düzenleme : Ben !importantbir !importantstil satır içi ile geçersiz kılmaya çalışıyorum bir stile sahip bir stil sayfası var , bu yüzden kullanarak .width()ve benim dış !importantstil tarafından geçersiz kılındı ​​beri benzer çalışmaz eklemeniz gerekir .

Ayrıca, önceki değeri geçersiz kılacak değer hesaplanır , bu yüzden başka bir dış stil oluşturamıyorum.


Dikkat çekicidir, bu aslında Chrome'da (en azından benim için) çalışır, ancak Firefox'ta değildir.
Peter Jaric

Bu benim için Chrome 17.x ve Safari 5.1.1'de de çalışıyor, ancak FF 8.0'da çalışmıyor.
DavidJ

JQuery 1.8.2 kullanarak Chromium 20.0.x üzerinde benim için çalışmıyor.
Alba Mendez

7
jQuery hata # 11173 , düzeltme .cssve !importantjQuery çekirdeğinde idi. Hata “düzeltilmeyecek” diye kapatıldı. Ancak, bu hatanın test durumu bu sorudaki kadar kısıtlayıcı değildi - test durumunda !importantgeçersiz kılmaya çalıştığı satır içi bir stil yoktu. Bu nedenle, bu hata için önerilen geçici çözüm bu durumda çalışmaz.
Rory O'Kane

2
Geçersiz kılmanın olası kopyası ! Css veya jquery ile önemli - Bu daha eski ve daha yüksek oy alırken, diğerinin en net, en değerli cevabı var.
Jason C

Yanıtlar:


603

Sorun jQuery !importantözniteliği anlamadığı için oluşur ve bu nedenle kuralı uygulayamaz.

Bu soruna geçici bir çözüm sağlayabilir ve kurala başvurarak uygulayabilirsiniz addClass():

.importantRule { width: 100px !important; }

$('#elem').addClass('importantRule');

Veya şunu kullanarak attr():

$('#elem').attr('style', 'width: 100px !important');

İkinci yaklaşım, önceden belirlenmiş satır içi stil kurallarını kaldırır. Bu yüzden dikkatli kullanın.

Tabii ki, @Nick Craver'ın yönteminin daha kolay / akıllı olduğu konusunda iyi bir argüman var.

Yukarıdaki attr()yaklaşım orijinal styledizeyi / özellikleri korumak için biraz değiştirilmiş ve bir yorumda falko tarafından önerildiği gibi değiştirilmiştir :

$('#elem').attr('style', function(i,s) { return (s || '') + 'width: 100px !important;' });

2
i senin ikinci yaklaşım doğru eğilerek, ama ne üzücü bu kötü çünkü muhtemelen sadece caymak olamaz çünkü önceki cssText ayrıştırmak zorunda kalıyorum
mkoryak

1
ah, üzgünüm alamadım, bazen İngilizce mizah anlayışımın ötesine geçiyor ... :)
Sinan

1
İç içe tırnak işaretleri nelerdir ('"genişlik: 100 piksel! Önemli"')? Bu benim için işe yaramadı, ama iç tırnakları kaldırdığımda işe yaradı. Teşekkürler!
Peter Jaric

15
stil boş olduğunda küçük düzeltme: $ ('# elem'). attr ('stil', işlev (i, s) {return (s || '') + 'genişlik: 100 piksel! önemli;'});
falko

4
Firefox'ta son snippet'iniz 'undefinedwidth: 100px !important;'geçerli stil boş olduğunda stili ayarlayacağı için @ falko'nun düzeltmesini eklemelisiniz .
acdcjunior

332

Bence gerçek bir çözüm buldum. Yeni bir işlev haline getirdim:

jQuery.style(name, value, priority);

Bunu, .style('name')tıpkı değerleri gibi .css('name')almak, CSSStyleDeclaration'ı almak .style()ve değerleri ayarlamak için kullanabilirsiniz - önceliği 'önemli' olarak belirleme yeteneğiyle. Bkz bu .

gösteri

var div = $('someDiv');
console.log(div.style('color'));
div.style('color', 'red');
console.log(div.style('color'));
div.style('color', 'blue', 'important');
console.log(div.style('color'));
console.log(div.style().getPropertyPriority('color'));

İşte çıktı:

null
red
blue
important

İşlev

(function($) {    
  if ($.fn.style) {
    return;
  }

  // Escape regex chars with \
  var escape = function(text) {
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
  };

  // For those who need them (< IE 9), add support for CSS functions
  var isStyleFuncSupported = !!CSSStyleDeclaration.prototype.getPropertyValue;
  if (!isStyleFuncSupported) {
    CSSStyleDeclaration.prototype.getPropertyValue = function(a) {
      return this.getAttribute(a);
    };
    CSSStyleDeclaration.prototype.setProperty = function(styleName, value, priority) {
      this.setAttribute(styleName, value);
      var priority = typeof priority != 'undefined' ? priority : '';
      if (priority != '') {
        // Add priority manually
        var rule = new RegExp(escape(styleName) + '\\s*:\\s*' + escape(value) +
            '(\\s*;)?', 'gmi');
        this.cssText =
            this.cssText.replace(rule, styleName + ': ' + value + ' !' + priority + ';');
      }
    };
    CSSStyleDeclaration.prototype.removeProperty = function(a) {
      return this.removeAttribute(a);
    };
    CSSStyleDeclaration.prototype.getPropertyPriority = function(styleName) {
      var rule = new RegExp(escape(styleName) + '\\s*:\\s*[^\\s]*\\s*!important(\\s*;)?',
          'gmi');
      return rule.test(this.cssText) ? 'important' : '';
    }
  }

  // The style function
  $.fn.style = function(styleName, value, priority) {
    // DOM node
    var node = this.get(0);
    // Ensure we have a DOM node
    if (typeof node == 'undefined') {
      return this;
    }
    // CSSStyleDeclaration
    var style = this.get(0).style;
    // Getter/Setter
    if (typeof styleName != 'undefined') {
      if (typeof value != 'undefined') {
        // Set style property
        priority = typeof priority != 'undefined' ? priority : '';
        style.setProperty(styleName, value, priority);
        return this;
      } else {
        // Get style property
        return style.getPropertyValue(styleName);
      }
    } else {
      // Get CSSStyleDeclaration
      return style;
    }
  };
})(jQuery);

Bkz bu okuma ve CSS değerleri ayarlamak için nasıl örnekler için. Benim sorunum zaten !importantdiğer tema CSS ile çakışmaları önlemek için benim CSS genişliği için ayarlamıştı , ama stil özniteliğine ekleneceği için jQuery genişliğinde yaptığım herhangi bir değişiklik etkilenmeyecekti.

uygunluk

Bu makaleyi kullanarak önceliği ayarlamak için setProperty, Bu Makale IE 9+ ve diğer tüm tarayıcılar için destek olduğunu söylüyor. IE 8 ile denedim ve başarısız oldu, bu yüzden işlevlerim için destek inşa ettim (yukarıya bakın). SetProperty kullanan tüm diğer tarayıcılarda çalışır, ancak <IE 9'da çalışmak için özel koduma ihtiyaç duyacaktır.


bunu diğer tarayıcılarda test ettiniz mi?
mkoryak

2
Birkaç yıl önce yayınlanan jQuery.important eklentisi de var . Üretimde sadece küçük bir sorunla kullanıyorum (Sorunlar sekmesine bakın.
colllin

14
$ ('.someclass') .each (function () {this.style.setProperty ('sınır', 'yok', 'önemli');}); stackoverflow.com/questions/11962962/… Daha basit, daha temiz ve daha verimli.

3
Bununla başa çıkmanın tek iyi yolu, doğrudan stil enjeksiyonunu değil, sınıfları kullanmaktır.
Richard

3
@Richard, bu başa çıkmanın tek iyi yoludur değil kullanımına !importantşeyler için en az jQuery ile değişim ... gidiyoruz, sizin tarzlarda oldukları sürece itibariyle sizin stilleri. Kodunuz !important, her ikinci stile tokatlayarak özgüllük kurallarını bilmemesi üzerine çalışan bir öğrenci tarafından kodlanmış bir sayfada çalışırsa , !importantsönce er ya da geç bunlardan birine başlayacaksınız .
Septagram

149

Genişliği şu şekilde kullanarak doğrudan ayarlayabilirsiniz .width():

$("#elem").width(100);

Yorumlar için güncellendi: Bu seçeneğiniz de var, ancak öğedeki tüm css'in yerini alacak, bu yüzden daha uygun olduğundan emin değilsiniz:

$('#elem').css('cssText', 'width: 100px !important');

tamam, ben bir örnek olarak kullanılan, ben umurumda ayarlamak önemlidir!
mkoryak

1
Ayrıca durumumu daha iyi yansıtmak için soruyu düzenledi .. temelde ben satır içi geçersiz kılması gereken kötü bir şey olarak ayarlanmış bir dış! önemli genişliği var. width () bu nedenle çalışmıyor
mkoryak

@mkoryak - Diğer sınıf dışı seçeneklerle güncellendi, durumunuza uyup uymayacağından emin değilim.
Nick Craver

1
Ancak, öğeye doğrudan uygulanan diğer stilleri geçersiz kılar. stackoverflow.com/a/11723492/491044 uygulaması en kolay yöntemdir.
trgraglia

10
$('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');önceki değerle bir araya getirerek geçersiz kılmaları önleme
Abel Callejo

81
const elem = $("#elem");
elem[0].style.removeAttribute('width');
elem[0].style.setProperty('width', '100px', 'important');

Not: Chrome'u kullanmak aşağıdakiler gibi bir hata döndürebilir:

elem [0] .style.removeAttribute bir işlev değil

Hattı .removePropertydüzeltmek gibi işlevi kullanmak elem[0].style.removeProperty('width');için sorunu gidermek .


10
Bu en iyi cevaplardan biri. Basit ve işe yarıyor. Ve çok fazla açıklama gerektirmez. JQuery seçici dışında sadece normal bir JavaScript. jQuery "önemli" için destek sağlamaz, bu yüzden düzenli JS kullanmak gitmek için bir yoldur
OMA

2
Eğer onunla Vanilya gitmek istiyorsanız, sadece var = document.getElementById('elem');elem üzerinde stil yöntemleri (elem [0] aksine) yapmak ve yapmak. Şerefe.
humbolight

3
Vanilla JS'de removeAttribute çalışmaz. Aşağıdakileri yapın. var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
mcoenca

2
Ayrıca sorunları vardı .removeAttribute. Sadece IE için bir yöntem gibi görünüyor . @mcoenca yorumu doğru; .removePropertyiyi çalışıyor. It adlı IE9 + göre MSDN
FelipeAls

2
@Dejan, çok geç cevap verdiğim için üzgünüm, ama bu işe yarayacak:elem.next().get(0).style...
RedClover

54

David Thomas'ın cevabı bir kullanım yolunu açıklıyor $('#elem').attr('style', …), ancak bunu kullanmanın styleöznitelikte önceden ayarlanmış stilleri sileceği konusunda uyarıyor . İşte attr()bu problem olmadan kullanmanın bir yolu :

var $elem = $('#elem');
$elem.attr('style', $elem.attr('style') + '; ' + 'width: 100px !important');

İşlev olarak:

function addStyleAttribute($element, styleAttribute) {
    $element.attr('style', $element.attr('style') + '; ' + styleAttribute);
}
addStyleAttribute($('#elem'), 'width: 100px !important');

İşte bir JS Bin demosu .


2
addStyleAttribute()jQuery ile.css() aynı parametreleri alacak şekilde de değiştirilebilir . Örneğin, değerlerine CSS özelliklerinin bir haritasının alınmasını destekleyebilir. Eğer bunu yaparsa, temelde yeniden hayata olurdu .css()ile !importantsabit hata ancak herhangi optimizasyonlar olmadan.
Rory O'Kane

1
Genişlik bir CSS sınıfında tanımlandığından ve tarayıcı penceresinin ve içeriğinin genişliğine göre hesaplanan bir değerle dinamik olarak geçersiz kılmam gerektiğinden bu benim için iyi çalıştı.
Chris Rasco

30

Diğer cevapları okuduktan ve denedikten sonra, benim için işe yarayan şey bu:

$(".selector")[0].style.setProperty( 'style', 'value', 'important' );

Bu IE 8 ve altında çalışmıyor.


1
ve hala IE8'i desteklememiz gerektiğinden (bazılarımız şanssız) - bu iyi değil.
mkoryak

27

Bunu yapabilirsiniz:

$("#elem").css("cssText", "width: 100px !important;");

Özellik adı olarak "cssText" ve değeri olarak CSS'ye eklemek istediğiniz her şeyi kullanın.


5
bunun dezavantajı, cssTextdaha önce orada olan her şeyin üzerine yazacağıdır - bu yüzden gerçekten özgürce kullanamazsınız
mkoryak

1
her neyse, $ ("# elem"). css ("cssText", "+ =; width: 100px! important;");
lexa-b

18

Bunu iki şekilde başarabilirsiniz:

$("#elem").prop("style", "width: 100px !important"); // this is not supported in chrome
$("#elem").attr("style", "width: 100px !important");

Aslında, .prop()işlev jQuery v1.6'da eklendi ve Chrome'da çalışacak ... bu pervane sayfasından alıntılandı: jQuery 1.6'dan önce, .attr()yöntem tutarsız davranışa neden olabilecek bazı öznitelikleri alırken bazen özellik değerlerini dikkate aldı. JQuery 1.6'dan itibaren .prop()yöntem, .attr()öznitelikleri alırken özellik değerlerini açıkça almak için bir yol sağlar .
Mottie

1
Genel bir çözüm için pek iyi bir fikir değil. Bunu kullanarak mevcut stilinizi geçersiz kılabilirsiniz.
Nirav Zaveri

14

@ AramKocharyan'ın cevabının karmaşıklığına veya stil etiketlerini dinamik olarak eklemeye gerek yoktur.

Sadece stilin üzerine yaz, ama hiçbir şeyi ayrıştırmak zorunda değilsin, neden?

// Accepts the hyphenated versions (i.e. not 'cssFloat')
function 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' : '') + ';');
}

Kullanamıyorum removeProperty()o kaldırmaz çünkü !importantChrome'da kuralları.
Kullanılamaz element.style[property] = '', çünkü yalnızca Firefox'ta camelCase kabul eder.

Bunu jQuery ile muhtemelen daha kısa yapabilirsiniz, ancak bu vanilya işlevi modern tarayıcılarda, Internet Explorer 8'de vb.


12

İşte bu sorunla karşılaştıktan sonra yaptığım şey ...

var origStyleContent = jQuery('#logo-example').attr('style');
jQuery('#logo-example').attr('style', origStyleContent + ';width:150px !important');

Teşekkür ederiz, bu, özel bir eklentiden çok daha basittir (potansiyel olarak diğer satır içi stilleri yok etse bile).
Phrogz

9

Bu çözüm önceki stillerin hiçbirini geçersiz kılmaz, sadece ihtiyacınız olanı uygular:

var heightStyle = "height: 500px !important";
if ($("foo").attr('style')) {
  $("foo").attr('style', heightStyle + $("foo").attr('style').replace(/^height: [-,!,0-9,a-z, A-Z, ]*;/,''));
else {
  $("foo").attr('style', heightStyle);
}

9

Çok alakalı değilse ve bir öğe ile uğraşıyorsanız #elem, kimliğini başka bir şeye değiştirebilir ve istediğiniz gibi şekillendirebilirsiniz ...

$('#elem').attr('id', 'cheaterId');

Ve CSS'nizde:

#cheaterId { width: 100px;}

9
neden sadece bir css sınıfı eklemek yerine bir css uygulamak için kimliği değiştiriyorsunuz?
TeKapa

8

css()İşlevi kullanmak yerine şu işlevi deneyin addClass():

  <script>
  $(document).ready(function() {
    $("#example").addClass("exampleClass");
  });
  </script>

  <style>
  .exampleClass{
    width:100% !important;
    height:100% !important;
  }
  </style>

OP, mülkün değerinin dinamik olarak hesaplandığını yazdı, bu yüzden cevabınız onun için işe yaramadı.
Sebastian Zartner

Bu çözüm benim için çalıştı. Orijinal poster olarak tam ihtiyaçlara sahip olduğumu düşünmüyorum ama css () 'nin olmadığı yerde çalışıyor.
leekei

2
Bu gerçekten bir probleme mükemmel bir çözüm ... sadece bu problem değil !
mkoryak

8

Benden bu sorunun en kolay ve en iyi çözümü .css () veya .attr () yerine addClass () kullanmaktı.

Örneğin:

$('#elem').addClass('importantClass');

Ve CSS dosyanızda:

.importantClass {
    width: 100px !important;
}

1
Genişlik JavaScript'te hesaplandığından bu sorunu çözmez.
Chris


7

Bu yanıtların çoğu artık güncel değil, IE7 desteği bir sorun değil.

IE11 + ve tüm modern tarayıcıları destekleyen bunu yapmanın en iyi yolu :

const $elem = $("#elem");
$elem[0].style.setProperty('width', '100px', 'important');

İsterseniz, bunu yapan küçük bir jQuery eklentisi oluşturabilirsiniz. Bu eklenti css(), desteklediği parametrelerde jQuery'nin kendi yöntemiyle yakından eşleşir :

/**
 * Sets a CSS style on the selected element(s) with !important priority.
 * This supports camelCased CSS style property names and calling with an object 
 * like the jQuery `css()` method. 
 * Unlike jQuery's css() this does NOT work as a getter.
 * 
 * @param {string|Object<string, string>} name
 * @param {string|undefined} value
 */   
jQuery.fn.cssImportant = function(name, value) {
  const $this = this;
  const applyStyles = (n, v) => {
    // Convert style name from camelCase to dashed-case.
    const dashedName = n.replace(/(.)([A-Z])(.)/g, (str, m1, upper, m2) => {
      return m1 + "-" + upper.toLowerCase() + m2;
    }); 
    // Loop over each element in the selector and set the styles.
    $this.each(function(){
      this.style.setProperty(dashedName, v, 'important');
    });
  };
  // If called with the first parameter that is an object,
  // Loop over the entries in the object and apply those styles. 
  if(jQuery.isPlainObject(name)){
    for(const [n, v] of Object.entries(name)){
       applyStyles(n, v);
    }
  } else {
    // Otherwise called with style name and value.
    applyStyles(name, value);
  }
  // This is required for making jQuery plugin calls chainable.
  return $this;
};
// Call the new plugin:
$('#elem').cssImportant('height', '100px');

// Call with an object and camelCased style names:
$('#another').cssImportant({backgroundColor: 'salmon', display: 'block'});

// Call on multiple items:
$('.item, #foo, #bar').cssImportant('color', 'red');

Örnek jsfiddle burada .


1
cevap bu. Diğer cevapları kontrol etmeye gerek yok
Shwet

6

Önce bir önceki stili kaldırmamız gerekir. Düzenli bir ifade kullanarak kaldırıyorum. Rengi değiştirmek için bir örnek:

var SetCssColorImportant = function (jDom, color) {
       var style = jDom.attr('style');
       style = style.replace(/color: .* !important;/g, '');
       jDom.css('cssText', 'color: ' + color + ' !important;' + style); }

3
Neden bu kadar çok çözüm cssText yöntemi gayet iyi çalıştığında öğeye bir stil etiketi kesmek bilmiyorum ... eg$selector.css('cssText','margin-bottom: 0 !important')
frumbert

6

Kafasına stil eklemenin alternatif bir yolu:

$('head').append('<style> #elm{width:150px !important} </style>');

Bu, tüm CSS dosyalarınıza stil ekler, böylece diğer CSS dosyalarından daha yüksek önceliğe sahip olur ve uygulanır.


6

Belki şu şekilde olabilir:

Önbellek

var düğüm = $ ('. seçici') [0];
VEYA
var node = document.querySelector ('. seçici');

CSS ayarla

node.style.setProperty ('genişlik', '100px', 'önemli');

CSS'yi kaldır

node.style.removeProperty (width);
VEYA
node.style.width = '';

6

Tamam çalışıyor ve daha önce başka herhangi bir CSS üzerine yazabilir düşünüyorum (bu: DOM öğesi):

this.setAttribute('style', 'padding:2px !important');

5

Şöyle yapın:

$("#elem").get(0).style.width= "100px!important";

5

Bu çözüm, hesaplanan tüm javascript'i bırakacak ve öğeye önemli etiketi ekleyecektir: Yapabilirsiniz (Genişliği önemli etiketle ayarlamanız gerekirse Ex)

$('exampleDiv').css('width', '');
//This will remove the width of the item
var styles = $('exampleDiv').attr('style');
//This will contain all styles in your item
//ex: height:auto; display:block;
styles += 'width: 200px !important;'
//This will add the width to the previous styles
//ex: height:auto; display:block; width: 200px !important;
$('exampleDiv').attr('style', styles);
//This will add all previous styles to your item

4

Üç çalışma örneği

Benzer bir durumum vardı, ama .closest () ile uzun bir süre birçok varyasyonla mücadele ettikten sonra .find () kullandım.

Örnek Kod

// Allows contain functions to work, ignores case sensitivity

jQuery.expr[':'].contains = function(obj, index, meta, stack) {
    result = false;
    theList = meta[3].split("','");
    var contents = (obj.textContent || obj.innerText || jQuery(obj).text() || '')
    for (x=0; x<theList.length; x++) {
        if (contents.toLowerCase().indexOf(theList[x].toLowerCase()) >= 0) {
            return true;
        }
    }
    return false;
};

$(document).ready(function() {
    var refreshId = setInterval( function() {
        $("#out:contains('foo', 'test456')").find(".inner").css('width', '50px', 'important');
    }, 1000); // Rescans every 1000 ms
});

Alternatif

$('.inner').each(function () {
    this.style.setProperty('height', '50px', 'important');
});

$('#out').find('.inner').css({ 'height': '50px'});

Çalışıyor: http://jsfiddle.net/fx4mbp6c/


Size bir oylama yedekleyeceğim, ancak .indexOf()işlevi daha fazla tarayıcı uyumlu bir şeyle değiştirmeyi seçmelisiniz . Bunun yerine .match()veya .test()yerine kullanın.indexOf()
Alexander Dixon

Neden noktalı virgül yok var contents = ?
Peter Mortensen

3

Durumunuz için uygun olabilir veya olmayabilir, ancak bu tür birçok durum için CSS seçicilerini kullanabilirsiniz.

Örneğin, .cssText'in 3. ve 6. örneklerinin farklı bir genişliğe sahip olmasını istiyorsanız yazabilirsiniz:

.cssText:nth-of-type(3), .cssText:nth-of-type(6) {width:100px !important;}

Veya:

.container:nth-of-type(3).cssText, .container:nth-of-type(6).cssText {width:100px !important;}

Bu , 3. ve 6. örnekleriyle eşleşmiyor.cssText . :nth-of-type()düşündüğünüzü yapmaz. Bir açıklama için buraya bakın .
BoltClock

Yeterince adil. Bağlantıyı okudum, ama ne demek istediğini anladığımdan emin değilim. İşte bu çalışmayı amaçlandığı gibi gösteren bir keman: jsfiddle.net/d2E4b
Tim Cutting

2
Kemanınızda bir dizi liunsurla uğraşıyorsunuz . Hepsi aynı eleman tipindedir li, bu da seçicinin uğraştığı şeydir. Aynı ana öğede farklı öğeleri karıştıracak :nth-of-type()olsaydınız, özellikle karışıma bir sınıf seçici eklediğinizde farklı davranırdı.
BoltClock

3

Eklemeden denediğinizi varsayalım !important?

Satır içi CSS (JavaScript bu şekilde stil ekler) stil sayfası CSS'sini geçersiz kılar. Stil sayfası CSS kuralı olsa bile durumun bu olduğundan eminim !important.

Başka bir soru (belki aptalca bir soru ama sorulması gerekir.): Üzerinde çalıştığınız eleman mı display:block;yoksa display:inline-block;?

CSS'deki uzmanlığınızı bilmiyorsanız ... satır içi öğeler her zaman beklediğiniz gibi davranmaz.


4
önemli olan herşeyi geçersiz kılan css kuralları, nerede olursa olsun, sadece!! Yaşadığım sorun bu. geçersiz kılmak istiyorum! dahası, ben sadece stil sayfasının kendisini değiştiremezsiniz, bu yüzden sağlamanız gereken değer JS ile hesaplanması gerekir.
mkoryak

3

!importantJavaScript kullanarak bir DOM öğesine eklemek için setProperty veya cssText'i kullanabiliriz .

Örnek 1:

elem.style.setProperty ("color", "green", "important");

Örnek 2:

elem.style.cssText='color: red !important;'

2

Ayrıca belirli öğelerin veya eklentilerin (Bootstrap gibi) iyi oynamadıkları bazı özel sınıf durumları olduğunu !importantveya bunun gibi diğer geçici çözümlerin olduğunu keşfettim .addClass/.removeClassve bu nedenle onları açıp kapatmak zorundasınız.

Örneğin, <table class="table-hover">satır renkleri gibi öğeleri başarılı bir şekilde değiştirmenin tek yolu gibi bir şey kullanıyorsanız , table-hoversınıfı şu şekilde açıp kapatmaktır:

$(your_element).closest("table").toggleClass("table-hover");

Umarım bu çözüm birisine yardımcı olacaktır! :)


2

Ben "olay" bir menü öğesinin bir metin rengini değiştirmeye çalışırken aynı sorunu vardı. Aynı sorunu yaşadığımda bulduğum en iyi yol:

İlk adım: CSS'nizde bu amaçla yeni bir sınıf oluşturun, örneğin:

.colorw{ color: white !important;}

Son adım: addClass yöntemini kullanarak bu sınıfı aşağıdaki gibi uygulayın:

$('.menu-item>a').addClass('colorw');

Sorun çözüldü.


1
Bence en iyi cevap. En uygun olanı.
Siyah

Teşekkürler @Siyah CSS ppl bir sürü tarafından bilinir ama sadece birkaç kişi için anlaşılır ve bu üzücü ve lol nefret etmek için bazı programcılar yapar
JoelBonetR

Bununla birlikte, js ile CSS değeri oluşturmak istiyorsanız, JS'de tanımlanan renk değerini örnek alın. Aksi takdirde bu güzel.
Carl Papworth

neden js'de bir renk tanımlamak istersiniz?
JoelBonetR

2

Bunun en güvenli çözümü, bir sınıf eklemek ve daha sonra CSS'de sihri yapmaktır :-) addClass()ve removeClass()işi yapmalıdır.


1

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

Alternatif bir yaklaşım, JavaScript'te dinamik olarak CSS sınıfı oluşturmak ve güncellemektir. Bunu yapmak için stil öğesini kullanabiliriz ve CSS sınıfını güncelleyebilmemiz için style öğesinin kimliğini kullanmamız gerekir

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.