「如何用一行jQuery實現圖片無縫輪播動畫?」
<div class="slide">
<img src="1.png"><img src="2.png"><img src="3.png"><img src="4.png">
</div>
純jQuery無法在真正意義上「一行」實現完整輪播(含無縫循環、鼠標暫停、自動播放、響應式等)。面試考察的是:
var speed = 30;
var gpic = document.getElementById('slide');
var gpic1 = gpic.children[0]; // 圖片容器1
var gpic2 = gpic.children[1]; // 圖片容器2(克隆)
gpic2.innerHTML = gpic1.innerHTML; // 複製內容實現無縫
function Marquee() {
if (gpic2.offsetWidth - gpic.scrollLeft <= 0) {
gpic.scrollLeft -= gpic1.offsetWidth; // 重置位置
} else {
gpic.scrollLeft++; // 像素級滾動
}
}
var timer = setInterval(Marquee, speed);
gpic.onmouseover = function() { clearInterval(timer); };
gpic.onmouseout = function() { timer = setInterval(Marquee, speed); };
$('.slide').each(function() {
var $this = $(this), $imgs = $this.children('img');
var html = $imgs.clone().add($imgs.clone()); // 雙倍確保無縫
$this.empty().append(html).css({overflow: 'hidden', whiteSpace: 'nowrap'});
var width = $imgs.first().outerWidth(true) * $imgs.length;
var pos = 0;
function animate() {
pos -= 1;
if (Math.abs(pos) >= width) pos = 0;
$this.scrollLeft(-pos);
requestAnimationFrame(animate);
}
$this.hover(function() { cancelAnimationFrame(animate); }, animate);
animate();
});
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 原生JS | 零依賴、性能最優 | 代碼量大 | 極簡項目、學習原理 |
| Swiper.js | 功能全、生態成熟 | 體積較大 | 企業級項目首選 |
| Owl Carousel | 配置簡單 | 維護較慢 | 快速原型 |
| CSS Animation | GPU加速、無JS | 交互控制弱 | 純展示輪播 |
面試造火箭,工作拧螺絲——理解原理比背誦「一行代碼」更有價值。