作者 xiaoqiu

添加了手动输入服务地址功能,然后键盘J键弹出,优化了图片显示

@@ -5,23 +5,28 @@ @@ -5,23 +5,28 @@
5 @click="handleOther" 5 @click="handleOther"
6 > 6 >
7 <!-- 相册展开大小 容器 --> 7 <!-- 相册展开大小 容器 -->
8 - <div id="dragBox"> 8 + <div id="dragBox" ref="dragBoxDom">
  9 + <!-- 每一层容器 -->
9 <div 10 <div
10 v-for="(item, index) in spanBoxList" 11 v-for="(item, index) in spanBoxList"
11 :key="index" 12 :key="index"
12 class="spinBox" 13 class="spinBox"
13 :id="`spinBox${index + 1}`" 14 :id="`spinBox${index + 1}`"
14 > 15 >
  16 + <!-- 每层的图片 -->
15 <img 17 <img
16 v-for="(childen, number) in item" 18 v-for="(childen, number) in item"
17 :src="childen" 19 :src="childen"
  20 + alt="图片"
18 @click.stop="handleClick($event, childen)" 21 @click.stop="handleClick($event, childen)"
19 /> 22 />
20 </div> 23 </div>
21 - <div v-show="closeImg" class="fixed-img" :style="{ opacity: fixedOpacity }">  
22 - <img :src="fixedImg" />  
23 </div> 24 </div>
24 </div> 25 </div>
  26 +
  27 + <!-- 放大居中图片 -->
  28 + <div v-show="closeImg" class="fixed-img-box" :style="{ opacity: fixedOpacity }">
  29 + <img :src="fixedImg" class="fixed-img" />
25 </div> 30 </div>
26 31
27 <!-- 翻页按钮 --> 32 <!-- 翻页按钮 -->
@@ -44,12 +49,11 @@ import { ElMessage, ElMessageBox } from 'element-plus' @@ -44,12 +49,11 @@ import { ElMessage, ElMessageBox } from 'element-plus'
44 import { getSignatureList, getUseBg } from '@/api/signature' 49 import { getSignatureList, getUseBg } from '@/api/signature'
45 let imgList = import.meta.glob('../assets/img/*.*', { eager: true }) 50 let imgList = import.meta.glob('../assets/img/*.*', { eager: true })
46 let imgArr = Object.values(imgList).map((item) => item.default) 51 let imgArr = Object.values(imgList).map((item) => item.default)
47 -let spanBoxList = ref([])  
48 -let aEls = ref([]) 52 +let spanBoxList = ref([]) // 图片列表
  53 +let aEls = ref([]) // 图片元素
49 let radius = ref(760) 54 let radius = ref(760)
50 let bgImgUrl = ref('') 55 let bgImgUrl = ref('')
51 -const closeImg = ref(false) // 是否关闭中间图片  
52 -let outDom = ref(null) 56 +let dragBoxDom = ref(null) // 相册容器
53 let startX = ref(0) 57 let startX = ref(0)
54 let startY = ref(0) 58 let startY = ref(0)
55 let endX = ref(0) 59 let endX = ref(0)
@@ -58,6 +62,7 @@ let tX = ref(0) @@ -58,6 +62,7 @@ let tX = ref(0)
58 let tY = ref(30) 62 let tY = ref(30)
59 let desX = ref(0) 63 let desX = ref(0)
60 let desY = ref(0) 64 let desY = ref(0)
  65 +const closeImg = ref(false) // 是否显示中间图片
