首页 > 代码库 > 如何让火狐浏览器兼容background-position的animate动画?
如何让火狐浏览器兼容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);
如何让火狐浏览器兼容background-position的animate动画?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。