jQuery.width()和jQuery.css('width')的区别
目录
- 问题描述
- 调试
- 总结和补充
问题描述
使用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')的区别相关推荐
- jQuery 样式操作||操作 css 方法/设置类样式方法
操作 css 方法 <!DOCTYPE html> <html lang="en"><head><meta charset="U ...
- jquery如何去掉css,jQuery教程之jQuery去掉一个CSS属性
本篇文章探讨了jQuery教程之jQuery去掉一个CSS属性,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 1.什么事JQ? 一个优秀的js库,大型开发必备 2.J ...
- jquery折叠菜单、jquery侧边栏菜单、CSS侧边栏菜单
jquery折叠菜单.jquery侧边栏菜单.CSS侧边栏菜单 一.Jquery折叠菜单效果 二.jquery侧边栏菜单效果 三.CSS侧边栏菜单效果 先上代码 <!DOCTYPE html&g ...
- 【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 的基 ...
- jQuery过滤选择器:first和:first-child的区别,CSS伪类:first-child
最近项目中遇到需求:只在第一列不能删除,不显示小叉号:点击可添加一列,后面的列右上角显示小叉号,可以点击删除. 我是使用以下方法解决这个小需求 :CSS伪类选择器:first-child设置所有小叉号 ...
- 关于JS下offsetLeft,style.left,以及jquery中的offset().left,css(left)的区别。
最近因为工作需要,仔细研究了一下关于JS下offsetLeft,style.left,以及jquery中的offset().left,css("left")的区别. JS下的off ...
- 如何通过jQuery动态设置元素CSS的样式,以及HTML中CSS “内联式”、“嵌套式”、“外联式”使用方法
html元素使用CSS渲染标签的样式,可以通过内联式.嵌套式.外联式来将CSS样式添加到html中.有时候涉及到动态的参数,或者在事件中需要修改不同元素的CSS样式时,可以通过js获取目标元素,再其修 ...
- jquery和JavaScript之间的联系和区别
文章目录 前言 一.本质区别 二.用法区别 1.获取内容 2.设置css样式 3.属性(增删查) 总结 前言 在学习jQuery的之前,就对JavaScript已经进行了深入的学习.但是,对jQuer ...
- 跟着JQuery API学Jquery 之四 css
在javascript中我们常常要改变dom的css样式 ,同样Jquery也对改变css做了封装不用我们去用 getElementByid().style.--来操作了 1 css 这里只有一个函数 ...
最新文章
- 【css】如何使光标移动到某个区域后改变形状
- 大数据互联网架构阶段 全文检索技术
- js 层 分页显示选择用户名
- 实例解析Java class文件格式
- 项目中的富文本编辑器该如何选择?
- 第八课 魔棒 画笔工具和铅笔工具
- 注意,Fastjson 最新高危漏洞来袭!
- 数据库:跨数据库,服务器数据迁移
- 请简述gouraud光照模型_OpenGL ES for Android(冯氏光照)
- 数据--第33课 - 树课后练习
- MATLAB 简单神经网络案例
- SPSS——线性回归
- 微分中值定理——(罗尔定理、拉格朗日定理、导数极限定理、达布定理、柯西定理)
- LAMP虚拟主机架设论坛
- Windows Server 2008 R2 搭建网站详细教程
- 微信公众号开发:获取openId和用户信息(完整版)
- Mybatis中,SQLSessionFactoryBuilder使用build方法时做了哪些事?
- 麦克风声源定位原理_一种利用麦克风阵列进行声源定位的方法与流程
- 简述计算机用二进制的原因,简述计算机采用二进制的原因
- C语言:求高次方数的尾数
热门文章
- python格式化文本_Python格式化大文本
- linux perl telnet安装,linux @ Net :: Telnet和vt-100终端的Perl问题
- vue.js 每次循环五个数据_AutoML数据增广
- vb error bc30469: 对非共享成员的引用要求对象引用_提问||准备好面向你的对象了吗?...
- Win10网页打不开提示DNS_PROBE_POSSIBLE错误解决
- 分享一个让 Ping 的输出更简单易读方法
- 100连接蓝牙_车机蓝牙连接常见问题说明
- matlab入门笔记3
- 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)
- UVA1342 That Nice Euler Circuit(ACM - ICPC 2004 Asia - Shanghai)(计算几何、欧拉定理)