36
个编辑
-
汇聚密码安全智慧 共享实战经验!
无编辑摘要 标签:已被回退 |
无编辑摘要 标签:已被回退 移动版编辑 移动版网页编辑 |
||
| 第1行: | 第1行: | ||
// 移动端公告滚动效果 | // 移动端公告滚动效果 - 修复版本 | ||
// | // 使用 transform 实现滚动,确保在移动端正常工作 | ||
(function() { | (function() { | ||
'use strict'; | 'use strict'; | ||
// 防止重复初始化 | |||
var initialized = false; | |||
var scrollInterval = null; | |||
// 初始化公告滚动 | // 初始化公告滚动 | ||
function initSiteNoticeScroll() { | function initSiteNoticeScroll() { | ||
var self = $('#siteNoticeScroll'); | var self = $('#siteNoticeScroll'); | ||
if (!self.length || !self[0]) return; | if (!self.length || !self[0]) { | ||
return; | |||
} | |||
var ul = self.find('ul:first'); | var ul = self.find('ul:first'); | ||
if (!ul.length) return; | if (!ul.length) { | ||
return; | |||
} | |||
var lis = ul.find('li'); | var lis = ul.find('li'); | ||
if (lis.length <= 1) { | |||
return; // 如果只有一个或没有项目,不需要滚动 | |||
if ( | |||
} | } | ||
// 获取容器宽度(使用多种方法确保获取到) | // 获取容器宽度(使用多种方法确保获取到) | ||
var containerWidth = self.width() || self[0].offsetWidth || self[0].clientWidth; | var containerWidth = self.width() || self[0].offsetWidth || self[0].clientWidth; | ||
if (containerWidth === 0) { | if (containerWidth === 0) { | ||
// | // 如果宽度为0,延迟重试 | ||
setTimeout(initSiteNoticeScroll, 100); | setTimeout(initSiteNoticeScroll, 100); | ||
return; | return; | ||
} | } | ||
// 设置 ul 宽度和初始 | // 设置 ul 宽度和初始 transform | ||
var totalWidth = containerWidth * lis.length; | var totalWidth = containerWidth * lis.length; | ||
ul.css({ | ul.css({ | ||
| 第76行: | 第47行: | ||
'-webkit-transform': 'translate3d(0, 0, 0)', | '-webkit-transform': 'translate3d(0, 0, 0)', | ||
'-moz-transform': 'translate3d(0, 0, 0)', | '-moz-transform': 'translate3d(0, 0, 0)', | ||
'-ms-transform': ' | '-ms-transform': 'translate3d(0, 0, 0)', | ||
'-o-transform': 'translate3d(0, 0, 0)', | '-o-transform': 'translate3d(0, 0, 0)', | ||
'transform': 'translate3d(0, 0, 0)', | 'transform': 'translate3d(0, 0, 0)', | ||
| 第89行: | 第60行: | ||
}); | }); | ||
// 设置每个 li | // 设置每个 li 的宽度 | ||
lis. | lis.css({ | ||
'width': containerWidth + 'px', | |||
'height': '25px', | |||
'line-height': '25px', | |||
'list-style': 'none', | |||
'float': 'left', | |||
'display': 'inline-block', | |||
'box-sizing': 'border-box', | |||
'padding': '0 10px', | |||
'vertical-align': 'top', | |||
'flex-shrink': '0' | |||
}); | }); | ||
| 第132行: | 第77行: | ||
ul[0].offsetHeight; | ul[0].offsetHeight; | ||
// | // 清除之前的定时器 | ||
if (scrollInterval) { | |||
clearInterval(scrollInterval); | |||
clearInterval( | |||
} | } | ||
// 开始滚动 | // 开始滚动 | ||
scrollInterval = window.setInterval(function() { | |||
var dataset = ul[0].dataset; | var dataset = ul[0].dataset; | ||
if (!dataset) return; | if (!dataset) return; | ||
| 第164行: | 第108行: | ||
'-webkit-transform': 'translate3d(0, 0, 0)', | '-webkit-transform': 'translate3d(0, 0, 0)', | ||
'-moz-transform': 'translate3d(0, 0, 0)', | '-moz-transform': 'translate3d(0, 0, 0)', | ||
'-ms-transform': ' | '-ms-transform': 'translate3d(0, 0, 0)', | ||
'-o-transform': 'translate3d(0, 0, 0)', | '-o-transform': 'translate3d(0, 0, 0)', | ||
'transform': 'translate3d(0, 0, 0)' | 'transform': 'translate3d(0, 0, 0)' | ||
| 第180行: | 第124行: | ||
}, 50); | }, 50); | ||
} else { | } else { | ||
// | // 正常滚动 | ||
ul.css({ | ul.css({ | ||
'-webkit-transition': 'transform 0.73s ease-in-out', | '-webkit-transition': 'transform 0.73s ease-in-out', | ||
| 第197行: | 第141行: | ||
}, 5000); | }, 5000); | ||
// | // 窗口大小改变时重新计算 | ||
$(window | $(window).on('resize.siteNoticeScroll', function() { | ||
containerWidth = self.width() || self[0].offsetWidth || self[0].clientWidth; | containerWidth = self.width() || self[0].offsetWidth || self[0].clientWidth; | ||
if (containerWidth === 0) return; | if (containerWidth === 0) return; | ||
| 第204行: | 第148行: | ||
var totalWidth = containerWidth * lis.length; | var totalWidth = containerWidth * lis.length; | ||
ul.css('width', totalWidth + 'px'); | ul.css('width', totalWidth + 'px'); | ||
lis | lis.css('width', containerWidth + 'px'); | ||
var currentLeft = parseInt(ul[0].dataset.left) || 0; | var currentLeft = parseInt(ul[0].dataset.left) || 0; | ||
| 第218行: | 第154行: | ||
var translateX = -(currentLeft * containerWidth); | var translateX = -(currentLeft * containerWidth); | ||
ul.css({ | ul.css({ | ||
'-webkit-transform': 'translate3d(' + translateX + 'px, 0, 0)', | '-webkit-transform': 'translate3d(' + translateX + 'px, 0, 0)', | ||
'-moz-transform': 'translate3d(' + translateX + 'px, 0, 0)', | '-moz-transform': 'translate3d(' + translateX + 'px, 0, 0)', | ||
'-ms-transform': 'translateX(' + translateX + 'px)', | '-ms-transform': 'translateX(' + translateX + 'px)', | ||
'-o-transform': 'translate3d(' + translateX + 'px, 0, 0)', | '-o-transform': 'translate3d(' + translateX + 'px, 0, 0)', | ||
'transform': 'translate3d(' + translateX + 'px, 0, 0)' | 'transform': 'translate3d(' + translateX + 'px, 0, 0)', | ||
'-webkit-transition': 'transform 0.37s ease-in-out', | |||
'-moz-transition': 'transform 0.37s ease-in-out', | |||
'-o-transition': 'transform 0.37s ease-in-out', | |||
'transition': 'transform 0.37s ease-in-out' | |||
}); | }); | ||
}); | }); | ||
// 保存 interval | // 保存 interval ID | ||
self.data('scrollInterval', scrollInterval); | self.data('scrollInterval', scrollInterval); | ||
} | } | ||
| 第274行: | 第210行: | ||
return true; | return true; | ||
} | } | ||
// 等待 DOM 和 MediaWiki 加载完成 | // 等待 DOM 和 MediaWiki 加载完成 | ||
| 第288行: | 第221行: | ||
var promptAdded = initUserPrompt(); | var promptAdded = initUserPrompt(); | ||
// 延迟初始化滚动效果,确保 DOM | // 延迟初始化滚动效果,确保 DOM 完全更新 | ||
setTimeout(function() { | setTimeout(function() { | ||
initSiteNoticeScroll(); | initSiteNoticeScroll(); | ||
}, promptAdded ? 200 : 100); | }, promptAdded ? 200 : 100); | ||
| 第327行: | 第240行: | ||
init(); | init(); | ||
} | } | ||
}, | }, 300); | ||
} | } | ||
} else { | } else { | ||
| 第334行: | 第247行: | ||
document.addEventListener('DOMContentLoaded', function() { | document.addEventListener('DOMContentLoaded', function() { | ||
if (typeof $ !== 'undefined' && !initialized) { | if (typeof $ !== 'undefined' && !initialized) { | ||
setTimeout(init, | setTimeout(init, 200); | ||
} | } | ||
}); | }); | ||
| 第357行: | 第270行: | ||
mw.hook('mobile.init').add(function() { | mw.hook('mobile.init').add(function() { | ||
if (!initialized) { | if (!initialized) { | ||
setTimeout(init, | setTimeout(init, 300); | ||
} | } | ||
}); | }); | ||
} | } | ||
})(); | })(); | ||