特定の要素にクラスを追加するにはどうすればよいですか?


1188

すでにクラスがある要素があります:

<div class="someclass">
    <img ... id="image1" name="image1" />
</div>

次に、クラスをdiv(置換ではなく追加)に追加するJavaScript関数を作成します。

どうやってやるの?


9
2020年以降にこのスレッドを読む人は、古いclassNameメソッドをスキップしてelement.classList.add("my-class")代わりに使用してください。
Pikamander2

回答:


1920

最新のブラウザのみをターゲットにしている場合:

element.classList.addを使用してクラスを追加します

element.classList.add("my-class");

そしてelement.classList.removeでクラスを削除します:

element.classList.remove("my-class");

Internet Explorer 9以下をサポートする必要がある場合:

className要素のプロパティにスペースと新しいクラスの名前を追加します。まず、id簡単に参照を取得できるように要素にを配置します。

<div id="div1" class="someclass">
    <img ... id="image1" name="image1" />
</div>

その後

var d = document.getElementById("div1");
d.className += " otherclass";

前のスペースに注意してくださいotherclass。スペースを含めることが重要です。そうしないと、クラスリストでその前にある既存のクラスが損なわれます。

MDNのelement.classNameも参照してください。


26
JavaScriptで実行する必要があるページ全体での唯一の作業がこのクラス名の追加である場合は、そうです。しかし、これがページの唯一の動的な部分であるとは思えません。ライブラリは、他のすべてにも役立ちます。30-50kbで、jQueryは議論する価値のあるヒットにはなりません。
rfunduk

167
「ライブラリーだけでなく、他のすべてに役立ちます」 -離れてJavaScriptを学習から
meouw

19
クラスをDOM要素に追加することは、言語の学習とどのような関係がありますか?document.getElementById( 'div1')。classNameは、jQueryを使用して同じことを行うのと同じくらい、ライブラリ関連の問題です。問題は「どうすればできるか」でした。徹底的にテストされたライブラリが賢明な答えです。
rfunduk

6
@thenduks:JavaScript!== jQueryはご存じでしょう。この質問への回答にライブラリソリューションと非ライブラリソリューションが含まれているのは良いことです。なぜなら、物事がどのように機能するかを知るには、それらを達成するための最も単純な方法だけではないからです。この質問はjavascriptでタグ付けされていることに気づくでしょう
meouw

2
@meouw:私はあなたに同意します。ただし、jQueryはJavaScriptで記述さているため、OPにライブラリーが良いアイデアであることを言及することは、「フレームワークを喉に押し付ける」ことではないと主張します。それで全部です。
rfunduk

1351

フレームワークなしでこれを行う最も簡単な方法は、element.classList.addメソッドを使用することです。

var element = document.getElementById("div1");
element.classList.add("otherclass");

編集: そして要素からクラスを削除したい場合-

element.classList.remove("otherclass");

私は空のスペースを追加したり、エントリ処理を自分で複製したりする必要がないことを好みます(これは、document.classNameアプローチを使用するときに必要です)。ブラウザにはいくつかの制限がありますが、ポリフィルを使用して回避できます。


67
これはIE 10.0より前のバージョンではサポートされていないのは残念です。なぜなら、これは優れた機能であり、私が頻繁に遭遇する問題の最も簡単な解決策だからです。
mricci 2013年

12
classListのポリフィルが利用可能です。
wcandillon 2013


11
スペースのあるものは少なくともハックのように感じられるので、これは使用するのに最適なようです。クラスを追加するための
メンターで

5
@SilverRingveeスペースアプローチのさらなるリスクは、他の開発者がそれが重要であることを知らず、物事をクリーンアップするために削除する可能性があることです。
akauppi

178

目的の要素 "d"を見つけます。

d.className += ' additionalClass'; //note the space

これを巧妙な方法でラップして、存在を確認したり、スペース要件などを確認したりできます。


