2014-01-07 15 views
5

Ich versuche, die used value der Ränder eines Elements zu bestimmen. Mein Verständnis ist, dass dies über .getComputedStyle() zurückgegeben werden sollte. Es scheint jedoch, dass FireFox und Opera nicht die richtigen Werte zurückgeben, wenn margin: auto; verwendet wird. Firefox gibt '0px' und Opera kehrt '0px' oder gelegentlich 'auto':Ermitteln der absoluten Breite der Ränder (Problem mit Rand: auto;)

http://jsfiddle.net/8FXbZ/

Ich weiß, ich könnte den Inhalt Breite des Mutter berechnen und die Gesamtbreite des Kindes, und verwenden Sie diejenigen, die Ränder zu berechnen , aber ich bin auf der Suche in erster Linie auf den Fall, wenn die Eltern ein Flexbox ist:

http://jsfiddle.net/8FXbZ/1/

Auch hier sind die Werte möglicherweise ‚Reverse Engineering‘ werden könnte, aber das wäre relativ kompliziert (BWS Wenn die Flexbox das Wrapping erlaubt hat, fragte ich mich, ob jemand andere Gedanken hatte.

+0

Dies kann helfen: http://stackoverflow.com/questions/12718084/jquery-1-8-2-noncurrent-jquery-ui-outerwidth-and-outerheight-broken –

+0

@Diodeus Ich muss etwas falsch verstehen, weil ich bin mir nicht sicher, wie das hilft? Ich wusste bereits von jQuerys '.outerWidth()', also habe ich einen Blick durch ihre Quelle geworfen, aber es stellt sich heraus, dass es in FF/Opera (zumindest in einer Flexbox) auch falsche Randwerte gibt. – BYossarian

+0

Es gibt andere Möglichkeiten, den Rand zu finden - jquery hat einige mächtige Positionierungsfunktionen, mit denen Sie indirekt rechnen können. Flexbox ist immer noch ein relativ neues CSS-Konzept und der Support ist möglicherweise nicht so gut wie erwartet. Warum brauchen Sie die Ränder genau? – ProfileTwist

Antwort

0

Ich weiß, das ist nicht die Antwort, die Sie suchen. Angesichts des Fehlers, hier ist eine Poly-Fill ich begann, die linken und rechten Ränder zu berechnen. FIDDLE

function getMargin(elem) { 
    var parent = elem.parentNode, 
    prev = elem, 
    next = elem, 
    leftEdge, 
    rightEdge; 

    var pos = elem.getBoundingClientRect(); 
    var parentPos = parent.getBoundingClientRect(); 
    var parentComputed = window.getComputedStyle(parent); 
    while((prev = prev.previousSibling) && !prev.getBoundingClientRect){} 
    while((next = next.nextSibling) && !next.getBoundingClientRect){} 
    if(prev) 
    leftEdge = prev.getBoundingClientRect().right; //+ getMargin(prev).right 
    else { 
    leftEdge = parentPos.left + parseInt(parentComputed.getPropertyValue("padding-left")) + parseInt(parentComputed.getPropertyValue("border-left-width")) 
    } 
    if(next) 
    rightEdge = next.getBoundingClientRect().left; //- getMargin(next).left; 
    else { 
    rightEdge = parentPos.right - parseInt(parentComputed.getPropertyValue("padding-right")) - parseInt(parentComputed.getPropertyValue("border-right-width")) 

    } 

    return { 
    left: pos.left - leftEdge, 
    right: rightEdge - pos.right 
    } 
} 

Es gibt einen Haken, müssen Sie in einen leeren <span></span> Tag Teiler einzufügen zwischen den Elementen Sie versuchen, für die Ränder zu berechnen. Es kann ein beliebiges leeres Tag sein (das 0 Breite und Höhe hat, aber sichtbar ist).

<div id="parent"> 
    <div id="inner"></div> 
    <span></span> 
    <div id="other"></div> 
</div> 

Wenn Sie waren die Teiler span-Tags zu entfernen, und verwenden Rekursion die vorherige und nächste Element Margen berechnen Sie in kreisförmige Endlosschleife laufen würde als Feld der rechts Box würde erfordern, links links Randwert und rechts Box würde die links Box rechts Marge Wert benötigen.

Verwandte Themen