正在显示
1 个修改的文件
包含
79 行增加
和
53 行删除
| @@ -5,25 +5,30 @@ | @@ -5,25 +5,30 @@ | ||
| 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> | 25 | </div> |
| 26 | 26 | ||
| 27 | + <!-- 放大居中图片 --> | ||
| 28 | + <div v-show="closeImg" class="fixed-img-box" :style="{ opacity: fixedOpacity }"> | ||
| 29 | + <img :src="fixedImg" class="fixed-img" /> | ||
| 30 | + </div> | ||
| 31 | + | ||
| 27 | <!-- 翻页按钮 --> | 32 | <!-- 翻页按钮 --> |
| 28 | <button | 33 | <button |
| 29 | v-show="queryParams.pageNum > 1" | 34 | v-show="queryParams.pageNum > 1" |
| @@ -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; |
-
请 注册 或 登录 后发表评论