最後活躍 1 day ago

修訂 3f301a696c1229258e0d526a7c9c60c466135423

留言界面js 原始檔案
1function initPages() {
2 const cards = document.querySelectorAll('.animate-card');
3 const wrapper = document.querySelector('.animation-wrapper');
4 const finalCard = document.querySelector('.final-card')
5 const newest_comment=loadData("newest_comment",10)
6 // 定义所有可能的飞入动画
7 const flyAnimations = [
8 'flyFromTopLeft',
9 'flyFromTopRight',
10 'flyFromBottomLeft',
11 'flyFromBottomRight',
12 'flyFromLeft',
13 'flyFromRight',
14 'flyFromTop',
15 'flyFromBottom'
16 ]
17 if (newest_comment === null || newest_comment.length <=0){
18 fillFakeCard(flyAnimations,wrapper,finalCard)
19 return
20 }
21 // 初始化动画卡片
22 for (let i = 0; i < newest_comment.length; i++) {
23 const item = newest_comment[i]
24 const card_container =document.createElement("div")
25 const card_ = getRandomCard()
26 card_container.classList.add("message-container",'animate-card',card_)
27 card_container.innerHTML = `
28 <div class="fake-content">
29 <div class="fake-image"><img src="${item.avatar}" alt=""></div>
30 <div class="fake-text">
31 <div class="fake-title">${item.nick}</div>
32 <div class="fake-lines">
33 <div class="fake-line">${removeHTMLTags(item.content)}</div>
34 <div class="fake-line">${formatDateTime(new Date(item.date))}</div>
35 </div>
36 </div>
37 </div>
38 `
39 // wrapper.append(card_container)
40 const baseColor = getRandomPastelColor();
41 const contrastColor = getContrastColor(baseColor);
42 card_container.style.backgroundColor = baseColor.toString();
43 const fakeContent = card_container.querySelector('.fake-content');
44 if (fakeContent) {
45 fakeContent.style.backgroundColor = contrastColor;
46
47 // 为内部元素设置基础颜色(形成反向对比)
48 const elements = fakeContent.querySelectorAll('.fake-image, .fake-title, .fake-line');
49 elements.forEach(element => {
50 element.style.backgroundColor = baseColor.toString();
51 });
52 }
53 const randomAnimation = flyAnimations[Math.floor(Math.random() * flyAnimations.length)];
54 const delay = i * 0.2;
55 card_container.style.animationDelay = `${delay}s`;
56 card_container.style.animationName = randomAnimation;
57 card_container.addEventListener('animationend', function() {
58 this.style.animation = 'none';
59
60 const position = getRandomPosition(this,wrapper);
61 const rotation = (Math.random() - 0.5) * 40;
62 const scale = 0.8 + Math.random() * 0.4;
63
64 this.style.position = 'absolute';
65 this.style.left = position.x + 'px';
66 this.style.top = position.y + 'px';
67 this.style.transform = `rotate(${rotation}deg) scale(${scale})`;
68 this.style.transition = 'all 0.3s ease';
69 this.style.opacity = '1';
70 this.style.visibility = 'visible';
71
72 // 添加鼠标悬停效果
73 this.addEventListener('mouseover', function() {
74 this.style.transform = `rotate(${rotation}deg) scale(${scale * 1.15})`; // 增加放大倍数
75 this.style.boxShadow = '0 10px 25px rgba(0,0,0,0.15)'; // 增加阴影
76 this.style.zIndex = '81';
77 this.style.cursor = 'pointer';
78 this.style.transition = 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'; // 添加平滑过渡
79 // 隐藏final-card
80 finalCard.style.visibility = 'hidden';
81 });
82
83 // 添加鼠标移出效果
84 this.addEventListener('mouseout', function() {
85 this.style.transform = `rotate(${rotation}deg) scale(${scale})`;
86 this.style.boxShadow = '0 4px 15px rgba(0,0,0,0.06)';
87 this.style.zIndex = '80'; // 恢复原来的层级
88 this.style.cursor = 'default';
89 this.style.transition = 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)';
90 // 显示final-card
91 finalCard.style.visibility = 'visible';
92 });
93 });
94 wrapper.append(card_container)
95 }
96}
97
98function getRandomCard() {
99 const cards = ["card-1","card-2","card-3","card-4","card-5","card-6","card-7","card-8","card-9","card-10"];
100 return cards[Math.floor(Math.random() * cards.length)];
101}
102
103function getRandomPastelColor() {
104 return {
105 hue: Math.floor(Math.random() * 360),
106 saturation: 40 + Math.random() * 20,
107 lightness: 92 + Math.random() * 6,
108 toString() {
109 return `hsl(${this.hue}, ${this.saturation}%, ${this.lightness}%)`;
110 }
111 };
112}
113
114function formatDateTime(date) {
115 var y = date.getFullYear();
116 var m = date.getMonth() + 1;
117 m = m < 10 ? ('0' + m) : m;
118 var d = date.getDate();
119 d = d < 10 ? ('0' + d) : d;
120 var h = date.getHours();
121 h = h < 10 ? ('0' + h) : h;
122 var minute = date.getMinutes();
123 minute = minute < 10 ? ('0' + minute) : minute;
124 var second = date.getSeconds();
125 second = second < 10 ? ('0' + second) : second;
126 return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
127}
128
129function fillFakeCard(flyAnimations,wrapper,finalCard) {
130 const number = 10
131 for (let i = 0; i < number; i++) {
132 const card_container =document.createElement("div")
133 const card_ = getRandomCard()
134 card_container.classList.add("message-container",'animate-card',card_)
135 card_container.innerHTML = `
136 <div class="fake-content">
137 <div class="fake-image"></div>
138 <div class="fake-text">
139 <div class="fake-title"></div>
140 <div class="fake-lines">
141 <div class="fake-line"></div>
142 <div class="fake-line"></div>
143 </div>
144 </div>
145 </div>
146 `
147 const baseColor = getRandomPastelColor();
148 const contrastColor = getContrastColor(baseColor);
149
150 // 设置卡片背景色
151 card_container.style.backgroundColor = baseColor.toString();
152
153 // 为内容区域设置对比色
154 const fakeContent = card_container.querySelector('.fake-content');
155 if (fakeContent) {
156 fakeContent.style.backgroundColor = contrastColor;
157
158 // 为内部元素设置基础颜色(形成反向对比)
159 const elements = fakeContent.querySelectorAll('.fake-image, .fake-title, .fake-line');
160 elements.forEach(element => {
161 element.style.backgroundColor = baseColor.toString();
162 });
163 }
164
165 // 随机选择一个飞入动画
166 const randomAnimation = flyAnimations[Math.floor(Math.random() * flyAnimations.length)];
167 const delay = i * 0.2;
168 card_container.style.animationDelay = `${delay}s`;
169 card_container.style.animationName = randomAnimation;
170
171 card_container.addEventListener('animationend', function() {
172 this.style.animation = 'none';
173
174 const position = getRandomPosition(this,wrapper);
175 const rotation = (Math.random() - 0.5) * 40;
176 const scale = 0.8 + Math.random() * 0.4;
177
178 this.style.position = 'absolute';
179 this.style.left = position.x + 'px';
180 this.style.top = position.y + 'px';
181 this.style.transform = `rotate(${rotation}deg) scale(${scale})`;
182 this.style.transition = 'all 0.3s ease';
183 this.style.opacity = '1';
184 this.style.visibility = 'visible';
185
186 // 添加鼠标悬停效果
187 this.addEventListener('mouseover', function() {
188 this.style.transform = `rotate(${rotation}deg) scale(${scale * 1.15})`; // 增加放大倍数
189 this.style.boxShadow = '0 10px 25px rgba(0,0,0,0.15)'; // 增加阴影
190 this.style.zIndex = '2002';
191 this.style.cursor = 'pointer';
192 this.style.transition = 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)'; // 添加平滑过渡
193 // 隐藏final-card
194 finalCard.style.visibility = 'hidden';
195 });
196
197 // 添加鼠标移出效果
198 this.addEventListener('mouseout', function() {
199 this.style.transform = `rotate(${rotation}deg) scale(${scale})`;
200 this.style.boxShadow = '0 4px 15px rgba(0,0,0,0.06)';
201 this.style.zIndex = '1001'; // 恢复原来的层级
202 this.style.cursor = 'default';
203 this.style.transition = 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)';
204 // 显示final-card
205 finalCard.style.visibility = 'visible';
206 });
207 });
208 wrapper.append(card_container)
209 }
210
211}
212
213function removeHTMLTags(str) {
214 return str.replace(/<[^>]*>/g, ' ');
215}
216
217function getRandomPosition(element,wrapper) {
218 const wrapperRect = wrapper.getBoundingClientRect();
219 const elementRect = element.getBoundingClientRect();
220
221 const maxX = wrapperRect.width - elementRect.width;
222 const maxY = wrapperRect.height - elementRect.height;
223
224 const randomX = Math.random() * maxX;
225 const randomY = Math.random() * maxY;
226
227 return { x: randomX, y: randomY };
228}
229function getContrastColor(baseColor) {
230 const contrastHue = (baseColor.hue + 180) % 360;
231 const contrastSaturation = Math.min(baseColor.saturation + 10, 60);
232 const contrastLightness = Math.max(baseColor.lightness - 8, 85);
233 return `hsl(${contrastHue}, ${contrastSaturation}%, ${contrastLightness}%)`;
234}
235
236
237// 取数据
238function loadData(name, time) {
239 let d = JSON.parse(localStorage.getItem(name));
240 // 过期或有错误返回 0 否则返回数据
241 if (d) {
242 let t = Date.now() - d.time
243 if (-1 < t && t < (time * 60000)) return d.data;
244 }
245 return null;
246};
247
248function init(){
249 const path = window.location.pathname;
250 if (path === '/messages/') {
251 initPages()
252 }else {
253 return
254 }
255}
256init()