在開發過程中,經常會遇到一些交互效果,今天所聯系的便是一個類似折紙的折疊效果,查看效果.
說到折紙,我們先看下圖
這是我第一時間想到的大體思路,如果能讓這6個面連續的變化角度到0不就可以了嗎,運用css3 transition或animation毫無壓力~~
要實現上圖的這種效果,設置不同rotateX值及父元素的perspective即可,可是在實際寫出來之後卻發現這樣並不可行,不論我們設置transform-origin或者其他的值,都不能使幾個面相互一直相互連接。
再來看下圖,我們折紙過程實際是這樣子的,如果我們分解開來,可以分解成以下步驟,第一1,2,3在同一個平面,第二步:1為1個平面,2,3為1個平面,第三步:1,2,3分別成3個平面。我們可以這樣認為,即2,3是以一定角度從1平面折疊,3是以一定角度從2平面折疊,所以我們修改下我們的html結構
<div class='outer'> <div class='red fold'> 段落1 <div class='yellow fold'> 段落2 <div class='blue fold'> 段落3 <div class='green fold'> 4 </div> </div> </div> </div> </div>
css代碼:
.outer{width:400px;margin:0px auto;-webkit-perspective:500px;-webkit-perspective-origin:50% 100% } .outer .fold{height:100px;text-align:center;line-height:100px;font-family:'Microsoft YaHei';font-size: 24px;color:#fff;-webkit-transform-style:preserve-3d; -webkit-transform-origin:0 0} .red{background-color:red;-webkit-transform:rotateX(50deg)} .yellow{background-color:yellow;-webkit-transform:rotateX(-120deg)} .blue{background-color:blue;-webkit-transform:rotateX(136deg)} .green{background-color:green;-webkit-transform:rotateX(-120deg)}
我們得到的效果如下:
下面我們加上收縮動畫,效果看這裡:
代碼如下:
css:
.outer{width:400px;margin:100px auto; -webkit-perspective:800px; -webkit-perspective-origin:50% 100% } .outer .fold{height:100px; text-align:center; line-height:100px; font-family:'Microsoft YaHei'; font-size: 24px; color:#fff; -webkit-transform-style:preserve-3d; -webkit-transform-origin:0 0; -webkit-transition:transform linear 800ms; } .red{background-color:red; -webkit-transform:rotateX(90deg) } .yellow{background-color:yellow; -webkit-transform:rotateX(-180deg) } .blue{background-color:blue; -webkit-transform:rotateX(180deg); } .green{background-color:green; -webkit-transform:rotateX(-180deg); } .outer.activity .fold{-webkit-transform:rotateX(0deg); }
html:
<div class='outer'> <div class='red fold'> 段落1 <div class='yellow fold'> 段落2 <div class='blue fold'> 段落3 <div class='green fold'> 4 </div> </div> </div> </div> </div>
js:
var btn=document.getElementById('btn'), contain=document.querySelector('.outer') ; btn.onclick=function(){ contain.classList.toggle('activity') }
當然,我們可以為不同的元素添加不同的transition-delay,來使幾個面有先後的展開。