Comment appliquer les styles css à AngularJS?

Q1. Supposons que je veuille modifier l'apparence de chaque "élément" qu'un utilisateur marque pour la suppression avant que le bouton principal "supprimer" soit appuyé. (Cette rétroaction visuelle immédiate devrait éliminer la nécessité du proverbial "êtes-vous sûr?" dialogue.) L'Utilisateur vérifiera les cases à cocher pour indiquer les éléments à supprimer. Si une case à cocher n'est pas cochée, cet élément devrait revenir à son apparence normale.

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

Q2. Supposons que je veuille permettre à chaque utilisateur de personnaliser la façon dont mon site est présenté. Par exemple, sélectionnez à partir d'un ensemble fixe de tailles de police, permettent des couleurs de premier plan et d'arrière-plan définissables par l'utilisateur, etc.

Quelle est la meilleure façon d'appliquer le style CSS que l'utilisateur sélectionne/introduit?

299
demandé sur Mark Rajcok 2012-12-11 07:39:53

13 réponses

angulaire fournit un certain nombre de directives intégrées pour manipuler le style CSS conditionnellement/dynamiquement:

  • classe ng - utilisation lorsque l'ensemble des styles CSS est statique / connu à l'avance
  • ng-style - utilisation lorsque vous ne pouvez pas définir une classe CSS parce que les valeurs de style peuvent changer dynamiquement. Contrôle programmable de la les valeurs de style.
  • ng-show et ng-hide - utilisation si vous devez seulement montrer ou cacher quelque chose (modifie CSS)
  • ng-if - nouveau dans la version 1.1.5, utiliser à la place du ng-switch plus verbeux si vous n'avez besoin de vérifier qu'une seule condition (modifie DOM)
  • ng-switch - utiliser au lieu d'utiliser plusieurs émissions de gaz à effet de serre mutuellement exclusives (modifie DOM)
  • ng-désactivé et ng-readonly - utiliser pour limiter le formulaire de comportement de l'élément
  • ng-animate - nouveau dans la version 1.1.4, utiliser pour ajouter CSS3 transitions /animations

la "voie angulaire" normale consiste à lier une propriété model/scope à un élément D'UI qui acceptera les entrées/manipulations de l'utilisateur (i.e., utiliser ng-model), puis à associer cette propriété model à l'une des directives intégrées mentionnées ci-dessus.

lorsque l'utilisateur modifie L'UI, Angular met automatiquement à jour les éléments associés sur la page.


Q1 semble être un bon cas pour la classe ng -- le style CSS peut être capturé dans une classe.

ng-classe accepte une "expression" qui doit correspondre à l'un des suivants:

  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 en utilisant ng-repeat sur un modèle de tableau, et que lorsque la case à cocher pour un élément est cochée vous voulez appliquer la classe pending-delete :

<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.


Q2 semble être un bon cas pour le style ng -- le style CSS est dynamique, donc nous ne pouvons pas définir une classe pour cela.

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 puisse taper un nom de couleur dans une boîte de texte pour la couleur de fond (un picker de couleur jQuery serait beaucoup plus agréable):

<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 aussi un exemple de ng-show et ng-hide . Si une case à cocher est cochée, en plus de la couleur de fond qui devient rose, du texte est affiché. Si "rouge" est entré dans la zone de texte, une div devient cachée.

472
répondu Mark Rajcok 2013-05-25 13:33:14

j'ai trouvé des problèmes lors de l'application des classes à l'intérieur de table Eléments quand j'avais une classe déjà appliquée à l'ensemble de la table (par exemple, une couleur appliquée aux lignes impaires <myClass tbody tr:nth-child(even) td> ). Il semble que lorsque vous inspectez l'élément avec Developer Tools , le element.style n'a pas de style assigné. Donc, au lieu d'utiliser ng-class , j'ai essayé d'utiliser ng-style , et dans ce cas, le nouvel attribut CSS apparaît à l'intérieur element.style . Ce code fonctionne très bien pour moi:

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

    [...amazing code...]

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

    [...more amazing code...]

</tr>

Myvar est ce que je suis en train d'évaluer, et dans chaque cas, j'applique un style à chaque <td> en fonction de la valeur myvar , qui écrive le style actuel appliqué par la classe CSS pour la table entière.

mise à JOUR

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

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

fondamentalement, ce dont nous avons besoin pour activer une classe ng est la classe à appliquer et une déclaration vraie ou fausse. Vrai s'applique à la classe et false 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 dans route_b , la classe active sera appliquée.

cela fonctionne juste avoir une fonction logique sur la droite qui retourne vrai ou faux.

ainsi, dans le premier exemple, style ng est conditionné par trois énoncés. Si tous sont faux, aucun style n'est appliqué, mais suivant notre logique, au moins un va être appliqué, donc, l'expression logique va vérifier quelle variable la comparaison est vraie et parce qu'un tableau non vide est toujours vrai, qui laissera un tableau comme retour et avec un seul vrai, considérant que nous utilisons ou pour l'ensemble de la réponse, le style restant sera appliqué.

d'ailleurs, j'ai oublié de vous donner la fonction isActive ():

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

NOUVELLE MISE À JOUR

Ici vous avez quelque chose que je trouve vraiment utile. Quand vous devez appliquer une classe en fonction de la valeur d'une variable, par exemple, une icône en fonction du contenu du div , vous pouvez utiliser le code suivant (très utile dans 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 Font Awesome

103
répondu Timbergus 2015-10-30 15:55:37

