样式选择器 ng-class/ng-style

ng-class

通过ng-class,我们可以对界面元素的css样式进行控制。下面,让我们通过示例来看看功能如何实现:

此示例来源于官网的ngClass介绍界面,我进行了一些加工。

首先,我们先创建一个style.css文件。

  1. /* 删除线 */
  2. .strike {
  3. text-decoration: line-through;
  4. }
  5. /* 粗体 */
  6. .bold {
  7. font-weight: bold;
  8. }
  9. /* 红色 */
  10. .red {
  11. color: red;
  12. }
  13. /* 错误 */
  14. .has-error {
  15. color: red;
  16. background-color: yellow;
  17. }
  18. /* 橙色 */
  19. .orange {
  20. color: orange;
  21. }

修改FirstCtrl为如下代码:

  1. //app.js
  2. App.controller("FirstCtrl", function ($scope) {
  3. $scope.data = {
  4. deleted:false,
  5. important:false,
  6. error:false
  7. };
  8. });

并在index.html<head>部分将css文件引入,并加入对应的代码。全部代码如下:

  1. <!DOCTYPE html>
  2. <html lang="zh" ng-app="App">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{{"学习AngularJS 1.x"}}</title>
  6. <!-- 此处引入style.css样式文件-->
  7. <link type="text/css" rel="stylesheet" href="css/style.css">
  8. </head>
  9. <body>
  10. <div ng-controller="FirstCtrl">
  11. <!-- 此处放置了ng-class,并设定了每个样式激活时的条件(对应下方3个复选框)-->
  12. <p ng-class="{strike: data.deleted, bold: data.important, 'has-error': data.error}">示例文字</p>
  13. <input type="checkbox" ng-model="data.deleted">
  14. 选中后上方文字将加上删除线(style中加上strike类) <br>
  15. <input type="checkbox" ng-model="data.important">
  16. 选中后上方文字将变化为粗体(style中加上bold类) <br>
  17. <input type="checkbox" ng-model="data.error">
  18. 选中后上方文字将变红,背景变黄(style中加上has-error类)
  19. </div>
  20. <script type="text/javascript" src="components/angular/angular.js"></script>
  21. <script type="text/javascript" src="js/app.js"></script>
  22. </body>
  23. </html>

运行效果:

未选中时效果

图4-11 ngClass运行效果

选中第一个的效果

图4-12 ngClass运行效果

选中第二个的效果

图4-13 ngClass运行效果

选中第三个的效果

图4-14 ngClass运行效果

全部选中的效果

图4-15 ngClass运行效果

动态化的样式输入

在上方的示例中,我们是针对提前设定好的样式进行是否生效的判断。除了这种使用方式,ng-class还支持直接传入字符串的方式进行样式调整。

比如如下示例:

  1. App.controller("FirstCtrl", function ($scope) {
  2. $scope.data = {
  3. style: ""
  4. };
  5. });
  1. <div ng-controller="FirstCtrl">
  2. <p ng-class="data.style">直接使用字符串作为样式</p>
  3. <input type="text" ng-model="data.style">
  4. </div>

运行效果

图4-16 ngClass运行效果(使用文本作为样式)

结合两种模式的应用示例

这两种模式也可以结合使用,示例如下:

  1. <p ng-class="[data.style, {orange: warning}]">同时应用两种样式</p>

此示例可举一反三,比如加入多个文本输入(对应多个来源),以及多个设定好的样式开关。

此示例就不进行具体的运行效果展示了,请读者自行测试效果。

CSS动画效果应用

我们先在style.css中加入css的动画效果代码:

  1. .base-class {
  2. transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
  3. }
  4. .base-class.animate {
  5. color: red;
  6. font-size:3em;
  7. }

修改HTML代码如下:

  1. <div ng-controller="FirstCtrl">
  2. <input type="button" value="开始动画" ng-click="data.style='animate'">
  3. <br>
  4. <input type="button" value="恢复原始" ng-click="data.style=''">
  5. <br>
  6. <span class="base-class" ng-class="data.style">示例文本</span>
  7. </div>

运行之后,点击上面的按钮,则文字放大变红。点击第二个按钮,则文本变回原来的样子。

由于动画效果无法通过截图表示,还请读者自行测试。

ng-style

ng-style提供的功能比ng-class要少一些,只支持样式的传入。我们可以使用以下两种模式:

  1. <span ng-style="{'background-color':data.colorInput}">示例文本</span>
  2. //colorInput为$scope中的对象,传入文本即可
  3. <span ng-style="data.styleText">示例文本</span>
  4. //styleText为样式为 '{'color':red}'类型的文本

通过样式传入,我们可以直接向元素传入对应的样式,实现样式动态化的效果。

一个比较主要的用途是向元素传入动态的背景图片,例子如下(以下两个示例来自于StackOverflow):

  1. data-ng-style="{'background-image':'url(img/products/{{product.img}})'}"

也可以传入一个函数(主要用于解决IE11中背景图片不显示的问题):

  1. <div ng-style="getBackgroundStyle(imagepath)"></div>
  2. <script type="text/javascript">
  3. //代码放置在ng-controller中
  4. $scope.getBackgroundStyle = function (imagepath) {
  5. return {
  6. 'background-image': 'url(' + imagepath + ')'
  7. }
  8. }
  9. </script>

下面,我们通过官网的示例来看看如何传入文本:

  1. <input type="button" value="设置字体颜色为红色" ng-click="data.myStyle={color:'red'}">
  2. <input type="button" value="设置背景颜色" ng-click="data.myStyle={'background-color':'blue'}">
  3. <input type="button" value="清除样式" ng-click="data.myStyle={}">
  4. <br>
  5. <span ng-style="data.myStyle">示例文本</span>
  6. <pre>当前样式为{{data.myStyle}}</pre>

运行效果为:

图4-17 ng-style运行效果

在下一节中,我们还将看到约束为只设置背景颜色的示例。