從Medium網(wǎng)頁大背景講述網(wǎng)頁前端知識
Medium是由Twitter的聯(lián)合創(chuàng)始人:Evan Williams和Biz Stone創(chuàng)辦于2012年8月創(chuàng)辦的一個文章寫作、閱讀平臺。注意,我這里并沒有用很多網(wǎng)站上援引的博客平臺是因為Medium的出現(xiàn)塑造了一種新的社會化自我營銷渠道。在首頁引入的Welcome to Medium里,我們看到它的初衷是為了讓人們更好地寫作,但是作為Twitter的一個延伸,它依舊搭載在一個社交性很強的平臺之上。這也讓在Medium中寫作的人更愿意去分享、營銷、推廣自己的寫作內(nèi)容,甚至成為一些知名Developers, Designers and even Managers的發(fā)布渠道。例如:Facebook的Product Design Director Julie Zhuo就曾經(jīng)通過在Medium上發(fā)表文章來解釋Facebook為何revert掉在視覺層面上非常突出的新版界面。而更讓人覺得特別的是,每當我看到好的文章分享到twitter上時,都會有作者親自來favorite你的tweet,這簡直就是自我運營啊,有木有! 好啦,閑話說完,我們進入主題。
首頁布局
大背景圖或是視頻,已經(jīng)成為累當今服務(wù)性網(wǎng)站設(shè)計的一個趨勢,隨著網(wǎng)速越來越快、屏幕越來越大,一張巨幅首頁圖片無論從視覺沖擊力還是從性能上都已經(jīng)不再是不可能實現(xiàn)的功能。那我們來看一下這個首頁的布局是如何實現(xiàn)的: HTML:
<div class="container surface-container" id="container">
<div class="surface" id="..." style="display: block; visibility: visible;">
::before
<div class="screen-content surface-content">
<div class="image-fill layout-fill promo-fill" style="background-image: url('xxx.jpeg')">
<div class="layout-fill align-middle">
::before
<div class="align-block layout-fill-width">
<div class="layout-single-column">...</div>
<div class="align-center">...</div>
</div>
<footer class="footer ..."></footer>
</div>
</div>
</div>
::after
</div>
</div>
CSS: 為了實現(xiàn)全window的覆蓋,第一個要做的就是設(shè)置html, body
的height
為100%,寬度的話,應(yīng)為是自動全覆蓋,就無需多做設(shè)置。.container
只是作為一個過度,同樣設(shè)置到100%的高度(這里我會暫時忽略除了layout之外的屬性設(shè)置)。 再深一層是便是.surface
,除了再次繼承了滿高度、滿寬度外,還定義了box-sizing: border-box;
,請移位MDN來理解。這里要注意它加了.suface:before, .surface:after
的屬性,是為了自動生成clearfix的效果來阻止float溢出,但其實在這個首頁之中并沒有用到。
html, body, .container {
height: 100%;
}
.surface {...}
.surface:before, .surface:after {
display: table;
content: " ";
}
.surface:after {
clear: both;
}
在往里面的幾個.screen-content, .surface-content
只是繼續(xù)控制高度,和一些默認背景顏色。直到下面這一層才定義了覆蓋整個背景大圖的屬性,而具體的背景圖片是只額姐加到了DOM的這個div
里面(我想原因應(yīng)該是有一些數(shù)據(jù)binding在里面,這樣好做更新):
.image-fill, {
background-position: center;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
}
.image-fill {
background-color: rgba(0, 0, 0, 0.9);
}
.promo-fill {
background-color: #000;
}
大背景圖
在這里,為了實現(xiàn)圖片可以滿背景覆蓋,最主要的一個元素就是background-size: cover;
,這個屬性一共有以下幾個可能的值:
background-size: <length> | <percentage> | auto | cover | contain;
它們分別代表的意思是:
-
background-size: 50% | 120px | auto;
設(shè)置了背景圖片的寬度,高度則自動計算。默認的auto
維持了背景圖原有的大小。 -
background-size: 50% auto;
同時強制定義了寬度和高度。 -
background-size: auto, auto, [...];
定義給多個背景圖片(注意被一個定義會用逗號隔開,與auto auto
并不是一個意思)。 -
background-size: cover;
這樣定義的背景圖片會被修改圖片大?。ㄩL寬比例不變),以確保剛剛好覆蓋整個Element。 -
background-size: contain;
背景圖片會被修改大?。ㄩL寬比例不變),以確保剛剛好被這個Element包裹在里面。
下面幾張圖分別展示了集中不同的情況: 當background-size
設(shè)置為cover
時,即使屏幕被拉窄拉寬,圖片依舊很好地覆蓋著整個屏幕(更多的比對還可以訪問MDN):
contain
時,圖片長寬比并不發(fā)生變化,卻會被包在window里面:
50% 100%
時,圖片長寬比按照設(shè)置的數(shù)值被拉伸:
注意,這里的背景圖片都是按照默認的會重復鋪排在x和y軸上,所以當背景圖不能覆蓋element的時候,便會出現(xiàn)重復的樣式。此外,background-position: center;
也定義了圖片按照所屬element的中心位置來調(diào)整大小。
兼容性
這樣圖片全頁面覆蓋的實現(xiàn)方法就說明完了,contain & cover
屬性的兼容性如下:
- Chrome 3.0+
- Firefox 3.6 (1.9.2)+
- IE 9.0+
- Opera 10.0+
- Safari 4.1+
如果為了實現(xiàn)同樣的效果,卻要面對恐怖的IE7/8,腫么破,請嘗試如下:
.background-cover {
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
src='PATH_TO_BACKGROUND_IMAGE',
sizingMethod='scale');
-ms-filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(
src='PATH_TO_BACKGROUND_IMAGE',
sizingMethod='scale');
}
但是要小心,這個實現(xiàn)方法會使得起內(nèi)部的鏈接點擊失效(請給我大MS 32個贊),而且這個實現(xiàn)的是background-size: 100% 100%
的效果?;蛘呖梢酝ㄟ^jQuery (jquery.backgroundSize.js)來實現(xiàn)。
其他示例
這里面是一些好看的大圖覆蓋的例子,但是并不是所有的頁面都是通過background-size
來實現(xiàn)的:
- http://www.whitmansnyc.com/
- https://chrome.google.com/webstore/detail/momentum/laookkfknpbbblfpciffpaejjkokdgca?hl=en
-
http://quinntonharris.strikingly.com/
- 其實現(xiàn)方式其實是背景圖很大,大小設(shè)置為auto,而覆蓋效果則是通過設(shè)置外面一層的div大小來實現(xiàn)的。
-
http://www.lattrapereve.fr/
- 背景視頻大小是根據(jù)window大小的變化,用javascript來修改的。
本文地址:http://m.pkvc.cn/tutorial/id2044.html