Застосовуйте атрибут стилю CSS динамічно в Angular JS


112

Це має бути простою проблемою, але я не можу знайти рішення.

У мене є така розмітка:

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

Мені потрібен колір фону для прив’язки до області, тому я спробував це:

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

Це не спрацювало, тому я провів деякі дослідження і виявив ng-style, але це не вийшло, тому я спробував взяти динамічну частину і просто жорстко кодувати стиль у ng-style, як це ...

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

і це навіть не працює. Я нерозумію, як це ng-styleпрацює? Чи є спосіб ввести {{data.backgroundCol}}атрибут простого стилю та отримати його для вставки значення?


Оформити цю статтю: ecofic.com/about/blog/…
Рохіт

Відповіді:


190

Директива ngStyle дозволяє вамдинамічновстановлюватистиль CSS на HTML-елемент.

Вираження, яке оцінюється об'єкту, ключі якого є назви стилів CSS та значення, є відповідними значеннями для цих ключів CSS. Оскільки деякі імена стилів CSS не є дійсними ключами для об'єкта, їх потрібно цитувати.

ng-style="{color: myColor}"

Ваш код буде:

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

Якщо ви хочете використовувати змінні області:

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

Ось приклад на скрипці, яка використовує ngStyle, та під кодом із запущеним фрагментом:

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>


Я хочу отримати оригінальний колір поточного клацаючого елемента, а не колір фону, коли наведіть на нього курсор. Використовуючи наведене нижче, надає мені наведіть колір фону, а не початковий колір: $ event.currentTarget.currentStyle.backgroundColor; будь-яка ідея, як отримати оригінальний колір фону?
Махеш

<div ng-style = "{'background-color': data.backgroundCol}"> </div> повинен бути <div ng-style = "{background-color: data.backgroundCol}"> </div>
eric2323223

24

Найпростіший спосіб - викликати функцію для стилю, і функція повертає правильний стиль.

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

І у вашому контролері:

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

4
Я б не рекомендував цього, кутовий - це все, що стосується дотримання деталей стилю в
огляді

7
Я також не рекомендую цього, це буде працювати лише в кількох браузерах, як хром, але якщо ви подивитесь на IE 9+, це не вийде
imal hasaranga perera

Насправді це все ще не працює в IE11, я скопіював якийсь код з попереднього проекту і розгубився, коли він не працював, попередній проект використовував Chrome
csharpsql

18

Безпосередньо з ngStyle документів :

Вираження, яке оцінюється об'єкту, ключі якого є назви стилів CSS та значення, є відповідними значеннями для цих ключів CSS.

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

Отже, ви могли це зробити:

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

Сподіваюся, це допомагає!


4
Так, я це бачив у документах, але не міг зрозуміти, як перекласти це на кілька правил, тепер я бачу, що це не звичайний синтаксис css, а синтаксис об'єкта.
jonhobbs

14

У загальній ноті ви можете використовувати комбінацію стилів ng-if і ng, що включають умовні зміни зі зміною фонового зображення.

<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

Я б сказав, що ви повинні помістити стилі, які не перетворяться на звичайний styleатрибут, а умовні / області стилів у ng-styleатрибут. Також рядкові клавіші не потрібні. Для розділених дефісом клавіш CSS використовуйте верблюд.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.