在Angular JS中动态应用CSS样式属性


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}}普通样式属性并使其插入值?


Answers:


190

ngStyle 指令允许您动态设置HTML元素上的 CSS样式。

表示一个对象的表达式,该对象的键是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; 任何想法如何获得原始的背景颜色?
Mahesh 2014年

<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
我不建议您将角度视图全部保留在视图中
OlivierM 2015年

7
我也不推荐这样做,它仅在chrome等浏览器中有效,但是如果您使用IE 9+,它将无法正常工作
imal hasaranga perera

实际上,这在IE11中仍然不起作用,我从以前的项目中复制了一些代码,当它不起作用时感到困惑,以前的项目使用的是Chrome
csharpsql

18

直接来自ngStyle docs

表示一个对象的表达式,该对象的键是CSS样式名称,而值是这些CSS键的对应值。

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

因此,您可以这样做:

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

希望这可以帮助!


4
是的,我在文档中看到了,但是我看不到如何将其转换为多个规则,现在我看到它不是普通的CSS语法,而是对象语法。
jonhobbs 2014年

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>

0

只需执行以下操作:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.