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);
|