cela fonctionne bien lorsque la classe ng ne peut pas être utilisée (par exemple lors de la conception 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 cette question et de nombreuses autres. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS

34
répondu Ashley Davis 2014-01-19 07:14:53
span class="circle circle-{{selectcss(document.Extension)}}">

et 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);
}
12
répondu Nenad Jesic 2015-01-31 12:03:33

Cette solution a fonctionné pour moi

<a ng-style="{true: {paddingLeft: '25px'}, false: {}}[deleteTriggered]">...</a>
10
répondu iamtankist 2014-08-23 19:25:32

une autre option lorsque vous avez besoin d'un style css simple d'une ou deux propriétés:

:

<tr ng-repeat="element in collection">
    [...amazing code...] 
    <td ng-style="{'background-color': getTrColor(element.myvar)}">
        {{ element.myvar }}
    </td>
    [...more amazing code...]
</tr>

contrôleur:

$scope.getTrColor = function (colorIndex) {
    switch(colorIndex){
        case 0: return 'red';
        case 1: return 'green';
        default: return 'yellow';
    }
};
7
répondu Dudi 2017-03-23 08:23:24

vous pouvez utiliser l'expression ternaire. Il y a deux façons de le faire:

<div ng-style="myVariable > 100 ? {'color': 'red'} : {'color': 'blue'}"></div>

ou...

<div ng-style="{'color': (myVariable > 100) ? 'red' : 'blue' }"></div>
7
répondu michal-michalak 2018-09-27 05:24:11

voir l'exemple suivant

<!DOCTYPE html>
    <html ng-app>
    <head>
    <title>Demo Changing CSS Classes Conditionally with Angular</title>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
    <script src="res/js/controllers.js"></script>

    <style>

    .checkboxList {
        border:1px solid #000;
        background-color:#fff;
        color:#000;
        width:300px;
        height: 100px;
        overflow-y: scroll;
    }

    .uncheckedClass {
       background-color:#eeeeee;
       color:black;
    }
    .checkedClass {
        background-color:#3ab44a;
        color:white;
    }
    </style>

    </head>
    <body ng-controller="TeamListCtrl">
    <b>Teams</b>
    <div id="teamCheckboxList" class="checkboxList">

    <div class="uncheckedClass" ng-repeat="team in teams" ng-class="{'checkedClass': team.isChecked, 'uncheckedClass': !team.isChecked}">

    <label>
    <input type="checkbox" ng-model="team.isChecked" />
    <span>{{team.name}}</span>
    </label>
    </div>
    </div>
    </body>
    </html>
6
répondu Ranga Reddy 2014-11-13 06:58:16

As of AngularJS v1.2.0 rc, ng-class et même ng-attr-class échouent avec les éléments SVG (ils ont fonctionné plus tôt, même avec liaison normale à l'intérieur de l'attribut de classe)

spécifiquement, aucun de ces travaux maintenant:

ng-class="current==this_element?'active':' ' "
ng-attr-class="{{current==this_element?'active':' '}}"
class="class1 class2 .... {{current==this_element?'active':''}}"

comme solution de contournement, je dois utiliser

ng-attr-otherAttr="{{current==this_element?'active':''}}"

et puis le style en utilisant

[otherAttr='active'] {
   ... styles ...
}
2
répondu kumar_harsh 2013-09-15 12:48:33

une façon de plus (dans le futur) d'appliquer le style conditionnellement est de créer conditionnellement le style scoped

<style scoped type="text/css" ng-if="...">

</style>

mais de nos jours seulement FireFox soutient des styles scoped.

1
répondu Pavel Voronin 2014-08-19 13:39:29

il y a une option de plus que j'ai récemment découvert que certaines personnes peuvent trouver utile parce qu'elle permet de changer une règle CSS à l'intérieur d'un élément style - évitant ainsi le besoin d'utilisation répétée d'une directive angulaire telle que ng-style, ng-class, ng-show, ng-hide, ng-animate, et d'autres.

cette option utilise un service avec des variables de service qui sont définies par un contrôleur et surveillées par une directive attribut que j'appelle"custom-style". Cette stratégie pourrait j'ai essayé de donner quelques indications générales avec ce violon .

var app = angular.module('myApp', ['ui.bootstrap']);
app.service('MainService', function(){
    var vm = this;
});
app.controller('MainCtrl', function(MainService){
    var vm = this;
    vm.ms = MainService;
});
app.directive('customStyle', function(MainService){
    return {
        restrict : 'A',
        link : function(scope, element, attr){
            var style = angular.element('<style></style>');
            element.append(style);
            scope.$watch(function(){ return MainService.theme; },
                function(){
                    var css = '';
                    angular.forEach(MainService.theme, function(selector, key){
                        angular.forEach(MainService.theme[key], function(val, k){
                            css += key + ' { '+k+' : '+val+'} ';
                        });                        
                    });
                    style.html(css);
                }, true);
        }
    };
});
1
répondu Gavin Palmer 2015-11-07 14:28:05

Eh bien, je vous suggérerais de vérifier l'état de votre contrôleur avec une fonction retournant vrai ou faux .

<div class="week-wrap" ng-class="{today: getTodayForHighLight(todayDate, day.date)}">{{day.date}}</div>

et dans votre contrôleur, vérifiez la condition

$scope.getTodayForHighLight = function(today, date){
    return (today == date);
}
1
répondu sheelpriy 2018-09-27 05:24:37

une chose à regarder est - si le style CSS a des tirets - vous devez les supprimer. Donc, si vous voulez définir background-color , la bonne façon est:

ng-style="{backgroundColor:myColor}" 
0
répondu Neil Munro 2014-03-05 11:04:57