¿Cómo puedo configurar varios estilos CSS en JavaScript?

189

Tengo las siguientes variables de JavaScript:

var fontsize = "12px"
var left= "200px"
var top= "100px"

Sé que puedo configurarlos en mi elemento de forma iterativa así:

document.getElementById("myElement").style.top=top
document.getElementById("myElement").style.left=left

¿Es posible ponerlos todos juntos a la vez, algo como esto?

document.getElementById("myElement").style = allMyStyle 
Mircea
fuente
1
¿Cuál sería allMyStyleen tu ejemplo? Al principio tienes una lista de variables individuales ...
Felix Kling
1
tamaño de fuente: 12px; izquierda: 200 px; arriba: 100 px
Mircea
1
Si esto funcionara, sería una cadena que contiene todo el CSS que se establecerá: document.getElementById ("myElement"). Style = font-size: 12px; izquierda: 200 px; arriba: 100 px
Mircea
@Mircea: Mira mi respuesta ... puedes usar cssText.
Felix Kling
@Felix Kling esto es lo que estoy buscando. No hacer muchos reflujos y repintes. No estoy seguro de si funcionará con mi código, ¡pero debería ser así! Gracias
Mircea

Respuestas:

277

Si tiene los valores CSS como cadena y no hay otro CSS ya establecido para el elemento (o no le importa sobrescribir), utilice la cssTextpropiedad :

document.getElementById("myElement").style.cssText = "display: block; position: absolute";

Esto es bueno en cierto sentido, ya que evita volver a pintar el elemento cada vez que cambia una propiedad (las cambia todas "de una vez" de alguna manera).

Por otro lado, primero tendría que construir la cadena.

Felix Kling
fuente
64
document.getElementById ("myElement"). style.cssText + = ';' + cssString; devolverá un valor 'normalizado' para element.style.cssText: la nueva cadena reemplazará las propiedades con nombre existentes por cualquier valor nuevo, agregará nuevas y dejará el resto solo.
Kennebec
2
@kennebec: Solo lo intenté y tienes razón. No lo sabía, solo pensé que se añadía al texto ya existente. Pero de hecho reemplaza los valores ...
Felix Kling
1
Esperaba que alguien lo obtuviera y lo usara. Nunca lo había visto documentado. Buena respuesta, por cierto.
Kennebec
33
@kennebec Realicé una prueba jsperf y descubrí que aplicar múltiples reglas css en una secuencia en lugar de usar el método cssText es más rápido: jsperf.com/csstext-vs-multiple-css-rules/4
Andrei Oniga
2
@RohitTigga: una cadena que contiene reglas CSS. Por ej display: block; position: absolute;.
Felix Kling
280

Usando Object.assign :

Object.assign(yourelement.style,{fontsize:"12px",left:"200px",top:"100px"});

Esto también le brinda la capacidad de fusionar estilos, en lugar de reescribir el estilo CSS.

También puede hacer una función de acceso directo:

const setStylesOnElement = function(styles, element){
    Object.assign(element.style, styles);
}
Laimis
fuente
16
lamentablemente este método no es compatible con IE11 kangax.github.io/compat-table/es6/…
AndrewSilver
2
@AndrewSilver: use babel && una de las muchas bibliotecas de polyfill para obtener soporte para las funciones de ES6 en navegadores no compatibles.
Periata Breatta
1
¡Al usar babel, este es el método a seguir! ¡Perfecto!
nirazul
1
@Nirazul ¿Cómo usarlo? Lo intento document.querySelector('html').style = Object.assign({}, document.querySelector('html').style, { color: 'red'})pero no pasa nada.
Jonathan Dion
1
Esto será suficiente, ya que expande un objeto javascript simple: no es necesario asignar nada: Object.assign(document.querySelector('html').style, { color: 'red' });... solo asegúrese de que el estilo no se sobrescriba en un elemento inferior. Esto es muy probable cuando se usa en el htmlelemento.
nirazul
51

