jQuery CSS 操作:css() 和 cssHooks()

🎉摘要:本文详细介绍 jQuery 中的 css() 和 cssHooks() 方法。涵盖获取元素样式、设置单个及多个样式、函数动态赋值等用法。同时讲解 cssHooks() 钩子系统,用于自定义 CSS 属性读写逻辑及处理浏览器兼容性问题,如 transform 前缀自动处理。提供完整代码示例与在线演示,帮助开发者高效操作 CSS 样式。

本文将介绍 jQuery 中的 css() 和 cssHooks() 方法,通过这些方法操作 CSS,可以通过 css() 获取匹配元素的 CSS 属性值和设置对应的 CSS 属性。

css(name|pro|[,val|fn])

在 jQuery 中,css() 方法用于操作元素的样式,支持获取样式、设置单个样式、设置多个样式、和函数动态赋值四种用法。如下:

获取元素样式

用于获取匹配元素计算后的样式值(支持行内样式、内部样式、外部样式),注意,只能获取第一个匹配元素的样式。

语法:

$(selector).css(样式名)

示例:

<style>
    .myClass {
        padding: 10px;
        box-shadow: inset 0 0 5px red;
    }
</style>
<p class="myClass">Hello JQuery</p>

运行如下 jQuery 代码:

var obj = $('.myClass');
log.info('元素字体大小:' + obj.css('font-size'),
    '元素背景颜色:' + obj.css('background-color'));

// 输出如下:
// 元素字体大小:16px 元素背景颜色:rgba(0, 0, 0, 0)

设置单个样式

用于给匹配的所有元素设置单个 CSS 样式,如 color、background 等。注意,数值可省略单位(默认 px),字符串需写全单位。

语法:

$(selector).css(样式名, 样式值)

示例:

<p class="myClass">Hello JQuery</p>

运行如下 jQuery 代码:

$('.myClass').css('color', 'red');
$('.myClass').css('font-size', '22px');

上述代码将所有拥有 myClass 类的元素的字体设置为红色,字体大小设置为 22px。

设置多个样式

css() 方法还支持一次性设置多个 CSS 样式,代码更简洁。注意,样式名称可以采用驼峰写法(fontSize)或短横线写法(font-size)。

语法:

$(selector).css({ 样式键值对 })

示例:

<p class="myClass">Hello JQuery</p>

运行如下 jQuery 代码:

$('.myClass').css({
    'color': 'red',
    'background': '#ccc',
    'font-size': '12px'
});

上述代码将所有拥有 myClass 类的元素的字体设置为红色、背景设置为 #ccc、字体设置为 12px。

函数动态赋值

用于根据元素的索引或原有样式值,动态计算新样式。语法如下:

$(selector).css(样式名, function(index, oldValue){})

回调函数参数说明:

  • index:当前元素在匹配集合中的索引(从 0 开始)

  • oldValue:当前元素的原有样式值

示例:

<p class="myClass">Hello JQuery</p>

运行如下 jQuery 代码:

$('.myClass').css('height', function(index, oldValue){
    return parseInt(oldValue) * 2;
});

上述代码将所有拥有 myClass 类的元素的高度设置为原来高度的两倍。

jQuery.cssHooks()

jQuery.cssHooks() 是 jQuery 提供的 CSS 属性钩子系统,用于自定义浏览器对 CSS 属性的读写逻辑,统一不同浏览器的兼容性差异、扩展原生 CSS 不支持的属性,或封装复杂的样式操作。

简单来说,jQuery.cssHooks() 能让你像使用原生 CSS 属性一样,使用自定义的“伪 CSS 属性”,jQuery 会自动调用你定义的读写逻辑。

语法如下:

// 定义 cssHook
$.cssHooks['自定义属性名'] = {
  // 获取样式时执行
  get: function(elem, computed, extra) {
    // 返回属性值
  },
  // 设置样式时执行
  set: function(elem, value) {
    // 处理样式设置逻辑
  }
};

参数说明:

  • elem:当前操作的 DOM 元素

  • computed:布尔值,是否获取计算后的样式

  • extra:额外参数,如动画相关配置

  • value:设置样式时传入的属性值

示例:

<p class="myClass">Hello JQuery</p>

运行如下 jQuery 代码:

// 为 css 的 transform 属性添加兼容处理,自动添加浏览器前缀
$.cssHooks['someCSSProp'] = {
    // 获取样式
    get: function( elem, computed, extra ) {
        log.debug('触发了 someCSSProp 的 get 方法', elem, computed, extra );
        var prefixes = ['webkitTransform', 'MozTransform', 'msTransform', 'transform'];
        for (var i = 0; i < prefixes.length; i++) {
            if (elem.style[prefixes[i]] !== undefined) {
                return elem.style[prefixes[i]];
            }
        }
    },
    // 设置样式
    set: function( elem, value ) {
        // WebKit 内核浏览器的前缀
        elem.style.webkitTransform = value;
        // Mozilla 基金会(Firefox 开发商)的前缀
        elem.style.MozTransform = value;
        // Microsoft 微软的前缀
        elem.style.msTransform = value;
        // 这是 W3C 官方最终标准
        elem.style.transform = value;
    }
};

