$(document).ready(function () { // 初始化产品图片切换功能 initProductGallery(); // 初始化SKU属性切换 initSkuSwitcher(); // 初始化放大镜功能(仅对图片有效) initMagnifier(); // 初始化图片放大功能 initImageEnlarger(); }); /** * 产品图片切换功能(支持视频) */ function initProductGallery() { $('.preview').each(function () { const $preview = $(this); const $imageMenu = $preview.find(".imageMenu"); const $imageList = $imageMenu.find(".image_list"); const $mediaContainer = $preview.find(".bigImg"); // 改为通用的媒体容器 const $enlargeImg = $(".enlarge-img img"); const $scrollButtons = $preview.find('.scrollbutton'); const mediaItems = $imageList.find("li"); const count = mediaItems.length; const interval = mediaItems.first().height(); let curIndex = 0; // 更新按钮状态 function updateButtonState() { $scrollButtons.removeClass('disabled'); if (curIndex === 0) $preview.find('.smallImgUp').addClass('disabled'); if (curIndex === count - 1) $preview.find('.smallImgDown').addClass('disabled'); } // 切换媒体内容(图片或视频) function switchMedia(index) { curIndex = index; const $item = mediaItems.eq(index); const mediaUrl = $item.find('img').data('url'); const isVideo = isVideoUrl(mediaUrl); // 更新缩略图状态 mediaItems.eq(index).addClass('on').siblings().removeClass("on"); // 清空媒体容器 $mediaContainer.empty(); if (isVideo) { // 创建视频元素(优化后的版本) const videoHtml = ` `; $mediaContainer.html(videoHtml); // 添加视频加载后的处理 const $video = $mediaContainer.find('video'); $video.on('loadedmetadata', function () { // 确保视频在容器中正确显示 $(this).css({ 'width': '100%', 'height': 'auto', 'max-height': '100%', 'object-fit': 'contain' }); // 居中显示 $(this).parent().css({ 'display': 'flex', 'align-items': 'center', 'justify-content': 'center' }); }); // 大图查看器不显示视频 } else { // 显示图片 $mediaContainer.html(``); // 更新大图查看器的图片 $enlargeImg.attr('src', mediaUrl); } $imageList.stop().animate({ "marginTop": -index * interval + "px" }, 600); updateButtonState(); } // 滚动按钮事件 $scrollButtons.on('click', function () { if ($(this).hasClass('disabled')) return false; const newIndex = $(this).hasClass('smallImgUp') ? curIndex - 1 : curIndex + 1; switchMedia(newIndex); }); // 缩略图点击事件 $imageList.on('click', 'li img', function () { const $li = $(this).parent(); switchMedia($li.index()); }); // 初始化状态 switchMedia(0); }); } /** * 判断URL是否是视频 */ function isVideoUrl(url) { if (!url) return false; const videoExtensions = ['.mp4', '.webm', '.ogg']; return videoExtensions.some(ext => url.toLowerCase().endsWith(ext)); } /** * SKU属性切换功能 */ function initSkuSwitcher() { $(".dowebok").on('click', 'a', function (e) { e.preventDefault(); const skuId = $(this).data('sku_id'); $(this).addClass('on') .parent().siblings().find('a').removeClass('on'); $(".preview").hide(); $(`#preview${skuId}`).show(); // 切换SKU后重置图片查看器 $(".enlarge-img").hide(); }); } /** * 放大镜功能(仅对图片有效) */ function initMagnifier() { // 仅当主图是图片时初始化放大镜 $(document).on('mouseenter', '#midimg', function () { const $midimg = $(this); const $winSelector = $("#winSelector"); const $bigView = $("#bigView"); const $bigViewImg = $bigView.find("img"); let selectorWidth = $winSelector.width(); let selectorHeight = $winSelector.height(); let imgWidth = $midimg.width(); let imgHeight = $midimg.height(); let viewImgWidth, viewImgHeight, viewHeight; // 更新大图 function updateViewImg() { $bigViewImg.attr('src', $midimg.attr('src')); } // 计算选择器位置 function calculatePosition(e) { const imgOffset = $midimg.offset(); let X = e.pageX - imgOffset.left - selectorWidth / 2; let Y = e.pageY - imgOffset.top - selectorHeight / 2; X = Math.max(0, Math.min(X, imgWidth - selectorWidth)); Y = Math.max(0, Math.min(Y, imgHeight - selectorHeight)); if (!viewImgWidth) { viewImgWidth = $bigViewImg.outerWidth(); viewImgHeight = $bigViewImg.height(); if (viewImgWidth < 200 || viewImgHeight < 200) { viewImgWidth = viewImgHeight = 800; } viewHeight = selectorHeight * viewImgHeight / imgHeight; $bigView.width(selectorWidth * viewImgWidth / imgWidth); $bigView.height(viewHeight); } const scrollX = X * viewImgWidth / imgWidth; const scrollY = Y * viewImgHeight / imgHeight; $bigViewImg.css({ "left": -scrollX, "top": -scrollY }); $bigView.css({ "top": 0, "left": $(".preview").offset().left + $(".preview").width() + 15 }); return { left: X, top: Y }; } // 鼠标事件处理 function handleMouseOver(e) { if ($winSelector.is(":hidden")) { $winSelector.add($bigView).show(); } $winSelector.css(calculatePosition(e)); e.stopPropagation(); } function handleMouseOut() { $winSelector.add($bigView).hide(); } // 绑定事件 $midimg.on({ mousemove: handleMouseOver, mouseout: handleMouseOut }); // 初始化 updateViewImg(); $bigView.scrollLeft(0).scrollTop(0); }); } /** * 图片放大功能(仅显示图片) */ function initImageEnlarger() { const $enlargeImg = $(".enlarge-img"); const $enlargeImgContent = $enlargeImg.find("img"); const $closeBtn = $enlargeImg.find(".close"); // 主图点击放大(仅对图片有效) $(document).on('click', '.bigImg img', function () { const currentImgSrc = $(this).attr('src'); $enlargeImgContent.attr('src', currentImgSrc); $enlargeImg.show(); }); // 关闭放大图 $closeBtn.on('click', function () { $enlargeImg.hide(); }); // 放大图中的左右切换按钮(仅切换图片) $enlargeImg.find('.scrollbutton_01').on('click', function () { const $currentPreview = $('.preview:visible'); const $imageMenu = $currentPreview.find('.imageMenu'); const $allItems = $imageMenu.find('li'); const $currentItem = $imageMenu.find('li.on'); let currentIndex = $allItems.index($currentItem); // 只查找图片项(跳过视频) let $imageItems = $allItems.filter(function () { return !isVideoUrl($(this).find('img').data('url')); }); // 如果没有图片项,直接返回 if ($imageItems.length === 0) { $enlargeImg.hide(); return; } // 找到当前图片在纯图片列表中的位置 let imageIndex = $imageItems.index($currentItem); if (imageIndex === -1) imageIndex = 0; let newIndex; if ($(this).hasClass('smallImgUp')) { newIndex = (imageIndex - 1 + $imageItems.length) % $imageItems.length; } else { newIndex = (imageIndex + 1) % $imageItems.length; } const newImgSrc = $imageItems.eq(newIndex).find('img').data('url'); $enlargeImgContent.attr('src', newImgSrc); // 同步更新主图显示(如果当前显示的是图片) if ($currentPreview.find('video').length === 0) { $currentPreview.find('#midimg').attr('src', newImgSrc); } // 更新激活状态 $allItems.removeClass('on'); $imageItems.eq(newIndex).addClass('on'); }); // ESC键关闭 $(document).on('keyup', function (e) { if (e.key === "Escape") { $enlargeImg.hide(); } }); }