2013-04-10 34 views
6

Tôi có một chút jQuery chọn một hình ảnh ngẫu nhiên từ một thư mục và làm mờ nó trong một div trên mỗi lần tải trang. Vấn đề là div menu bên dưới hình ảnh nhảy lên không gian trống của hình ảnh trước khi hình ảnh mờ dần.jQuery: giữ lại kích thước div đáp ứng cho vùng chứa hình ảnh trước khi fadeIn

Cách tốt nhất để giữ hình ảnh div giữ nguyên chiều cao trước khi hình ảnh bị mờ dần là gì? CSS để "điền" div trước khi hình ảnh mờ dần? Hoặc tải một .jpg trống trước khi hình ảnh ngẫu nhiên mờ dần? (Tất cả các hình ảnh ngẫu nhiên có cùng kích thước 1000px chiều rộng x 250px chiều cao).

Tôi cần giữ lại sự phản hồi của thiết kế, vì vậy có thể giải pháp tốt nhất là tải trước một jpg trống và sau đó mờ dần trong hình ảnh ngẫu nhiên.

Tôi chưa bao gồm hình ảnh và chú thích mảng vì đơn giản, nhưng chức năng này kết quả đầu ra hình ảnh với lớp .randomheader:

jQuery:

<script> 
    $(document).ready(function(){ 
    $('.randomheader').randomImage(); 
    }); 
    </script> 