61 const queryParams = ref({ 66 const queryParams = ref({
62 pageNum: 1, 67 pageNum: 1,
63 pageSize: 60 68 pageSize: 60
@@ -65,6 +70,8 @@ const queryParams = ref({ @@ -65,6 +70,8 @@ const queryParams = ref({
65 const server_base = localStorage.getItem('crgx_server') 70 const server_base = localStorage.getItem('crgx_server')
66 const fixedImg = ref('') 71 const fixedImg = ref('')
67 const fixedOpacity = ref(0) 72 const fixedOpacity = ref(0)
  73 +
  74 +// 随机分布加载图片列表。仅测试使用,后端图片不够情况使用
68 function randomGroupWithRepeats(arr, groupCount, groupSize) { 75 function randomGroupWithRepeats(arr, groupCount, groupSize) {
69 // 参数校验 76 // 参数校验
70 if (!Array.isArray(arr) || arr.length === 0) { 77 if (!Array.isArray(arr) || arr.length === 0) {
@@ -110,7 +117,7 @@ function init(delayTime) { @@ -110,7 +117,7 @@ function init(delayTime) {
110 } 117 }
111 } 118 }
112 } 119 }
113 -// 获取图片 120 +// 获取图片元素
114 function getSpinBoxDom() { 121 function getSpinBoxDom() {
115 for (let i = 0; i < spanBoxList.value.length; i++) { 122 for (let i = 0; i < spanBoxList.value.length; i++) {
116 let spinDom = document.getElementById(`spinBox${i + 1}`) 123 let spinDom = document.getElementById(`spinBox${i + 1}`)
@@ -190,27 +197,28 @@ const openServer = () => { @@ -190,27 +197,28 @@ const openServer = () => {
190 } 197 }
191 198
192 onMounted(async () => { 199 onMounted(async () => {
  200 + // 判断是否需要填写服务器地址,本地没有则弹出,手动填写按下字母J
193 if (!localStorage.getItem('crgx_server')) { 201 if (!localStorage.getItem('crgx_server')) {
194 return openServer(true) 202 return openServer(true)
195 } 203 }
196 -  
197 - const signRes = await getSignatureList()  
198 - const bgRes = await getUseBg() 204 + getImgList()
  205 + const bgRes = await getUseBg() // 获取背景图片
199 bgImgUrl.value = server_base + bgRes.data.path 206 bgImgUrl.value = server_base + bgRes.data.path
200 - const imgList = signRes.rows?.map((item) => {  
201 - return `${server_base}${item.path}`  
202 - })  
203 - spanBoxList.value = randomGroupWithRepeats(imgList, 3, 20)  
204 let spinDom1 = document.getElementById('spinBox1') 207 let spinDom1 = document.getElementById('spinBox1')
205 getSpinBoxDom() 208 getSpinBoxDom()
206 - //相册容器  
207 - outDom.value = document.getElementById('dragBox')  
208 // 开始旋转动画 209 // 开始旋转动画
209 - setTimeout(() => { 210 + let timer = setTimeout(() => {
210 init() 211 init()
  212 + clearTimeout(timer)
211 }, 100) 213 }, 100)
212 //鼠标滚动事件 214 //鼠标滚动事件
213 document.addEventListener('mousewheel', handleMouseWheel) 215 document.addEventListener('mousewheel', handleMouseWheel)
  216 + // 监听键盘按下事件
  217 + document.addEventListener('keydown', (e) => {
  218 + if (e.key == 'j') {
  219 + openServer()
  220 + }
  221 + })
214 //暂停开始旋转 222 //暂停开始旋转
215 function playSpin(yes) { 223 function playSpin(yes) {
216 spinDom1.style.animationPlayState = yes ? 'running' : 'paused' 224 spinDom1.style.animationPlayState = yes ? 'running' : 'paused'
@@ -219,7 +227,7 @@ onMounted(async () => { @@ -219,7 +227,7 @@ onMounted(async () => {
219 //鼠标移动事件 227 //鼠标移动事件
220 document.onpointerdown = function (e) { 228 document.onpointerdown = function (e) {
221 //清除惯性定时器 229 //清除惯性定时器
222 - clearInterval(outDom.value.timer) 230 + clearInterval(dragBoxDom.value.timer)
223 e = e || ewindow.event 231 e = e || ewindow.event
224 //鼠标点击位置 232 //鼠标点击位置
225 ;(startX.value = e.clientX), (startY.value = e.clientY) 233 ;(startX.value = e.clientX), (startY.value = e.clientY)
@@ -234,22 +242,22 @@ onMounted(async () => { @@ -234,22 +242,22 @@ onMounted(async () => {
234 desY.value = endY.value - startY.value 242 desY.value = endY.value - startY.value
235 tX.value += desX.value * 0.1 243 tX.value += desX.value * 0.1
236 tY.value += desY.value * 0.1 244 tY.value += desY.value * 0.1
237 - changeRotate(outDom.value) 245 + changeRotate(dragBoxDom.value)
238 startX.value = endX.value 246 startX.value = endX.value
239 startY.value = endY.value 247 startY.value = endY.value
240 } 248 }
241 //鼠标离开时 开始自动旋转 249 //鼠标离开时 开始自动旋转
242 this.onpointerup = function (e) { 250 this.onpointerup = function (e) {
243 //惯性旋转 251 //惯性旋转
244 - outDom.value.timer = setInterval(function () { 252 + dragBoxDom.value.timer = setInterval(function () {
245 desX.value *= 0.95 253 desX.value *= 0.95
246 desY.value *= 0.95 254 desY.value *= 0.95
247 tX.value += desX.value * 0.1 255 tX.value += desX.value * 0.1
248 tY.value += desY.value * 0.1 256 tY.value += desY.value * 0.1
249 - changeRotate(outDom.value) 257 + changeRotate(dragBoxDom.value)
250 playSpin(false) 258 playSpin(false)
251 if (Math.abs(desX.value) < 0.5 && Math.abs(desY.value) < 0.5) { 259 if (Math.abs(desX.value) < 0.5 && Math.abs(desY.value) < 0.5) {
252 - clearInterval(outDom.value.timer) 260 + clearInterval(dragBoxDom.value.timer)
253 playSpin(true) 261 playSpin(true)
254 } 262 }
255 }) 263 })
@@ -259,8 +267,14 @@ onMounted(async () => { @@ -259,8 +267,14 @@ onMounted(async () => {
259 } 267 }
260 }) 268 })
261 269
  270 +// 销毁时候取消监听
262 onUnmounted(() => { 271 onUnmounted(() => {
263 document.removeEventListener('mousewheel', handleMouseWheel) 272 document.removeEventListener('mousewheel', handleMouseWheel)
  273 + document.removeEventListener('keydown', (e) => {
  274 + if (e.key == 'j') {
  275 + openServer()
  276 + }
  277 + })
264 }) 278 })
265 </script> 279 </script>
266 280
@@ -298,39 +312,16 @@ onUnmounted(() => { @@ -298,39 +312,16 @@ onUnmounted(() => {
298 transform: rotateX(-10deg); 312 transform: rotateX(-10deg);
299 } 313 }
300 314
301 -.fixed-img {  
302 - position: fixed;  
303 - top: 0;  
304 - background-color: #fff;  
305 - width: 180px;  
306 - height: 240px;  
307 - opacity: 0;  
308 - transform: scale(3) rotateY(180deg);  
309 - transition: all 0.5s ease-in-out;  
310 - img {  
311 - transform: rotateY(180deg);  
312 - }  
313 -}  
314 -  
315 #dragBox { 315 #dragBox {
316 transform: rotateX(-30deg); 316 transform: rotateX(-30deg);
317 } 317 }
318 -  
319 .spinBox { 318 .spinBox {
320 - width: 180px;  
321 - height: 240px; 319 + width: 190px;
  320 + height: 254px;
322 animation: spin 100s infinite linear; 321 animation: spin 100s infinite linear;
323 } 322 }
324 323
325 -@for $i from 2 through 7 {  
326 - $top-value: if($i % 2 == 0, 120% * math.div($i, 2), -120% * math.div($i - 1, 2));  
327 -  
328 - #spinBox#{$i} {  
329 - position: absolute;  
330 - top: $top-value;  
331 - }  
332 -}  
333 - 324 +// 每层图片样式
334 #dragBox img { 325 #dragBox img {
335 transform-style: preserve-3d; 326 transform-style: preserve-3d;
336 position: absolute; 327 position: absolute;
@@ -339,16 +330,50 @@ onUnmounted(() => { @@ -339,16 +330,50 @@ onUnmounted(() => {
339 width: 100%; 330 width: 100%;
340 height: 100%; 331 height: 100%;
341 background: #fff; 332 background: #fff;
342 - box-shadow: 0 0 8px #fff; 333 + border-radius: 10px;
  334 + box-shadow:
  335 + inset 0 -3em 3em rgba(0, 0, 0, 0.1),
  336 + 0 0 0 2px rgb(190, 190, 190),
  337 + 0.3em 0.3em 1em rgba(0, 0, 0, 0.3);
  338 + transition: border-radius 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
343 object-fit: contain; 339 object-fit: contain;
  340 +
344 /*倒影 */ 341 /*倒影 */
345 --webkit-box-reflect: below 10px linear-gradient(transparent, transparent, #0005); 342 --webkit-box-reflect: below 10px linear-gradient(transparent, transparent, #0005);
346 } 343 }
347 344
348 -#dragBox img:hover {  
349 - box-shadow: 0 0 15px #fff; 345 +// 中间显示图片样式
  346 +.fixed-img-box {
  347 + position: fixed;
  348 + top: 50%;
  349 + left: 50%;
  350 + background-color: #fff;
  351 + max-width: 220px;
  352 + height: auto;
  353 + opacity: 0;
  354 + transform: translate(-50%, -50%) scale(3) rotateY(180deg);
  355 + transition: all 0.5s ease-in-out;
  356 + img {
  357 + transform: rotateY(180deg);
  358 + width: 100%;
  359 + object-fit: contain;
  360 + }
  361 +}
  362 +
  363 +// 动态计算每一层的位置 每层间隔自身120%
  364 +@for $i from 2 through 7 {
  365 + $top-value: if($i % 2 == 0, 120% * math.div($i, 2), -120% * math.div($i - 1, 2));
  366 +
  367 + #spinBox#{$i} {
  368 + position: absolute;
  369 + top: $top-value;
  370 + }
350 } 371 }
351 372
  373 +// #dragBox img:hover {
  374 +// box-shadow: 0 0 15px #fff;
  375 +// }
  376 +
352 /*自动旋转 */ 377 /*自动旋转 */
353 @keyframes spin { 378 @keyframes spin {
354 from { 379 from {
@@ -360,6 +385,7 @@ onUnmounted(() => { @@ -360,6 +385,7 @@ onUnmounted(() => {
360 } 385 }
361 } 386 }
362 387
  388 +// 上下页按钮
363 .slick-prev-button, 389 .slick-prev-button,
364 .slick-next-button { 390 .slick-next-button {
365 position: absolute; 391 position: absolute;