Aplicar atributo de estilo CSS dinamicamente em Angular JS

112

Este deve ser um problema simples, mas não consigo encontrar uma solução.

Eu tenho a seguinte marcação:

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

Preciso que a cor de fundo seja associada ao escopo, então tentei o seguinte:

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

Isso não funcionou, então eu fiz algumas pesquisas e descobri ng-style, mas não funcionou, então tentei retirar a parte dinâmica e apenas embutir o estilo no código ng-style, assim ...

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

e isso nem funciona. Estou entendendo mal como ng-stylefunciona? Existe uma maneira de {{data.backgroundCol}}inserir um atributo de estilo simples e fazer com que ele insira o valor?

Jonhobbs
fonte
Confira
Rohit

Respostas:

190

A diretiva ngStyle permite que você defina oestilo CSS em um elemento HTML dinamicamente.

Expressão que evals a um objeto cujas chaves são nomes de estilo CSS e valores são valores correspondentes para essas chaves CSS. Como alguns nomes de estilo CSS não são chaves válidas para um objeto, eles devem ser colocados entre aspas.

ng-style="{color: myColor}"

Seu código será:

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

Se você quiser usar variáveis ​​de escopo:

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

Aqui está um exemplo de violino que uso ngStyle, e abaixo o código com o snippet em execução:

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
fonte
Desejo obter a cor de fundo original do elemento clicado atual e não a cor de fundo quando passo o mouse. Usar o seguinte me dá a cor de fundo do foco, não a cor original: $ event.currentTarget.currentStyle.backgroundColor; alguma ideia de como obter a cor de fundo original?
Mahesh
<div ng-style = "{'background-color': data.backgroundCol}"> </div> deve ser <div ng-style = "{background-color: data.backgroundCol}"> </div>
eric2323223
24

A maneira mais fácil é chamar uma função para o estilo e fazer com que a função retorne o estilo correto.

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

E em seu controlador:

$scope.functionThatReturnsStyle = function() {
  var style1 = "width: 300px";
  var style2 = "width: 200px";
  if(condition1)
     return style1;
  if(condition2)
     return style2;
}
Bennett
fonte
4
Eu não recomendaria isso, angular tem tudo a ver com manter detalhes de estilo na vista
OlivierM
7
Eu não recomendo isso também, ele funcionará apenas em alguns navegadores como o Chrome, mas se você olhar para o IE 9+ não funcionará
imal hasaranga perera
Na verdade, isso ainda não funciona no IE11, copiei algum código de um projeto anterior e fiquei confuso quando não funcionou, o projeto anterior estava usando o Chrome
csharpsql
18

Diretamente dos ngStyle documentos :

Expressão que evals a um objeto cujas chaves são nomes de estilo CSS e valores são valores correspondentes para essas chaves CSS.

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

Então você pode fazer isso:

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

Espero que isto ajude!

Jakee
fonte
4
Sim, eu vi isso nos documentos, mas não consegui ver como traduzir isso para várias regras, agora posso ver que não é uma sintaxe css normal, mas uma sintaxe de objeto.
Jonhobbs
14

Em uma nota genérica, você pode usar uma combinação de ng-if e ng-style incorporar mudanças condicionais com mudança na imagem de fundo.

<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
fonte
0

Eu diria que você deve colocar estilos que não mudam em um styleatributo regular e estilos condicionais / escopo em um ng-styleatributo. Além disso, as chaves de string não são necessárias. Para chaves CSS delimitadas por hífen, use camelcase.

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

Basta fazer isso:

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

Srk95
fonte