jQuery宽度得到错误的值

时间:2016-08-11 21:29:31

标签: javascript jquery html css

我遇到了jquery方法.width()的问题。我有4个不同的textarea需要根据包含它们的div的大小调整大小,所以我调用方法.width()来获取div的实际宽度(无论如何是窗口的100%)但是这个方法即使将所有内容包装在$(窗口).ready()。

之后,也总是得到错误的值

这是CSS

#contCode{
    width: 100%;
    height: 500px;
    margin-top: 50px;
    float: left;
    padding: 0;
}
.codeArea{
    float: left;
    font-family: "Lucida Console", Monaco, monospace;
    height:100%;
    padding: 5px 0 0 5px;
    margin: 0;
    border-right: 1px solid black;
    border-bottom: 1px solid black;
    resize: none;
}

这是HTML

<div id="contCode">
    <textarea class="codeArea" placeholder="Put your code here"></textarea>
    <textarea class="codeArea" placeholder="Put your code here"></textarea>
    <textarea class="codeArea" placeholder="Put your code here"></textarea>
    <div class="codeArea"></div>
</div>

这是剧本

$(window).ready(function (){
        var wi = $("#contCode").width(); 
        var wiTex;
        wiTex = (wi) / 4;
        $(".codeArea").width(wiTex);
    });

我已经尝试过使用outerWidth和innerWith并得到相同的结果。

4 个答案:

答案 0 :(得分:1)

我发现了两个问题。我知道的第一个

  1. 您需要添加box-sizing: border-box,以便在设置框的width时包含边框宽度。如果您不这样做,设置为100px 1px边框的框实际上会102px宽。

  2. 我发现的第二个问题是使用jQuery的.width()方法。出于某种原因,即使我手动设置为.width('100px'),这些框也被设置为112px。我将其更改为使用vanilla JavaScript。

  3. 您可以从下面的演示中看到这些框现在对齐。

    &#13;
    &#13;
    $(window).ready(function() {
      var wi = $("#contCode").width();
      var wiTex = (wi) / 4;
    
      document.querySelectorAll('.codeArea').forEach(function(node) {
        node.style.width = wiTex+'px'
      })
      
    });
    &#13;
    #contCode {
      width: 100%;
      height: 500px;
      margin-top: 50px;
      float: left;
      padding: 0;
    }
    .codeArea {
      float: left;
      font-family: "Lucida Console", Monaco, monospace;
      height: 100%;
      padding: 5px 0 0 5px;
      margin: 0;
      border-right: 1px solid black;
      border-bottom: 1px solid black;
      resize: none;
      background: #ccc;
      box-sizing: border-box;
    }
    &#13;
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id="contCode">
      <textarea class="codeArea" placeholder="Put your code here"></textarea>
      <textarea class="codeArea" placeholder="Put your code here"></textarea>
      <textarea class="codeArea" placeholder="Put your code here"></textarea>
      <div class="codeArea">The result area</div>
    </div>
    &#13;
    &#13;
    &#13;

答案 1 :(得分:1)

只需使用:

$(document).ready(function (){
    var wi = $("#contCode").width(); 
    var wiTex;
    wiTex = (wi) / 4;
    $(".codeArea").width(wiTex - 7); //here is the trick =)
});

为什么我会生成7个像素?这是因为css如何计算元素的宽度。

在css中,宽度等于width + padding + border。在您的情况下,元素的实际宽度为:wiTex + 5px of left padding + 2 pixels of borders

您甚至可以删除javascript代码并使用此css

.codeArea{
    float: left;
    font-family: "Lucida Console", Monaco, monospace;
    height:100%;
    padding: 5px 0 0 5px;
    margin: 0;
    border-right: 1px solid black;
    border-bottom: 1px solid black;
    resize: none;
    width: calc(25% - 7px); /* magic =) */
}

你可以自己see

答案 2 :(得分:1)

试试这个!

&#13;
&#13;
    #contCode{
        width: 100%;
        height: 500px;
        margin-top: 50px;
        float:left;
        padding: 0;
    }

    .codeArea{
        float: left;
        font-family: "Lucida Console", Monaco, monospace;
        height:100%;
        width:22%; //Added this
        padding:5px 0 0 5px;
        margin: 0;
        border:1px solid #ccc; 
        color:#333; 
        resize: none;
        background-color:#eee;
    }
&#13;
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

    <div id="contCode">
       <textarea class="codeArea" placeholder="Put your code here"></textarea>
       <textarea class="codeArea" placeholder="Put your code here"></textarea>
       <textarea class="codeArea" placeholder="Put your code here"></textarea>
       <div class="codeArea">Hello World</div>
    </div>
&#13;
&#13;
&#13;

干杯!

答案 3 :(得分:0)

第3个textarea之后有一个换行符。是因为CSS3盒子大小的属性?默认情况下,它是content-box,它只包含内容本身但不包含填充。您需要将其更改为border-box;