@Mircea: Es muy fácil configurar los múltiples estilos para un elemento en una sola declaración. No afecta las propiedades existentes y evita la complejidad de buscar bucles o complementos.

document.getElementById("demo").setAttribute(
   "style", "font-size: 100px; font-style: italic; color:#ff0000;");

TENGA CUIDADO: si más adelante usa este método para agregar o alterar propiedades de estilo, se borrarán las propiedades anteriores establecidas mediante 'setAttribute'.

CAÑA
fuente
removeAttributepodría ser útil para aquellos que estén pensando en usar setAttributepara restablecer el estilo
che-azeh
41

Haga una función para cuidarlo y pase los parámetros con los estilos que desea cambiar.

function setStyle( objId, propertyObject )
{
 var elem = document.getElementById(objId);
 for (var property in propertyObject)
    elem.style[property] = propertyObject[property];
}

y llamarlo así

setStyle('myElement', {'fontsize':'12px', 'left':'200px'});

para los valores de las propiedades dentro del objeto de propiedad puede usar variables.

Gabriele Petrioli
fuente
Estaba usando la propiedad .style cada vez individualmente para no anular si tuviera que cambiar un estilo, pero esto funciona mejor, más condensado.
dragonore
2
La mejor solución, porque es tan flexible y útil como cssText, pero más rápido.
Simon Steinberger
17

Una biblioteca de JavaScript le permite hacer estas cosas muy fácilmente.

jQuery

$('#myElement').css({
  font-size: '12px',
  left: '200px',
  top: '100px'
});

Objeto y un for-in-loop

O, un método mucho más elegante es un objeto básico y for-loop

var el = document.getElementById('#myElement'),
    css = {
      font-size: '12px',
      left: '200px',
      top: '100px'
    };  

for(i in css){
   el.style[i] = css[i];
}
Harmen
fuente
2
Sí, pero en este proyecto no puedo usar jQuery ... Gracias
Mircea
¿necesita escribir fonttsize como fontSize?
midstack
1
Si. Las propiedades distinguen entre mayúsculas y minúsculas, incluso cuando se utiliza la notación de cadenas. Debe ser fontSize: 12px.
MyNameIsKo
Diría font-size;)
mikus
14

establecer múltiples propiedades de estilo CSS en Javascript

document.getElementById("yourElement").style.cssText = cssString;

o

document.getElementById("yourElement").setAttribute("style",cssString);

Ejemplo:

document
.getElementById("demo")
.style
.cssText = "margin-left:100px;background-color:red";

document
.getElementById("demo")
.setAttribute("style","margin-left:100px; background-color:red");
eyupgevenim
fuente
13

Acabo de tropezar aquí y no veo por qué se requiere tanto código para lograr esto.

Agregue su código CSS como una cadena.

let styles = `
    font-size:15em;
    color:red;
    transform:rotate(20deg)`

document.querySelector('*').style = styles
a

Thielicious
fuente
1
También uso este método porque es útil si no tienes otros estilos en línea, pero a veces causa problemas.
Любопытный
Si se producen problemas, solo se debe a una mala implementación. Todo depende de cómo, cuándo y dónde lo aplique a su código.
Thielicious
3

Puede tener clases individuales en sus archivos css y luego asignar el nombre de clase a su elemento

o puede recorrer las propiedades de los estilos como:

var css = { "font-size": "12px", "left": "200px", "top": "100px" };

for(var prop in css) {
  document.getElementById("myId").style[prop] = css[prop];
}
Sachin Shanbhag
fuente
Esa no es una opción ya que las variables son dinámicas
Mircea
Esto no es exactamente lo que preguntó el usuario, pero es muy probable que sea la solución más viable. +1
Ryan Kinal
2
@Sachin "font-size" debe estar en camello como "fontSize". No se garantiza que los nombres de estilo hibnados funcionen en todos los navegadores, a menos que use setAttribute.
Ashwin Prabhu
2

No pienses que es posible como tal.