// 使用:直接调用,无需关心前缀
$('.myClass').css('transform', 'rotate(45deg)');
log.info($('.myClass').css('transform')); // 获取旋转值

上述代码将对 transform  样式进行兼容处理,这就不需要我们像这样去编写 CSS 处理样式兼容:

.box {
    /* IE9 */
    -ms-transform: rotate(45deg);
    /* Chrome / Safari 旧版 */
    -webkit-transform: rotate(45deg);
    /* 标准:所有现代浏览器 */
    transform: rotate(45deg);
}

当我们执行 $('.myClass').css('transform', 'rotate(45deg)') 时将会自动处理兼容问题。

完整示例

下面示例通过“点击自己动手试一试”可以尝试各种方法的效果:

示例:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JQeury 教程</title>
    <!-- 引入 jQuery 库 -->
    <script type="text/javascript" src="https://www.hxstrive.com/cdn/libs/jquery/3.7.1/jquery.min.js"></script>
    <!-- 引入 loglevel 库,方便在 DOM 中打印日志 -->
    <script src="https://www.hxstrive.com/preview_code/libs/custom_loglevel.js"></script>
    <style>
        button { background: #EEE !important; border: 1px solid #ccc !important; 
            min-width: 40px; padding: 5px; margin: 5px; cursor: pointer; }
        sup {color: red; font-size: 12px; background: transparent !important;}
        /* 效果 */
        .myClass {
            padding: 10px;
            box-shadow: inset 0 0 5px red;
        }
    </style>
</head>
<body>

    <div class="app">
        <h3>CSS</h3>
        <p class="myClass">Hello JQuery</p>
    </div>

    <div>
        <!-- css(name|pro|[,val|fn])1.9* 访问匹配元素的样式属性 -->
        <!-- 获取元素样式 -->
        <button type="button" onclick="
                var obj = $('.myClass');
                // 获取样式属性,例如:font-size, background-color 等
                log.info('元素字体大小:' + obj.css('font-size'),
                    '元素背景颜色:' + obj.css('background-color'));
            ">$('.myClass').css()<sup>1.9*</sup></button>

        <!-- 设置单个样式 -->
        <button type="button" onclick="
                // 设置样式属性,例如:color 等
                $('.myClass').css('color', 'red');
                $('.myClass').css('font-size', '22px');
            ">$('.myClass').css('color', 'red')</button>
        
        <!-- 设置多个样式 -->
        <button type="button" onclick="
                // 同时设置多个样式属性,例如:color, background 等
                $('.myClass').css({
                    'color': 'red',
                    'background': '#ccc',
                    'font-size': '12px'
                });
            ">$('.myClass').css({...})</button>
        
        <!-- 函数动态赋值 -->
        <button type="button" onclick="
                $('.myClass').css('height', function(index, oldValue){
                    return parseInt(oldValue) * 2;
                });
            ">$('.myClass').css(function(){})</button>

        <!-- jQuery.cssHooks() 直接向 jQuery 中添加钩子,用于覆盖设置或获取特定 CSS 属性时的方法,
                目的是为了标准化 CSS 属性名或创建自定义属性 -->
        <button type="button" onclick="
                // 添加自定义的CSS钩子
                // 首先,检查是否支持 cssHooks
                if ( !$.cssHooks ) {
                    log.error('此插件运行需要 jQuery 1.4.3 或更高版本');
                    return;
                }

                // 统一处理带浏览器前缀的 transform 属性
                $.cssHooks['someCSSProp'] = {
                    // 获取样式
                    get: function( elem, computed, extra ) {
                        log.debug('触发了 someCSSProp 的 get 方法', elem, computed, extra );
                        var prefixes = ['webkitTransform', 'MozTransform', 'msTransform', 'transform'];
                        for (var i = 0; i < prefixes.length; i++) {
                            if (elem.style[prefixes[i]] !== undefined) {
                                return elem.style[prefixes[i]];
                            }
                        }
                    },
                    // 设置样式
                    set: function( elem, value ) {
                        // WebKit 内核浏览器的前缀
                        elem.style.webkitTransform = value;
                        // Mozilla 基金会(Firefox 开发商)的前缀
                        elem.style.MozTransform = value;
                        // Microsoft 微软的前缀
                        elem.style.msTransform = value;
                        // 这是 W3C 官方最终标准
                        elem.style.transform = value;
                    }
                };

                // 使用:直接调用,无需关心前缀
                $('.myClass').css('transform', 'rotate(45deg)');
                log.info($('.myClass').css('transform')); // 获取旋转值
            ">jQuery.cssHooks()</button>
    </div>

</body>
</html>

看看效果👉自己动手试一试 »

更多关于 jQuery 的知识请阅读后续教程。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号