如何让火狐浏览器兼容background-position的animate动画?

在做背景图片滚动的动画时,一般会用到background-position-x|background-position-y,

但火狐和欧朋浏览器不支持改表示方法,只支持原生的background-position,在做此类动画的时候,由于background-position所有浏览器都支持,所以就可以放心的使用animate做背景滚动动画了.....

可是悲剧的是,jq的animate不支持background-position的表达方式,其支持background-position-x|background-position-y,所以做背景动画就成为一个难题,如何解决呢..

在网上找到了关于此类的解决方法---就是用插件,但这个插件是基于jq 1.8版本一下,所以在使用时必须用jq 1.8版本。

代码如下:

  1 (function ($) {
  2
  3 if (!document.defaultView || !document.defaultView.getComputedStyle) {
  4
  5 var oldCurCSS = jQuery.curCSS;
  6
  7 jQuery.curCSS = function (elem, name, force) {
  8
  9 if (name === "background-position") {
 10
 11 name = "backgroundPosition";
 12
 13 }
 14
 15 if (name !== "backgroundPosition" || !elem.currentStyle || elem.currentStyle[name]) {
 16
 17 return oldCurCSS.apply(this, arguments);
 18
 19 }
 20
 21 var style = elem.style;
 22
 23 if (!force && style && style[name]) {
 24
 25 return style[name];
 26
 27 }
 28
 29 return oldCurCSS(elem, "backgroundPositionX", force) + " " + oldCurCSS(elem, "backgroundPositionY", force);
 30
 31 };
 32
 33 }
 34
 35
 36
 37 var oldAnim = $.fn.animate;
 38
 39 $.fn.animate = function (prop) {
 40
 41 if ("background-position" in prop) {
 42
 43 prop.backgroundPosition = prop["background-position"];
 44
 45 delete prop["background-position"];
 46
 47 }
 48
 49 if ("backgroundPosition" in prop) {
 50
 51 prop.backgroundPosition = "(" + prop.backgroundPosition + ")";
 52
 53 }
 54
 55 return oldAnim.apply(this, arguments);
 56
 57 };
 58
 59
 60
 61 function toArray(strg) {
 62
 63 strg = strg.replace(/left|top/g, "0px");
 64
 65 strg = strg.replace(/right|bottom/g, "100%");
 66
 67 strg = strg.replace(/([0-9\.]+)(\s|\)|$)/g, "$1px$2");
 68
 69 var res = strg.match(/(-?[0-9\.]+)(px|\%|em|pt)\s(-?[0-9\.]+)(px|\%|em|pt)/);
 70
 71 return [parseFloat(res[1], 10), res[2], parseFloat(res[3], 10), res[4]];
 72
 73 }
 74
 75
 76
 77 $.fx.step.backgroundPosition = function (fx) {
 78
 79 if (!fx.bgPosReady) {
 80
 81 var start = $.curCSS(fx.elem, "backgroundPosition");
 82
 83
 84
 85 if (!start) {//FF2 no inline-style fallback
 86
 87 start = "0px 0px";
 88
 89 }
 90
 91
 92
 93 start = toArray(start);
 94
 95
 96
 97 fx.start = [start[0], start[2]];
 98
 99
100
101 var end = toArray(fx.end);
102
103 fx.end = [end[0], end[2]];
104
105
106
107 fx.unit = [end[1], end[3]];
108
109 fx.bgPosReady = true;
110
111 }
112
113
114
115 var nowPosX = [];
116
117 nowPosX[0] = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit[0];
118
119 nowPosX[1] = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit[1];
120
121 fx.elem.style.backgroundPosition = nowPosX[0] + " " + nowPosX[1];
122
123 };
124
125 })(jQuery);
126
127
128
129 现在jq版本都已经发展好多版本了,加入了好多新的方法,所以如何既能用高版本的jq,还能解决background-position的问题呢》》》
130
131
132
133
134
135 完美解决:
136
137 (function($) {
138
139    $.fx.step["backgroundPosition"] = function(fx) {
140
141    if (typeof fx.end == ‘string‘) {
142
143    fx.start = getBgPos(fx.elem);
144
145    //fx.end原本是一个string,这里将它转换成数组,就不会再进入这个if,也方便我们下面的计算
146
147    //例 "0px -21px"
148
149    fx.end = [parseFloat(fx.end.split(" ")[0]), parseFloat(fx.end.split(" ")[1])];
150
151    }
152
153    //这里fx.pos是根据传入的时间参数,从0到1变化的浮点数
154
155    var nowPosX = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit;
156
157    var nowPosY = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit;
158
159    fx.elem.style.backgroundPosition = nowPosX + ‘ ‘ + nowPosY;
160
161
162
163    /**
164
165     * 获取backgroundPosition数组[top, left],没有单位
166
167     */
168
169    function getBgPos(elem) {
170
171    var top = 0.0;
172
173    var left = 0.0;
174
175    if ($(elem).css("backgroundPosition")) {
176
177    //例 "0px -21px"
178
179    top = parseFloat($(elem).css("backgroundPosition").split(" ")[0]);
180
181    left = parseFloat($(elem).css("backgroundPosition").split(" ")[1]);
182
183    } else {
184
185    top = parseFloat($(elem).css("backgroundPositionX"));
186
187    left = parseFloat($(elem).css("backgroundPositionY"));
188
189    }
190
191    return [top, left];
192
193    }
194
195    }
196
197 })(jQuery);
时间: 2024-07-31 03:13:05

