2013-02-26 13 views
6

Szukałem tego problemu, ale nie znalazłem na razie ostatecznego rozwiązania lub przykładu, aby go rozwiązać. Używając jQuery, gdy obracam zmienną wielkość, uchwyty i kolejne operacje zmiany rozmiaru są wygładzane. Jak mogę to rozwiązać lub obejść? Oto przykład tego, co mówię: http://jsfiddle.net/LVU7c/jQuery zmiana rozmiaru obróconych elementów

Kod na skrzypcach jest:

$('#widget').resizable({ handles: 'n, e, s, w' }); 

i CSS, aby obrócić prosty div tag 90 stopni.

Odpowiedz

6

Podstawowa koncepcja została opublikowana przez Linus Gudn Jokela, która usunęła odpowiedź i nie przywróciła jej pomimo mojej prośby.

Można użyć obróconego owinięcia wewnętrznego dla zawartości, a następnie dołączyć uchwyty zmiany rozmiaru do elementu zewnętrznego, który pozostaje niezabezpieczony.

Kod JS będzie potrzebny, aby zachować synchronizację treści z kontenerem pod względem wysokości i szerokości. Powyżej znajduje się pełna demonstracji: http://jsfiddle.net/fXthv/

JS:

$('#widget').resizable({ 
    handles: 'n, e, s, w', 
    resize: function(){ 
     correct(this); 
    } 
}); 

function correct(el) { 
    var widget = $('#widget_content'), 
     deg = widget.data("rotate"); 
    if (typeof deg == "number") { 
     widget.css({ 
      width: (function() { 
       if (deg % 180 == 0) return $(el).outerWidth() 
       else return $(el).outerHeight() 
      })(), 
      height: (function() { 
       if (deg % 180 == 0) return $(el).outerHeight() 
       else return $(el).outerWidth() 
      })(), 
      marginLeft: (function() { 
       if (deg % 360 == 90) return $(el).outerWidth(); 
       else if (deg % 360 == 180) return $(el).outerWidth(); 
       else return 0; 
       //else if (deg % 360 == 270) return $(el).outerWidth(); 
      })(), 
      marginTop: (function() { 
       if (deg % 360 == 270) return $(el).outerHeight(); 
       else if (deg % 360 == 180) return $(el).outerHeight(); 
       else return 0; 
       //else if (deg % 360 == 270) return $(el).outerWidth(); 
      })() 
     }); 
    } 
} 

CSS:

#widget { 
    width: 100px; 
    height: 100px; 
    background-color: #cecece; 
} 
#widget_content { 
    margin-left:100px; 
    width: 100px; 
    height: 100px; 
    background-image: url(http://aux.iconpedia.net/uploads/2106003206.png); 
    background-size: 100% 100%; 
    /* removing the styles below will make the image appear as expected */ 
    -webkit-transform-origin: 0 0; 
    -moz-transform-origin: 0 0; 
    -ms-transform-origin: 0 0; 
    -o-transform-origin: 0 0; 
    transform:rotate(90deg); 
    -ms-transform:rotate(90deg); 
    /* IE 9 */ 
    -moz-transform:rotate(90deg); 
    /* Firefox */ 
    -webkit-transform:rotate(90deg); 
    /* Safari and Chrome */ 
    -o-transform:rotate(90deg); 
    /* Opera */ 
} 

HTML:

<div id="widget"> 
    <div id="widget_content"></div> 
</div> 
+0

T kapelusz to całkiem fajne rozwiązanie. Malutkim błędem jest to, że za każdym razem, gdy zmieniasz rozmiar div, przeskakuje on odrobinę w górę i w lewo, chyba że jest przeciwny krawędzi jego rodzica. Możesz to zobaczyć, jeśli zmniejszysz div na jego górnej/lewej stronie, a następnie zmień rozmiar z dowolnej strony. – ajp15243

+0

@ ajp15243 W jakiej przeglądarce to próbujesz? Nie mogę tego odtworzyć w FF (chociaż może po prostu nie rozumiem, jak odtworzyć problem). –

+0

Powinien być najnowszy stabilny Chrome (v25.0.1364.97). Jestem również w Linuksie i czasami widzę małe dziwne problemy z układem, które, jak podejrzewam, są spowodowane Gnome3, ale zazwyczaj nie widzę tego na jsFiddle. Aby lepiej wyjaśnić jego odtworzenie, chwycić górny uchwyt i pociągnąć w dół, a następnie chwycić lewy uchwyt i przeciągnąć w prawo. Następnie, bez przeciągania za dużo, chwyć i delikatnie przesuń prawy lub dolny uchwyt, obserwując pozycję pudełka (najłatwiej zobaczyć, gdy patrzysz na lewy górny róg). – ajp15243