1

I try to get the width of a specific element with JQuery. Sometimes, .width() returns the right value, sometimes one that is too little (this happens random on a few page loads)

So most of the time I get the right value when I load my page, but sometimes something gets messed up.

I thought, that my code firing too early (when css is not loaded or something similar) might cause this, but even after I started to use $(window).bind("load", function(){ ... code goes here ...}), the situation hasn't really changed.

My code:

$(document).ready(function () {

    $(".section-content .feature-details").each(function (index, object) {
        var featureDetails = $(object);
        featureDetails.find(".details-content").width(featureDetails.find(".details-navigation").width());
        console.log(featureDetails.find(".details-navigation").width());
    });

EDIT: (If I do a setTimeout, everything works fine, so this problem has to be related to some form of async loading, which isn't "fast enough" - right?) The exact code I use:

JavaScript:

$(document).ready(function () {

    // setTimeout(function () {
        $(".section-content .feature-details").each(function (index, object) {
            var featureDetails = $(object);
            featureDetails.find(".details-content").width(featureDetails.find(".details-navigation").width());
            console.log(featureDetails.find(".details-navigation").width());
        });

    // }, 100);

});

HTML:

<div class="feature columns columns-justify-fullwidth columns-vertical-align-center">
                    <div class="feature-details">
                        <div class="details-navigation">
                            <ul>
                                <li><a href="#" class="color-grey-light"><div>Web</div></a></li>
                                <li class="active"><a href="#" class="color-grey-light"><div>Desktop</div></a></li>
                                <li><a href="#" class="color-grey-light"><div>Mobile</div></a></li>
                                <li><a href="#" class="color-grey-light"><div>Datenbanken</div></a></li>
                            </ul>
                        </div>
                        <div class="details-content">
                            <p>
                                Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
                                <br/>
                                <br/> Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor.
                                Lorem ipsum dolor sit amet, consetetur sadipscing elitr.
                            </p>
                        </div>
                    </div>
                    <div class="showcase"></div>
                </div>

CSS:

.columns {
    display: flex;
}
.columns-justify-fullwidth {
    justify-content: space-between;
}

.columns-vertical-align-center {
    align-items: center;
}

.feature-details .details-navigation {
    display: inline-block;
}

.feature-details .details-navigation ul {
    display: inline-block;
    height: 50px;
    border-bottom: 2px solid #aaa;
}

.feature-details .details-navigation li {
    height: 100%;
    display: inline-block;
    vertical-align: top;
}

.feature-details .details-navigation li:not(:last-child) {
    margin-right: 18px;
}

.feature-details .details-navigation ul a {
    display: table;
    height: 100%;
    font-size: 16px;
}

.feature-details .details-navigation ul a > div {
    display: table-cell;
    padding-bottom: 12px;
    vertical-align: bottom;
}

/*
.feature-details .details-navigation ul li:hover {
    border-bottom: 2px solid #222;
}
*/

.feature-details .details-navigation ul li:hover a {
    color: #222;
}

.feature-details .details-navigation li.active {
    border-bottom: 2px solid #222;
}

.feature-details .details-content {
    margin-top: 16px;
}

.feature .showcase {
    width: 450px;
    height: 450px;
    background-color: #f7f7f7;
}

1 Answers1

0

Try using jQuery $( document ).ready and see if the results are more consistent. I am not able to get any inconsistent widths.

$(document).ready(function() {
  $(".feature-details").each(function(index, object) {
    var featureDetails = $(object);
    featureDetails.find(".details-content").width(featureDetails.find(".details-navigation").width());
    console.log(featureDetails.find(".details-navigation").width());
  })
})
Akrion
  • 18,117
  • 1
  • 34
  • 54