目录

  • 问题描述
  • 调试
  • 总结和补充

问题描述

使用jQuery修改一个div的宽度时,发现$($0).width('10rem')总是修改成不正确的值,然后使用$($0).css('width', '10rem')时却能正确,简单得查阅了下jQuery文档,发现文档里面对$.fn.width的描述是:

val为空时是取得第一个匹配元素当前计算的宽度值(px),val不为空时是设置宽度,可以是字符串或者数字,还可以是一个函数。

刚开始还以为是$.fn.width只支持px,对rem支持不好,后来跟踪了一下源码发现想法错了。

调试

我使用的是jquery-v1.11.1.js。

Chrome控制台下输入$.fn.width定位到10206行:

在这个地方打一个断点,输入$($0).width('10rem')开始跟踪,进入了jQuery.style( elem, type, value, extra ),继续往下,发现经过如下代码时val发生了变化,变成了一个错误的值,10rem变成了34rem

看来就是这个hook引起的,重新来一次,按下F11进入hook看一下,进入了$.cssHooks.width.set

看到了一个很关键的方法augmentWidthOrHeight(扩大宽度或者高度),很显然问题出在这里,没有特别仔细看,大概逻辑是,如果borderBox,那么val减去padding和border的值,如果不是,那么加上:

测试的$0的宽高度如下,因为没有border,所以这里计算出来就是paddingLeft+paddingRight,也就是-24:

再看setPositiveNumber方法,里面强行把10rem中的10跟上面计算出来单位为px的-24相减!难怪会出错:

return 10(单位是rem) - (-24(单位是px)) + 'rem';

说白了就是jQuery这个hook只能处理单位是px的,单位是其它的就有问题了。那么回到最开始,$.fn.width$.fn.css('width')有啥区别呢?

可以发现,$.fn.width最终调用的是jQuery.style( elem, type, value, extra )$.fn.css调用的是jQuery.style( elem, name, value ),唯一的差别是前者多了一个extra。

总结和补充

  • $.fn.width会根据是否是borderBox来计算新的宽度,如果是borderBox,会额外加上padding和border的宽度,计算时只是按照px来,用rem做单位会出错;
  • 另外,$.fn.width返回的是不带单位的number类型,$.fn.css('width')返回的是带单位的字符串;
  • 通过源码还可以发现,$.fn.width可以计算window和document的宽度,而后者不行。

如有不正确或者需要补充的地方,欢迎指正!

jQuery.width()和jQuery.css('width')的区别相关推荐

  1. jQuery 样式操作||操作 css 方法/设置类样式方法

    操作 css 方法 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...

  2. jquery如何去掉css,jQuery教程之jQuery去掉一个CSS属性

    本篇文章探讨了jQuery教程之jQuery去掉一个CSS属性,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 1.什么事JQ? 一个优秀的js库,大型开发必备 2.J ...

  3. jquery折叠菜单、jquery侧边栏菜单、CSS侧边栏菜单

    jquery折叠菜单.jquery侧边栏菜单.CSS侧边栏菜单 一.Jquery折叠菜单效果 二.jquery侧边栏菜单效果 三.CSS侧边栏菜单效果 先上代码 <!DOCTYPE html&g ...

  4. 【08】jQuery:01-jQuery介绍、jQuery基本使用、jQuery选择器、jQuery样式操作、jQuery效果、jQuery入口函数、jQuery对象

    文章目录 day01 - jQuery 1.1. jQuery 介绍 1.1.1 JavaScript 库 1.1.2 jQuery的概念 1.1.3 jQuery的优点 1.2. jQuery 的基 ...

  5. jQuery过滤选择器:first和:first-child的区别,CSS伪类:first-child

    最近项目中遇到需求:只在第一列不能删除,不显示小叉号:点击可添加一列,后面的列右上角显示小叉号,可以点击删除. 我是使用以下方法解决这个小需求 :CSS伪类选择器:first-child设置所有小叉号 ...

  6. 关于JS下offsetLeft,style.left,以及jquery中的offset().left,css(left)的区别。

    最近因为工作需要,仔细研究了一下关于JS下offsetLeft,style.left,以及jquery中的offset().left,css("left")的区别. JS下的off ...

  7. 如何通过jQuery动态设置元素CSS的样式,以及HTML中CSS “内联式”、“嵌套式”、“外联式”使用方法

    html元素使用CSS渲染标签的样式,可以通过内联式.嵌套式.外联式来将CSS样式添加到html中.有时候涉及到动态的参数,或者在事件中需要修改不同元素的CSS样式时,可以通过js获取目标元素,再其修 ...

  8. jquery和JavaScript之间的联系和区别

    文章目录 前言 一.本质区别 二.用法区别 1.获取内容 2.设置css样式 3.属性(增删查) 总结 前言 在学习jQuery的之前,就对JavaScript已经进行了深入的学习.但是,对jQuer ...

  9. 跟着JQuery API学Jquery 之四 css

    在javascript中我们常常要改变dom的css样式 ,同样Jquery也对改变css做了封装不用我们去用 getElementByid().style.--来操作了 1 css 这里只有一个函数 ...

最新文章

  1. 【css】如何使光标移动到某个区域后改变形状
  2. 大数据互联网架构阶段 全文检索技术
  3. js 层 分页显示选择用户名
  4. 实例解析Java class文件格式
  5. 项目中的富文本编辑器该如何选择?
  6. 第八课 魔棒 画笔工具和铅笔工具
  7. 注意,Fastjson 最新高危漏洞来袭!
  8. 数据库:跨数据库,服务器数据迁移
  9. 请简述gouraud光照模型_OpenGL ES for Android(冯氏光照)
  10. 数据--第33课 - 树课后练习
  11. MATLAB 简单神经网络案例
  12. SPSS——线性回归
  13. 微分中值定理——(罗尔定理、拉格朗日定理、导数极限定理、达布定理、柯西定理)
  14. LAMP虚拟主机架设论坛
  15. Windows Server 2008 R2 搭建网站详细教程
  16. 微信公众号开发:获取openId和用户信息(完整版)
  17. Mybatis中,SQLSessionFactoryBuilder使用build方法时做了哪些事?
  18. 麦克风声源定位原理_一种利用麦克风阵列进行声源定位的方法与流程
  19. 简述计算机用二进制的原因,简述计算机采用二进制的原因
  20. C语言:求高次方数的尾数

热门文章

  1. python格式化文本_Python格式化大文本
  2. linux perl telnet安装,linux @ Net :: Telnet和vt-100终端的Perl问题
  3. vue.js 每次循环五个数据_AutoML数据增广
  4. vb error bc30469: 对非共享成员的引用要求对象引用_提问||准备好面向你的对象了吗?...
  5. Win10网页打不开提示DNS_PROBE_POSSIBLE错误解决
  6. 分享一个让 Ping 的输出更简单易读方法
  7. 100连接蓝牙_车机蓝牙连接常见问题说明
  8. matlab入门笔记3
  9. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)
  10. UVA1342 That Nice Euler Circuit(ACM - ICPC 2004 Asia - Shanghai)(计算几何、欧拉定理)