视差滚动效果jQuery Stellar.js使用

发布于:
分类: Script

什么为视差滚动效果看看下面这个网站http://www.sosglobal.eu/en/,是否觉得很熟悉呢?逛外国网站经常可以看到这个效果,接下来我们就来看看基于jQuery的Stellar插件实现视差滚动效果。

Stellar.js是一款基于jQuery的插件,专业提供视差滚动效果30年,值得信赖。使用方法如下:
第一步,为元素对象添加 .stellar() 效果函数:

// 例如:
$(window).stellar();
// 或者:
$('#main').stellar();

如果是对 ‘window’ 添加效果函数,可以简写成这样:

$.stellar();

设定之后,该对象中的所有滚动背景或元素都会应用视差滚动效果。

元素滚动效果

不论是 absolute, relative 还是 fixed 定位的元素,要让其以不同速度滚动,只需为它添加如下属性:

<div data-stellar-ratio="2">

这里的比例值是相对于正常滚动速度来说的。所以,如果值为0.5,元素滚动速度为正常速度的一半;如果值为1,元素滚动速度不变;如果值为2,元素滚动速度为正常速度的2倍。

当比例值小于1时,可能会出现滚动不连贯的跳动现象,这时请将相应元素的 ‘position’ 设置为 fixed

背景滚动效果

同理,对于要使用视差滚动效果的背景图片,只需为它添加如下属性:

<div data-stellar-background-ratio="0.5">

这里的比例值和上面的一样。为了避免出现滚动不连贯的跳动现象,请将相应元素的 ‘background-attachment’ 设置为 fixed

设置偏移

Stellar.js最强大的功能莫过于其对元素的排列对齐

当偏移容器到达屏幕边缘——或者到达设定的偏移位置时,容器内的所有元素刚好对齐。这样一来,你就能轻易地构造出复杂的视差滚动效果。

要同时给所有元素设置偏移,请传入以下参数:

$.stellar({
  horizontalOffset: 40, //设置横向偏移,默认单位:px
  verticalOffset: 150 //设置纵向偏移,默认单位:px
});

你也可以单独给元素添加以下data属性:

<div data-stellar-ratio="2"
     data-stellar-horizontal-offset="40"
     data-stellar-vertical-offset="150">

设置偏移容器

默认情况下,偏移是相对于偏移容器来说的(,而非相对于容器内的元素)。也就是说,容器内的元素是absolute定位,而容器本身是relative定位。(可能我自己能理解原文的意思,但是不好用中文表述..原文:By default, offsets are relative to the element’s offset parent. This mirrors the way an absolutely positioned element behaves when nested inside an element with a relative position.)

所谓的“偏移容器”,遵循CSS规则,只要某个子元素的父元素 position 属性为relative 或者 absolute ,那么该父元素就是其偏移容器了。

如果要指定DOM中其他祖先元素为该子元素的偏移容器,请为该祖先元素添加如下的data属性:

<div data-stellar-offset-parent="true">

您也可以单独对偏移容器设置偏移:

<div data-stellar-offset-parent="true"
     data-stellar-horizontal-offset="40"
     data-stellar-vertical-offset="150">

以上各个偏移的优先级同样遵循CSS规则,从高到低依次是 元素属性 > 偏移容器属性 > JavaScript传入的属性。

(此时,由于设置了偏移容器,当蓝色框的边缘到达偏移位置时,所有星星同时对齐,形成整个单词)

此时只有当每个黄色框的边缘分别到达偏移位置时,其中的星星才会对齐,构成字母。因为此时,每个字母对应的 div 层即是其默认的偏移容器。

首页中,正是通过指定 h2 为偏移容器,我们才能保证星星的对齐是基于 h2,而不是DOM树中下一级的 div 元素,从而实现预期的效果。(一次形成整个单词而不是一个一个字母出现)

设置滚动和定位

通过设置 scrollProperty 的值,你可以设置元素的滚动方式,比如设置为CSS3的 ‘transform’ ,那么代码该这么写:

$('#gallery').stellar({
  scrollProperty: 'transform'
});

