Bagaimana cara mendaftar! Penting menggunakan .css ()?

735

Saya mengalami kesulitan menerapkan gaya itu !important. Saya sudah mencoba:

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

Ini tidak melakukan apa - apa ; tidak ada gaya lebar yang diterapkan. Apakah ada cara jQuery-ish menerapkan gaya seperti itu tanpa harus menimpa cssText(yang berarti saya harus menguraikannya terlebih dahulu, dll)?

Sunting : Saya harus menambahkan bahwa saya memiliki stylesheet dengan !importantgaya yang saya coba timpa dengan !importantstyle inline, jadi menggunakan .width()dan sejenisnya tidak berfungsi karena akan ditimpa oleh !importantgaya eksternal saya .

Juga, nilai yang akan menggantikan nilai sebelumnya dihitung , jadi saya tidak bisa begitu saja membuat gaya eksternal lain.

mkoryak
sumber
Yang perlu diperhatikan adalah ini benar-benar berfungsi di Chrome (setidaknya untuk saya), tetapi tidak di Firefox.
Peter Jaric
Ini juga berfungsi untuk saya di Chrome 17.x dan Safari 5.1.1, tetapi tidak di FF 8.0.
DavidJ
Tidak berfungsi untuk saya di Chromium 20.0.x menggunakan JQuery 1.8.2.
Alba Mendez
7
Bug jQuery # 11173 adalah tentang memperbaiki .cssdan !importantdalam inti jQuery. Bug ditutup sebagai "tidak akan diperbaiki". Namun, uji kasus bug itu tidak seketat yang ada dalam pertanyaan ini - kasus uji tidak memiliki !importantgaya inline yang coba ditimpa. Dengan demikian, solusi yang diusulkan dalam bug itu tidak akan berfungsi dalam kasus ini.
Rory O'Kane
2
Kemungkinan duplikat Overriding! Penting dengan css atau jquery - Meskipun yang satu ini lebih tua, dan lebih banyak yang memilih, yang lain mendapat jawaban paling jelas dan paling berharga.
Jason C

Jawaban:

603

Masalahnya disebabkan oleh jQuery tidak memahami !importantatribut, dan karena itu gagal menerapkan aturan.

Anda mungkin dapat mengatasi masalah itu, dan menerapkan aturan dengan merujuknya, melalui addClass():

.importantRule { width: 100px !important; }

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

Atau dengan menggunakan attr():

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

Pendekatan yang terakhir akan menghapus semua aturan gaya in-line yang ditetapkan sebelumnya. Jadi gunakan dengan hati-hati.

Tentu saja, ada argumen bagus bahwa metode @Nick Craver lebih mudah / lebih bijaksana.

Di atas, attr()pendekatan dimodifikasi sedikit untuk mempertahankan stylestring / properti asli, dan dimodifikasi seperti yang disarankan oleh falko dalam komentar:

$('#elem').attr('style', function(i,s) { return (s || '') + 'width: 100px !important;' });
David mengatakan mengembalikan Monica
sumber
2
Saya condong ke arah pendekatan Anda yang terakhir, tetapi yang menyedihkan adalah bahwa sakit mungkin akhirnya harus menguraikan cssText sebelumnya karena saya tidak bisa begitu saja membuangnya
mkoryak
1
ah, maaf tidak bisa mendapatkannya, kadang-kadang humor bahasa Inggris melampaui pemahaman saya ... :)
Sinan
1
Ada apa dengan tanda kutip bersarang ('"lebar: 100px! Penting"')? Itu tidak berhasil bagi saya, tetapi ketika saya menghapus kutipan batin itu berhasil. Terima kasih!
Peter Jaric
15
perbaikan kecil ketika style kosong: $ ('# elem'). attr ('style', function (i, s) {return (s || '') + 'width: 100px! important;'});
falko
4
Anda harus menambahkan perbaikan @ falko, karena di firefox cuplikan terakhir Anda akan mengatur gaya 'undefinedwidth: 100px !important;'ketika gaya saat ini kosong.
acdcjunior
332

Saya pikir saya telah menemukan solusi nyata. Saya telah membuatnya menjadi fungsi baru:

jQuery.style(name, value, priority);

Anda dapat menggunakannya untuk mendapatkan nilai .style('name')seperti .css('name'), dapatkan CSSStyleDeclaration dengan .style(), dan juga menetapkan nilai - dengan kemampuan untuk menentukan prioritas sebagai 'penting'. Lihat ini .

Demo

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'));

Inilah hasilnya:

null
red
blue
important

Fungsinya

(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);

