123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- (function($, window) {
- var CLASS_ACTIVE = $.className('active');
- var rgbaRegex = /^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/;
- var getColor = function(colorStr) {
- var matches = colorStr.match(rgbaRegex);
- if (matches && matches.length === 5) {
- return [
- matches[1],
- matches[2],
- matches[3],
- matches[4]
- ];
- }
- return [];
- };
- var Transparent = function(element, options) {
- this.element = element;
- this.options = $.extend({
- top: 0, //距离顶部高度(到达该高度即触发)
- offset: 150, //滚动透明距离
- duration: 16, //过渡时间
- scrollby: window//监听滚动距离容器
- }, options || {});
- this.scrollByElem = this.options.scrollby || window;
- if (!this.scrollByElem) {
- throw new Error("监听滚动的元素不存在");
- }
- this.isNativeScroll = false;
- if (this.scrollByElem === window) {
- this.isNativeScroll = true;
- } else if (!~this.scrollByElem.className.indexOf($.className('scroll-wrapper'))) {
- this.isNativeScroll = true;
- }
- this._style = this.element.style;
- this._bgColor = this._style.backgroundColor;
- var color = getColor(mui.getStyles(this.element, 'backgroundColor'));
- if (color.length) {
- this._R = color[0];
- this._G = color[1];
- this._B = color[2];
- this._A = parseFloat(color[3]);
- this.lastOpacity = this._A;
- this._bufferFn = $.buffer(this.handleScroll, this.options.duration, this);
- this.initEvent();
- } else {
- throw new Error("元素背景颜色必须为RGBA");
- }
- };
- Transparent.prototype.initEvent = function() {
- this.scrollByElem.addEventListener('scroll', this._bufferFn);
- if (this.isNativeScroll) { //原生scroll
- this.scrollByElem.addEventListener($.EVENT_MOVE, this._bufferFn);
- }
- }
- Transparent.prototype.handleScroll = function(e) {
- var y = window.scrollY;
- if (!this.isNativeScroll && e && e.detail) {
- y = -e.detail.y;
- }
- var opacity = (y - this.options.top) / this.options.offset + this._A;
- opacity = Math.min(Math.max(this._A, opacity), 1);
- this._style.backgroundColor = 'rgba(' + this._R + ',' + this._G + ',' + this._B + ',' + opacity + ')';
- if (opacity > this._A) {
- this.element.classList.add(CLASS_ACTIVE);
- } else {
- this.element.classList.remove(CLASS_ACTIVE);
- }
- if (this.lastOpacity !== opacity) {
- $.trigger(this.element, 'alpha', {
- alpha: opacity
- });
- this.lastOpacity = opacity;
- }
- };
- Transparent.prototype.destory = function() {
- this.scrollByElem.removeEventListener('scroll', this._bufferFn);
- this.scrollByElem.removeEventListener($.EVENT_MOVE, this._bufferFn);
- this.element.style.backgroundColor = this._bgColor;
- this.element.mui_plugin_transparent = null;
- };
- $.fn.transparent = function(options) {
- options = options || {};
- var transparentApis = [];
- this.each(function() {
- var transparentApi = this.mui_plugin_transparent;
- if (!transparentApi) {
- var top = this.getAttribute('data-top');
- var offset = this.getAttribute('data-offset');
- var duration = this.getAttribute('data-duration');
- var scrollby = this.getAttribute('data-scrollby');
- if (top !== null && typeof options.top === 'undefined') {
- options.top = top;
- }
- if (offset !== null && typeof options.offset === 'undefined') {
- options.offset = offset;
- }
- if (duration !== null && typeof options.duration === 'undefined') {
- options.duration = duration;
- }
- if (scrollby !== null && typeof options.scrollby === 'undefined') {
- options.scrollby = document.querySelector(scrollby) || window;
- }
- transparentApi = this.mui_plugin_transparent = new Transparent(this, options);
- }
- transparentApis.push(transparentApi);
- });
- return transparentApis.length === 1 ? transparentApis[0] : transparentApis;
- };
- $.ready(function() {
- $($.classSelector('.bar-transparent')).transparent();
- });
- })(mui, window);
|