手把手教你用純css3實現(xiàn)輪播圖效果

首先先看demo吧溶握,點擊查看demo

一、隨便說幾句

css3動畫效果的強大不言而喻蒸播,自它出現(xiàn)一直熱度不減睡榆,它與js動畫的優(yōu)劣也一直成為前端界爭論的話題,不可置疑的是css3動畫的出現(xiàn)在一定程度上降低了動畫效果的實現(xiàn)難度袍榆,利于前端的學(xué)習(xí)胀屿,其精簡的代碼量把我們從煩人的js調(diào)試中解放出來,當(dāng)然css的動畫效果有其局限性包雀,我們不能只用css3模擬出全部的就是動畫宿崭,另外就是瀏覽器的兼容性問題。我們這次用css3實現(xiàn)一個輪播圖效果才写,體驗一下css3的強大葡兑。

首先說明我們可次只實現(xiàn)了自動輪播,效果也是最常見的淡入淡出赞草,并未實現(xiàn)點擊輪換效果讹堤,至少在我目前水平來看,自動輪播與點擊輪換兩者純css3只能選其一厨疙,如果可以同時實現(xiàn)兩種效果的方法洲守,請告訴我。

二、布局

<section class="slider-contaner">
    <ul class="slider">
        <li class="slider-item slider-item1"></li>
        <li class="slider-item slider-item2"></li>
        <li class="slider-item slider-item3"></li>
        <li class="slider-item slider-item4"></li>
        <li class="slider-item slider-item5"></li>
    </ul>
</section>

html代碼沒有什么可說的梗醇,樣式的話首先必定slider的大盒子必定是相對定位知允,另外我們采用在li標簽中添加background-image,因為這樣才有可能用純的css實現(xiàn)響應(yīng)式叙谨,另外背景圖為了在響應(yīng)式中看清全貌温鸽,必然使用background-size:100%,另外就是高度問題了唉俗,顯然slider-container必需是和li的高度一致嗤朴,因為響應(yīng)式中必然這個高度不能固定死,所以使用height屬性顯然不行虫溜,padding屬性可以解決這個問題雹姊,一是background-image可以顯示在padding中,二是padding中以%為單位是以父元素寬度為基準的衡楞。

*{
      margin:0;
      padding:0;
}
ul,li{
      list-style: none;
}
.floatfix {
      *zoom: 1;
}
.floatfix:after {
      content: "";
      display: table;
      clear: both;
}
.slider-contaner{
      width:100%;
      position:relative;
}
.slider,.slider-item{
      padding-bottom:40%;
}
.slider-item{
      width:100%;
      position:absolute;
      background-size:100%;
}
.slider-item1{
      background-image:url(imgs/1.jpg);
}
.slider-item2{
      background-image:url(imgs/2.jpg);
}
.slider-item3{
      background-image:url(imgs/3.jpg);
}
.slider-item4{
      background-image:url(imgs/4.jpg);
}
.slider-item5{
      background-image:url(imgs/5.jpg);
}

三吱雏、設(shè)計動畫

淡入淡出效果肯定是使用opacity,首先整體來看所有圖片的淡入淡出都是同一個動畫瘾境,只是時間不一樣而已歧杏,這肯定是利用animation-delay來控制,動畫無限輪換肯定使用animation-iteration-count: infinite迷守,我們這次5張圖片犬绒,整個動畫分為圖片停留和淡入淡出兩個效果,用下圖表示兑凿,箭頭表示淡入淡出過程凯力。

因為css3中沒有一個屬性是規(guī)定兩次動畫播放的時間間隔,所以我們必須把其他圖片淡入淡出時該圖片的效果寫進動畫里礼华,顯然這時候是opacity:0咐鹤;

我們?yōu)榱藢憚赢嫷姆奖悖瑒赢嬍褂镁€性函數(shù)圣絮,也就是animation-timing-function:linear;整個過程使用20s祈惶,一次停留使用3秒,一次淡入淡出使用1s扮匠,折合成百分比也就是15%和5%捧请;

@keyframes fade{
0%{
      opacity:0;
      z-index:2;
}
5%{
      opacity:1;
      z-index: 1;
}
20%{
      opacity:1;
      z-index:1;
}
25%{
      opacity:0;
      z-index:0;
}
100%{
      opacity:0;
      z-index:0;
}
}

接下來就是為每張圖片添加animation-delay了,因為第一張圖片必須顯示在最前棒搜,所以其他通過相鄰兄弟選擇器使用opacity:0血久,第一張圖片開始不需要淡入淡出,直接跳至停留也就是5%帮非,所以animation-delay為-1s,第二章圖片和第一張相隔20%,也就是4s末盔,animation-delay為3s筑舅,以此類推

.slider-item + .slider-item{
      opacity:0;
}
.slider-item1{
      animation-delay: -1s;
}
.slider-item2{
      animation-delay: 3s;
}
.slider-item3{
      animation-delay: 7s;
}
.slider-item4{
      animation-delay: 11s;
}
.slider-item5{
      animation-delay: 15s;
}

這個時候我們的輪播圖可以動了

