我想要做的是在視口(或父元素)內部對圖像進行居中和調整大小,而不對其進行拉伸。爲了使一個很長的故事短小,我希望圖像保持其縱橫比並調整大小,以便完全覆蓋視口。將響應視口中的圖像居中而不會丟失其寬高比
這是我的HTML佈局:
<div class="media-area" data-size="b" data-type="2">
<ul class="content-slider">
<li class="cs-item">
<img class="cs-background" src="assets/img/backgrounds/top-slider-1.jpg" alt="slider-element">
</li>
<li class="cs-item">
<img class="cs-background" src="assets/img/backgrounds/top-slider-2.jpg" alt="slider-element">
</li>
<li class="cs-item">
<img class="cs-background" src="assets/img/backgrounds/top-slider-3.jpg" alt="slider-element">
</li>
</ul>
</div>
這是我的CSS:
.media-area {
width: 100%;
height: 100%; /* Standard height */
position: relative;
overflow: hidden;
}
.media-area .content-slider {
position: relative;
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.media-area .content-slider .cs-item {
position: relative;
display: block;
float: left;
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
.media-area .content-slider .cs-item img {
display: block;
}
.media-area .content-slider .cs-background {
-webkit-transition: all .1s ease-in-out;
-moz-transition: all .1s ease-in-out;
-o-transition: all .1s ease-in-out;
transition: all .1s ease-in-out;
}
這是我的JS:
function mediazone() {
var defaults = {
elem: ".media-area",
elemWrap: ".media-area .content-slider",
elemSlide: ".media-area .content-slider .cs-item",
vh: $(window).height(),
vw: $(window).width()
};
$(defaults.elemSlide).find(".cs-background").each(function() {
var bkndImgW = $(this).width(); // Current image width
var bkndImgH = $(this).height(); // Current image height
var mediaViewPortW = $(this).parents(defaults.elem).width(); // Current media viewport width
var mediaViewPortH = $(this).parents(defaults.elem).height(); // Current media viewport height
// Used for viewport aspect ratio
var viewportratio = Math.round((mediaViewPortW/mediaViewPortH) * 100000)/100000;
// Used for image aspect ratio
var imageratio = Math.round((bkndImgW/bkndImgH) * 100000)/100000;
// Negative margins for when the height is larger than the width
var bkndImgPosW = ((bkndImgW - mediaViewPortW)/2)*-1;
// Negative margins for when the width is larger than the height
var bkndImgPosH = ((bkndImgH - mediaViewPortH)/2)*-1;
bkndImgPosW = Math.min(0, Math.max(bkndImgPosW, bkndImgPosW));
bkndImgPosH = Math.min(0, Math.max(bkndImgPosH, bkndImgPosH));
if (viewportratio > imageratio) {
$(this).removeAttr("style");
$(this).css("min-height", "100%");
$(this).css("width", "100%");
$(this).css("margin", bkndImgPosH+"px 0px");
} else if (viewportratio < imageratio){
$(this).removeAttr("style");
$(this).css("height", "100%");
$(this).css("min-width", "100%");
$(this).css("margin", "0px "+bkndImgPosW+"px");
} else if (viewportratio == imageratio) {
$(this).removeAttr("style");
}
});
}
的功能在這裏初始化:
$(document).ready(function() {
mediazone();
});
$(window).resize(function() {
mediazone();
console.log('window resize event');
});
我現在面臨的問題是,當頁面加載時,圖像是視口的一半,但是當我調整瀏覽器窗口大小時,它完全適合。
另一個我現在無法找到解決方法的問題是兩個縱橫比相等的問題(我無法找到一種方法使圖像覆蓋屏幕而不必處理一些空白區域)。當前述場景正在進行時,這會使圖像閃爍。
在DOM中使用IMG標記很重要,否則可能會有一種方法可以使用CSS中的「background-image」屬性。
任何人都可以指出我失蹤/做錯了/我應該刪除?
親切的問候,
亞歷
*後來編輯*
這就是我現在所擁有的:
http://jsfiddle.net/LexEckhart/Z5cjx/
調整大小後,它似乎工作正常,並保持中間的圖像平衡,但當頁面加載時,項目沒有正確定位。
謝謝你的回答,但我必須堅持Img標籤的佈局。使用上面描述的「填充底部」可能會將高度演算排除在等式之外......我將不得不考慮這一點。 – user2708284
@ user2708284請參閱編輯。 – Pointy
嗯,如果圖像不是16:9會發生什麼? :| http://jsfiddle.net/LexEckhart/Z5cjx/ – user2708284