Como é que adiciono uma classe a um dado elemento?

tenho um elemento que já tem uma classe:

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

agora quero criar uma função Javascript que irá adicionar uma classe ao div (não substituir, mas adicionar).

Como posso fazer isso?

Author: user2314737, 2009-02-03

22 answers

Adicione um espaço mais o nome da sua nova classe à propriedade className do elemento. Primeiro, coloque um id no elemento para que você possa facilmente obter uma referência.

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

Depois

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

Ver também elemento.className on MDN .

 1661
Author: Ishmael, 2016-01-16 16:20:05

A maneira mais fácil de fazer isto sem qualquer framework é usar elemento.classList.método de adicionar .

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

Editar: E se quiser remover a classe de um elemento -

element.classList.remove("otherclass");

Prefiro não ter de adicionar nenhum espaço vazio e duplicar o tratamento de Entradas (o que é necessário quando se utiliza a abordagem document.className). Existem algumas limitações do navegador , mas você pode trabalhar em torno delas usando polifills .

 1075
Author: Yuri, 2017-09-26 10:32:49

Encontre o seu elemento-alvo " d " como quiser e depois:

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

Você pode embrulhar isso em formas mais inteligentes para verificar a pré-existência, e verificar os requisitos de espaço, etc..

 173
Author: annakata, 2017-02-26 16:29:40

Adicionar Classe

  • Compatível Com Cruz

    No seguinte exemplo adicionamos um classname ao elemento <body>. Isto é compatível com o IE-8.

    var a = document.body;
    a.classList ? a.classList.add('classname') : a.className += ' classname';
    
    Isto é abreviatura para o seguinte..
    var a = document.body;
    if (a.classList) {
        a.classList.add('wait');
    } else {
        a.className += ' wait';
    }
    

  • Desempenho

    Se estiver mais preocupado com o desempenho sobre a compatibilidade cruzada, pode reduzi-lo para o seguinte, que é 4% rapidamente.

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

  • Conveniência

    Em alternativa, pode usar o jQuery, mas o desempenho resultante é significativamente mais lento. 94% mais lento de acordo com jsPerf

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


Remover a classe

  • Desempenho

    Usar o jQuery selectivamente é o melhor método para remover uma classe se estiver preocupado com desempenho

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

  • Sem jQuery é 32% mais lento.
    var a = document.body, c = ' classname';
    a.className = a.className.replace( c, '' );
    a.className = a.className + c;
    

Referências

  1. caso de ensaio jsPerf: adicionar uma classe
  2. caso de ensaio jsPerf: remoção de uma classe

Usando O Protótipo

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

Utilizar YUI

YAHOO.util.Dom.hasClass(document.body,"classname")
YAHOO.util.Dom.addClass(document.body,"classname")
YAHOO.util.Dom.removeClass(document.body,"classname")
 118
Author: davidcondrey, 2015-08-02 07:20:48

Outra abordagem para adicionar a classe ao elemento usando JavaScript puro

Para adicionar classe:

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

Para remover a classe:

document.getElementById("div1").classList.remove("classToBeRemoved");
 33
Author: Shoaib Chikate, 2014-09-23 11:15:35

Quando o trabalho que estou a fazer não justifica a utilização de uma biblioteca, uso estas duas funções:

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;
}
 21
Author: meouw, 2009-02-03 14:40:44
Assumindo que você está fazendo mais do que apenas adicionar esta classe (por exemplo, você tem pedidos assíncronos e assim por diante Também), eu recomendaria uma biblioteca como protótipo ou jQuery. Isto vai tornar tudo o que precisa de fazer (incluindo isto) muito simples. Então vamos dizer que você tem jQuery na sua página agora, você poderia usar um código como este para adicionar um nome de classe a um elemento (na carga, neste caso):
$(document).ready( function() {
  $('#div1').addClass( 'some_other_class' );
} );

Vê o jQuery Navegador API para outras coisas.

 20
Author: rfunduk, 2009-02-03 14:00:25

Podes usar a lista de alunos.adicionar ou classList.remover o método para adicionar / remover uma classe de um elemento.

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

O código acima irá adicionar (e não substituir) uma classe "anyclass" ao nomeelem. Da mesma forma você pode usar classList.remover () método para remover uma classe.

nameElem.classList.remove("anyclss")
 14
Author: sjv, 2013-08-10 08:59:34

