2010-05-12 6 views
6

Ten jQuery pozwala ograniczyć ruch oporu więc występuje tylko na osi określonej:możliwe ograniczenie rozmiaru jQuery do osi X lub Y, np. Ograniczenie przeciągnięcia?

$("#draggable2").draggable({ axis: 'x' }); 

Patrz: http://jqueryui.com/demos/draggable/#constrain-movement

To nie jest legalne jQuery, ale żeby to było:

$("#Container").resizable({ minHeight: 150, containment: {axis:'y' } }); 

Czy można uniemożliwić użytkownikowi zwiększenie szerokości #Container, jednocześnie pozwalając jej na podniesienie?

Dzięki

Odpowiedz

23

Tak, jest to możliwe przy użyciu zdarzeń interfejsu użytkownika. Wzdłuż osi x:

$("#Container").resizable({ 
    resize: function(event, ui) { 
     ui.size.width = ui.originalSize.width; 
    } 
}); 

lub wzdłuż osi y:

$("#Container").resizable({ 
    resize: function(event, ui) { 
     ui.size.height = ui.originalSize.height; 
    } 
}); 
+0

działa jak urok ... dzięki ... – Sankaranand

+0

To może już nie działać. Próbowałem mocno kodować ui.size.width w zdarzeniu resize i stwierdziłem, że zostało zignorowane. Może niektóre zmiany w jquery przerwały to rozwiązanie. – jcollum

+2

Okazuje się, że to zadziała w jquery ui 1.9, ale nie w wersji 1.10; przesłałem go jako błąd – jcollum

1

Widzę dwa sposoby, aby to zrobić, jeden lepszy od drugiego. Najlepiej najpierw:

1) Ustaw minWidth i maxWidth na tę samą wartość (a mianowicie wartość, jaką ma pozostać szerokość).

$('#theThing').resizable({ minWidth = 200, maxWidth = 200 }); 

2) Utwórz element nadrzędny o stałej szerokości i ustaw go jako izolację. Nie wiem, jak to będzie działać na wysokości, ale domyślnie div bez określonej wysokości rośnie, jeśli ma zawartość, więc może działać.

+0

Dzięki za sugestię, Tomas. Niestety, gdy #TheThing jest zawarty wewnątrz #Container, a #Container nie ma żadnej wyraźnej wysokości: \t $ ("# theThing"). Resizable ({minHeight: 150, containment: '#Container'}), wtedy Totemu nie można zmienić rozmiaru w pionie. #Container po prostu nie wzrośnie poza wysokość, jakiej potrzebuje, aby renderować #theThing w pierwszej kolejności. – Tim

+0

@Tim, czy próbowałeś w inny sposób - ustawiając min i max szerokość na tę samą wartość? To właśnie bym zrobił, zamiast mieć pojemnik. –

23

Obie te odpowiedzi pracować, ale mają niefortunne konsekwencje pokazując < -> kursor na granicy wschodniej , sprawiając, że użytkownik myśli, że może zmienić szerokość. Co moim zdaniem jest lepszy mecz jest wywołanie to na obiekcie jQuery:

.resizable({handles:'s'})

ponieważ to będzie po prostu usunąć możliwość zmiany szerokości i kursor.

+1

Uwielbiam tę odpowiedź. Przyjazny interfejs użytkownika, co jest dość istotne. Jeśli kiedykolwiek zdecydujesz się użyć ducha lub pomocnika, inne metody mogą wprowadzić w błąd i być może frustrować użytkowników. Jest to proste, eleganckie, a nie intensywne procesor.Zauważ, że możesz użyć '{handle: 's, n'}' lub '{handles: 'n'}' jeśli sobie tego życzysz, nie ograniczasz się tylko do zmiany rozmiaru w dolnej krawędzi – adambullmer

+1

[Link to dokumentacja] (http://api.jqueryui.com/resizable/#option-handles) – Johannes

+0

Dzięki za tę odpowiedź kciuki! –

3

Zauważyłem, że po prostu wyczyszczenie w stylu linii wysokości lub szerokości obiektu po zmianie rozmiaru również działa. Dodatkową zaletą jest to, że nie wiąże się z oryginalnymi wymiarami obiektu (ponieważ mogą się one zmieniać w zależności od zawartości).

$("#Container").resizable({ 
    resize: function(event, ui) { 
     $(this).css('height',''); 
    } 
}); 
+0

To jest świetne rozwiązanie. Mam naprawdę dużą opcję zmiany rozmiaru, więc pokazuję tylko uchwyt w rogu "se", w przeciwnym razie zostałby pominięty. Ustawienie maksymalnej i minimalnej wysokości nie wydawało się działać, biorąc pod uwagę zmiany przepływu danych podczas zmiany rozmiaru. –

+0

Jedyne działające rozwiązanie, biorąc pod uwagę, że korzystasz z najnowszej wersji interfejsu jQuery. Dziękuję Ci. –