解析Angular 2+ 样式绑定方式


Posted in Javascript onJanuary 15, 2018

引言

开发ngx(angular 2+ 以后都直接称为ngx)也有1年半的时间了,刚开始开发的时候使用的还是angular2 RC版,现在已经出angular5了,时光飞逝啊!

ngx从设计之初就是一个component-based的框架,所以大到一个页面,小到一个按钮,都是一个component。

这就涉及到了组件的重用,设计通用组件的时候,必不可少的就是动态的样式绑定。

回头想想, angular还真是给我们提供了好几种属性绑定的方式呢。

接下来我们就来具体看看如果在组件中使用样式绑定。

style binding

[style.propertyName]

我们有一个button,默认的样式是bootstrapprimary,

假如在不同的页面中按钮的大小要不同,这个时候就需要动态绑定button的字体大小,可以使用[style.propertyName]来实现。

template中代码

<button 
  class="btn btn-primary" 
  [style.fontSize]="fontSize">
  Style Binding
</button>

Component类中代码

private fontSize: string = "2em";

结果如图:

解析Angular 2+ 样式绑定方式

假如我们还需要动态设置button的边框半径border-radius

template中代码则变为:

<button 
  class="btn btn-primary" 
  [style.fontSize]="fontSize"
  [style.borderRadius]="borderRadius">
  Style Binding
</button>

Component类中代码则变为:

private fontSize: string = "2em";
private borderRadius: string = "10px";

则结果变成:

解析Angular 2+ 样式绑定方式

使用[style.propertyName]来绑定样式属性固然不粗,可是一旦有新的需求,我们就需要继续加上我们需要绑定的属性, 这个时候组件上绑定的属性就会越来越多,我们有没有办法来创建一个object来存储我们需要绑定的属性呢? 当然有,[ngStyle]就可以帮我们来做这件事情。

[ngStyle]

所以上面的例子,我们就可以直接使用[ngStyle]来动态绑定button的font-sizeborder-radius

template中的代码则变为:

<button 
  class="btn btn-primary" 
  [ngStyle]="btnStyle" >
  Style Binding
</button>

Component类的代码则变为:

private btnStyle: any = {
  borderRadius: "10px",
  fontSize: "2em"
};

结果为:

解析Angular 2+ 样式绑定方式

[style.propertyName] vs. [ngStyle]

[style.propertyName]每次只能绑定一个属性

而 [ngStyle] 则可以同时绑定多个属性

当[style.propertyName] 和 [ngStyle] 绑定同一个属性时,比如都需要动态修改font-size, [style.propertyName]则会覆盖[ngStyle]里面的同一属性.

当然除了style binding, 我们还可以使用class binding来动态修改样式。

class binding

[class.className]

使用这种方式,我们可以根据绑定变量的值来动态添加或者移除css class。
还是使用刚才button的例子。

则代码变为:

//template
<button 
  class="btn btn-primary" 
  [class.btnBorder]="changeBorder" >
  Style Binding
</button>

//CSS
.btnBorder {
 border-color: green;
 border-radius: 10px;
}

//Component Class
private changeBorder: boolean = true;

结果如图:

解析Angular 2+ 样式绑定方式

看着字体有点小啊,我们再动态添加一个改变字体的class:my

这个时候代码就变为了:

//template
<button 
  class="btn btn-primary" 
  [class.btnBorder]="changeBorder" [class.btnFont]="changeFont" >
  Style Binding
</button>

//CSS
.btnBorder {
 border-color: green;
 border-radius: 10px;
}
.btnFont {
 font-size: 2em;
 font-weight: bold;
}

//Component Class
private changeBorder: boolean = true;
private changeFont: boolean = true;

结果如图:

解析Angular 2+ 样式绑定方式

[ngClass]

像[ngStyle]一样,angular也给我们提供了一个指令[ngClass]来动态绑定多个css class。

那么我们可以使用[ngClass]对上面的代码重构一下

//template
<button 
  class="btn btn-primary" 
  [ngClass]= "{'btnFont': changeFont, 'btnBorder': changeBorder}">
  Style Binding
</button>

//CSS
.btnBorder {
 border-color: green;
 border-radius: 10px;
}
.btnFont {
 font-size: 2em;
 font-weight: bold;
}