四、添加輪播焦點

添加輪播焦點當(dāng)然不是為了點擊陨舱,而是告訴訪問者這里有幾張圖片和目前圖片的位置翠拣,至少以我個人而言,輪播焦點很重要游盲,因為如果我不知道輪播的圖片有幾張误墓,我又沒有辦法點擊,我就會非常不安益缎,感覺自己沒有看到整個網(wǎng)頁的全貌谜慌。所以我們還是添加一下輪播焦點。首先非常明確的這個仍然可以使用上面的動畫莺奔,另外布局肯定使用position:absolute欣范,另外很明顯焦點我們必須寫兩次,一次是當(dāng)前圖片的樣式令哟,一次是非當(dāng)前圖片的樣式

<div class="focus-container">
<ul class="floatfix"> 
<li><div class="focus-item focus-item1"></div></li>
<li><div class="focus-item focus-item2"></div></li>
<li><div class="focus-item focus-item3"></div></li>
<li><div class="focus-item focus-item4"></div></li>
<li><div class="focus-item focus-item5"></div></li>
</ul>
</div>
.focus-container{
      position:absolute;
      bottom:2%;
      z-index:7;
      margin:0 auto;
      left:0;
      right:0;
}
.focus-container ul{
      margin-left:46%;
}
.focus-container li{
      width:10px;
      height:10px;
      border-radius:50%;
      float:left;
      margin-right:10px;
      background:#fff;
}
.focus-item{
      width:100%;
      height:100%;
      background:#51B1D9;
      border-radius:inherit;
      animation-duration: 20s;
      animation-timing-function: linear;
      animation-name:fade;
      animation-iteration-count: infinite;
}
.focus-item1{
      animation-delay: -1s;
}
.focus-item2{
      animation-delay: 3s;
}
.focus-item3{
      animation-delay: 7s;
}
.focus-item4{
      animation-delay: 11s;
}
.focus-item5{
      animation-delay: 15s;
}

五恼琼、梳理代碼

如果你維護過別人的代碼你就會知道,代碼梳理對于后期維護的重要性了屏富,沒有經(jīng)過梳理的css代碼晴竞,隨心所欲寫到哪里就是哪里,對于后期維護來說簡直就是一場災(zāi)難狠半,css代碼梳理個人認為首先必須添加必要的注釋噩死,將css代碼分區(qū),另外就是盡量減少后期修改需要修改的地方典予,這個主要是代碼重構(gòu)的問題甜滨,這個問題我已經(jīng)在編寫代碼的時候考慮到了,所以主要任務(wù)就是添加注釋和告訴維護者代碼最常修改的地方瘤袖,我們遵循最常修改的代碼放到最后的原則衣摩。
我們來分析一下我們的代碼如果給別人用可能需要修改的地方,首先肯定是圖片路徑捂敌,所以我們把這個樣式放在最后艾扮,然后是圖片高度,輪播焦點的顏色占婉,動畫時間的設(shè)置(這里還涉及圖片個數(shù))泡嘴,輪播焦點的位置,當(dāng)然輪播焦點大小也可能修改逆济。重構(gòu)后代碼如下:

<section class="slider-contaner">
<ul class="slider">
<li class="slider-item slider-item1"></li>
<li class="slider-item slider-item2"></li>
<li class="slider-item slider-item3"></li>
<li class="slider-item slider-item4"></li>
<li class="slider-item slider-item5"></li>
</ul>
<div class="focus-container">
<ul class="floatfix"> 
<li><div class="focus-item focus-item1"></div></li>
<li><div class="focus-item focus-item2"></div></li>
<li><div class="focus-item focus-item3"></div></li>
<li><div class="focus-item focus-item4"></div></li>
<li><div class="focus-item focus-item5"></div></li>
</ul>
</div>
</section>
/*css reset start*/
*{
margin:0;
padding:0;
}
ul,li{
list-style: none;
}
/*css reset end*/

/*css public start*/
.floatfix {
*zoom: 1;
}
.floatfix:after {
content: "";
display: table;
clear: both;
}
/*css public end*/

