2015-04-23 16 views
5

Tôi hiểu điều này có thể khó khăn, tôi có hơn 10 năm làm việc với HTML, nhưng tôi không thể tìm thấy giải pháp không liên quan đến việc làm việc với các phép tính phức tạp với Javascript.Làm cách nào để tăng chiều cao hình ảnh theo kích thước của nội dung bên dưới nó, trong một thùng chứa có kích thước cố định

Tôi có một thùng chứa có kích thước cố định chia làm hai, vì vậy hộp chứa có nửa trên và nửa dưới. Nửa trên có một hình ảnh. Nửa dưới có văn bản. Những gì tôi muốn là hình ảnh và văn bản chiếm tất cả không gian có sẵn. Nếu văn bản ngắn, sẽ có nhiều không gian hơn cho hình ảnh. Nếu văn bản lớn hơn, hình ảnh sẽ nhỏ hơn, tự động. Tôi đã thêm một vài ảnh chụp màn hình để minh họa những gì tôi muốn. Trong mọi trường hợp, chúng chiếm 100% không gian dọc có sẵn của vùng chứa kích thước cố định.

Image with one line of text below it

Image with multiple lines of text below it

+0

Điều này sẽ làm theo các nguyên tắc thiết kế đáp ứng. Hãy cho tôi một chút và tôi sẽ có một câu trả lời làm việc cho bạn –

+0

Tôi bị phân tâm nhưng dường như những người dùng khác đã đưa ra những đề xuất rất tốt. digitaldouble cung cấp một giải pháp duy nhất css thanh lịch bằng cách sử dụng một trong hai bảng hoặc flexbox –

Trả lời

3

Dưới đây là một css cách tiếp cận tinh khiết

Bạn có thể thử sử dụng display: table-row

https://jsfiddle.net/4h37fv7o/

Hãy thử và sửa đổi theo chiều dài của văn bản ở phía dưới và xem thay đổi kích thước hình ảnh.

Có một số cảnh báo nhưng nó hoạt động.

Ngoài ra, bạn có thể sử dụng flexbox mặc dù, sử dụng hình nền:

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

+0

Đây là một lựa chọn tinh khiết css tinh khiết. Tôi cũng thích việc sử dụng hộp flex –

+0

Cảm ơn! Tôi thích cách tiếp cận này nhiều nhất bởi vì nó là css thuần túy. Tôi đã cải thiện nó bằng cách sử dụng chiều rộng tối đa và căn giữa hình ảnh. – jpatiaga

0

Ngoài ra, có lẽ là cách dễ nhất là sử dụng element.getBoundingClientRect JavaScript của() chức năng. Điều đó sẽ đòi hỏi phải đặt văn bản của bạn bên trong bộ phận tương đối của chính nó, sau đó áp dụng hàm đã nói để tính chiều cao của văn bản đã hoàn thành của bạn (tính bằng pixel). Vì bạn đang sử dụng kích thước cố định cho bộ phận vùng chứa chính của mình, bạn có thể tính toán và sử dụng không gian còn lại cho hình ảnh của mình. Một hoặc hai thuật toán nhỏ khó hiểu cần thiết ở đây có thể, như làm việc trên các tỷ lệ khung hình để khớp với thuộc tính chiều cao.

Hy vọng điều này sẽ hữu ích; Tôi không chắc làm thế nào phức tạp các phương pháp tiếp cận bạn đã cố gắng để tránh được.

 <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 writing JKL abc def writing JKL abc def writing JKL abc def writing JKL abc def writing JKL abc def writing JKL abc def writing JKL abc def def writing 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

với ít mã js/jquery bạn có thể tính toán chiều cao của vùng chứa và văn bản, sau đó thay đổi kích thước hình ảnh!

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

sử dụng 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

Bạn có thể sử dụng JS + CSS calc để có được điều này ảnh hưởng. Bạn sẽ muốn sử dụng JS để có được chiều cao của văn bản và áp dụng một cal với chiều cao hình ảnh để làm cho nó mở rộng appropiatly

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

các 2em là để giải thích cho các padding của thẻ đoạn. Ví dụ dưới đây sử dụng jQuery để có được chiều cao đoạn văn nhưng bạn có thể sử dụng thư viện vanillajs để có được nó.

$(".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>

Các vấn đề liên quan