//Component Class
private changeBorder: boolean = true;
private changeFont: boolean = true;

结果依旧为:

解析Angular 2+ 样式绑定方式

[ngClass]需要绑定一个object,key是css类名, value是绑定的变量。

[class.className] vs. [ngClass]

[class.className]每次只能绑定一个CSS类。

而 [ngClass] 则可以同时绑定多个CSS类。

当[class.className] 和 [ngClass] 需要动态修改同一个样式时,比如都需要动态修改font-size, [class.className]则会覆盖[ngClass]里面的统一样式.

[className]

angular还提供一种绑定方式,就是直接通过修改元素的className来动态改变样式。

但我不推荐这种使用方式,为什么不推荐? 看下面的例子

//template
<button 
  class="btn btn-primary" 
  [className]="changedFont">
  Style Binding
</button>

//CSS
.btnBorder {
 border-color: green;
 border-radius: 10px;
}
.btnFont {
 font-size: 2em;
 font-weight: bold;
}

//Component Class
private changedFont: string = "btnFont";

结果却变成了这样:

解析Angular 2+ 样式绑定方式

我们预先设置好的bootstrap的primary被移除了, 就是因为[className]会添加动态绑定的类名,然后移除之前所有的类名。
所以这种绑定方式是很有危险性的,因为针对一个组件,我们通常都会有很多种类来共同控制样式。

在通用组件中,非常不推荐使用[className]。

总结

最后再来总结下angular中各种样式绑定的特点和区别:

  1. [style.propertyName] 直接绑定一个string类型的样式值,或者string类型的变量。优先级最高,会覆盖已有的样式属性。
  2. [ngStyle]绑定一个样式组合的object,key是css属性名,value是对应的样式值,或者string类型的变量。
  3. [class.className] 直接绑定true/false, 或者boolean类型的变量。
  4. [ngClass]绑定一个css类名组合的object,key是css类名,value是true/false 或者boolean类型的变量。
  5. [className] 直接绑定css类名,或者string类型的变量。 (不推荐使用这种方式)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的函数的两种定义方式和函数变量赋值
May 12 Javascript
javascript的document.referrer浏览器支持、失效情况总结
Jul 18 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
Apr 15 Javascript
JavaScript实现表格快速变色效果代码
Aug 19 Javascript
JS实现的仿QQ空间图片弹出效果代码
Feb 23 Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 Javascript
jQuery用noConflict代替$的实现方法
Apr 12 jQuery
实例讲解javascript实现异步图片上传方法
Dec 05 Javascript
Vue组件化开发思考
Feb 02 Javascript
微信小程序上传图片实例
May 28 Javascript
原生js实现无缝轮播图
Jan 11 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
Jul 19 Javascript
基于jquery的on和click的区别详解
Jan 15 #jQuery
仿淘宝JSsearch搜索下拉深度用法
Jan 15 #Javascript
vue2.0 父组件给子组件传递数据的方法
Jan 15 #Javascript
深入理解requireJS-实现一个简单的模块加载器
Jan 15 #Javascript
vue2.0 如何把子组件的数据传给父组件(推荐)
Jan 15 #Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
Jan 15 #Javascript
js实现一个简单的MVVM框架示例
Jan 15 #Javascript
You might like
用PHPdig打造属于你自己的Google[图文教程]
2007/02/14 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
JS判断数组中是否有重复值得三种实用方法
2013/08/16 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
JQuery替换DOM节点的方法
2015/06/11 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
React Native验证码倒计时工具类分享
2017/10/24 Javascript
vue自定义移动端touch事件之点击、滑动、长按事件
2018/07/10 Javascript
Vue实现简单的跑马灯
2020/05/25 Javascript
JavaScript的垃圾回收机制与内存管理
2020/08/06 Javascript
JS相册图片抖动放大展示效果的示例代码
2021/01/29 Javascript
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
新闻学毕业生自荐信
2013/11/15 职场文书
家长评语大全
2014/01/22 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
2014年政协工作总结
2014/12/09 职场文书
市场总监岗位职责
2015/02/11 职场文书
行政上诉状范文
2015/05/23 职场文书