66 votes

Copier tous les styles d'un élément à un autre

Comment puis-je récupérer tous les styles (même hérités) d'un élément A vers un élément B ? en javascript ou en utilisant jquery.

disons que j'ai un élément <p class="foo">...</p> et j'ajoute un nouvel élément <div /> qui ressemblerait à la même chose, à l'exception du contenu.

1 votes

Si le <div /> est à l'intérieur de <p>, il héritera automatiquement de la CSS

4 votes

(Mais personne ne mettrait un <div> à l'intérieur d'un <p>, n'est-ce pas ? - parce que tout le monde valide son code, donc ils auraient déjà trouvé l'erreur ;-)

0 votes

Vous pouvez utiliser addClass() au nouvel élément.

61voto

sdleihssirhc Points 18791

Si vous ne vous souciez pas de l'IE, vous pouvez le faire :

var p = document.getElementById("your_p_id");
var div = document.createElement("div");
div.innerHTML = "your div content";
div.style.cssText = document.defaultView.getComputedStyle(p, "").cssText;

#your_p_id {
  color: #123124;
  background-color: #decbda;
}

<textArea id="your_p_id">Hello world!</textArea>

Cela fonctionne pour les styles en ligne, intégrés et hérités.

EDIT : Et par "se foutre d'IE", je voulais bien sûr dire "se foutre de tout sauf de Webkit".

UPDATE : Cela fonctionne dans les versions actuelles de Chrome(19), Safari(5), Firefox(12), et IE(9). Il fonctionne également dans les anciennes versions de certains, comme IE8.

1 votes

Vous devrez peut-être aussi ajouter quelque chose comme : someElement.appendChild(div) ;

4 votes

Pourquoi ne pas utiliser window.getComputedStyle plutôt que document.defaultView ce qui signifie la même chose ? L'utilisation de la variable globale de la fenêtre est beaucoup plus courante.

0 votes

Pourriez-vous faire un cas de test ? Cela ne fait rien pour moi (FF 33.1). Peut-être que je m'attends à ce qu'il fasse quelque chose qu'il ne fait pas ?

15voto

Thibaut Points 113

En fait, La réponse de sdleihssirhc ne fonctionnera pas sur firefox comme getComputedStyle(p, "").cssText retournera une chaîne vide, c'est un bogue connu depuis longtemps : https://bugzilla.mozilla.org/show_bug.cgi?id=137687

La solution pour supporter également Firefox est d'itérer sur getComputedStyle et créer manuellement la chaîne CSS :

var clonedNode = document.createElement("div");
const styles = window.getComputedStyle(node);
if (styles.cssText !== '') {
    clonedNode.style.cssText = styles.cssText;
} else {
    const cssText = Object.values(styles).reduce(
        (css, propertyName) =>
            `${css}${propertyName}:${styles.getPropertyValue(
                propertyName
            )};`
    );

    clonedNode.style.cssText = cssText
}

1voto

Jean Louis Points 580

Essayez de copier toutes les propriétés CSS comme ceci :

$("#target").css("border", $("#source").css("border"));
$("#target").css("background", $("#source").css("background"));

#source {
  background-color: #dfeacb !important;
  color: #bbae4e !important;
  border: 1px solid green !important;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textArea id="source">Hello world!</textArea>
<textArea id="target">Hello world!</textArea>

Pourquoi pas ? Vous pouvez créer le dictionnaire qui peut être composé de toutes les propriétés.

2 votes

Il peut être acceptable de faire ça une fois comme ça, mais dans une boucle, ce n'est vraiment pas intelligent. Puisque vous saisissez chaque propriété séparément et la définissez également séparément.

0 votes

Cette opération sera particulièrement lente si l'élément fait déjà partie du document.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X