Lihat ini untuk contoh cara membaca dan mengatur nilai CSS. Masalah saya adalah bahwa saya sudah menetapkan!important lebar pada CSS saya untuk menghindari konflik dengan CSS tema lainnya, tetapi setiap perubahan yang saya buat pada lebar dalam jQuery tidak akan terpengaruh karena mereka akan ditambahkan ke atribut style.

Kesesuaian

Untuk pengaturan dengan prioritas menggunakan setPropertyfungsi, Artikel ini mengatakan ada dukungan untuk IE 9+ dan semua browser lainnya. Saya telah mencoba dengan IE 8 dan gagal, itulah sebabnya saya membangun dukungan untuk itu dalam fungsi saya (lihat di atas). Ini akan bekerja pada semua browser lain menggunakan setProperty, tetapi akan membutuhkan kode khusus saya untuk bekerja di <IE 9.

Aram Kocharyan
sumber
sudahkah Anda menguji ini di browser lain?
mkoryak
2
Ada juga plugin jQuery.important yang diterbitkan beberapa tahun yang lalu. Saya menggunakannya dalam produksi dengan hanya satu masalah kecil (lihat tab Masalah mereka.
colllin
14
$ ('.someclass') .each (function () {this.style.setProperty ('border', 'none', 'important');}); stackoverflow.com/questions/11962962/... Lebih sederhana, lebih bersih, dan lebih efisien.
3
Satu-satunya cara yang baik untuk mengatasinya adalah menggunakan kelas, bukan injeksi gaya langsung.
Richard
3
@ Richard, satu-satunya cara yang baik untuk menangani ini adalah tidak menggunakan !importantgaya Anda, setidaknya untuk hal-hal yang akan Anda ubah dengan jQuery ... Selama itu adalah gaya Anda . Jika kode Anda berjalan di dalam halaman yang dikodekan oleh seorang siswa yang mengatasi ketidaktahuannya akan aturan spesifik dengan menampar !importantsetiap gaya kedua, Anda akan langsung masuk ke salah satu dari ini !importantscepat atau lambat.
Septagram
149

Anda dapat mengatur lebar langsung menggunakan .width()seperti ini:

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

Diperbarui untuk komentar: Anda memiliki opsi ini juga, tetapi itu akan mengganti semua css pada elemen, jadi tidak yakin itu lebih layak:

$('#elem').css('cssText', 'width: 100px !important');
Nick Craver
sumber
ok, saya gunakan dengan sebagai contoh, yang saya pedulikan adalah pengaturan! penting.
mkoryak
1
juga saya mengedit pertanyaan untuk mencerminkan situasi saya lebih baik .. pada dasarnya saya memiliki eksternal! Lebar penting yang ditetapkan ke sesuatu yang buruk yang harus saya ganti inline. lebar () tidak berfungsi karena alasan ini
mkoryak
@mkoryak - Diperbarui dengan satu-satunya pilihan non-kelas lainnya, tidak yakin apakah itu akan sesuai dengan situasi Anda atau tidak.
Nick Craver
1
Tapi itu akan menggantikan gaya lain yang langsung diterapkan ke elemen. stackoverflow.com/a/11723492/491044 adalah yang termudah untuk diterapkan.
trgraglia
10
cegah penggantian dengan $('#elem').css('cssText', $('#elem').css('cssText')+'width: 100px !important');konat dengan nilai sebelumnya
Abel Callejo
81
const elem = $("#elem");
elem[0].style.removeAttribute('width');
elem[0].style.setProperty('width', '100px', 'important');

Catatan: Menggunakan Chrome dapat mengembalikan kesalahan seperti:

elem [0] .style.removeAttribute bukan fungsi

Mengubah jalur untuk menggunakan .removePropertyfungsi seperti untuk elem[0].style.removeProperty('width');memperbaiki masalah.

BettaSplendens
sumber
10
Ini adalah salah satu jawaban terbaik. Sederhana dan berhasil. Dan itu tidak membutuhkan banyak penjelasan. Ini hanya JavaScript biasa, kecuali pemilih jQuery. jQuery tidak memberikan dukungan untuk "penting" sehingga menggunakan JS reguler adalah cara untuk pergi
OMA
2
Jika Anda ingin mengikuti Vanilla, buat var = document.getElementById('elem');dan lakukan metode gaya pada elem (bukan elem [0]). Bersulang.
humbolight
3
Di vanilla JS, removeAttribute tidak berfungsi. Lakukan yang berikut. var style = document.getElementById('elem'); style.removeProperty('width'); style.setProperty('width, '100px', 'important')
mcoenca
2
Juga punya masalah dengan .removeAttribute. Tampaknya menjadi metode IE-only . @mcoenca komentar benar; .removePropertybekerja dengan baik. Ini IE9 + menurut MSDN
FelipeAls
2
@ Djan, maaf untuk jawaban yang sangat terlambat, tetapi ini harus bekerja:elem.next().get(0).style...
RedClover
54

Jawaban David Thomas menjelaskan cara menggunakan $('#elem').attr('style', …), tetapi memperingatkan bahwa menggunakannya akan menghapus gaya yang sebelumnya ditetapkan dalam styleatribut. Inilah cara penggunaan attr()tanpa masalah itu:

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

Sebagai fungsi:

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

Berikut ini adalah demo JS Bin .

Rory O'Kane
sumber
2
addStyleAttribute()juga dapat dimodifikasi untuk mengambil parameter yang sama dengan jQuery.css() . Misalnya, ini dapat mendukung pengambilan peta properti CSS ke nilainya. Jika Anda melakukannya, pada dasarnya Anda akan menerapkan kembali .css()dengan !importantbug diperbaiki tetapi tanpa optimasi.
Rory O'Kane
1
Ini bekerja dengan baik bagi saya karena lebar didefinisikan dalam kelas CSS dan saya perlu menimpanya secara dinamis dengan nilai yang dihitung berdasarkan lebar jendela browser dan konten.
Chris Rasco
30

Setelah membaca jawaban lain dan bereksperimen, inilah yang berhasil bagi saya:

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

Ini tidak bekerja di IE 8 dan di bawahnya.

Nate
sumber
1
dan karena kita masih harus mendukung IE8 (sebagian dari kita, yang sial) - ini tidak baik.
mkoryak
27

Kamu bisa melakukan ini:

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

Menggunakan "cssText" sebagai nama properti dan apa pun yang Anda ingin tambahkan ke CSS sebagai nilainya.

hawkeye126
sumber
5
Kelemahan dari ini adalah bahwa itu akan menimpa apa pun cssTextyang ada di sana sebelumnya - jadi Anda benar-benar tidak dapat menggunakannya secara bebas
mkoryak
1
Lagi pula, Anda dapat menggunakan $ ("# elem"). css ("cssText", "+ =; width: 100px! important;");
lexa-b
18

Anda dapat mencapai ini dalam dua cara:

$("#elem").prop("style", "width: 100px !important"); // this is not supported in chrome
$("#elem").attr("style", "width: 100px !important");
kva
sumber
Sebenarnya, .prop()fungsi itu ditambahkan di jQuery v1.6 dan akan berfungsi di Chrome ... ini dikutip dari halaman prop: Sebelum jQuery 1.6, .attr()metode ini terkadang memperhitungkan nilai properti ketika mengambil beberapa atribut, yang dapat menyebabkan perilaku tidak konsisten. Pada jQuery 1.6, .prop()metode ini menyediakan cara untuk secara eksplisit mengambil nilai properti, sambil .attr()mengambil atribut.
Mottie
1
Bukan ide yang sangat bagus untuk solusi generik. Anda dapat mengganti gaya Anda yang ada menggunakan ini.
Nirav Zaveri
14

Tidak perlu pergi ke kompleksitas jawaban @ AramKocharyan, atau kebutuhan untuk memasukkan tag gaya apa pun secara dinamis.

Gaya hanya ditimpa, tetapi Anda tidak perlu mengurai apa pun, mengapa Anda?

// 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' : '') + ';');
}

Tidak dapat digunakan removeProperty(), karena tidak akan menghapus !importantaturan di Chrome.
Tidak dapat digunakan element.style[property] = '', karena hanya menerima camelCase di Firefox.

Anda mungkin bisa membuat ini lebih pendek dengan jQuery, tetapi fungsi vanilla ini akan berjalan di browser modern, Internet Explorer 8, dll.

Hashbrown
sumber
12

Inilah yang saya lakukan setelah menghadapi masalah ini ...

var origStyleContent = jQuery('#logo-example').attr('style');
jQuery('#logo-example').attr('style', origStyleContent + ';width:150px !important');
kebyang
sumber
Terima kasih, ini jauh lebih mudah diterapkan daripada plugin khusus (bahkan jika itu berpotensi menghancurkan gaya inline lainnya).
Phrogz
9

Solusi ini tidak mengesampingkan salah satu gaya sebelumnya, hanya berlaku yang Anda butuhkan:

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);
}
Alain Beauvois
sumber
9