<script> 
(function($){ 

    $.randomImage = { 
     defaults: { 

      path: '/fullpathhere/headerimages/', 

      myImages: ['image1.jpg' , 'image2.jpg' , 'image3.jpg'], 

      myCaptions: ['Caption 1' , 'Caption 2' , 'Caption 3']  
     }   
    } 

    $.fn.extend({ 
     randomImage:function(config) { 
      var config = $.extend({}, $.randomImage.defaults, config); 

      return this.each(function() { 
       var imageNames = config.myImages; 
       var imageCaptions = config.myCaptions; 
       var imageNamesSize = imageNames.length; 
       var randomNumber = Math.floor(Math.random()*imageNamesSize); 
       var displayImage = imageNames[randomNumber]; 
       var displayCaption = imageCaptions[randomNumber]; 
       var fullPath = config.path + displayImage; 

       // Load the random image 
       $(this).attr({ src: fullPath, alt: displayImage }).fadeIn('slow'); 

       // Load the caption 
       $('#caption').html(displayCaption).fadeIn('slow'); 
      }); 
     } 
    }); 
    </script> 

HTML:

<header id="masthead" class="site-header" role="banner"> 

    <!-- random image loads in the div below --> 
    <img src="" class="randomheader" width="1000" height="250" alt="header image"> 
    <div id="caption"></div> 

    <!-- The nav div below jumps up into the div above --> 
    <nav id="site-navigation" class="main-navigation" role="navigation"> 
     // nav here 
    </nav> 

CSS:

.randomheader { 
    margin-top: 24px; 
    margin-top: 1.714285714rem; 
} 

img.randomheader { 
    max-width: 100%; 
    height: auto; 
    display: none; 
} 
+0

Đặt vùng chứa xung quanh hình ảnh với chiều cao cố định. Khi hình ảnh biến mất trong chiều cao thay đổi của nó sẽ không gây ra vấn đề dòng chảy. Các kích thước cố định của container nên ngăn chặn các vấn đề dòng chảy. – Lowkase

+0

Cảm ơn, nhưng điều đó đã phá vỡ sự đáp ứng của thiết kế. – markratledge

+1

Phản hồi ở đây là gì? Thẻ hình ảnh ở trên có kích thước được chỉ định trong đơn vị px tiềm ẩn (trong HTML). Các yếu tố bố trí đáp ứng thường được chỉ định bằng% hoặc em. Hình ảnh phải thay đổi như thế nào khi trình duyệt được thay đổi kích thước? –

Trả lời

6

@ apaul34208 khá nhiều nhấn đinh trên đầu đó ... Tôi tạo ra một ví dụ cho bạn dựa trên cùng một nguyên tắc để bạn có thể thấy nó hoạt động.

HTML:

<header id="masthead" class="site-header" role="banner"> 
    <div class="randomheader"> 
    <div class="image"><img src="" /></div> 
    <span class="caption"></span> 
    </div> 

    <nav id="site-navigation" class="main-navigation" role="navigation"> 
    nav here 
    </nav> 
</header> 

CSS:

.randomheader .image { 
    position: relative; 
    height: 0; 

    /* 
    This percentage needs to be calculated 
    using the aspect ratio of your image. 
    Type your image width and height in this tool 
    to get the aspect ration of your image: 
    http://andrew.hedges.name/experiments/aspect_ratio/ 

    In this example the Google logo was 55:19 and 
    to get the percentage you divide 19 by 55 = 0.3454 
    */ 
    padding-bottom: 34.54%; 
} 

.randomheader img { 
    position: absolute; 
    top: 0; 
    left: 0; 
    width: 100%; 
    height: 100%; 
} 

.randomheader .caption { 
    display: block; 
    min-height: 1em; 
} 

.randomheader img, 
.randomheader .caption { 
    opacity: 0; 
} 

jQuery:

(function($) { 

    $.fn.extend({ 

    randomImage: function(config) { 
     var defaults = {}, 
      config = $.extend({}, defaults, config); 

     return this.each(function() { 
     var randNum = Math.floor(Math.random()*config.myImages.length), 
      image = config.myImages[randNum], 
      caption = config.myCaptions[randNum], 
      path = config.path + image, 
      $container = $(this), 
      $image = $container.find('img'), 
      $caption = $container.find('.caption'); 

     // preload image before adding 
     // to DOM and fading it in 
     $image.attr({ 
      src: path, 
      alt: image 
     }).load(function() { 
      $caption.html(caption); 
      $image.add($caption).animate({ opacity: 1 }, 'slow'); 
     }); 
     }); 
    } 

    }); 

}(jQuery)); 

// on DOM ready, 
// start 'er up 
jQuery(function($) { 
    $('.randomheader').randomImage({ 
    myImages: ['logo4w.png'], 
    myCaptions: ['Google logo'], 
    path: 'https://www.google.co.uk/images/srpr/' 
    }); 
}); 

JSFiddle Demo

+0

Cảm ơn vì công việc, nhưng vì lý do nào đó, điều này vẫn phá vỡ thiết kế đáp ứng của tôi. Có cách nào để tải trước hình ảnh px 1000x250 trống trong hàm jquery và sau đó mờ dần trong hình ảnh ngẫu nhiên không? Xấu xí, vâng, nhưng đó là một cách để giữ thiết kế đáp ứng. - – markratledge

+0

Không nên .randomheader img chiều cao là 'tự động' ở đó? Và @songdogtech tại sao tải trước hình ảnh trống qua jquery? Bạn có thể không bao gồm nó trong html của bạn như style = "opacity: 0" và chỉ cần thay thế hình ảnh, sau đó phai nó với animate? – hexalys

+0

@songdogtech - Nếu bạn định sử dụng một hình ảnh trống thì điều đó là không cần thiết và tôi sẽ tạo hình ảnh của bạn nhỏ vì nó có thể duy trì tỷ lệ khung hình của hình ảnh bạn sẽ tải (để trợ giúp với hiệu suất). Vì vậy, nếu hình ảnh của bạn là 958px x 718px, đó là tỷ lệ khung hình 4: 3 để hình ảnh trống của bạn có thể là 4px x 3px. Sau đó, bạn chỉ cần thiết lập chiều rộng của nó là 100% và chiều cao để tự động trong CSS. Hi vọng điêu nay co ich. – jjenzz

3

A jsfiddle mà tôi đã trình bày cách thực hiện điều này. Kiểu dáng display:none bạn đưa vào hình ảnh thực sự xóa phần tử khỏi DOM, không chỉ ẩn nó. Vì vậy, thanh nav nhảy lên vì có 'không có gì' ở đó cho đến khi cuộc gọi fadeIn được thực hiện.

Bạn vẫn có thể ẩn hình ảnh, nhưng bạn sẽ cần phải thay thế hình ảnh đó bằng phần tử trống có cùng độ cao hoặc đặt nó vào một vùng chứa như trong jsfiddle.

+0

Cảm ơn, hoạt động, nhưng nó phá vỡ sự đáp ứng của thiết kế. Tôi cần chiều cao: tự động trên vùng chứa để giữ cho vùng chứa đáp ứng khi thay đổi kích thước cửa sổ trình duyệt. Hoặc tôi cần phải trao đổi trong một jpg trống là 250pxx1000px. – markratledge

+0

Bạn có thể cung cấp thêm chi tiết về chính xác nội dung phản hồi không? Hình ảnh có thay đổi kích thước hay gì đó không? Tôi không thấy những gì bạn đang cố gắng làm. – Deif

+0

Yea, hình ảnh thay đổi kích thước theo kích thước trình duyệt, từ việc sử dụng chiều rộng tối đa: 100%; chiều cao: auto; Vì vậy, tôi nghĩ rằng một blank.jpg 1000x250 được tải trước trước khi hình ảnh ngẫu nhiên bị mờ dần sẽ giữ chiều cao và chiều rộng div và nó sẽ không sụp đổ trước khi hình ảnh ngẫu nhiên bị mờ. Tôi không biết liệu đáp ứng có thể giả lập trong jsfiddle, nhưng nó phá vỡ sự đáp ứng của trang web trực tiếp của tôi. – markratledge

3

Tôi gặp vấn đề tương tự với nội dung của mình nhảy xuống khi trình chiếu của tôi được tải.

Đây là những gì tôi found- jsFiddle

html

<div id="Container"> 
<div id="box"></div> 
<div id="element"> <!-- add content here --> </div> 
</div> 

css

#Container { 
display: inline-block; 
position: relative; 
width: 100%; 
} 

#box { 
padding-top: 25%; 
/* adjust % for height */ 
} 

#element { 
position: absolute; 
top: 0; 
bottom: 0; 
left: 0; 
right: 0; 
background:red; /* added for visibility */ 
} 

Nó làm cho một giữ chỗ chất lỏng tuyệt vời. Chỉ cần chơi với tỷ lệ phần trăm để có được kích thước mong muốn.

đầu tiên tôi thấy phương pháp này ở đâu đó trên SO, nhưng tôi nghĩ đó là một sự thích nghi của this- http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio

+0

Cảm ơn công việc, nhưng vì lý do nào đó, điều này vẫn phá vỡ thiết kế đáp ứng của tôi. Có cách nào để tải trước hình ảnh px 1000x250 trống trong hàm jquery và sau đó mờ dần trong hình ảnh ngẫu nhiên không? Xấu xí, vâng, nhưng đó là một cách để giữ thiết kế đáp ứng. – markratledge

+0

@songdogtech Bạn có thể liên kết với một ví dụ không? Bạn không chắc chắn làm thế nào điều này là phá vỡ một thiết kế đáp ứng. – apaul

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