Zastosuj atrybut stylu CSS dynamicznie w Angular JS

112

To powinien być prosty problem, ale nie mogę znaleźć rozwiązania.

Mam następujące znaczniki:

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

Chcę, aby kolor tła był powiązany z lunetą, więc wypróbowałem to:

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

To nie zadziałało, więc poszukałem trochę informacji i odkryłem ng-style, ale to nie zadziałało, więc spróbowałem usunąć część dynamiczną i po prostu zakodować styl na stałe, w ng-styleten sposób ...

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

a to nawet nie działa. Czy nie rozumiem, jak to ng-styledziała? Czy istnieje sposób umieszczenia {{data.backgroundCol}}w zwykłym atrybucie stylu i zmuszenia go do wstawienia wartości?

jonhobbs
źródło
Sprawdź
Rohit

Odpowiedzi:

190

Dyrektywa ngStyle pozwaladynamicznieustawićstyl CSS na elemencie HTML.

Wyrażenie, które odwołuje się do obiektu, którego klucze są nazwami i wartościami w stylu CSS, są odpowiednimi wartościami dla tych kluczy CSS. Ponieważ niektóre nazwy stylów CSS nie są prawidłowymi kluczami dla obiektu, należy je cytować.

ng-style="{color: myColor}"

Twój kod będzie:

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

Jeśli chcesz użyć zmiennych zakresu:

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

Tutaj przykład na skrzypcach, które używają ngStyle, a poniżej kodu z działającym fragmentem kodu:

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>

StarsSky
źródło
Chcę uzyskać oryginalny kolor tła aktualnie klikniętego elementu, a nie kolor tła po najechaniu kursorem. Użycie następujących daje mi kolor tła po dymku, a nie kolor oryginalny: $ event.currentTarget.currentStyle.backgroundColor; masz pomysł, jak uzyskać oryginalny kolor tła?
Mahesh
<div ng-style = "{'background-color': data.backgroundCol}"> </div> powinno być <div ng-style = "{background-color: data.backgroundCol}"> </div>
eric2323223
24

Najłatwiejszym sposobem jest wywołanie funkcji dla stylu i zwrócenie przez funkcję odpowiedniego stylu.

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

A w kontrolerze:

$scope.functionThatReturnsStyle = function() {
  var style1 = "width: 300px";
  var style2 = "width: 200px";
  if(condition1)
     return style1;
  if(condition2)
     return style2;
}
Bennett
źródło
4
Nie polecałbym tego, w kanciastej chodzi o zachowanie szczegółów stylu w widoku
OlivierM,
7
Tego też nie polecam, zadziała tylko w kilku przeglądarkach, takich jak chrome, ale jeśli spojrzysz na IE 9+, to nie zadziała
imal hasaranga perera
W rzeczywistości to nadal nie działa w IE11, skopiowałem kod z poprzedniego projektu i byłem zdezorientowany, gdy nie działał, poprzedni projekt korzystał z Chrome
csharpsql
18

Bezpośrednio z ngStyle dokumentów :

Wyrażenie, które odwołuje się do obiektu, którego kluczami są nazwy i wartości w stylu CSS, odpowiadają wartościom tych kluczy CSS.

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

Więc możesz to zrobić:

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

Mam nadzieję że to pomoże!

jakee
źródło
4
Tak, widziałem to w dokumentach, ale nie widziałem, jak przetłumaczyć to na wiele reguł, teraz widzę, że nie jest to normalna składnia css, ale składnia obiektowa.
jonhobbs
14

Ogólnie rzecz biorąc, możesz użyć kombinacji stylu ng-if i ng, aby uwzględnić zmiany warunkowe ze zmianą obrazu tła.

<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>
TS Shriram
źródło
0

Powiedziałbym, że powinieneś umieścić style, które nie zmienią się w zwykły styleatrybut, a style warunkowe / zakresowe w ng-styleatrybut. Ponadto klucze łańcuchowe nie są konieczne. W przypadku kluczy CSS rozdzielanych myślnikami użyj litery camelcase.

<div ng-style="{backgroundColor: data.backgroundCol}" style="width:20px; height:20px; margin-top:10px; border:solid 1px black;"></div>
omikes
źródło
0

Po prostu zrób to:

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

Srk95
źródło