そして、この方法を使用して削除するには?
DeathGrip

3
@DeathGripは、クラスを単一の定義名に戻すだけです。d.className = 'originalClass';
TheTechy

@TheTechy-維持する必要があるクラスが複数ある場合(最近よく発生します)、それは機能しません。
Mark Schultheiss

1
昔ながらの方法でsplitある空白のクラス名を削除するには、結果の配列から不要なものを削除してから、joinもう一度配列を...またはを使用しますelement.classList.remove
Stijn de Witt

131

クラスを追加

  • クロス互換

    次の例ではclassname<body>要素にaを追加します。これはIE-8互換です。

    var a = document.body;
    a.classList ? a.classList.add('classname') : a.className += ' classname';

    これは以下の略記です。

    var a = document.body;
    if (a.classList) {
        a.classList.add('wait');
    } else {
        a.className += ' wait';
    }

  • パフォーマンス

    相互互換性よりもパフォーマンスに関心がある場合は、4%高速な次のように短縮できます。

    var z = document.body;
    document.body.classList.add('wait');

  • 便利さ

    あるいは、jQueryを使用することもできますが、結果として生じるパフォーマンスは大幅に低下します。jsPerfによると94%遅い

    $('body').addClass('wait');


クラスを削除する

  • パフォーマンス

    jQueryを選択的に使用することは、パフォーマンスに関心がある場合にクラスを削除するための最良の方法です

    var a = document.body, c = ' classname';
    $(a).removeClass(c);

  • jQueryがないと、32%遅くなります

    var a = document.body, c = ' classname';
    a.className = a.className.replace( c, '' );
    a.className = a.className + c;

参考文献

  1. jsPerfテストケース:クラスの追加
  2. jsPerfテストケース:クラスの削除

プロトタイプの使用

Element("document.body").ClassNames.add("classname")
Element("document.body").ClassNames.remove("classname")
Element("document.body").ClassNames.set("classname")

YUIの使用

YAHOO.util.Dom.hasClass(document.body,"classname")
YAHOO.util.Dom.addClass(document.body,"classname")
YAHOO.util.Dom.removeClass(document.body,"classname")

