Book_system/app/static/js/inventory-book-logs.js
superlishunqin 29914a4178 0506
2025-05-06 12:01:11 +08:00

264 lines
8.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 冰雪奇缘风格的图书库存日志页面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);