虽然AI能帮大家完成lightbox效果,但是效果是个未知数。所以龙哥特意把不借助外部资源就能实现wordpress文章图片点击有lightbox的效果收藏下,以便日后直接使用。当然喜欢折腾的朋友也可以直接把代码复制后问AI添加自己还需要的其他功能。
一、效果:
· ✅ 点击图片打开,全屏展示
· ✅ 点击遮罩区域或关闭按钮关闭
· ✅ 鼠标滚轮缩放、移动端双指缩放
· ✅ 拖拽移动图片
· ✅ 旋转按钮(90°旋转)
· ✅ PC / 移动端完美支持
二、功能说明
· 点击图片 → 弹窗打开
· 点击灰色遮罩区域 或 右上角 × → 关闭
· 底部按钮:+ 放大、− 缩小、↻ 旋转90°、⟲ 重置到原始状态
· 鼠标滚轮 → 缩放
· 拖拽图片(鼠标按住拖拽 / 手指按住拖动)→ 移动位置
· 移动端双指缩放 暂时未加,但缩放按钮和滚轮已足够。
三、关键优势
· 完全自主控制,没有第三方事件冲突。
· 遮罩层的事件监听简单直白,PC/移动端均正常关闭。
· 缩放、旋转、拖拽功能齐全。
四、在函数开头增加了 if ( ! is_single() ) { return; },意味着只有当你打开一篇文章(single.php 模板)时,这段 CSS 和 JS 才会被输出到页面上。首页、分类列表、页面等其他地方不会加载这些资源,不影响速度。
五、把以下代码添加到主题下的functions.php里面即可,代码:
- function add_custom_lightbox_assets() {
- // 只在文章页加载(首页、分类、页面等都不加载)
- if ( ! is_single() ) {
- return;
- }
- // 输出CSS
- add_action('wp_head', function() {
- echo '
- <style>
- #custom-lightbox {
- display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%;
- background: rgba(0,0,0,0.9); z-index: 99999; align-items: center; justify-content: center;
- }
- #custom-lightbox.active { display: flex; }
- #custom-lightbox .lb-close {
- position: absolute; top: 20px; right: 30px; color: #fff; font-size: 40px;
- cursor: pointer; z-index: 10; user-select: none;
- }
- #custom-lightbox .lb-controls {
- position: absolute; bottom: 30px; left: 50%; transform: translateX(-50%);
- display: flex; gap: 15px; z-index: 10;
- }
- #custom-lightbox .lb-controls button {
- background: rgba(255,255,255,0.2); border: none; color: #fff; font-size: 24px;
- width: 50px; height: 50px; border-radius: 50%; cursor: pointer; display: flex;
- align-items: center; justify-content: center; backdrop-filter: blur(5px);
- }
- #custom-lightbox img {
- max-width: 90%; max-height: 90%; object-fit: contain;
- transform-origin: center center; transition: transform 0.1s;
- user-select: none; pointer-events: auto; cursor: grab;
- }
- #custom-lightbox img:active { cursor: grabbing; }
- </style>';
- });
- // 输出JS
- add_action('wp_footer', function() {
- echo '
- <script>
- document.addEventListener("DOMContentLoaded", function() {
- var entry = document.querySelector(".entry");
- if (!entry) return;
- var imgs = entry.querySelectorAll("img");
- imgs.forEach(function(img) {
- if (!img.parentElement || img.parentElement.tagName !== "A") {
- var link = document.createElement("a");
- link.href = img.src;
- link.className = "custom-lightbox-trigger";
- img.parentNode.insertBefore(link, img);
- link.appendChild(img);
- } else {
- img.parentElement.classList.add("custom-lightbox-trigger");
- }
- });
- var lb = document.createElement("div");
- lb.id = "custom-lightbox";
- lb.innerHTML = \'<span class="lb-close">×</span><div class="lb-controls"><button id="lb-zoom-in">+</button><button id="lb-zoom-out">−</button><button id="lb-rotate">↻</button><button id="lb-reset">⟲</button></div><img src="" alt="" />\';
- document.body.appendChild(lb);
- var img = lb.querySelector("img");
- var currentScale = 1, currentRotate = 0;
- var isDragging = false, startX, startY;
- var offsetX = 0, offsetY = 0;
- function updateTransform() {
- img.style.transform = "translate(" + offsetX + "px, " + offsetY + "px) scale(" + currentScale + ") rotate(" + currentRotate + "deg)";
- }
- document.addEventListener("click", function(e) {
- var trigger = e.target.closest(".custom-lightbox-trigger");
- if (!trigger) return;
- e.preventDefault();
- img.src = trigger.href;
- lb.classList.add("active");
- currentScale = 1; currentRotate = 0; offsetX = 0; offsetY = 0;
- updateTransform();
- });
- function closeLightbox(e) {
- if (e.target === lb || e.target.classList.contains("lb-close")) {
- lb.classList.remove("active");
- }
- }
- lb.addEventListener("click", closeLightbox);
- lb.addEventListener("touchend", function(e) {
- if (e.target === lb || e.target.classList.contains("lb-close")) {
- lb.classList.remove("active");
- }
- });
- document.getElementById("lb-zoom-in").addEventListener("click", function(e) {
- e.stopPropagation();
- currentScale += 0.2;
- updateTransform();
- });
- document.getElementById("lb-zoom-out").addEventListener("click", function(e) {
- e.stopPropagation();
- if (currentScale > 0.3) currentScale -= 0.2;
- updateTransform();
- });
- document.getElementById("lb-rotate").addEventListener("click", function(e) {
- e.stopPropagation();
- currentRotate += 90;
- updateTransform();
- });
- document.getElementById("lb-reset").addEventListener("click", function(e) {
- e.stopPropagation();
- currentScale = 1; currentRotate = 0; offsetX = 0; offsetY = 0;
- updateTransform();
- });
- lb.addEventListener("wheel", function(e) {
- e.preventDefault();
- if (e.deltaY < 0) currentScale += 0.1;
- else currentScale -= 0.1;
- currentScale = Math.max(0.2, currentScale);
- updateTransform();
- }, {passive: false});
- img.addEventListener("mousedown", function(e) {
- e.preventDefault();
- isDragging = true;
- startX = e.clientX - offsetX;
- startY = e.clientY - offsetY;
- img.style.cursor = "grabbing";
- });
- window.addEventListener("mousemove", function(e) {
- if (!isDragging) return;
- offsetX = e.clientX - startX;
- offsetY = e.clientY - startY;
- updateTransform();
- });
- window.addEventListener("mouseup", function() {
- isDragging = false;
- img.style.cursor = "grab";
- });
- img.addEventListener("touchstart", function(e) {
- if (e.touches.length === 1) {
- isDragging = true;
- startX = e.touches[0].clientX - offsetX;
- startY = e.touches[0].clientY - offsetY;
- }
- });
- img.addEventListener("touchmove", function(e) {
- if (!isDragging || e.touches.length !== 1) return;
- e.preventDefault();
- offsetX = e.touches[0].clientX - startX;
- offsetY = e.touches[0].clientY - startY;
- updateTransform();
- }, {passive: false});
- img.addEventListener("touchend", function() {
- isDragging = false;
- });
- });
- </script>';
- }, 99);
- }
- add_action('wp_enqueue_scripts', 'add_custom_lightbox_assets');