すごい:)省略形(a.classList ? ...)は通常のもの(if (a.classList) { ....)と比べて速度に違いがありますか?
Wilf

5
オルソありclassList.remove()ます。なぜそれを使わなかったのですか?jQuery jsperf.com/remove-class-vanilla-vs-jquery
Fez Vrasta

@FezVrasta classListはIE 10以前ではサポートされていません。それでも、市場シェアはまあまあです(netmarketshare.comで+ 13%)。
アダム

6
@アダム彼classListはクラスを削除する以外のすべてに使用しました、これが私がそれを求めている理由です。
Fez Vrasta 2016年

アンダー@FezVrasta クロス互換性の私は使用することは、(.addでした)だけが利用可能であるかどうかをチェックした後、henseは互換性の交差します。削除のために私は自分自身を繰り返すことに煩わされなかったので、あまり多くのオプションを含めませんでした。
davidcondrey 2016

33

純粋なJavaScriptを使用して要素にクラスを追加する別のアプローチ

クラスを追加する場合:

document.getElementById("div1").classList.add("classToBeAdded");

クラスを削除する場合:

document.getElementById("div1").classList.remove("classToBeRemoved");

4
これは、ブラウザのサポートやシムの議論など、他のユーザーからすでに何度か回答されています。
bafromca 2014

@bafromca以前の答えが出たことと、私の間違いはわかりませんでした。あなたはこの答えにフラグを立てることができます
Shoaib Chikate '24

3
@ShoaibChikate:必要に応じて回答を削除することもできます(ポイントは保持されます)。この質問の乱雑さを減らすことだけを試みます。完全にあなた次第です。
Dan Dascalescu 2015年

22

私がしている作業がライブラリを使用する必要がない場合は、次の2つの関数を使用します。

function addClass( classname, element ) {
    var cn = element.className;
    //test for existance
    if( cn.indexOf( classname ) != -1 ) {
        return;
    }
    //add a space if the element already has class
    if( cn != '' ) {
        classname = ' '+classname;
    }
    element.className = cn+classname;
}

function removeClass( classname, element ) {
    var cn = element.className;
    var rxp = new RegExp( "\\s?\\b"+classname+"\\b", "g" );
    cn = cn.replace( rxp, '' );
    element.className = cn;
}

15
if( cn.indexOf( classname ) != -1 ) { return; } 「btn-info」クラスがすでにここにある状態で「btn」クラスを追加すると、失敗することに注意してください。
Alexandre Dieulot 2013

1
element.className.split(" ");ここで報告されている@AlexandreDieulotの問題を防ぐために使用する必要があります。
Amir Fo 2018

20

この1つのクラスを追加するだけではない場合(たとえば、非同期リクエストなどが続く場合)、PrototypejQueryなどのライブラリをお勧めします。

これにより、これを含め、実行する必要のあるすべてのことが非常に簡単になります。

したがって、ページにjQueryがあるとしましょう。次のようなコードを使用して、要素にクラス名を追加できます(この場合、ロード時)。

$(document).ready( function() {
  $('#div1').addClass( 'some_other_class' );
} );

他のものについてはjQuery APIブラウザをチェックしてください。


15

classList.add OR classList.removeメソッドを使用して、要素からクラスを追加/削除できます。

var nameElem = document.getElementById("name")
nameElem.classList.add("anyclss")

上記のコードは、nameElemにクラス「anyclass」を追加します(置き換えません)。同様に、classList.remove()メソッドを使用してクラスを削除できます。

nameElem.classList.remove("anyclss")

非常に素晴らしいが、IE <= 9またはSafariの<= 5.0 ... :((ではサポートされていませんcaniuse.com/classlist
サイモン

1
これについては、ブラウザのサポートを含め、すでに説明済みです。
Dan Dascalescu 2015年

10

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

既存の値を削除または影響せずに要素にクラスを追加するには、次のようにスペースと新しいクラス名を追加します。

document.getElementById("MyElement").className += " MyClass";

要素のすべてのクラスを変更するには:

既存のすべてのクラスを1つ以上の新しいクラスに置き換えるには、className属性を設定します。

document.getElementById("MyElement").className = "MyClass";

(スペース区切りのリストを使用して、複数のクラスを適用できます。)


6

jQueryを使用せず、古いブラウザーをサポートする場合:

function addClass(elem, clazz) {
    if (!elemHasClass(elem, clazz)) {
        elem.className += " " + clazz;
    }
}

function elemHasClass(elem, clazz) {
    return new RegExp("( |^)" + clazz + "( |$)").test(elem.className);
}

5

IE9が正式にシャットダウンさelement.classListれ、上記のように多くの方法でそれを達成できることはわかっclassListていますが、上記の多くの回答を参考にせずに、IE9がどのように機能するかを学習しようとしました。

以下のコードは、上記の多くの回答を拡張し、重複するクラスの追加を回避することでそれらを改善しています。

function addClass(element,className){
  var classArray = className.split(' ');
  classArray.forEach(function (className) {
    if(!hasClass(element,className)){
      element.className += " "+className;
    }
  });            
}
//this will add 5 only once
addClass(document.querySelector('#getbyid'),'3 4 5 5 5');

5

私も最速の方法はes5のようにElement.prototype.classListを使用することだと思います:document.querySelector(".my.super-class").classList.add('new-class') しかし、ie8にはElement.prototype.classListのようなものはありません。 ):

if(Element.prototype.classList === void 0){
	function DOMTokenList(classes, self){
		typeof classes == "string" && (classes = classes.split(' '))
		while(this.length){
			Array.prototype.pop.apply(this);
		}
		Array.prototype.push.apply(this, classes);
		this.__self__ = this.__self__ || self
	}

	DOMTokenList.prototype.item = function (index){
		return this[index];
	}

	DOMTokenList.prototype.contains = function (myClass){
		for(var i = this.length - 1; i >= 0 ; i--){
			if(this[i] === myClass){
				return true;
			}
		}
		return false
	}

	DOMTokenList.prototype.add = function (newClass){
		if(this.contains(newClass)){
			return;
		}
		this.__self__.className += (this.__self__.className?" ":"")+newClass;
		DOMTokenList.call(this, this.__self__.className)
	}

	DOMTokenList.prototype.remove = function (oldClass){
		if(!this.contains(newClass)){
			return;
		}
		this[this.indexOf(oldClass)] = undefined
		this.__self__.className = this.join(' ').replace(/  +/, ' ')
		DOMTokenList.call(this, this.__self__.className)
	}

	DOMTokenList.prototype.toggle = function (aClass){
		this[this.contains(aClass)? 'remove' : 'add'](aClass)
		return this.contains(aClass);
	}

	DOMTokenList.prototype.replace = function (oldClass, newClass){
		this.contains(oldClass) && this.remove(oldClass) && this.add(newClass)
	}

	Object.defineProperty(Element.prototype, 'classList', {
		get: function() {
			return new DOMTokenList( this.className, this );
		},
		enumerable: false
	})
}


4

他の人が言ったことを詳しく説明するために、複数のCSSクラスがスペースで区切られた単一の文字列に結合されています。したがって、ハードコーディングしたい場合は、次のようになります。

<div class="someClass otherClass yetAnotherClass">
      <img ... id="image1" name="image1" />
</div>

そこから、新しいクラスを追加するために必要なJavaScriptを簡単に派生させることができます...要素のclassNameプロパティに新しいクラスが続くスペースを追加するだけです。これを知っていれば、必要に応じて後でクラスを削除する関数を作成することもできます。


4

簡単な方法で要素クラスを追加、削除、または確認するには:

var uclass = {
    exists: function(elem,className){var p = new RegExp('(^| )'+className+'( |$)');return (elem.className && elem.className.match(p));},
    add: function(elem,className){if(uclass.exists(elem,className)){return true;}elem.className += ' '+className;},
    remove: function(elem,className){var c = elem.className;var p = new RegExp('(^| )'+className+'( |$)');c = c.replace(p,' ').replace(/  /g,' ');elem.className = c;}
};

var elem = document.getElementById('someElem');
//Add a class, only if not exists yet.
uclass.add(elem,'someClass');
//Remove class
uclass.remove(elem,'someClass');

4

jQueryと同様の最新のアプローチを使用できます

JSがDOMで最初に検出する要素を1つだけ変更する必要がある場合は、これを使用できます。

document.querySelector('.someclass').className += " red";
.red {
  color: red;
}
<div class="someclass">
  <p>This method will add class "red" only to first element in DOM</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

クラス名の前にスペースを1つ残してください。

新しいクラスを追加したいクラスが複数ある場合は、次のように使用できます

document.querySelectorAll('.someclass').forEach(function(element) {
  element.className += " red";
});
.red {
  color: red;
}
<div class="someclass">
  <p>This method will add class "red" to all elements in DOM that have "someclass" class.</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>

<div class="someclass">
  <p>lorem ipsum</p>
</div>


3

ブラウザのDOMで実行できる純粋なJavaScriptを使用する方が良いと思います。

これが機能的な使い方です。ES6を使用しましたが、JavaScript StyleGuideに適したES5と関数式または関数定義を自由に使用できます。

'use strict'

const oldAdd = (element, className) => {
  let classes = element.className.split(' ')
  if (classes.indexOf(className) < 0) {
    classes.push(className)
  }
  element.className = classes.join(' ')
}

const oldRemove = (element, className) => {
  let classes = element.className.split(' ')
  const idx = classes.indexOf(className)
  if (idx > -1) {
    classes.splice(idx, 1)
  }
  element.className = classes.join(' ')
}

const addClass = (element, className) => {
  if (element.classList) {
    element.classList.add(className)
  } else {
    oldAdd(element, className)
  }
}

const removeClass = (element, className) => {
  if (element.classList) {
    element.classList.remove(className)
  } else {
    oldRemove(element, className)
  }
}


2

純粋なJSを使用したサンプル。最初の例では、要素のIDを取得し、たとえば2つのクラスを追加します。

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsById('tabGroup').className = "anyClass1 anyClass2";
})