通过使用CSS3的 ‘transform’ ,我们才能实现 iOS 上的视差滚动 。

同样,你也可以通过设置 positionProperty 的值,来设置元素的定位方式,比如同样设置为CSS3的 ‘transform’ ,那么代码该这么写:

$('#gallery').stellar({
  positionProperty: 'transform'
});

关于 scrollPropertypositionProperty 这两个属性可用的属性值,请参考下面的“所有属性”小节

如果内置的属性值不能满足你的需求,你还可以 自定义插件

所有属性

下面列出了Stellar.js内置的所有可用属性,以及它们的默认属性值:

$.stellar({
  // 设置滚动的方向是“竖直方向”还是“水平方向”,或者两个方向都有
  horizontalScrolling: true, //默认水平方向开启滚动
  verticalScrolling: true, //默认竖直方向开启滚动

  // 设置全局偏移
  horizontalOffset: 0, //默认水平偏移为0
  verticalOffset: 0, //默认竖直偏移为0

  // 窗口加载完毕或者改变大小时是否刷新滚动元素
  responsive: false, //默认不刷新

  // 设置滚动方式
  // 可以选择 'scroll', 'position', 'margin' 或者 'transform'
  // 或者 使用自己定义的 'scrollProperty' 插件.
  scrollProperty: 'scroll', //默认为 'scroll'

  // 设置定位方式
  // 可以选择 'position' 或者 'transform'
  // 或者 使用自己定义的 'positionProperty' 插件.
  positionProperty: 'position', //默认为 'position'

  // 设置两种滚动效果的开关
  parallaxBackgrounds: true, //默认开启背景滚动
  parallaxElements: true, //默认开启元素滚动

  // 滚动元素滚动到视口(viewport)以外时是否隐藏
  hideDistantElements: true, //默认为隐藏

  // 自定义元素如何出现和消失
  hideElement: function($elem) { $elem.hide(); },
  showElement: function($elem) { $elem.show(); }
});

使用自己定义的 ‘scrollProperty’ 插件

作为一个功能强大的插件,Stellar.js 内置以下滚动属性值:
‘scroll’, ‘position’, ‘margin’ 和 ‘transform’

如果以上属性值已经无法满足你要使用的滚动效果了,不妨自己写一个插件~ 比如说,内置的属性值没有 ‘margin’,那么你可以这样定义 ‘margin’:

$.stellar.scrollProperty.margin = {
  getLeft: function($element) {
    return parseInt($element.css('margin-left'), 10) * -1;
  },
  getTop: function($element) {
    return parseInt($element.css('margin-top'), 10) * -1;
  }
}

然后,直接传入该 ‘scrollProperty’ 属性值就好了:

$.stellar({
  scrollProperty: 'margin'
});

使用自己定义的 ‘positionProperty’ 插件

作为一个功能强大的插件,Stellar.js 内置以下两个定位属性值:’position’ 和 ‘transform’。前者通过css的 topleft 属性来定位元素,后者通过css3中的transforms来定位元素。

同样,如果你需要对元素的定位进行更好的控制,不妨自己写一个插件~比如说,内置的属性值没有 ‘position’,那么你可以这样定义 ‘position’:

$.stellar.positionProperty.position = {
  setTop: function($element, newTop, originalTop) {
    $element.css('top', newTop);
  },
  setLeft: function($element, newLeft, originalLeft) {
    $element.css('left', newLeft);
  }
}

同样,直接传入该 ‘positionProperty’ 属性值就好了:

$.stellar({
  positionProperty: 'position'
});

如果你出于技术原因,要同时设置滚动和定位两个属性值,可以定义一个 ‘setPosition’ 函数:

$.stellar.positionProperty.foobar = {
  setPosition: function($el, x, startX, y, startY) {
    $el.css('transform', 'translate3d(' +
      (x - startX) + 'px, ' +
      (y - startY) + 'px, ' +
      '0)');
  }
}

$.stellar({
  positionProperty: 'foobar'
});

具体请看 stellar插件官网

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注