classListを使用して1つの命令で複数のクラスを追加/削除する方法はありますか?


164

これまでのところ私はこれをしなければなりません:

elem.classList.add("first");
elem.classList.add("second");
elem.classList.add("third");

これはjQueryで実行可能ですが、このように

$(elem).addClass("first second third");

追加または削除するネイティブの方法があるかどうか知りたいのですが。

回答:


313
elem.classList.add("first");
elem.classList.add("second");
elem.classList.add("third");

等しい

elem.classList.add("first","second","third");

15
また、複数のクラス名の配列を適用する場合は、DOMTokenList.prototype.add.apply(elem.classList、['first'、 'second'、 'third']);を呼び出す必要があります。
Emanuel Kluge 2013

8
執筆時点では、Firefoxもサポートしていません。 私の答えはポリフィルを提供します。
アンディE

これはネイティブAPIであるため、サポートがそれほど良くなくても、これを正解として切り替えます。
エンリケモレノテント2014

1
あなたはel.className + =「ここに私のクラスを」検討している
マイケルTontchev

1
複数のクラスを削除する方法はありますか
MeVimalkumar

71

新しいスプレッド演算子により、複数のCSSクラスを配列として適用することがさらに簡単になります。

const list = ['first', 'second', 'third'];
element.classList.add(...list);

1
受け入れられた回答は値の直接リストで機能しますが、これは配列で機能します...どちらも優れた回答のようです!
エンリケモレノテント2017年

DOMTokenList配列の代わりにを使用できますか?DOMTokenListは配列のようなオブジェクトであることを知っています。それでそれをclassList.add()メソッドで使用することは可能ですか、またはDOMTokenListを実際の配列に変換する必要がありますか?
xela84

19

このclassListプロパティは、重複するクラスが要素に不必要に追加されないようにします。この機能を維持するために、ロングハンドバージョンやjQueryバージョンが気に入らない場合は、addMany関数と(タイプ)removeManyを追加することをお勧めします。DOMTokenListclassList

DOMTokenList.prototype.addMany = function(classes) {
    var array = classes.split(' ');
    for (var i = 0, length = array.length; i < length; i++) {
      this.add(array[i]);
    }
}

DOMTokenList.prototype.removeMany = function(classes) {
    var array = classes.split(' ');
    for (var i = 0, length = array.length; i < length; i++) {
      this.remove(array[i]);
    }
}

これらは次のように使用できます。

elem.classList.addMany("first second third");
elem.classList.removeMany("first third");

更新

コメントに従って、これらが定義されていない場合にのみ、これらのカスタムメソッドを記述したい場合は、以下を試してください。

DOMTokenList.prototype.addMany = DOMTokenList.prototype.addMany || function(classes) {...}
DOMTokenList.prototype.removeMany = DOMTokenList.prototype.removeMany || function(classes) {...}

まだ良い答えです。また、2文字しかなかったため、編集できませんでした。
ピート

18

からのadd()メソッドclassListでは、単一の配列ではなく個別の引数を渡すことができるため、apply add()を使用して呼び出す必要があります。最初の引数にはclassList、同じDOMノードからの参照を渡し、2番目の引数として、追加するクラスの配列を渡す必要があります。

element.classList.add.apply(
  element.classList,
  ['class-0', 'class-1', 'class-2']
);

これは、Spread Operatorを使用したソリューションのES5バージョンです(@morkroの回答を参照)。Babel Replで簡単に確認できます。
Nickensoul

7

要素にクラスを追加するには

document.querySelector(elem).className+=' first second third';

更新:

クラスを削除する

document.querySelector(elem).className=document.querySelector(elem).className.split(class_to_be_removed).join(" ");

これは興味深いことですが、クラスの文字列を編集するだけです。複数のクラスを削除したい場合は機能しません。OPに追加するのを忘れていました。
エンリケモレノテント2012年

4
使用しないでくださいclassName。パフォーマンスはひどいです(その値を取得してもリフローが発生します)。
ジェイコブ2016

7

DOMTokenList仕様の新しいバージョンでは、add()およびへの複数の引数とremove()toggle()状態を強制ための。

執筆時点では、Chromeはadd()およびへの複数の引数をサポートしていますremove()が、他のブラウザはサポートしていません。IE 10以下、Firefox 23以下、Chrome 23以下、およびその他のブラウザーは、2番目の引数をサポートしていませんtoggle()

私は次の小さなポリフィルを書いて、サポートが拡大するまで押し流しました。

(function () {
    /*global DOMTokenList */
    var dummy  = document.createElement('div'),
        dtp    = DOMTokenList.prototype,
        toggle = dtp.toggle,
        add    = dtp.add,
        rem    = dtp.remove;

    dummy.classList.add('class1', 'class2');

    // Older versions of the HTMLElement.classList spec didn't allow multiple
    // arguments, easy to test for
    if (!dummy.classList.contains('class2')) {
        dtp.add    = function () {
            Array.prototype.forEach.call(arguments, add.bind(this));
        };
        dtp.remove = function () {
            Array.prototype.forEach.call(arguments, rem.bind(this));
        };
    }

    // Older versions of the spec didn't have a forcedState argument for
    // `toggle` either, test by checking the return value after forcing
    if (!dummy.classList.toggle('class1', true)) {
        dtp.toggle = function (cls, forcedState) {
            if (forcedState === undefined)
                return toggle.call(this, cls);

            (forcedState ? add : rem).call(this, cls);
            return !!forcedState;
        };
    }
})();

