在js中,对样式的操作我们并不感到陌生,在很多框架中都是用极少的代码,实现更强大的功能,在这做出一些的总结。存在不足还望指出!
1、封装一个添加css的方法(这篇引用了前面的框架结构)
在 js 中 获得样式, 默认只能获得行内样式, 类样式与外部样式无法获得,
可以使用计算样式来获得第一次的结果window.getComputedStyle 获得style对象 建议第一次用
注意: 如果是 低版本的 IE 浏览器, 需要使用 currentStyle
YY.fn.extend({ css: function(cssName,cssValue){ var style = window.getComputedStyle(this[0]); return style[cssName]; } }) I(function(){ var res = I('div').css('backgroundColor'); console.log(res);//获得样式值 console.log(typeof res );//string })
上式是在一个参数情况下,获得可以获得样式值,如果两个参数值了,先考虑设置一个样式值的情况
YY.fn.extend({ css: function (cssName,cssValue){ if(cssValue === undefined){//判断是否有样式值,没有的话就返回 return window.getComputedStyle(this[0])[cssName]; }else{ return this.each(function (){ this.style[cssName]= cssValue;//给每个dom添加属性 }); } } })
下面可以设置多个样式值
YY.fn.extend({ css: function ( cssName, cssValue ) { //判断是否为对象 if ( typeof cssName == 'object' ) { // 给 this 中每一个 dom 对象都添加 样式 return this.each(function () { var k; for ( k in cssName ) { this.style[ k ] = cssName[ k ]; }
//在这也可以用each方法做,不过要注意this指向的对象
YY.each(cssName,function(i,v){
_this.style[i] = cssName[ i ];
})*/ }); } else if ( cssValue === undefined ) { return window.getComputedStyle( this[ 0 ] )[ cssName ]; } else { // 给所有的元素都添加 该样式 return this.each(function () { this.style[ cssName ] = cssValue; }); } } });
2、封装关于class系列方法
判断类样式是否有class方法
YY.fn.extend({ hasClass: function ( cName ) { // cName 可能会是多个类样式 // 判断 this[ 0 ] 是否具有该类样式 var has = false;//事先定义一个has YY.each(this[ 0 ].className.split( ' ' ), function ( i, v ) { // console.log( this ); // 包装对象 // console.log( v ); // 字符串 if ( v === cName ) {//此处不能用this,this指向字符串数组 has = true; return false; } }); return has; } });
此处也可这么做
YY.fn.extend({ hasClass: function (cName){ return ( ' ' + this[ 0 ].className + ' ' ).indexOf( ' ' + YY.trim( cName ) + ' ' ) != -1; } })
添加class的方法
YY.fn.extend({ addClass: function (cName){ return this.each(function){ // 在处理 CSS 类样式的时候, 实际上就是累加数据 //采用临时变量对其赋值,那么会预先在内存中加载计算,解决浏览器性能问题 var className += ' '+ cName; //对类样式的空格做出处理 this.className = YY.trim(className); } } });
移除class的方法
第一种方法
YY.fn.extend({ removeClass: function (cName){ return this.each(function(){ //将 DOM 对象的 className的字符串分割成数组 var arr = this.className.split(' '), l = arr.length, i; for( i = 0;i < l;i++){ if(arr[i] === cName){ break; } } //删除数组的第i项 arr.splice(i,1); //然后把数组每一项放入一个新字符串 this.className = arr.join(' '); }) } });
第二种方法
YY.fn.extend({ removeClass: function (cName){ // 将 this 中每一个 DOM 对象的 className 属性中符合 cName 的删除掉 return this.each(function(){ //获得DOM 对象的 className var className = ' '+this.className+ ' '; //直接将其替代为空 this.className = YY.trim(className.replace(' '+cName+' ',' ')) }) } });
在实现以上方法基础上就很容易实现toggle方法
YY.fn.extend({ toggleClass: function ( cName ) { if ( this.hasClass( cName ) ) { this.removeClass( cName ); } else { this.addClass( cName ); } } });