314 votes

Comment puis-je conditionnellement appliquer des styles CSS en AngularJS?

T1. Supposons que je veux modifier l'apparence de chaque "point" que l'utilisateur d'une marque pour suppression, avant que le bouton "supprimer" est pressé. (Ce retour visuel immédiat devrait éliminer la nécessité pour la proverbiale "êtes-vous sûr?" de la boîte de dialogue.) L'utilisateur cochez les cases pour indiquer les éléments qui doivent être supprimés. Si une case n'est pas cochée, l'élément en question doit revenir à son apparence normale.

Quelle est la meilleure façon d'appliquer ou supprimer le style CSS?

T2. Supposons que je veux permettre à chaque utilisateur de personnaliser la façon dont mon site est présenté. E. g., sélectionnez à partir d'un ensemble fixe de tailles de police, permettent à l'utilisateur-définissables par l'avant-plan et les couleurs de fond, etc.

Quelle est la meilleure façon d'appliquer le style CSS à l'utilisateur sélectionne la/les entrées?

487voto

Mark Rajcok Points 85912

Angulaire fournit un certain nombre de directives pour la manipulation de style CSS conditionnellement/dynamiquement:

  • ng-classe - utiliser lorsque le jeu de styles CSS est statique/connu à l'avance
  • ng-style - utiliser lorsque vous ne pouvez pas définir une classe CSS parce que les valeurs de style peut changer dynamiquement. Pensez programmable de contrôle des valeurs de style.
  • ng-show et ng-hide - utiliser si vous avez seulement besoin de montrer ou de cacher quelque chose (modifie le CSS)
  • ng-si - nouveau dans la version 1.1.5, à utiliser au lieu de la plus prolixe ng-commutateur si vous avez uniquement besoin de vérifier pour un seul état (modifie DOM)
  • ng-commutateur - utiliser au lieu d'utiliser plusieurs mutuellement exclusifs ng-montre (modifie DOM)
  • ng-désactivé et ng-readonly - utiliser pour limiter le formulaire de comportement de l'élément
  • ng-animer - nouveau dans la version 1.1.4, l'utiliser pour ajouter des transitions CSS3/animations

La normale "Angulaire voie" consiste à attacher un modèle/domaine d'application de la propriété d'un élément d'INTERFACE utilisateur qui accepte la saisie de l'utilisateur/de manipulation (c'est à dire, utiliser ng-model), puis d'associer le modèle de la propriété à celle de l'intégré dans les directives mentionnées ci-dessus.

Lorsque l'utilisateur modifie l'INTERFACE utilisateur, Angulaire mettra automatiquement à jour les associés des éléments sur la page.


T1 sonne comme une bonne affaire pour le gn-classe -- le CSS style peut être capturé dans une classe.

ng-classe accepte une "expression" qui doit correspondre à l'une des opérations suivantes:

  1. une chaîne de caractères de l'espace délimité par les noms de classe
  2. un tableau de noms de classe
  3. une carte/un objet de la classe des noms à des valeurs booléennes

En supposant que vos articles sont affichés à l'aide de ng-repeat sur certains modèle de matrice, et que lorsque la case à cocher pour un élément est vérifié que vous souhaitez appliquer l' pending-delete classe:

<div ng-repeat="item in items" ng-class="{'pending-delete': item.checked}">
   ... HTML to display the item ...
   <input type="checkbox" ng-model="item.checked">
</div>

Ci-dessus, nous avons utilisé ng-classe type d'expression #3 - une carte/un objet de la classe des noms à des valeurs booléennes.


T2 sonne comme une bonne affaire pour le gn-style-le style CSS est dynamique, on ne peut donc pas définir une classe pour cette.

ng-style accepte une "expression" qui doit évaluer:

  1. une carte/objet de la CSS noms de style CSS valeurs

Pour un exemple artificiel, supposons que l'utilisateur peut taper un nom de couleur dans un texbox pour la couleur d'arrière-plan (jQuery sélecteur de couleur serait beaucoup plus joli):

<div class="main-body" ng-style="{color: myColor}">
   ...
   <input type="text" ng-model="myColor" placeholder="enter a color name">


Violon

pour les deux ci-dessus.

Le violon contient également un exemple de ng-show et ng-hide. Si une case est cochée, en plus de l'arrière-plan-couleur virant au rose, un texte est affiché. Si "rouge" est entré dans la zone de texte, une div devient cachée.

105voto

Timbergus Points 444

J'ai trouvé des problèmes lors de l'application de classes à l'intérieur de la table des éléments quand j'ai eu un cours déjà appliquée à l'ensemble de la table (par exemple, une couleur à appliquer à l'impair de lignes <myClass tbody tr:nth-child(even) td>). Il semble que lorsque vous inspectez l'élément avec les Outils de développement, l' element.style n'a pas de style affecté. Donc, au lieu d'utiliser ng-class, j'ai essayé à l'aide d' ng-style, et dans ce cas, le nouvel attribut CSS ne s'affiche à l'intérieur d' element.style. Ce code fonctionne très bien pour moi:

