2015-04-23 11 views
5

Rozumiem, że to może być trudne, mam ponad 10 lat pracy z HTML, ale nie mogę znaleźć rozwiązanie, które nie wymaga pracy ze skomplikowanymi obliczeniami za pomocą Javascript.Jak zmienić wysokość obrazu zgodnie z rozmiarem zawartości pod nim, w pojemniku o stałym rozmiarze

Mam pojemnik o stałym rozmiarze podzielony na dwie części, więc pojemnik ma górną połowę i dolną połowę. Górna połowa ma obraz. W dolnej połowie znajduje się tekst. Chcę tylko, aby obraz i tekst zajmowały całą dostępną przestrzeń. Jeśli tekst jest krótki, jest więcej wolnego miejsca dla obrazu. Jeśli tekst jest większy, obraz jest mniejszy, dynamicznie. Dodałem kilka zrzutów ekranu, aby zilustrować to, co chcę. We wszystkich przypadkach zajmują one 100% dostępnej przestrzeni pionowej kontenera o stałym rozmiarze.

Image with one line of text below it

Image with multiple lines of text below it

+0

To byłoby zgodne z zasadą elastycznego projektowania. Daj mi trochę, a ja będę miał dla ciebie odpowiedź. –

+0

Rozproszyłem się, ale wygląda na to, że inni użytkownicy zaproponowali bardzo dobre sugestie. digitaldouble dostarczył eleganckie rozwiązanie tylko css przy użyciu tabel lub flexboxów –

Odpowiedz

3

Oto czysta podejście css

Prawdopodobnie można spróbować użyć display: table-row

https://jsfiddle.net/4h37fv7o/

spróbować zmienić długość tekstu na dole i zobacz zmianę rozmiaru obrazu.

Jest kilka zastrzeżeń, ale działa.

Alternatywnie, można użyć schematu flexbox aczkolwiek używając obraz tła:

https://jsfiddle.net/kdm0amsx/1/

+0

To jest elegancka opcja czystego css. Podoba mi się również użycie flex boxa –

+0

Dzięki! Podobało mi się to podejście najbardziej, ponieważ jest to czyste css. Poprawiłem go, używając szerokości maksymalnej i wyśrodkowania obrazu. – jpatiaga

0

Alternatywnie, prawdopodobnie najprostszym sposobem jest użycie element.getBoundingClientRect Javascript w function(). Wymagałoby to umieszczenia tekstu wewnątrz własnego podziału względnego, a następnie zastosowania tej funkcji do obliczenia wysokości gotowego tekstu (w pikselach). Ponieważ używasz stałych wymiarów dla głównego podziału kontenera, możesz następnie obliczyć i wykorzystać pozostałą przestrzeń dla swojego obrazu. Potrzebny może być jeden lub dwa trudne algoski, np. Opracowywanie współczynników proporcji do właściwości wysokości.

Mam nadzieję, że to pomaga; Nie jestem pewien, jak skomplikowane było podejście, którego próbujesz uniknąć.

 <head> 
<style> 
    body{ 
     background: #111; 
     color:  #d00; 
    } 

    #mainContainerDiv{ 
      top:  20%; 
      height:  49%; 

      left:  30%; 
      width:  40%; 

      background: #c90; 
      color:  #d00; 

      position: absolute;  
    }  



    #image{ 
      top:  10%; 
      height:  30%; 

      left:  30%; 
      width:  40%; 

      background: #0d0; 
      color:  #ddd; 

      position: absolute;  
    }  



    #textAtBottom{ 
      bottom: 2%; 
      /*height:  40%;*/ 

      left:  30%; 
      width:  40%; 

      background: #d00; 
      color:  #eee; 

      padding: 1%; 
      position: absolute;  
    }  

ABC def ghi jkl ABC def ghi jkl ABC def ghi jkl ABC def ghi jkl ABC def ghi jkl ABC def ghi jkl ABC def ghi jkl zniszczenie karty ghi jkl lorem ipsum doradum etsum ichtum latinum

 <!-- <div id="image">  UNCOMMENT THIS WHEN YOU'RE READY 
      </div> --> 

    </div><!-- mainContainerDiv--> 


    <script> 
     var a = document.getElementById('mainContainerDiv'); 
     var ar = a.getBoundingClientRect(); 
     alert('Main container element is ' + ar.top + 'pixels from its containing element i.e. <body>'); 

     // alert(' und hauptBeinhalter Unten ist ' + ar.bottom '); 
     // Bildis niedriger, so Teil ist ' + ar.height-ar.top + 'hoch total'); 


     var e = document.getElementById('textAtBottom'); 
     var x = e.getBoundingClientRect(); 

     alert('Text at Bottom starts ' + x.top + ' vertical pixels down from <body>'); 

     var numm = parseInt(x.top)-parseInt(ar.top); 
     alert('sooooo, you got '+ numm + ' pixels of space above the text to squeeze in your image!!!'); 
    </script> 

