关于js封装框架类库之样式操作

在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 );
                    }
                }
            });
时间: 2024-10-16 14:02:24

关于js封装框架类库之样式操作的相关文章

关于js封装框架类库之DOM操作模块(一)

在前端开发的过程中,javascript极为重要的一个功能就是对DOM对象的操作,而对其封装就是为了更好地进行DOM操作,提高浏览器的支持效率 现在给出一个案例:页面创建三个div,然后给其添加样式 1.第一种方法 //第一种方法 var i, node; for ( i = 0; i < 3; i++ ) { node = document.createElement( 'div' ); node.setAttribute( 'class', 'c' ); //node.className =

关于js封装框架类库之DOM操作模块(二)

上一篇基本实现了框架结构,但是与真正能用上的项目框架比较还是存在很多不足,在这又做了些加强与优化 1 (function ( window, undefined ) { 2 3 4 var arr = [], 5 push = arr.push, 6 slice = arr.slice, 7 concat = arr.concat; 8 9 // 构造函数 10 var YY = function YY ( selector ) { 11 return new YY.fn.init( selec

关于js封装框架类库之属性操作

在对DOM对象操作时,往往都要涉及到其属性的操作,为了提高开发效率,同时兼顾浏览器的性能,在这简单的封装了几个常见的属性.因为是模块化,在这只是引入了部分代码,其他代码在前几篇模块封装中有写.如有不足,万望提出,谢谢! 1.判断是否有属性,以及设置属性的操作 YY.fn.extend({ attr: function (attName,attValue){ //判断传入参数是否有属性值,没有直接返回属性名 if(arguments.length == 1){ return this[0].att

关于js封装框架类库之事件模块

在触发DOM上的某个事件时,会产生一个事件对象event.这个对象中包含着所有与事件有关的信息.包括导致事件的元素,事件的类型以及其他与特定事件相关的信息. 例如: 鼠标操作点击事件时,事件对象中会获得鼠标的按键信息等,会提示按的哪一个键 获得鼠标按键属性button和which 鼠标左中右按键分别对应:在谷歌浏览器中   button:左键 0 右键 2 中键 1  ,which:左键 1 右键 3 中键 2 ie8及以下:左键 1 右键 2 中键 4,which属性不存在 用户在操作键盘时,

关于js封装框架类库之选择器引擎(二)

在上篇介绍了选择器的获取标签.id.类名的方法,现在我们在上篇基础上继续升级 1.问题描述:上篇get('选择器')已经实现,如果get方法里是一个选择器的父元素,父元素是DOM对象,那么如何获取元素 思路:1.首先想到的是标签.id.类名的三个方法  2.假设是body节点,那么方法中的document改成body 3.传入的参数如何判断是否为DOM 注意:在获取id方法中全局也只有一个id,所以其中的doument无须修改 修改如下 // 注释: 对获取DOM对象方法的封装 var getT

关于js封装框架类库的那些事(一)

选择器模块之传统做法 var tag = function (tag){ return document.getElementsByTagName(tag); } var id = function (id){ return document.getElementById(id); } var className = function (className){ return document.getElementsByClassName(className); } 由浅入深之tag方法 这是ht

简单模拟jQuery创建对象的方法,以及封装一个js动画框架

今天无事点开了N年未点开的慕课网,看了一个js动画框架的视频,心血来潮用jQuery的方法封装了一下,虽然不如jQuery,但是还是有点点所获. 什么都不说,直接上代码: /** * 这是框架的唯一对象,使用jQuery框架的创建方法 * @class MyAnimation * @constructor */ function MyAnimation(Selector){ //返回MyAnimation原型链中init()方法创建的对象 return new MyAnimation.proto

js css样式操作代码(批量操作)

js css样式操作代码(批量操作) 作者: 字体:[增加 减小] 类型:转载 时间:2009-10-09 用js控制css样式,能让网页达到良好的的用户体验甚至是动画的效果.并且考虑到效率. 我们用js书写css样式通常会用下面的两种方式: 一般情况下我们用js设置元素对象的样式会使用这样的形式: 复制代码 代码如下: var element= document.getElementById(”id”); element.style.width=”20px”; element.style.he

JS封装cookie操作函数实例(设置、读取、删除)

本文实例讲述了JS封装cookie操作函数.分享给大家供大家参考,具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 /*设置cookie*/ function setCookie(name, value, iDay) {   var oDate=new Date();   oDate.setDate(oDate.getDate()+iDay);   document.cook