<tr ng-repeat="element in collection">

    [...amazing code...]

    <td ng-style="var === 0 && {'background-color': 'red'} ||
                  var === 1 && {'background-color': 'green'} ||
                  var === 2 && {'background-color': 'yellow'}">{{ var }}</td>

    [...more amazing code...]

</tr>

Var est-ce que je suis de l'évaluation, et dans chaque cas, j'ai appliquer un style à chaque <td> selon var valeur, qui remplace l'actuel style appliqué par la classe CSS pour l'ensemble de la table.

Mise à JOUR

Si vous souhaitez appliquer une classe à la table par exemple, lorsque vous visitez une page ou dans d'autres cas, vous pouvez utiliser cette structure:

<li ng-class="{ active: isActive('/route_a') || isActive('/route_b')}">

Fondamentalement, ce que nous avons besoin d'activer un ng-classe est la classe à appliquer et un vrai ou fausse déclaration. Vrai s'applique à la classe et faux qui ne fonctionne pas. Nous avons donc ici deux vérifications de l'itinéraire de la page et un OU entre eux, donc si nous sommes en /route_a OU nous sommes en route_b, l' actif de la classe sera appliqué.

Cela fonctionne juste d'avoir une fonction logique, sur la droite qui renvoie true ou false.

Ainsi, dans le premier exemple, ng-style est conditionnée par trois états. Si elles sont toutes fausses, aucun style n'est appliqué, mais en suivant notre logique, au moins on va être appliqué, donc, la logique de l'expression va vérifier les variables comparaison est vraie et dans la mesure où un tableau vide est toujours vrai, qui va à gauche d'un tableau comme au retour et avec un seul vrai, compte tenu que nous sommes l'aide OU pour toute réponse, le style reste sera appliquée.

En passant, j'ai oublié de vous donner la fonction est actif():

$rootScope.isActive = function(viewLocation) {
    return viewLocation === $location.path();
};

NOUVELLE MISE À JOUR

Ici, vous avez quelque chose que je trouve vraiment utile. Lorsque vous avez besoin d'appliquer une classe en fonction de la valeur d'une variable, par exemple, une icône en fonction du contenu de l' div, vous pouvez utiliser le code suivant (très utile en ng-repeat):

<i class="fa" ng-class="{ 'fa-github'   : type === 0,
                          'fa-linkedin' : type === 1,
                          'fa-skype'    : type === 2,
                          'fa-google'   : type === 3 }"></i>

Icônes de Police Impressionnant

34voto

Ashley Davis Points 3016

Cela fonctionne bien quand ng-classe ne peut pas être utilisée (par exemple, lorsque le style SVG):

ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"

(Je pense que vous devez être sur les dernières instable Angulaire d'utiliser ng-attr-, je suis actuellement sur 1.1.4)

J'ai publié un article sur le travail avec AngularJS+SVG. Il parle de ce problème et de nombreux autres. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS

13voto

Nenad Jesic Points 31
span class="circle circle-{{selectcss(document.Extension)}}">

 and code


$scope.selectcss = function (data) {
    if (data == '.pdf')
        return 'circle circle-pdf';
    else
        return 'circle circle-small';
};

 css



.circle-pdf {
    width: 24px;
    height: 24px;
    font-size: 16px;
    font-weight: 700;
    padding-top: 3px;
    -webkit-border-radius: 12px;
    -moz-border-radius: 12px;
    border-radius: 12px;
    background-image: url(images/pdf_icon32.png);
}

10voto

iamtankist Points 163

Cette solution a fonctionné pour moi

<a ng-style="{true: {paddingLeft: '25px'}, false: {}}[deleteTriggered]">...</a>

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