/*slider start*/
.slider-contaner{
width:100%;
position:relative;
}
.slider-item + .slider-item{
opacity:0;
}
.slider-item{
width:100%;
position:absolute;
animation-timing-function: linear;
animation-name:fade;
animation-iteration-count: infinite;
background-size:100%;
}
.focus-container{
position:absolute;
z-index:7;
margin:0 auto;
left:0;
right:0;
}
.focus-container li{
width:10px;
height:10px;
border-radius:50%;
float:left;
margin-right:10px;
background:#fff;
}
.focus-item{
width:100%;
height:100%;
border-radius:inherit;
animation-timing-function: linear;
animation-name:fade;
animation-iteration-count: infinite;
}
.focus-item2,.focus-item3,.focus-item4,.focus-item5{
opacity:0;
}
.focus-container ul{
margin-left:46%;
}
/*設(shè)置輪播焦點的位置*/
.focus-container{
bottom:2%;
}
/*設(shè)置當(dāng)前圖片焦點的顏色*/
.focus-item{
background:#51B1D9;
}
/*設(shè)置動畫酌予,請根據(jù)實際需要修改秒數(shù)*/
.slider-item,.focus-item{
animation-duration: 20s;
}
.slider-item1,.focus-item1{
animation-delay: -1s;
}
.slider-item2,.focus-item2{
animation-delay: 3s;
}
.slider-item3,.focus-item3{
animation-delay: 7s;
}
.slider-item4,.focus-item4{
animation-delay: 11s;
}
.slider-item5,.focus-item5{
animation-delay: 15s;
}
@keyframes fade{
0%{
opacity:0;
z-index:2;
}
5%{
opacity:1;
z-index: 1;
}
20%{
opacity:1;
z-index:1;
}
25%{
opacity:0;
z-index:0;
}
100%{
opacity:0;
z-index:0;
}
}
/*設(shè)置背景磺箕,響應(yīng)式請利用媒體查詢根據(jù)斷點修改路徑*/
.slider-item1{
background-image:url(imgs/1.jpg);
}
.slider-item2{
background-image:url(imgs/2.jpg);
}
.slider-item3{
background-image:url(imgs/3.jpg);
}
.slider-item4{
background-image:url(imgs/4.jpg);
}
.slider-item5{
background-image:url(imgs/5.jpg);
}
/*設(shè)置圖片的高度,請根據(jù)具體需要修改百分比抛虫,響應(yīng)式及時修改此值*/
.slider,.slider-item{
padding-bottom:40%;
}

六松靡、最后扯兩句

這種css3實現(xiàn)的輪播圖,缺點也是不言而喻建椰,點擊輪換和自動輪換兩者只能選其一雕欺,不過自動輪換可以用在手機端,這是一個不錯的選擇棉姐,另外屠列,現(xiàn)在的網(wǎng)站大都是通欄設(shè)計,網(wǎng)頁文字很少伞矩,尤其是網(wǎng)站首頁更是如此笛洛,有時候比的不是網(wǎng)站設(shè)計的優(yōu)劣,反而是誰選的圖片好看扭吁,誰就有可能受到青睞撞蜂,這種情況我們其實可以考慮將輪播圖變?yōu)楸尘暗妮啌Q,這時候輪播焦點也就可以不使用了侥袜,相信你的博客首頁或者產(chǎn)品首頁使用背景輪換蝌诡,效果會非常不錯的

最后是一個廣告貼,最近新開了一個分享技術(shù)的公眾號枫吧,歡迎大家關(guān)注??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浦旱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子九杂,更是在濱河造成了極大的恐慌颁湖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件例隆,死亡現(xiàn)場離奇詭異甥捺,居然都是意外死亡,警方通過查閱死者的電腦和手機镀层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門镰禾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唱逢,你說我怎么就攤上這事吴侦。” “怎么了坞古?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵备韧,是天一觀的道長。 經(jīng)常有香客問我痪枫,道長织堂,這世上最難降的妖魔是什么叠艳? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮捧挺,結(jié)果婚禮上虑绵,老公的妹妹穿的比我還像新娘。我一直安慰自己闽烙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布声搁。 她就那樣靜靜地躺著黑竞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疏旨。 梳的紋絲不亂的頭發(fā)上很魂,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音檐涝,去河邊找鬼遏匆。 笑死,一個胖子當(dāng)著我的面吹牛谁榜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼怎爵,長吁一口氣:“原來是場噩夢啊……” “哼悯森!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巷怜,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤葛超,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后延塑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绣张,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年关带,在試婚紗的時候發(fā)現(xiàn)自己被綠了侥涵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡豫缨,死狀恐怖独令,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情好芭,我是刑警寧澤燃箭,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站舍败,受9級特大地震影響招狸,放射性物質(zhì)發(fā)生泄漏敬拓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一裙戏、第九天 我趴在偏房一處隱蔽的房頂上張望乘凸。 院中可真熱鬧,春花似錦累榜、人聲如沸营勤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽葛作。三九已至,卻和暖如春猖凛,著一層夾襖步出監(jiān)牢的瞬間赂蠢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工辨泳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虱岂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓菠红,卻偏偏與公主長得像第岖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子途乃,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,501評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫绍傲、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評論 4 62
  • 你是一樹一樹的花開耍共,是燕在梁間呢喃烫饼。 你是愛,是暖试读,是希望杠纵, 你是人間的四月天! --《人間四月天》林徽因 《你是...
    五月成長筆記閱讀 368評論 0 0
  • 人情做透的本質(zhì)是滿足客戶的精神需求钩骇,指向的是信任與感性比藻。 利益驅(qū)動的本質(zhì)是滿足客戶的物質(zhì)需求,指向的是貪婪與理性倘屹。...
    瘦朵朵快樂相伴閱讀 459評論 0 0
  • 如諧音:為啥大街上總有人給你發(fā)傳單呀?因為你帥得令人發(fā)紙(指)银亲。 如您在生活中還有哪些好的段子或句子,歡迎在后留言...
    龍威盛閱讀 884評論 1 0