3

z małym kodem js/jquery, możesz obliczyć wysokość swojego kontenera i tekstu, a następnie zmienić rozmiar obrazu!

DEMO:https://jsfiddle.net/L42hguqw/2/

pomocą JQUERY:

var resizeUI = function(){ 
     var container = $('.container').eq(0); 
     var textFrame = $('.container .textFrame'); 
     var maxH = container.innerHeight(); 
     var textH = textFrame.outerHeight(); 
     $('.container .imageFrame').height(parseInt(maxH-textH,10)).show(); 
    }; 

CSS

div.container{ 
    background: #BB0000; 
    width: 300px; 
    height: 300px; 
    overflow: hidden; 
} 

div.imageFrame{ 
    max-width: 100%; 
    max-height: 100%; 
    display: none; 
} 
div.imageFrame img{ 
    display: block; 
    height: 100%; 
} 

div.textFrame{ 
    max-width: 100%; 
    max-height: 100%; 
    background: #333; 
    color: #DDD; 
} 

HTML:

<div class="container"> 
    <div class="imageFrame"> 
     <img src="http://www.conservatoryweb.co.uk/wp-content/uploads/2012/04/iStock_000011293178XSmallPaulMaguire.jpg"/> 
    </div> 

    <div class="textFrame">Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div> 
</div> 
1

Możesz użyć JS + CSS calc, aby uzyskać ten efekt. Będziemy chcieli, aby użyć JS, aby uzyskać wysokość tekstu i zastosować CAL na wysokość obrazu, aby zmusić go do skalowania appropiatly

calc("100% - " + paragraphHeightVariable + "px - 2em") 

2em ma stanowić padding znacznika akapitu. Poniższy przykład wykorzystuje jQuery do uzyskania wysokości akapitu, ale możesz użyć biblioteki vanillajs, aby ją uzyskać.

$(".container").each(function (a) { 
 
    var $container = $(this); 
 
    var $image = $container.children("img"); 
 
    var $p = $container.children("p"); 
 
    $image.css("height", "calc(100% - " + $p.height() + "px - 2em)"); 
 
    console.log($image.css("height"), $p.height()); 
 

 
});
.container { 
 
    width:400px; 
 
    height:450px; 
 
    background-color:grey; 
 
} 
 
.container p { 
 
    background-color:purple; 
 
} 
 
.container img { 
 
    max-width:100%; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div class="container"> 
 
    <img src="http://lorempixel.com/g/400/400/" /> 
 
    <p>Hello World!</p> 
 
</div> 
 
<br/> 
 
<div class="container"> 
 
    <img src="http://lorempixel.com/g/400/400/" /> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et mollis leo. Nunc vel finibus tortor. Nam suscipit quam purus, a cursus nulla efficitur non. Integer cursus arcu vel libero blandit efficitur. In at ligula placerat, mattis lacus semper, convallis lorem. 
 
    </p> 
 
</div> 
 
<br/> 
 
<div class="container"> 
 
    <img src="http://lorempixel.com/g/400/400/" /> 
 
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. In et mollis leo. Nunc vel finibus tortor. Nam suscipit quam purus, a cursus nulla efficitur non. Integer cursus arcu vel libero blandit efficitur. In at ligula placerat, mattis lacus semper, convallis lorem.Donec consectetur maximus mauris, egestas sollicitudin nunc imperdiet sit amet. Suspendisse ut consequat magna. In at eros mollis, malesuada arcu sit amet, imperdiet orci. Mauris vitae augue id nisi vulputate ultrices. Morbi a ipsum lacinia arcu consequat sollicitudin ut quis mauris. Quisque est dui, euismod non vestibulum sagittis, varius at elit. Maecenas facilisis tortor eget lorem aliquam, vel consequat lacus egestas. Nam vitae euismod nulla, in condimentum libero. Vivamus eget massa eros.</p> 
 
</div>

Powiązane problemy