如何让火狐浏览器兼容background-position的animate动画?的相关文章

IE浏览器跟火狐浏览器兼容写法3

HACK设置 仅IE7识别 *+html {…} 当面临需要只针对IE7做样式的时候就可以采用这个HACK. IE6及IE6以下识别 * html {…} 这个地方要特别注意很多地主都写了是IE6的HACK其实IE5.x同样可以识别这个HACK.其它浏览器不识别. html/**/ >body select {……}网页教学网 这句与上一句的作用相同. 仅IE6不识别 select { display /*IE6不识别*/:none;} 这里主要是通过CSS注释分开一个属性与值,流释在冒号前.

IE浏览器跟火狐浏览器兼容写法2

XHTML+CSS兼容性解决方案小集 ! 我就先把一些我遇到的问题写在下面: 1.在mozilla firefox和IE中的BOX模型解释不一致导致相差2px解决方法: div{margin:30px!important;margin:28px;}注意这两个margin的顺序一定不能写反,据阿捷的说法!important这个属性IE不能识别,但别的浏览器可以识别.所以在IE下其实解释成这样: div{maring:30px;margin:28px}重复定义的话按照最后一个来执行,所以不可以只写m

IE浏览器跟火狐浏览器兼容写法(1)

CSS样式表在Firefox和IE下的区别 总结的一些CSS在FF和IE下的区别!可能不完整,以后会陆续补充. FireFox: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行 FireFox: body 设置 text-align 时, div 需要设置 margin: auto(主要是 margin-left,margin-right) 方可居中 FireFox: 设置 padding 后, div 会增加 height 和 widt

关于document.body.scrollTop 的谷歌,火狐浏览器兼容问题

最近开发页面, 出现一个问题, 弹框在谷歌浏览器正常,在火狐浏览器中, 当滚动条滚动之后,弹框就显示在上面,也就是说document.body.scrollTop 它只适用于google浏览器, 火狐浏览器就要改为document.documentElement.scrollTop,但是如果做兼容的话,我的解决方法是document.documentElement.scrollTop + document.body.scrollTop. 这样就解决的不兼容的问题.

火狐浏览器,IE11浏览器 兼容处理

火狐浏览器中的css hack /**火狐浏览器兼容处理**/ /**火狐浏览器(所有)兼容处理**/ @-moz-document url-prefix() { 在这里输入兼容样式 } /**火狐浏览器2版本兼容处理**/ html>/**/body .selector, x:-moz-any-link { 在这里输入兼容样式 } /**火狐浏览器3版本兼容处理**/ html>/**/body .selector, x:-moz-any-link, x:default { 在这里输入兼容样

localStorage和sessionStorage火狐浏览器和其他高级浏览器的区别

例子: <script>window.onload=function(){ var oSetData = document.getElementById('setData'); var oGetData = document.getElementById('getData'); oSetData.onclick=function(){ if(window.localStorage){ console.log('支持'); localStorage.date1 = '{"content

FireFox火狐浏览器与IE兼容问题 - 透明滤镜 DIV滚动条

问题一:最简单的鼠标移过手变型的css要改了 cursor:pointer;/*FireFox(火狐)不支持cursor:hand*/ dw8下面自动出来的也没有hand这个属性了,标准的是pointer 问题二:FireFox(火狐)不支持滤镜 最常见的半透明不支持. filter: Alpha(Opacity=50); /* for IE */ opacity: .5;/* for Firefox */ style="-moz-opacity:0.5; filter:alpha(opacit

网页制作常见的问题(怎样兼容IE6/IE7/火狐浏览器)

1.IE6双边距问题? 在IE6的浏览器中明明设置的是10px的margin却为什么显示的是20px的margin其实这个Ie6的一个双边距BUG 例如: <style type="text/css"> body {margin:0} div { float:left; margin-left:10px; width:300px; height:300px; border:1px solid red; } </style> 因为加上浮动后就会多出一倍的边距,浮动

网页制作常见的面试题(怎样兼容IE6/IE7/火狐浏览器)

1.IE6双边距问题? 在IE6的浏览器中明明设置的是10px的margin却为什么显示的是20px的margin其实这个Ie6的一个双边距BUG例如:<style type="text/css">body {margin:0}div { float:left; margin-left:10px; width:300px; height:300px; border:1px solid red; }</style>因为加上浮动后就会多出一倍的边距,浮动后本来外边距