Pero podría crear un objeto a partir de las definiciones de estilo y simplemente recorrerlas.

var allMyStyle = {
  fontsize: '12px',
  left: '200px',
  top: '100px'
};

for (i in allMyStyle)
  document.getElementById("myElement").style[i] = allMyStyle[i];

Para desarrollar más, haga una función para ello:

function setStyles(element, styles) {
  for (i in styles)
    element.style[i] = styles[i];
}

setStyles(document.getElementById("myElement"), allMyStyle);
nnevala
fuente
2

Usando Javascript simple, no puede configurar todos los estilos a la vez; necesitas usar líneas individuales para cada una de ellas.

Sin embargo, no tiene que repetir el document.getElementById(...).style.código una y otra vez; cree una variable de objeto para hacer referencia a ella, y hará que su código sea mucho más legible:

var obj=document.getElementById("myElement").style;
obj.top=top;
obj.left=left;

... etc. Mucho más fácil de leer que su ejemplo (y, francamente, tan fácil de leer como la alternativa jQuery).

(si Javascript se hubiera diseñado correctamente, también podría haber usado la withpalabra clave, pero es mejor dejarlo solo, ya que puede causar algunos problemas desagradables en el espacio de nombres)

Spudley
fuente
1
Eso no es cierto, puede configurar todos los estilos a la vez a través de cssText.
Felix Kling
2
@Felix: cssTextestá bien para configurar el valor de la hoja de estilo en línea. Sin embargo, si también tiene clases, o si solo desea anular algunos valores pero no todos, puede ser bastante difícil de usar cssText. Entonces tienes razón; puede hacerlo, pero lo recomendaría para la mayoría de los casos de uso.
Spudley
1
Bueno, tener clases no es un argumento ... obj.topo obj.style.colortambién establece el valor de la hoja de estilo en línea. Y sí, en mi respuesta dije que uno sobrescribiría los valores ... depende del contexto si es útil o no.
Felix Kling
1
Será mejor que haga ese obj = document.getElementById ("myElement"). Style; o establezca sus propiedades obj.style.top = top.
Kennebec
@kennebec - hmm, podría haber jurado que hice eso. oh bueno, editado. Gracias por ver.
Spudley
1

Su mejor opción puede ser crear una función que establezca estilos por su cuenta:

var setStyle = function(p_elem, p_styles)
{
    var s;
    for (s in p_styles)
    {
        p_elem.style[s] = p_styles[s];
    }
}

setStyle(myDiv, {'color': '#F00', 'backgroundColor': '#000'});
setStyle(myDiv, {'color': mycolorvar, 'backgroundColor': mybgvar});

Tenga en cuenta que aún tendrá que usar los nombres de propiedad compatibles con javascript (por lo tanto backgroundColor)

Ryan Kinal
fuente
1

Ver para ... en

Ejemplo:

var myStyle = {};
myStyle.fontsize = "12px";
myStyle.left= "200px";
myStyle.top= "100px";
var elem = document.getElementById("myElement");
var elemStyle = elem.style;
for(var prop in myStyle) {
  elemStyle[prop] = myStyle[prop];
}
Onkelborg
fuente
1

Este es un hilo viejo, así que pensé que para cualquiera que buscara una respuesta moderna, sugeriría usar Object.keys ();

var myDiv = document.getElementById("myDiv");
var css = {
    "font-size": "14px",
    "color": "#447",
    "font-family": "Arial",
    "text-decoration": "underline"
};

function applyInlineStyles(obj) {
    var result = "";
    Object.keys(obj).forEach(function (prop) {
        result += prop + ": " + obj[prop] + "; ";
    });
    return result;
}

myDiv.style = applyInlineStyles(css);
dragonore
fuente
1

Hay escenarios en los que usar CSS junto con javascript podría tener más sentido con este problema. Echa un vistazo al siguiente código:

document.getElementById("myElement").classList.add("newStyle");
document.getElementById("myElement").classList.remove("newStyle");

