/** * 创建二级nav元素,如果存在,直接展示 * * @param {Object} config config.tabs,某个主导航的二级导航配置 * @param {Object} navItems 缓存一级导航的对象,用来计算位置 * @param {Object} subNavs 缓存二级导航的对象 * @param {Object} main 一级导航容器 * @param {string} index 一级导航navElement的index */ function createOrShowSubNav(config, navItems, subNavs, main, index) { var ul = subNavs[index].nav; var isNew = false; if (!u.isObject(ul)) { isNew = true; ul = document.createElement('ul'); ul.className = 'nav-sub'; lib.insertAfter(ul, main); subNavs[index].nav = ul; subNavs[index].navItems = {}; createNavElements(config, subNavs[index].navItems, ul, 'sub-'); } toggleSubNav(subNavs, subNavs[index].nav, index); if (isNew) { // 二级导航位置的计算,二级导航的长度默认为去除最右子元素的边距后的剩余长度 // 然后将二级导航的垂直平分线与一级导航子元素对齐 var navOffset = lib.getOffset(main); var navItemOffset = lib.getOffset(navItems[index]); var subNavOffset = lib.getOffset(ul); var middleOfNavItem = navItemOffset.left + navItemOffset.width / 2; var marginLeft = (middleOfNavItem - subNavOffset.width / 2); if (marginLeft < -navOffset.left + 10) { marginLeft = -navOffset.left + 10; } ul.style.cssText = 'margin-left: ' + marginLeft + 'px'; } }
/** * 初始化body内元素的坐标和宽度 * * @param {Slider} slider 滑动杆控件 */ function initBodyElements(slider) { var bodyElement = slider.bodyElement; // 获取滑块容器的位置 var bodyPos = lib.getOffset(bodyElement); var leftTop = slider.leftTop; var rightBottom = slider.rightBottom; var widthHeight = slider.widthHeight; // 获取滑块容器的宽度,用来计算值用 slider[widthHeight] = bodyPos[widthHeight]; // 滑块能去的最左边 if (typeof slider.min !== 'undefined') { var minLeftTop = getLeftTopByValue.call(slider, slider.min); // 滑块所能去的最左边 slider.minStartPos = bodyPos[leftTop] + minLeftTop; // 滑竿范围的最左边 slider.startPos = bodyPos[leftTop]; } // 滑块能去的最右侧 if (typeof slider.max !== 'undefined') { var maxLeftTop = getLeftTopByValue.call(slider, slider.max); slider.maxEndPos = bodyPos[leftTop] + maxLeftTop; slider.endPos = bodyPos[rightBottom]; } }
/** * 根据值获取滑块的位置 * * @param {number} value 滑块的值 * @return {number} 滑块的左侧位置 * @private */ function getLeftTopByValue(value) { var widthHeight = this.widthHeight; var bodyElement = this.bodyElement; // 获取滑块容器的位置 var bodyPos = lib.getOffset(bodyElement); var tmpwidthHeight = bodyPos[widthHeight]; var start = this.start; var end = this.end; var cursorLeftTop = (value - start) / (end - start) * tmpwidthHeight; return cursorLeftTop; }
/** * 根据鼠标位置,寻找离鼠标位置最近的handle * * @private * @param {Event} e 事件对象 * @return {Element} */ function findNearestCursorElement(e) { var pageXY = this.pageXY; var leftTop = this.leftTop; var bodyElement = this.helper.getPart('body'); var bodyPos = lib.getOffset(bodyElement); var mouseLeftTop = e[pageXY] - bodyPos[leftTop]; // 有两个滑块 if (this.range) { var firstLeftTop = getLeftTopByValue.call(this, this.minRangeValue); var secondLeftTop = getLeftTopByValue.call(this, this.maxRangeValue); var middleLeftTop = firstLeftTop + (secondLeftTop - firstLeftTop) / 2; if (mouseLeftTop > middleLeftTop && this.cursorElementTwo) { return this.cursorElementTwo; } } return this.cursorElement; }
function (elem, index) { elem.style.left = (index * footStepWidth - lib.getOffset(elem).width / 2) + 'px'; }