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?


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>


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;
}

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!


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>

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>

0

Po prostu zrób to:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.