264 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// 冰雪奇缘风格的图书库存日志页面JavaScript
 | 
						||
document.addEventListener('DOMContentLoaded', function() {
 | 
						||
 | 
						||
    // 雪花动画效果
 | 
						||
    createSnowflakes();
 | 
						||
 | 
						||
    // 表格行动画效果
 | 
						||
    animateTableRows();
 | 
						||
 | 
						||
    // 为表格行添加互动效果
 | 
						||
    addTableRowInteractions();
 | 
						||
 | 
						||
    // 添加书籍封面魔法效果
 | 
						||
    addBookCoverMagic();
 | 
						||
 | 
						||
    // 添加按钮魔法效果
 | 
						||
    addButtonMagic();
 | 
						||
 | 
						||
    // 响应式表格标签
 | 
						||
    makeTableResponsive();
 | 
						||
});
 | 
						||
 | 
						||
// 创建额外的雪花
 | 
						||
function createSnowflakes() {
 | 
						||
    const snowflakesContainer = document.querySelector('.snowflakes');
 | 
						||
    if (!snowflakesContainer) return;
 | 
						||
 | 
						||
    // 添加更多雪花,共30个
 | 
						||
    for (let i = 0; i < 20; i++) {
 | 
						||
        const snowflake = document.createElement('div');
 | 
						||
        snowflake.className = 'snowflake';
 | 
						||
        snowflake.textContent = ['❄', '❅', '❆'][Math.floor(Math.random() * 3)];
 | 
						||
 | 
						||
        // 随机位置和动画
 | 
						||
        const left = Math.random() * 100;
 | 
						||
        const animDuration = 8 + Math.random() * 10;
 | 
						||
        const animDelay = Math.random() * 5;
 | 
						||
        const fontSize = 0.8 + Math.random() * 1.2;
 | 
						||
 | 
						||
        snowflake.style.left = `${left}%`;
 | 
						||
        snowflake.style.animationDuration = `${animDuration}s`;
 | 
						||
        snowflake.style.animationDelay = `${animDelay}s`;
 | 
						||
        snowflake.style.fontSize = `${fontSize}em`;
 | 
						||
 | 
						||
        snowflakesContainer.appendChild(snowflake);
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
// 表格行动画效果
 | 
						||
function animateTableRows() {
 | 
						||
    const tableRows = document.querySelectorAll('.table-row');
 | 
						||
 | 
						||
    tableRows.forEach((row, index) => {
 | 
						||
        // 设置动画延迟,创建瀑布效果
 | 
						||
        row.style.animationDelay = `${index * 0.08}s`;
 | 
						||
        row.classList.add('fade-in');
 | 
						||
 | 
						||
        // 为入库和出库行添加不同的动画效果
 | 
						||
        if (row.dataset.type === 'in') {
 | 
						||
            row.classList.add('in-animation');
 | 
						||
        } else if (row.dataset.type === 'out') {
 | 
						||
            row.classList.add('out-animation');
 | 
						||
        }
 | 
						||
    });
 | 
						||
}
 | 
						||
 | 
						||
// 为表格行添加互动效果
 | 
						||
function addTableRowInteractions() {
 | 
						||
    const tableRows = document.querySelectorAll('.table-row');
 | 
						||
 | 
						||
    tableRows.forEach(row => {
 | 
						||
        // 点击高亮效果
 | 
						||
        row.addEventListener('click', function() {
 | 
						||
            // 移除其他行的选中状态
 | 
						||
            document.querySelectorAll('.table-row').forEach(r => {
 | 
						||
                r.classList.remove('selected-row');
 | 
						||
            });
 | 
						||
 | 
						||
            // 添加当前行的选中状态
 | 
						||
            this.classList.add('selected-row');
 | 
						||
 | 
						||
            // 添加闪光效果
 | 
						||
            const sparkle = document.createElement('div');
 | 
						||
            sparkle.className = 'row-sparkle';
 | 
						||
            this.appendChild(sparkle);
 | 
						||
 | 
						||
            // 移除闪光效果
 | 
						||
            setTimeout(() => {
 | 
						||
                sparkle.remove();
 | 
						||
            }, 800);
 | 
						||
        });
 | 
						||
 | 
						||
        // 鼠标悬停效果
 | 
						||
        row.addEventListener('mouseenter', function() {
 | 
						||
            // 添加冰晶效果
 | 
						||
            const iceEffect = document.createElement('div');
 | 
						||
            iceEffect.className = 'ice-effect';
 | 
						||
            this.appendChild(iceEffect);
 | 
						||
 | 
						||
            // 移除冰晶效果
 | 
						||
            this.addEventListener('mouseleave', function() {
 | 
						||
                iceEffect.remove();
 | 
						||
            }, { once: true });
 | 
						||
        });
 | 
						||
    });
 | 
						||
}
 | 
						||
 | 
						||
// 添加书籍封面魔法效果
 | 
						||
function addBookCoverMagic() {
 | 
						||
    const bookCover = document.querySelector('.book-cover');
 | 
						||
    const bookFrame = document.querySelector('.book-frame');
 | 
						||
 | 
						||
    if (bookCover && bookFrame) {
 | 
						||
        // 鼠标移动时添加3D效果
 | 
						||
        bookFrame.addEventListener('mousemove', function(e) {
 | 
						||
            const rect = this.getBoundingClientRect();
 | 
						||
            const x = e.clientX - rect.left;
 | 
						||
            const y = e.clientY - rect.top;
 | 
						||
 | 
						||
            const centerX = rect.width / 2;
 | 
						||
            const centerY = rect.height / 2;
 | 
						||
 | 
						||
            const deltaX = (x - centerX) / 20;
 | 
						||
            const deltaY = (y - centerY) / 20;
 | 
						||
 | 
						||
            bookCover.style.transform = `rotate(0deg) perspective(800px) rotateX(${-deltaY}deg) rotateY(${deltaX}deg)`;
 | 
						||
        });
 | 
						||
 | 
						||
        // 鼠标离开时恢复
 | 
						||
        bookFrame.addEventListener('mouseleave', function() {
 | 
						||
            bookCover.style.transform = 'rotate(3deg)';
 | 
						||
        });
 | 
						||
 | 
						||
        // 点击时添加闪光效果
 | 
						||
        bookFrame.addEventListener('click', function() {
 | 
						||
            const glow = document.querySelector('.book-glow');
 | 
						||
            glow.style.opacity = '1';
 | 
						||
            glow.style.background = 'radial-gradient(circle at 50% 50%, rgba(255, 255, 255, 0.8), rgba(173, 216, 230, 0) 70%)';
 | 
						||
 | 
						||
            setTimeout(() => {
 | 
						||
                glow.style.opacity = '0';
 | 
						||
            }, 500);
 | 
						||
        });
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
// 添加按钮魔法效果
 | 
						||
function addButtonMagic() {
 | 
						||
    const buttons = document.querySelectorAll('.frozen-btn');
 | 
						||
 | 
						||
    buttons.forEach(button => {
 | 
						||
        button.addEventListener('mouseenter', function() {
 | 
						||
            // 创建冰晶效果
 | 
						||
            const sparkles = document.createElement('div');
 | 
						||
            sparkles.className = 'btn-sparkles';
 | 
						||
            this.appendChild(sparkles);
 | 
						||
 | 
						||
            // 冰晶动画
 | 
						||
            for (let i = 0; i < 5; i++) {
 | 
						||
                const sparkle = document.createElement('div');
 | 
						||
                sparkle.className = 'btn-sparkle';
 | 
						||
                sparkle.style.left = `${Math.random() * 100}%`;
 | 
						||
                sparkle.style.top = `${Math.random() * 100}%`;
 | 
						||
                sparkle.style.animationDelay = `${Math.random() * 0.5}s`;
 | 
						||
                sparkles.appendChild(sparkle);
 | 
						||
            }
 | 
						||
        });
 | 
						||
 | 
						||
        button.addEventListener('mouseleave', function() {
 | 
						||
            const sparkles = this.querySelector('.btn-sparkles');
 | 
						||
            if (sparkles) {
 | 
						||
                sparkles.remove();
 | 
						||
            }
 | 
						||
        });
 | 
						||
    });
 | 
						||
}
 | 
						||
 | 
						||
// 响应式表格
 | 
						||
function makeTableResponsive() {
 | 
						||
    if (window.innerWidth <= 768) {
 | 
						||
        const headerCells = document.querySelectorAll('.th-frozen');
 | 
						||
        const headers = Array.from(headerCells).map(cell => cell.textContent);
 | 
						||
 | 
						||
        const dataCells = document.querySelectorAll('.td-frozen');
 | 
						||
 | 
						||
        dataCells.forEach((cell, index) => {
 | 
						||
            const headerIndex = index % headers.length;
 | 
						||
            cell.setAttribute('data-label', headers[headerIndex]);
 | 
						||
        });
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
// 创建额外CSS样式
 | 
						||
function addExtraStyles() {
 | 
						||
    const styleSheet = document.createElement('style');
 | 
						||
    styleSheet.type = 'text/css';
 | 
						||
    styleSheet.innerHTML = `
 | 
						||
        .row-sparkle {
 | 
						||
            position: absolute;
 | 
						||
            top: 0;
 | 
						||
            left: 0;
 | 
						||
            width: 100%;
 | 
						||
            height: 100%;
 | 
						||
            background: linear-gradient(to right, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.1));
 | 
						||
            pointer-events: none;
 | 
						||
            animation: rowSparkle 0.8s ease forwards;
 | 
						||
        }
 | 
						||
        
 | 
						||
        @keyframes rowSparkle {
 | 
						||
            0% { transform: translateX(-100%); }
 | 
						||
            100% { transform: translateX(100%); }
 | 
						||
        }
 | 
						||
        
 | 
						||
        .ice-effect {
 | 
						||
            position: absolute;
 | 
						||
            top: 0;
 | 
						||
            left: 0;
 | 
						||
            width: 100%;
 | 
						||
            height: 100%;
 | 
						||
            background: linear-gradient(135deg, rgba(255, 255, 255, 0), rgba(173, 216, 230, 0.1), rgba(255, 255, 255, 0));
 | 
						||
            pointer-events: none;
 | 
						||
            backdrop-filter: brightness(1.03);
 | 
						||
        }
 | 
						||
        
 | 
						||
        .btn-sparkles {
 | 
						||
            position: absolute;
 | 
						||
            inset: 0;
 | 
						||
            overflow: hidden;
 | 
						||
            pointer-events: none;
 | 
						||
        }
 | 
						||
        
 | 
						||
        .btn-sparkle {
 | 
						||
            position: absolute;
 | 
						||
            width: 10px;
 | 
						||
            height: 10px;
 | 
						||
            border-radius: 50%;
 | 
						||
            background-color: rgba(255, 255, 255, 0.8);
 | 
						||
            pointer-events: none;
 | 
						||
            animation: btnSparkle 1s ease infinite;
 | 
						||
        }
 | 
						||
        
 | 
						||
        @keyframes btnSparkle {
 | 
						||
            0%, 100% { transform: scale(0); opacity: 0; }
 | 
						||
            50% { transform: scale(1); opacity: 1; }
 | 
						||
        }
 | 
						||
        
 | 
						||
        .in-animation {
 | 
						||
            border-left: 3px solid rgba(3, 169, 244, 0.5);
 | 
						||
        }
 | 
						||
        
 | 
						||
        .out-animation {
 | 
						||
            border-left: 3px solid rgba(255, 152, 0, 0.5);
 | 
						||
        }
 | 
						||
    `;
 | 
						||
 | 
						||
    document.head.appendChild(styleSheet);
 | 
						||
}
 | 
						||
 | 
						||
// 初始化额外样式
 | 
						||
addExtraStyles();
 | 
						||
 | 
						||
// 窗口大小变化时重新调整
 | 
						||
window.addEventListener('resize', makeTableResponsive);
 |