ES5準拠の最新のブラウザーDOMTokenListが期待されていますが、このポリフィルをいくつかの特定のターゲット環境で使用しているので、うまく機能しますが、IE 8以下などのレガシーブラウザー環境で実行されるスクリプトを微調整する必要があるかもしれません。


1
IE10が複数のクラスの追加を許可していないことについて誰も言及していないようです。これは私にとってうまくいったので、ありがとう!IE9ではDomTokenListが定義されていないというエラーが発生するので注意してください。あなたもそれを説明したいと思うかもしれません。または、次の場合にのみ実行します(typeof DomTokenList!== 'undefined')
Ryan Ore

@ライアン:おかげで、DOMTokenListはIE 9でサポートされていると思いましたが、見逃されたようです。ある時点で回避策を試してみます。
アンディE

失敗したDOMTokenListでは、単語境界のregExチェックでclassNameを使用する必要があるようです
Greg

6

あなたは以下のようにすることができます

追加

elem.classList.add("first", "second", "third");

削除する

elem.classList.remove("first", "second", "third");

参照

TLDR;

上記の単純なケースでは、削除が機能するはずです。ただし、削除する場合は、削除する前にクラスが存在することを確認する必要があります

const classes = ["first","second","third"];
classes.forEach(c => {
  if (elem.classList.contains(c)) {
     element.classList.remove(c);
  }
})

5

これは、IE 10および11のユーザーにとって非常に簡単に思える回避策です。

var elem = document.getElementById('elem');

['first','second','third'].map(item => elem.classList.add(item));
<div id="elem">Hello World!</div>

または

var elem = document.getElementById('elem'),
    classes = ['first','second','third'];

classes.map(function(item) {
    return elem.classList.add(item);
});
<div id="elem">Hello World!</div>


5
良いアイデア。ただし、.map()ではなく.forEach()を使用します。返された配列を使用しないこのような状況では、よりクリーンで効率的です。
tenni 2018年

はい、そうです。
colecmc

2

標準の定義では、単一のクラスの追加または削除のみが可能です。いくつかの小さなラッパー関数は、あなたが求めることを実行できます:

function addClasses (el, classes) {
  classes = Array.prototype.slice.call (arguments, 1);
  console.log (classes);
  for (var i = classes.length; i--;) {
    classes[i] = classes[i].trim ().split (/\s*,\s*|\s+/);
    for (var j = classes[i].length; j--;)
      el.classList.add (classes[i][j]);
  }
}

function removeClasses (el, classes) {
  classes = Array.prototype.slice.call (arguments, 1);
  for (var i = classes.length; i--;) {
    classes[i] = classes[i].trim ().split (/\s*,\s*|\s+/);
    for (var j = classes[i].length; j--;)
      el.classList.remove (classes[i][j]);
  }
}

これらのラッパーを使用すると、クラスのリストを個別の引数として、スペースまたはコンマで区切られたアイテムを含む文字列として、あるいは組み合わせとして指定できます。例については、http://jsfiddle.net/jstoolsmith/eCqy7を参照してください


2

非常にシンプルで派手ではありませんが、私が信じなければならない実用的な解決策は、非常にクロスブラウザーです。

この関数を作成する

function removeAddClasses(classList,removeCollection,addCollection){
    for (var i=0;i<removeCollection.length;i++){ 
        classList.remove(removeCollection[i]); 
    }
    for (var i=0;i<addCollection.length;i++){ 
        classList.add(addCollection[i]); 
    }
}

次のように呼び出します:removeAddClasses(node.classList、arrayToRemove、arrayToAdd);

...ここでarrayToRemoveは、削除するクラス名の配列です:['myClass1'、 'myClass2'] etcetera

...およびarrayToAddは、追加するクラス名の配列です:['myClass3'、 'myClass4'] etcetera


1

追加するクラスの配列があるとすると、ES6スプレッド構文を使用できます。

let classes = ['first', 'second', 'third']; elem.classList.add(...classes);


0

私は@ rich.kellyの答えが好きでしたが、classList.add()(カンマ区切りの文字列)と同じ命名法を使用したかったので、少しずれています。

DOMTokenList.prototype.addMany = DOMTokenList.prototype.addMany || function() {
  for (var i = 0; i < arguments.length; i++) {
    this.add(arguments[i]);
  }
}
DOMTokenList.prototype.removeMany = DOMTokenList.prototype.removeMany || function() {
  for (var i = 0; i < arguments.length; i++) {
    this.remove(arguments[i]);
  }
}

だからあなたはそれから使うことができます:

document.body.classList.addMany('class-one','class-two','class-three');

すべてのブラウザをテストする必要がありますが、これはChromeで機能しました。
の存在よりも具体的なものをチェックする必要がありDOMTokenList.prototype.addManyますか?classList.add()IE11で失敗する正確な原因は何ですか?


0

別のポリフィルelement.classListここにありますMDNで見つけました。

そのスクリプトを含め、element.classList.add("first","second","third")意図したとおりに使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.