2017-05-03 1 views
0

Ich habe ein Element in einem DIV. Wie unten ...Dynamisch ändern Elemente Offset basierend auf seiner eigenen Größe und aktuellen Offset

<div id="parent"> 
    <div id="child"></div> 
</div> 

Normalerweise das Kind in der Mitte der Eltern zu zentrieren, während das Kind Größe ändert (Zoom), würde ich nur tun ...

$('#child').resizable({ 
     resize:function(){ 
      // this extends the left/top offset while width increases 
      $('#child').css({ 
       left:$('#parent').width()/2 - $('#child').width()/2, 
       top:$('#parent').height()/2 - $('#child').height()/2 
      }) 
     } 
    }); 

Das obige Beispiel Werke vollkommen in Ordnung, aber wenn ich das Kind in der Größe verändere, beginnt es immer an der gleichen Stelle und nicht am Offset des Kindes.

Aber jetzt muss ich den linken und oberen Versatz des Kindes genau wie im obigen Beispiel anpassen, aber dieses Mal basiert nicht auf Berechnungen der Elterngröße, sondern eher der genaue Versatz des Kindes und seine Größe.

+0

Gibt es etwas in meiner Antwort fehlt ich hinzufügen oder anpassen können, für Sie zu akzeptieren, ? – LGSon

+0

Ich habe Ihnen eine Stimme gegeben, aber Ihre Antwort basiert auf CSS, ich brauchte eine JavaScript-Lösung. Ich habe es schließlich bekommen, indem ich die Breite der Elemente erhöht habe und dann den Offset nach links angepasst habe, indem ich den Breitenunterschied zur aktuellen Linken hinzugefügt habe. Dies kann garantiert in jedem Browser funktionieren. – Dennisrec

Antwort

1

Darf ich vorschlagen, dass Sie transform und transform-origin verwenden.

transform Verwenden Sie die Elemente eigenen Eigenschaften, auf die es angewendet wird, nicht die Eltern.

CSS Hover

#parent { 
 
    height: 200px; 
 
    background: lightgray; 
 
} 
 
#child { 
 
    position: relative; 
 
    top: 50%; 
 
    left: 50%; 
 
    width: 100px; 
 
    padding: 30px; 
 
    background: red; 
 
    text-align: center; 
 
    transition: transform 0.5s; 
 
    transform: translate(-50%,-50%); 
 
    transform-origin: center top;  /* which origin to scale from */ 
 
} 
 
#child:hover { 
 
    transform: translate(-50%,-50%) scale(1.5); 
 
}
<div id="parent"> 
 
    <div id="child">Hover me</div> 
 
</div>

jQuery Hover

$(document).ready(function() { 
 
    $("#child").hover(function() { 
 
    $(this).css("transform", "translate(-50%,-50%) scale(1.5)"); 
 
    }, function() { 
 
    $(this).css("transform", "translate(-50%,-50%)"); 
 
    }); 
 
});
#parent { 
 
    height: 200px; 
 
    background: lightgray; 
 
} 
 

 
#child { 
 
    position: relative; 
 
    top: 50%; 
 
    left: 50%; 
 
    width: 100px; 
 
    padding: 30px; 
 
    background: red; 
 
    text-align: center; 
 
    transition: transform 0.5s; 
 
    transform: translate(-50%, -50%); 
 
    transform-origin: center top;   /* which origin to scale from */ 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="parent"> 
 
    <div id="child">Hover me</div> 
 
</div>

+0

Wie würde ich das in JavaScript pragmatisch machen? – Dennisrec

+0

Danke für die Rückkehr zu mir, aber durch pragmatisch meinte ich ohne Verwendung von CSS, aber die aktualisierte Antwort ist so ziemlich die gleiche wie die erste, da Sie die gleichen Stileigenschaften an das Element übergeben. Ich muss einige Berechnungen beachten, nur CSS. Aber danke, dass du es für mich versucht hast. – Dennisrec

+0

@Dennisrec Da ich nicht weiß, welche Berechnungen Sie beabsichtigen zu tun, könnte ich nicht möglich, sie in den Mix hinzuzufügen, obwohl mit der gegebenen Antwort kann ich nicht sehen, wie das für Sie kein Problem sein sollte – LGSon