jquery each循环得到div的宽度,再赋值给父元素。结果为什么不对?

<script src="jquery.js"></script>
<div id="a1">
    <div class="aa" style="width: 200px;">423423423423423423423</div>
    <div class="aa" style="width: 180px;">42342342342342342</div>
    <div class="aa" style="width: 150px;">123123</div>
</div>
<script>
var w = 0
$("#a1 .aa").each(function(){
    w += $("#a1 .aa").width();//获取宽度。并累加
})
$("#a1").width(w)
</script>
<style>
    .aa{
        display: inline-block;
    }
</style>

本来结果应该是这样的的

clipboard.png

但是把行内样式去掉之后,结果就好大了。

clipboard.png

为什么把行内样式去掉。就这样了呢????

阅读 4.5k
7 个回答

style标签对放到domjs之前
你的代码结构如果没有行内样式,会先把.aa按照块级元素处理,宽度为100%
js处理完成之后才读取style标签对,把.aa处理为行内块级元素,宽度缩短
同步的代码要把位置摆正确

w += $("#a1 .aa").width();//获取宽度。并累加

w += $(this).width();

把style里的样式放在最上边,页面加载是从上往下加载的,div是块级元素,.aa{display:inlne-block;}在最下边并没有起作用

$("#a1 .aa").each(function(){
    w += $("#a1 .aa").width();
    //这里用错了,应该用$(this).width(),不然累加的是第一个的宽度,
    //用w += $(this).width();我这本地测试530px
})
$("#a1 .aa").width();//这样默认取的是第一个.aa的宽度,也就是200,所以最后是600
第二次你删除行内样式后,得到div占据一行的宽度(因为inline-block还没生效),所以得到三倍的整行宽度

你没有理解$(selector)的真正意思
去查查会返回什么就知道问题了

$("#a1 .aa").each(function(){
    w += $("#a1 .aa").width(); // 这一句会返回什么?
})

另一个问题
要明白 样式 到哪里才会被加上,会被提前加载吗?
而 script 的执行是怎样?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题