2番目の例では、要素のクラス名を取得し、さらに1つ追加します。

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsByClassName('tabGroup')[0].className = "tabGroup ready";
})

1

Lodashを使用していてclassName文字列を更新したい場合:

// get element reference
var elem = document.getElementById('myElement');

// add some classes. Eg. 'nav' and 'nav header'
elem.className = _.chain(elem.className).split(/[\s]+/).union(['nav','navHeader']).join(' ').value()

// remove the added classes
elem.className = _.chain(elem.className).split(/[\s]+/).difference(['nav','navHeader']).join(' ').value()

0

まず、divにIDを指定します。次に、関数appendClassを呼び出します。

<script language="javascript">
  function appendClass(elementId, classToAppend){
    var oldClass = document.getElementById(elementId).getAttribute("class");
    if (oldClass.indexOf(classToAdd) == -1)
    {
      document.getElementById(elementId).setAttribute("class", classToAppend);
    }
}
</script>

1
追加しないクラスを置き換えます!たぶんも行が見つからないかoldClass +」「+ classToAppend代わりに最後classToAppendのさ
Vinze

indexOf素朴な解決策であり、すでに指摘されている問題があります
Dan Dascalescu 2015年

0

API querySelectorを使用して要素を選択し、要素と新しいクラス名をパラメーターとして使用して関数を作成できます。最新のブラウザーではクラスリストを使用し、その他ではIE8を使用します。その後、イベントの後に関数を呼び出すことができます。

 //select the dom element
 var addClassVar = document.querySelector('.someclass');

 //define the addclass function
 var addClass = function(el,className){
   if (el.classList){
     el.classList.add(className);
   }
   else {
     el.className += ' ' + className;
  }
};

