Applica l'attributo di stile CSS dinamicamente in Angular JS


112

Questo dovrebbe essere un problema semplice, ma non riesco a trovare una soluzione.

Ho il seguente markup:

<div style="width:20px; height:20px; margin-top:10px; border:solid 1px black; background-color:#ff0000;"></div>

Ho bisogno che il colore di sfondo sia vincolato all'ambito, quindi ho provato questo:

<div style="{width:20px; height:20px; margin-top:10px; border:solid 1px black; background-color:{{data.backgroundCol}};}"></div>

Non ha funzionato, quindi ho fatto qualche ricerca e ho trovato ng-style, ma non ha funzionato, quindi ho provato a togliere la parte dinamica e semplicemente a codificare lo stile ng-style, in questo modo ...

<div ng-style="{width:20px; height:20px; margin-top:10px; border:solid 1px black; background-color:#ff0000;}"></div>

e questo non funziona nemmeno. Sto fraintendendo come ng-stylefunziona? C'è un modo per inserire {{data.backgroundCol}}un semplice attributo di stile e fargli inserire il valore?


Risposte:


190

La direttiva ngStyle consente di impostare lostile CSS su un elemento HTML in modo dinamico.

Espressione che valuta un oggetto le cui chiavi sono nomi di stile CSS e i valori sono valori corrispondenti per quelle chiavi CSS. Poiché alcuni nomi di stile CSS non sono chiavi valide per un oggetto, devono essere citati.

ng-style="{color: myColor}"

Il tuo codice sarà:

<div ng-style="{'width':'20px', 'height':'20px', 'margin-top':'10px', 'border':'solid 1px black', 'background-color':'#ff0000'}"></div>

Se desideri utilizzare le variabili di ambito:

<div ng-style="{'background-color': data.backgroundCol}"></div>

Ecco un esempio sul violino che usa ngStylee sotto il codice con lo snippet in esecuzione:

angular.module('myApp', [])
.controller('MyCtrl', function($scope) {
  $scope.items = [{
      name: 'Misko',
      title: 'Angular creator'
    }, {
      name: 'Igor',
      title: 'Meetup master'
    }, {
      name: 'Vojta',
      title: 'All-around superhero'
    }

  ];
});
.pending-delete {
  background-color: pink
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="myApp" ng-controller='MyCtrl' ng-style="{color: myColor}">

  <input type="text" ng-model="myColor" placeholder="enter a color name">

  <div ng-repeat="item in items" ng-class="{'pending-delete': item.checked}">
    name: {{item.name}}, {{item.title}}
    <input type="checkbox" ng-model="item.checked" />
    <span ng-show="item.checked"/><span>(will be deleted)</span>
  </div>
  <p>
    <div ng-hide="myColor== 'red'">I will hide if the color is set to 'red'.</div>
</div>


Voglio ottenere il colore di sfondo originale dell'elemento corrente su cui si è fatto clic e non il colore di sfondo quando passo il mouse. L'utilizzo di quanto segue mi dà il colore di sfondo al passaggio del mouse, non il colore originale: $ event.currentTarget.currentStyle.backgroundColor; qualche idea su come ottenere il colore di sfondo originale?
Mahesh

<div ng-style = "{'background-color': data.backgroundCol}"> </div> dovrebbe essere <div ng-style = "{background-color: data.backgroundCol}"> </div>
eric2323223

24

Il modo più semplice è chiamare una funzione per lo stile e fare in modo che la funzione restituisca lo stile corretto.

<div style="{{functionThatReturnsStyle()}}"></div>

E nel tuo controller:

$scope.functionThatReturnsStyle = function() {
  var style1 = "width: 300px";
  var style2 = "width: 200px";
  if(condition1)
     return style1;
  if(condition2)
     return style2;
}

4
Non lo consiglierei, angolare è tutto incentrato sul mantenere i dettagli di stile nella vista
OlivierM

7
Non lo consiglio anche io, funzionerà solo in pochi browser come Chrome, ma se guardi IE 9+ non funzionerà
imal hasaranga perera

In effetti questo ancora non funziona in IE11, ho copiato del codice da un progetto precedente ed ero confuso quando non funzionava, il progetto precedente utilizzava Chrome
csharpsql

18

Direttamente dai ngStyle documenti :

Espressione che valuta un oggetto le cui chiavi sono nomi di stile CSS e i valori sono valori corrispondenti per quelle chiavi CSS.

<div ng-style="{'width': '20px', 'height': '20px', ...}"></div>

Quindi potresti fare questo:

<div ng-style="{'background-color': data.backgroundCol}"></div>

Spero che questo ti aiuti!


4
Sì, l'ho visto nei documenti, ma non sono riuscito a vedere come tradurlo in più regole, ora posso vedere che non è la normale sintassi CSS ma la sintassi degli oggetti.
jonhobbs

14

In una nota generica, puoi usare una combinazione di ng-if e ng-style incorporare modifiche condizionali con cambiamento nell'immagine di sfondo.

<span ng-if="selectedItem==item.id"
      ng-style="{'background-image':'url(../images/'+'{{item.id}}'+'_active.png)',
                'background-size':'52px 57px',
                'padding-top':'70px',
                'background-repeat':'no-repeat',
                'background-position': 'center'}">
 </span>
 <span ng-if="selectedItem!=item.id"
       ng-style="{'background-image':'url(../images/'+'{{item.id}}'+'_deactivated.png)',
                'background-size':'52px 57px',
                'padding-top':'70px',
                'background-repeat':'no-repeat',
                'background-position': 'center'}">
 </span>

0

Direi che dovresti inserire gli stili che non cambieranno in un styleattributo normale e gli stili condizionali / di ambito in un ng-styleattributo. Inoltre, le chiavi stringa non sono necessarie. Per le chiavi CSS delimitate da trattini, utilizza camelcase.

<div ng-style="{backgroundColor: data.backgroundCol}" style="width:20px; height:20px; margin-top:10px; border:solid 1px black;"></div>

0

Fai semplicemente questo:

<div ng-style="{'background-color': '{{myColorVariable}}', height: '2rem'}"></div>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.