Para adicionar uma classe adicional a um elemento:

Para adicionar uma classe a um elemento, sem remover / afectar os valores existentes, adicione um espaço e o novo nome da classe, como por exemplo:

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

Mudar todas as classes para um elemento:

Para substituir todas as classes existentes por uma ou mais novas classes, defina o atributo className:

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

(pode usar uma lista delimitada pelo espaço para aplicar várias classes.)

 10
Author: Muhammed, 2015-08-20 08:38:22

Se não quiser usar o jQuery e apoiar navegadores mais antigos:

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

function elemHasClass(elem, clazz) {
    return new RegExp("( |^)" + clazz + "( |$)").test(elem.className);
}
 5
Author: Ferran Maylinch, 2016-03-31 23:29:30

Apenas para elaborar o que outros já disseram, várias classes CSS são combinadas em uma única cadeia, delimitada por espaços. Assim, se você quisesse programá-lo, simplesmente se pareceria com isto:

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

De lá você pode facilmente derivar o javascript necessário para adicionar uma nova classe... basta adicionar um espaço seguido pela nova classe à propriedade do elemento className. Sabendo disso, você também pode escrever uma função para remover uma classe mais tarde se a necessidade surgir.

 4
Author: Misko, 2009-02-03 14:18:50

Para adicionar, remover ou verificar classes de elementos de uma forma simples:

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
Author: Marcos Fernandez Ramos, 2015-03-17 16:08:52

Eu sei que o IE9 está desligado oficialmente e podemos alcançá-lo com element.classList o que muitos disseram acima, mas eu apenas tentei aprender como ele funciona sem classList com a ajuda de muitas respostas acima eu poderia aprendê-lo.

Abaixo o código estende muitas respostas acima e melhora-as, evitando adicionar classes duplicadas.

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');
 4
Author: Yuvaraj, 2017-03-24 14:18:15

Podes usar uma abordagem moderna semelhante à jQuery

Se precisar de mudar apenas um elemento, o primeiro que o JS encontrar no DOM, pode usar isto:

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>

Tenha em mente para deixar um espaço antes do nome da classe.

Se tiver várias classes em que deseja adicionar uma nova classe, pode usá-la assim

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
Author: Vladimir Jovanović, 2017-09-24 15:44:43

Amostra com JS puro. No primeiro exemplo, obtemos o id do nosso elemento e adicionamos, por exemplo, 2 classes.

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

No segundo exemplo obtemos o nome da classe do elemento e adicionamos mais 1.

document.addEventListener('DOMContentLoaded', function() {
    document.getElementsByClassName('tabGroup')[0].className = "tabGroup ready";
})
 2
Author: Vasyl Gutnyk, 2015-07-19 16:31:23
Acho que é melhor usar JavaScript puro, que podemos usar no DOM do navegador. Aqui está a maneira funcional de usá-lo. Eu usei ES6, mas sinta-se livre para usar ES5 e expressão de função ou definição de função, o que se adequar ao seu estilo JavaScript.

'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
Author: bvmCoder, 2017-01-08 09:55:43

Eu também acho que a maneira mais rápida é usar o elemento.prototipo.classList como em es5: document.querySelector(".my.super-class").classList.add('new-class') mas em ie8 não existe tal coisa como elemento.prototipo.classList, de qualquer forma você pode polifilá-lo com este excerto (caiu livre para editá-lo e melhorá-lo):

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
	})
}
 2
Author: asdru, 2017-12-30 17:46:20
Primeiro, dá uma identificação ao div. Então, ligue para a função 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>
 0
Author: tehvan, 2009-02-03 14:04:58

Pode usar o selector de API para seleccionar o seu elemento e criar uma função com o elemento e o novo nome de classe como parâmetros. Usando classlist para navegadores modernos, else para IE8. Então você pode chamar a função após um evento.

 //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');
 0
Author: KevinOrfas, 2015-03-06 10:27:52

Para aqueles que usam Lodash e que querem actualizar className string:

// 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
Author: S.D., 2017-06-30 07:21:18
Este código js funciona para mim.

Oferece a substituição do nome da classe

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

Para adicionar basta usar

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

Para remover o uso

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

Espero que isto seja útil para alguém

 -4
Author: Anon, 2014-06-27 14:48:21

Em YUI, se incluíres yuidom , podes usar

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

HTH

 -10
Author: Alagu, 2009-02-03 14:11:58