Jika tidak begitu relevan dan karena Anda berurusan dengan satu elemen #elem, Anda dapat mengubah id-nya menjadi sesuatu yang lain dan menatanya sesuai keinginan ...

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

Dan di CSS Anda:

#cheaterId { width: 100px;}
Sinan
sumber
9
mengapa Anda mengubah id untuk menerapkan css, bukan hanya menambahkan kelas css?
TeKapa
8

Alih-alih menggunakan css()fungsi coba addClass()fungsi:

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

  <style>
  .exampleClass{
    width:100% !important;
    height:100% !important;
  }
  </style>
pengguna3778043
sumber
OP menulis bahwa nilai properti dihitung secara dinamis, sehingga jawaban Anda tidak berfungsi untuknya.
Sebastian Zartner
Solusi ini berhasil untuk saya. Saya tidak berpikir saya memiliki kebutuhan yang tepat seperti poster aslinya tetapi tidak berfungsi di mana css () tidak.
leekei
2
Ini memang solusi yang masuk akal untuk suatu masalah ... hanya saja bukan masalah ini !
mkoryak
8

Solusi termudah dan terbaik untuk masalah ini dari saya adalah cukup menggunakan addClass () daripada .css () atau .attr ().

Sebagai contoh:

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

Dan di file CSS Anda:

