consulting

97-oi.jpg
視差滾動動畫受到越來越多前端設計師的寵愛
會員評比: / 1
最差最好 
知識庫文章 - 網站動畫設計運用知識文章

作為一種優雅酷炫的頁面展示的方式,視差滾動(Parallax Scrolling)正受到越來越多前端設計師的寵愛,
優設的2014年網頁設計趨勢中依然能夠看到它的影子,所以我們不得不來好好研究下視差滾動的原理和實現方式。

一、視差滾動

視差滾動(Parallax Scrolling)指網頁滾動過程中,多層次的元素進行不同程度的移動,視覺上形成立體運動效果的網頁展示技術。
國內外的設計師們實現了很多酷炫的效果,大家請移步欣賞,《14個超棒的帶有故事趣味性視差滾動網站》、
《17 Inspiring Examples of Parallax Scrolling Sites》、《18 Beautiful Examples of Parallax Scrolling in Web Design》。

二、特性

視差滾動效果酷炫,適合於個性展示的場合。
視差滾動徐徐展開,適合於娓娓道來,講故事的場合。
視差滾動容易迷航,需要具備較強的導航功能。

三、原理

傳統的網頁的文字、圖片、背景都是一起按照相同方向相同速度滾動的,
而視差滾動則是在滾動的時候,內容和多層次的背景實現或不同速度,或不同方向的運動。
有的時候也可以加上一些透明度、大小的動畫來優化顯示。

四、實現

4.1簡單實現

利用background-attachment屬性實現。
background-attachment: fixed || scroll || local
默認情況下,此屬性取值scroll,頁面滾動時,內容和背景一起運動,如果取值fixed,背景相對瀏覽器固定。
借用Alloy Team的博文《視差滾動的愛情故事》的圖片和背景,來看看效果

<div class="article section1">
     每當我加班凌晨,獨自一人走在黑暗的回家路上
</div>
<div class="article section2">
     我會想起那天夕陽下的奔跑
</div>
<div class="article section3">
     那是我逝去的,青春
</div>


css非常簡單,

/*統一設置背景的background-attchment屬性*/
.article{
	width: 960px;
	margin: 0 auto;
	height: 800px;
	padding: 40px;
	font: 24px/1.5 'Microsoft YaHei';
	background-repeat: no-repeat;
	background-attachment: fixed;
	background-position: center center;
	background-size: cover;
	line-height:400px;
}
/*分別給每個部分設置不同的背景和顏色*/
.section1{
       color: white;
       background-image: url
( http://www.alloyteam.com/wp-content/uploads/2014/01/section01.jpg); } .section2{ color: #FF8500; background-image: url
( http://www.alloyteam.com/wp-content/uploads/2014/01/section02.jpg); } .section3{ color: #747474; background-image: url
( http://www.alloyteam.com/wp-content/uploads/2014/01/section03.jpg); }


4.2 加上動畫

上面的效果略顯呆板,我們在頁面滾動的時候,給文字加點動畫,看效果
我們來偵聽一下scroll事件,當頁面滾動某個地方時(),我們給元素添加動畫。

var articleHeight =800;
var section1 = document.getElementById('section1'),
section2 = document.getElementById('section2'),
section3 = document.getElementById('section3');
window.addEventListener('scroll',scrollHandler);
 
function scrollHandler(e){
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
if(scrollTop > 0 && scrollTop < articleHeight){
section1.classList.add('anim');
}else if(scrollTop >= articleHeight && scrollTop < articleHeight*2){
section2.classList.add('anim');
}else if(scrollTop >= articleHeight*2 && scrollTop < articleHeight*3){
section3.classList.add('anim');
}
}


html和css也要进行一些修改

/*統一設置背景的background-attchment屬性*/
.article{
	width: 960px;
	margin: 0 auto;
	height: 800px;
	padding: 40px;
	background-repeat: no-repeat;
	background-attachment: fixed;
	background-position: center center;
	background-size: cover;
        font: 24px/1.5 'Microsoft YaHei';
        line-height:400px; 
        text-indent:-25em;
}
/*分別給每個部分設置不同的背景和顏色*/
.section1{
        color: white;
        background-image: url
( http://www.alloyteam.com/wp-content/uploads/2014/01/section01.jpg); } .section2{ color: #FF8500; background-image: url
( http://www.alloyteam.com/wp-content/uploads/2014/01/section02.jpg); } .section3{ color: #747474; background-image: url
( http://www.alloyteam.com/wp-content/uploads/2014/01/section03.jpg); } .anim{ -webkit-transition : all 1s ease-in; -moz-transition : all 1s ease-in; -ms-transition : all 1s ease-in; transition : all 1s ease-in; text-indent:3em; }


4.3 背景運動

剛剛兩個情況只是背景保持fixed的狀態,我們可以給包括背景在內的多層次元素添加運動,從而實現視差滾動。
多背景時,需要確保上面的背景是透明的。
看看nettuts上的一個效果,研究研究,看看實現過程。

html文件裡面使用了data-speed和data-type向js里傳遞參數。

<!-- Section #1 -->
<section id="home" data-speed="10" data-type="background">
  <article>I am Absolute Positioned</article>
</section>
<!-- Section #2 -->
<section id="about" data-speed="4" data-type="background">
  <article>Simple Parallax Scroll</article>
</section>


CSS文件,

#home {
    background: url
(http://nettuts.s3.amazonaws.com/2138_SimpleParallax/Demo/images/home.jpg)
50% 0 no-repeat fixed; height: 1000px; margin: 0 auto; width: 100%; max-width: 1920px; position: relative; box-shadow: 0 0 50px rgba(0, 0, 0, 0.8); } #about { background: url
(http://nettuts.s3.amazonaws.com/2138_SimpleParallax/Demo/images/about.jpg)
50% 0 no-repeat fixed; height: 1000px; margin: 0 auto; width: 100%; max-width: 1920px; position: relative; box-shadow: 0 0 50px rgba(0, 0, 0, 0.8); } /* Introduction */ #home article { background: url
("http://nettuts.s3.amazonaws.com/2138_SimpleParallax/Demo/images/intro.png")
no-repeat scroll center top transparent; height: 458px; position: absolute; text-indent: -9999px; top: 291px; width: 100%; } #about article { background: url
("http://nettuts.s3.amazonaws.com/2138_SimpleParallax/Demo/images/parallax.png")
no-repeat scroll center top transparent; height: 458px; position: absolute; text-indent: -9999px; top: 291px; width: 100%; }


javascript,這裡用到了jquery

$(document).ready(function () {
    // Cache the Window object
    $window = $(window);
 
    $('section[data-type="background"]').each(function () {
        var $bgobj = $(this); // assigning the object
 
        $(window).scroll(function () {
 
            // Scroll the background at var speed
            // the yPos is a negative value because we're scrolling it UP!                              
            var yPos = -($window.scrollTop() / $bgobj.data('speed'));
 
            // Put together our final background position
            var coords = '50% ' + yPos + 'px';
 
            // Move the background
            $bgobj.css({
                backgroundPosition: coords;
            });
        }); // window scroll Ends
    });
});


(此篇文章為網路轉載,如有冒犯,請來信告知,當即刻移除!)