Esto simplemente cambia entre clases CSS y resuelve muchos problemas relacionados con la anulación de estilos. Incluso hace que su código sea más ordenado.

che-azeh
fuente
0

Puede escribir una función que establezca declaraciones individualmente para no sobrescribir ninguna declaración existente que no proporcione. Digamos que tiene esta lista de declaraciones de parámetros de objeto:

const myStyles = {
  'background-color': 'magenta',
  'border': '10px dotted cyan',
  'border-radius': '5px',
  'box-sizing': 'border-box',
  'color': 'yellow',
  'display': 'inline-block',
  'font-family': 'monospace',
  'font-size': '20px',
  'margin': '1em',
  'padding': '1em'
};

Puede escribir una función que se vea así:

function applyStyles (el, styles) {
  for (const prop in styles) {
    el.style.setProperty(prop, styles[prop]);
  }
};

que toma una elementy una objectlista de propiedades de declaraciones de estilo para aplicar a ese objeto. Aquí hay un ejemplo de uso:

const p = document.createElement('p');
p.textContent = 'This is a paragraph.';
document.body.appendChild(p);

applyStyles(p, myStyles);
applyStyles(document.body, {'background-color': 'grey'});

jsejcksn
fuente
0

Creo que es una forma muy simple con respecto a todas las soluciones anteriores:

const elm = document.getElementById("myElement")

const allMyStyle = [
  { prop: "position", value: "fixed" },
  { prop: "boxSizing", value: "border-box" },
  { prop: "opacity", value: 0.9 },
  { prop: "zIndex", value: 1000 },
];

allMyStyle.forEach(({ prop, value }) => {
  elm.style[prop] = value;
});
Jalal
fuente
0

Utilice el CSSStyleDeclaration.setProperty()método dentro Object.entriesdel objeto de estilos.
También podemos establecer la prioridad ("importante") para la propiedad CSS con esto.
Usaremos nombres de propiedades CSS "hypen-case".

const styles = {
  "font-size": "18px",
  "font-weight": "bold",
  "background-color": "lightgrey",
  color: "red",
  "padding": "10px !important",
  margin: "20px",
  width: "100px !important",
  border: "1px solid blue"
};

const elem = document.getElementById("my_div");

Object.entries(styles).forEach(([prop, val]) => {
  const [value, pri = ""] = val.split("!");
  elem.style.setProperty(prop, value, pri);
});
<div id="my_div"> Hello </div>

sivako
fuente
0

¿Es válido el siguiente innerHtml?

var styleElement = win.document.createElement("STYLE");
styleElement.innerHTML = "#notEditableVatDisplay {display:inline-flex} #editableVatInput,.print-section,i.fa.fa-sort.click-sortable{display : none !important}";

Sandeep M
fuente
0

Con ES6 + puedes usar también backticks e incluso copiar el CSS directamente desde algún lugar:

const $div = document.createElement('div')
$div.innerText = 'HELLO'
$div.style.cssText = `
    background-color: rgb(26, 188, 156);
    width: 100px;
    height: 30px;
    border-radius: 7px;
    text-align: center;
    padding-top: 10px;
    font-weight: bold;
`

document.body.append($div)

V. Sambor
fuente
-1
<button onclick="hello()">Click!</button>

<p id="demo" style="background: black; color: aliceblue;">
  hello!!!
</p>

<script>
  function hello()
  {
    (document.getElementById("demo").style.cssText =
      "font-size: 40px; background: #f00; text-align: center;")
  }
</script>
Razzak Romy
fuente
-1

Podemos agregar la función de estilos al prototipo de nodo:

Node.prototype.styles=function(obj){ for (var k in obj)    this.style[k] = obj[k];}

Luego, simplemente llame al método de estilos en cualquier nodo:

elem.styles({display:'block', zIndex:10, transitionDuration:'1s', left:0});

Conservará cualquier otro estilo existente y sobrescribirá los valores presentes en el parámetro del objeto.

admirhodzic
fuente