.importantClass {
    width: 100px !important;
}
Jack Fairfield
sumber
1
Karena lebar dihitung dalam JavaScript, ini tidak menyelesaikan masalah.
Chris
7

Sebagian besar jawaban ini sekarang sudah usang, dukungan IE7 tidak menjadi masalah.

Cara terbaik untuk melakukan ini yang mendukung IE11 + dan semua browser modern adalah:

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

Atau jika Anda mau, Anda bisa membuat plugin jQuery kecil yang melakukan ini. Plugin ini sangat cocok dengan css()metode jQuery sendiri dalam parameter yang didukungnya:

/**
 * 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');

Contoh jsfiddle di sini .

mkoryak
sumber
1
ini jawabannya. Tidak perlu memeriksa jawaban lain
Shwet
6

Pertama-tama kita harus menghapus gaya sebelumnya. Saya menghapusnya menggunakan ekspresi reguler. Berikut adalah contoh untuk mengubah warna:

var SetCssColorImportant = function (jDom, color) {
       var style = jDom.attr('style');
       style = style.replace(/color: .* !important;/g, '');
       jDom.css('cssText', 'color: ' + color + ' !important;' + style); }
Rodrigo Perez Burgues
sumber
3
Tidak tahu mengapa begitu banyak solusi meretas tag gaya ke elemen ketika metode cssText berfungsi dengan baik ... misalnya$selector.css('cssText','margin-bottom: 0 !important')
frumbert
6

Cara alternatif untuk menambahkan gaya di kepala:

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

Ini menambahkan gaya setelah semua file CSS Anda sehingga akan memiliki prioritas lebih tinggi daripada file CSS lainnya dan akan diterapkan.

h0mayun
sumber
6

Mungkin terlihat seperti ini:

Cache

var node = $ ('. selector') [0];
ATAU
var node = document.querySelector ('. selector');

Setel CSS

node.style.setProperty ('lebar', '100px', 'penting');

Hapus CSS

node.style.removeProperty ('width');
ATAU
node.style.width = '';
SerzN1
sumber
6

Saya pikir ini berfungsi OK dan dapat menimpa CSS lain sebelumnya (ini: elemen DOM):

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

Lakukan seperti ini:

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

Solusi ini akan meninggalkan semua javascript yang dikomputasi dan menambahkan tag penting ke dalam elemen: Anda dapat melakukannya (Mis jika Anda perlu mengatur lebar dengan tag penting)

$('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
Sebastian Leandro
sumber
4

Tiga contoh kerja

Saya memiliki situasi yang sama, tetapi saya menggunakan .find () setelah berjuang dengan .closest () untuk waktu yang lama dengan banyak variasi.

Kode Contoh

// 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'});

Bekerja: http://jsfiddle.net/fx4mbp6c/

membeli komputer
sumber
Saya akan menghindarkan Anda memilih, tetapi Anda harus memilih untuk mengganti .indexOf()fungsi dengan sesuatu yang lebih kompatibel lintas-browser. Gunakan, lebih tepatnya, .match()atau .test()bukannya.indexOf()
Alexander Dixon
Mengapa tidak ada tanda titik koma di baris tersebut var contents = ?
Peter Mortensen
3

Ini mungkin atau mungkin tidak sesuai untuk situasi Anda, tetapi Anda dapat menggunakan penyeleksi CSS untuk banyak jenis situasi ini.

Misalnya, jika Anda ingin instance ke-3 dan ke-6 dari .cssText memiliki lebar yang berbeda, Anda dapat menulis:

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

Atau:

.container:nth-of-type(3).cssText, .container:nth-of-type(6).cssText {width:100px !important;}
Pemotongan Tim
sumber
Ini tidak cocok dengan contoh 3 dan 6 dari .cssText. :nth-of-type()tidak melakukan apa yang Anda pikirkan. Lihat di sini untuk penjelasan.
BoltClock
Cukup adil. Saya memang membaca tautannya, tetapi saya tidak yakin saya mengerti maksud Anda. Berikut biola yang menunjukkan pekerjaan ini sebagaimana dimaksud: jsfiddle.net/d2E4b
Tim Cutting
2
Di biola Anda, Anda berurusan dengan serangkaian lielemen. Mereka semua dari jenis elemen yang sama li, yang merupakan apa yang berurusan dengan pemilih. Jika Anda mencampur elemen yang berbeda di induk yang sama, maka :nth-of-type()akan berperilaku berbeda, terutama jadi setelah Anda menambahkan pemilih kelas ke dalam campuran.
BoltClock
3

Saya akan menganggap Anda mencobanya tanpa menambahkan !important?

CSS sebaris (yang merupakan cara JavaScript menambahkan gaya) menimpa CSS stylesheet. Saya cukup yakin itulah masalahnya bahkan ketika aturan CSS stylesheet telah !important.

Pertanyaan lain (mungkin pertanyaan bodoh tetapi harus ditanyakan.): Apakah elemen yang Anda coba kerjakan display:block;atau display:inline-block;?

Tidak mengetahui keahlian Anda dalam CSS ... elemen sebaris tidak selalu berperilaku seperti yang Anda harapkan.

Dave Gregory
sumber
4
aturan css yang memiliki! menimpa segalanya penting, tidak peduli di mana mereka berada, hanya pengecualian bahwa gaya inline dengan! penting akan menimpa gaya stylesheet dengan! penting. Ini adalah masalah yang saya alami. ada aturan stylesheet dengan! penting yang ingin saya timpa. Terlebih lagi, nilai yang saya butuhkan untuk memasok harus dihitung melalui JS, jadi saya tidak bisa mengubah stylesheet itu sendiri.
mkoryak
3

Kita dapat menggunakan setProperty atau cssText untuk menambahkan !important ke elemen DOM menggunakan JavaScript.

Contoh 1:

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

Contoh 2:

elem.style.cssText='color: red !important;'
VISHNU Radhakrishnan
sumber
2

Saya juga menemukan bahwa elemen atau add-on tertentu (seperti Bootstrap) memiliki beberapa case kelas khusus di mana mereka tidak bermain dengan baik !importantatau work-arounds seperti.addClass/.removeClass , dan dengan demikian Anda harus mengaktifkan / mematikannya.

Misalnya, jika Anda menggunakan sesuatu seperti <table class="table-hover">satu-satunya cara untuk berhasil memodifikasi elemen seperti warna baris adalah dengan mengaktifkan table-hover/ menonaktifkan kelas, seperti ini

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

Semoga perbaikan ini bermanfaat bagi seseorang! :)

Austin
sumber
2

Saya memiliki masalah yang sama ketika mencoba mengubah warna teks dari menu-item ketika "event". Cara terbaik yang saya temukan ketika saya memiliki masalah yang sama adalah:

Langkah pertama: Buat, di CSS Anda, kelas baru dengan tujuan ini, misalnya:

.colorw{ color: white !important;}

Langkah terakhir: Terapkan kelas ini menggunakan metode addClass sebagai berikut:

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

Masalah terpecahkan.

JoelBonetR
sumber
1
Jawaban terbaik, menurut saya. Yang paling nyaman.
Siyah
Terima kasih @ Siyah CSS dikenal oleh banyak ppl tetapi dipahami hanya untuk beberapa orang dan ini menyedihkan dan membuat beberapa programmer membencinya lol
JoelBonetR
Namun tidak jika Anda ingin menghasilkan nilai CSS dengan js, contohnya nilai warna yang ditentukan dalam JS. Kalau tidak, ini bagus.
Carl Papworth
mengapa Anda ingin mendefinisikan warna dalam js?
JoelBonetR
2

Solusi teraman untuk ini adalah menambahkan kelas dan kemudian melakukan keajaiban dalam CSS :-), addClass()dan removeClass()harus melakukan pekerjaan.

Ryan S
sumber
1

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

Pendekatan alternatif secara dinamis membuat dan memperbarui kelas CSS dalam JavaScript. Untuk melakukan itu, kita bisa menggunakan elemen style dan perlu menggunakan ID untuk elemen style sehingga kita bisa memperbarui kelas 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)
Razan Paul
sumber