2009-08-21 13 views
38

W jaki sposób mogę przeskalować element div, aby zmieścił się w porcie przeglądarki, ale zachował proporcje elementu div. Jak mogę to zrobić za pomocą CSS i/lub JQuery?Skaluj element div, aby zmieścił się w oknie, ale zachowaj proporcje.

Dzięki!

+0

I, pod warunkiem rozwiązanie dla tego tutaj: http: // stackoverflow.com/questions/643500/html-ie-stretch-image-to-fit-save-aspect-ratio/19390489 # 19390489 – tommybananas

+1

Czy możesz zaakceptować odpowiedź poniżej? Szkoda, że ​​niektóre bardzo dobre odpowiedzi nie zostaną zaakceptowane. – gillytech

+0

Żadna z odpowiedzi na to pytanie nie przynosi pożądanego rezultatu. Zachowanie proporcji jest banalne, ale uzyskanie prawidłowego współczynnika kształtu ORAZ zawsze dopasowanego do lub mniejszego niż widoczny obszar w obu kierunkach jest trudniejsze. – atomless

Odpowiedz

1

Jest to możliwe z JQuery i odrobiną matematyki.

Użyj JQuery, aby uzyskać szerokość i wysokość portów widoków oraz bieżące wymiary elementów div.

$(document).width(); 

Obliczyć bieżący współczynnik proporcji div. np. szerokość/wysokość

Potrzebujesz trochę logiki, aby określić, czy najpierw ustawić szerokość, czy wysokość, a następnie użyj współczynnika początkowego, aby obliczyć drugą stronę.

+0

+1 za podanie prostej trasy matematycznej zamiast trasy wtyczki. – eyelidlessness

1

jQuery ma wtyczkę, która powiększa obiekt, dopóki jedna z jego stron nie osiągnie określonej wartości px. Połączenie tego będzie wysokości rzutni, możesz rozwinąć dowolny element do tego rozmiaru: jQuery MaxSide.

4

Podziękowania dla Geoffa za wskazówki dotyczące struktury matematyki i logiki. Oto moja realizacja jQuery, których używam do wielkości schowek, więc wypełnia okno:

var height = originalHeight; 
var width = originalWidth; 
aspect = width/height; 

if($(window).height() < $(window).width()) { 
    var resizedHeight = $(window).height(); 
    var resizedWidth = resizedHeight * aspect; 
} 

else { // screen width is smaller than height (mobile, etc) 
    var resizedWidth = $(window).width(); 
    var resizedHeight = resizedWidth/aspect;  
} 

To działa dobrze dla mnie w tej chwili w całej laptop i telefon ekranem rozmiarach.

+1

Twoje sprawdzenie 'height talljosh

+0

z małą rafinerią to działa, ale twoje IF nie sprawdza właściwego rozwiązania var vw = $ ("# absoluteSized"). Width(); var vh = $ ("# absoluteSized"). Height(); var divAspect = vw/vh; if (divAspect> aspect) { resizedHeight = vh; resizedWidth = resizedHeight * aspect; } else {// szerokość ekranu jest mniejsza niż wysokość (ruchomy itp.) resizedWidth = vw; resizedHeight = resizedWidth/aspect; } –

41

Do tego nie potrzebujesz javascript. Możesz użyć czystego CSS.

Procent wypełnienia jest interpretowany względem bloku zawierającego width. Połącz go z pozycją: absolute na elemencie child, a możesz umieścić prawie wszystko w pudełku, który zachowuje proporcje.

HTML:

<div class="aspectwrapper"> 
    <div class="content"> 
    </div> 
</div> 

CSS:

.aspectwrapper { 
    display: inline-block; /* shrink to fit */ 
    width: 100%;   /* whatever width you like */ 
    position: relative; /* so .content can use position: absolute */ 
} 
.aspectwrapper::after { 
    padding-top: 56.25%; /* percentage of containing block _width_ */ 
    display: block; 
    content: ''; 
} 
.content { 
    position: absolute; 
    top: 0; bottom: 0; right: 0; left: 0; /* follow the parent's edges */ 
    outline: thin dashed green;   /* just so you can see the box */ 
} 

display: inline-block pozostawia trochę dodatkowego miejsca poniżej dolnej krawędzi okna .aspectwrapper, więc kolejny element pod nim nie będzie działał przeciwko nim równo . Użycie display: block pozbędzie się go.

Dzięki this post za napiwek!


Inne podejście opiera się na fakcie, że przeglądarki respektują proporcje obrazu podczas zmiany rozmiaru tylko jego szerokości lub wysokości. (Dam google wygenerować przezroczysty obraz 16x9 dla celów demonstracyjnych, ale w praktyce byłoby użyć własnego obrazu statycznego).

HTML:

<div class="aspectwrapper"> 
    <img class="aspectspacer" src="http://chart.googleapis.com/chart?cht=p3&chs=160x90" /> 
    <div class="content"> 
    </div> 
</div> 

CSS:

.aspectwrapper { 
    width: 100%; 
    position: relative; 
} 
.aspectspacer { 
    width: 100%; /* let the enlarged image height push .aspectwrapper's bottom edge */ 
} 
.content { 
    position: absolute; 
    top: 0; bottom: 0; right: 0; left: 0; 
    outline: thin dashed green; 
} 
+1

można umieścić przykład JsFiddle z doskonałym polu (wszystkie strony euqal) zmieniając rozmiar za pomocą pierwszej metody? Nie bardzo rozumiałem, jak można to zrobić za pomocą pierwszej metody. – vsync

+4

Oto Ty: http://jsfiddle.net/ks2jH/1/ Pamiętaj, że kluczem do stworzenia idealnego pudełka jest "dopełnienie-szczyt: 100%", co oznacza, że ​​wysokość powinna wynosić 100% rozmiaru Szerokość '.aspectwrapper'. Ponieważ ta szerokość jest ustawiona na 50%, zmieni ona rozmiar wraz z rodzica. Dodałem również "overflow: hidden", aby tekst nie zniekształcał pudełka w małych rozmiarach. –

+0

Jeśli potrzebujesz prostokąta o połowę wyższego niż jest szeroki, użyjesz 'padding-top: 50%'. W powyższym przykładzie utworzyłem prostokąt 16: 9, odpowiedni do szerokiego ekranu wideo, używając "dopełnienia-góry: 56,25%" (9/16 = 56,25%). –

Powiązane problemy