move: function (ele) { var res = {}; var v = dom.getStyle(ele, 'left'); if (x && v) { x += parseInt(v, 10); res.left = x + 'px'; } v = dom.getStyle(ele, 'top'); if (y && v) { y += parseInt(v, 10); res.top = y + 'px'; } return res; }
scale: function (ele) { var items = parseTransform(dom.getStyle(ele, 'transform')); rate += parseFloat(items.scale || '1'); return { transform: 'scale(' + rate + ')' }; }
skew: function (ele) { var items = parseTransform(dom.getStyle(ele, 'transform')); deg += parseInt(items.skew || '0', 10); return { transform: 'skew(' + deg + 'deg)' }; }
rotate: function (ele) { var items = parseTransform(dom.getStyle(ele, 'transform')); deg += parseInt(items.rotate || '0', 10); return { transform: 'rotate(' + deg + 'deg)' }; }
Object.keys(bar).forEach(function (key) { if (commonKeys.indexOf(key) < 0 && dom.getStyle(bar[key], 'position') === 'fixed' ) { eles.push(bar[key]); } });
eles.forEach(function (ele, index) { if (index >= frontFixedNum) { parent = back.main; } // 保存原始样式信息 data = {}; attrs.forEach(function (key) { data[key] = ele.style[key] || null; }); attrData.push(data); // 当前位置计算 pos = dom.position(ele); // 计算margin-top, margin-left for (var i = 0, max = 2; i < max; i++) { value = parseInt(dom.getStyle(ele, 'margin-' + attrs[i]), 10); if (!isNaN(value)) { pos[attrs[i]] -= value; } // 修正offsetParent的margin影响 value = parseInt(dom.getStyle(parent, 'margin-' + attrs[i]), 10); if (!isNaN(value)) { pos[attrs[i]] -= value; } } // 改变position util.setStyles(ele, { position: 'absolute', top: pos.top + 'px', left: pos.left + 'px', width: dom.getStyle(ele, 'width') + 'px', height: dom.getStyle(ele, 'height') + 'px', bottom: 'auto', right: 'atuo' }); });
Object.keys(properties).forEach(function (name) { oldStyles[name] = dom.getStyle(ele, name); });
items.forEach(function (name, index) { value = parseInt(dom.getStyle(ele, 'padding-' + name), 10); res[index % 2 ? 'width' : 'height'] -= value; });
keys.forEach(function (key) { var item = { front: frontBars[key], back: backBars[key] }; // name相同表示bar不需要转场效果 // name不同表示bar要进行滑入渐变转场 item.change = item.front.getAttribute('data-name') !== item.back.getAttribute('data-name'); var front = item.front; var pos = util.getPosition(front); var position = dom.getStyle(front, 'position'); // 创建一个替代元素进行占位 var ele; if (position !== 'fixed' && position !== 'position') { // static 与 relative 的bar 需要具有样式的占位元素 ele = document.createElement(front.tagName); ele.className = front.className; ele.style.cssText += ';' + front.style.cssText + ';padding:0;border:0' + ';width:' + front.offsetWidth + 'px' + ';height:' + front.offsetHeight + 'px'; } else { // absolute 与 fixed 的bar 不需要占位 // 只需要一个回归的基准节点 ele = document.createElement('ins'); ele.style.display = 'none'; } item.frontBlock = ele; front.parentNode.insertBefore(ele, front); // fixed定位的bar需要移动到body下 // transform时fixed定位是相对与transform的父容器 // 而非body if (options.transform && dom.getStyle(item.back, 'position') === 'fixed' ) { var block = item.backBlock = document.createElement('ins'); block.style.display = 'none'; item.back.parentNode.insertBefore(block, item.back); document.body.appendChild(item.back); } // 将前页中的bar放置到body中并进行绝对定位 // 遮挡住后页相同位置的待转入bar ele = front; item.frontCSSBack = ele.style.cssText; if (position !== 'fixed') { var size = util.getSize(ele); ele.style.width = size.width + 'px'; ele.style.height = size.height + 'px'; ele.style.position = 'absolute'; ele.style.top = pos.top + 'px'; ele.style.left = pos.left + 'px'; } document.body.appendChild(ele); // 强制刷新 !!ele.offsetWidth; res.push(item); });
define("saber-viewport/util",["require","saber-dom"],function(require){var t=require("saber-dom"),exports={};return exports.setStyles=function(e,n,r){Object.keys(n).forEach(function(r){t.setStyle(e,r,n[r])}),r&&e.offsetWidth},exports.getSize=function(e){var n,r=["top","right","bottom","left"],i={width:e.clientWidth,height:e.clientHeight};return r.forEach(function(r,o){n=parseInt(t.getStyle(e,"padding-"+r),10),i[o%2?"width":"height"]-=n}),i},exports.getPosition=function(t){var e=t.getBoundingClientRect(),n=document;return e.top+=Math.max(n.documentElement.scrollTop,n.body.scrollTop),e.left+=Math.max(n.documentElement.scrollLeft,n.body.scrollLeft),e},exports});