//call the function
addClass(addClassVar, 'newClass');

これについては、ブラウザのサポートとともにすでに説明しいます
Dan Dascalescu 2015年


0
document.getElementById('some_id').className+='  someclassname'

または:

document.getElementById('come_id').classList.add('someclassname')

最初のアプローチは、2番目のアプローチが機能しないときにクラスを追加するのに役立ちました。
の前にスペースを確保することを忘れないでください' someclassname'最初のアプローチでは。

削除するために使用できます:

document.getElementById('some_id').classList.remove('someclassname')

-4

このjsコードは私のために働きます

クラス名の置き換えを提供します

var DDCdiv = hEle.getElementBy.....

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array
for (var i=0; i< Ta.length;i++)
{
    if (Ta[i] == 'visible'){
        Ta[i] = 'hidden';
        break;// quit for loop
    }
    else if (Ta[i] == 'hidden'){
        Ta[i] = 'visible';
    break;// quit for loop
    }
}
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

追加するだけ

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array
Ta.push('New class name');
// Ta.push('Another class name');//etc...
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

使用を削除するには

var cssCNs = DDCdiv.getAttribute('class');
var Ta = cssCNs.split(' '); //split into an array

for (var i=0; i< Ta.length;i++)
{
    if (Ta[i] == 'visible'){
        Ta.splice( i, 1 );
        break;// quit for loop
    }
}
DDCdiv.setAttribute('class',Ta.join(' ') );  // Join array with space and set class name

これが身体に役立つことを願っています


-9

YUIでは、yuidomを含めると使用できます

YAHOO.util.Dom.addClass('div1','className');

HTH


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