Динамическое применение атрибута стиля 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}}вставить атрибут простого стиля и заставить его вставить значение?

jonhobbs
источник

Ответы:

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>

StarsSky
источник
Я хочу получить исходный цвет фона текущего элемента, по которому щелкнули мышью, а не цвет фона при наведении курсора. Использование следующего дает мне цвет фона при наведении, а не исходный цвет: $ 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
Я бы не рекомендовал это, angular - это все, чтобы держать детали стиля в поле зрения
OlivierM
7
Я тоже не рекомендую это делать, это будет работать только в некоторых браузерах, таких как Chrome, но если вы посмотрите на 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-style, чтобы включить условные изменения с изменением фонового изображения.

<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, разделенных дефисом, используйте camelcase.

<div ng-style="{backgroundColor: data.backgroundCol}" style="width:20px; height:20px; margin-top:10px; border:solid 1px black;"></div>
омики
источник