GuardImageOverlay.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. <template>
  2. <div class="guard-overlay">
  3. <div class="guard-top-mask" aria-hidden="true" />
  4. <div class="guard-content">
  5. <div class="guard-badge">
  6. <img class="avatar" :src="avatarUrl" alt="" />
  7. <span class="level">{{ levelText }}</span>
  8. <span class="link" @click.stop="goGuardList">守护列表</span>
  9. </div>
  10. <div class="guard-bottom">
  11. <div class="date-block">
  12. <div class="month">{{ monthLabel }}</div>
  13. <div class="day-row">
  14. <span class="day">{{ dayLabel }}</span>
  15. <span class="total">/{{ daysInMonth }}</span>
  16. </div>
  17. </div>
  18. <div class="greeting-block">
  19. <div class="title">{{ greetingTitle }}</div>
  20. <div class="quote">不必在意他人目光与期待</div>
  21. <div class="quote">想着自己的方向前进即可</div>
  22. </div>
  23. </div>
  24. </div>
  25. </div>
  26. </template>
  27. <script setup lang="ts">
  28. import { computed } from 'vue'
  29. import { useRouter } from 'vue-router'
  30. import { GUARD_DEMO_IMAGES } from '@/mock/homeData'
  31. const props = defineProps({
  32. level: { type: String, default: '18级-经管' },
  33. })
  34. const router = useRouter()
  35. const levelText = computed(() => props.level)
  36. const MONTH_NAMES = [
  37. 'January',
  38. 'February',
  39. 'March',
  40. 'April',
  41. 'May',
  42. 'June',
  43. 'July',
  44. 'August',
  45. 'September',
  46. 'October',
  47. 'November',
  48. 'December',
  49. ]
  50. const avatarUrl = GUARD_DEMO_IMAGES[0]
  51. const now = new Date()
  52. const monthLabel = computed(() => MONTH_NAMES[now.getMonth()])
  53. const dayLabel = computed(() => now.getDate())
  54. const daysInMonth = computed(() =>
  55. new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate(),
  56. )
  57. const greetingTitle = computed(() => {
  58. const hour = now.getHours()
  59. if (hour < 12) return '早安,你好'
  60. if (hour < 18) return '午安,你好'
  61. return '晚安,你好'
  62. })
  63. function goGuardList() {
  64. router.push('/guard-list')
  65. }
  66. </script>
  67. <style scoped lang="less">
  68. .guard-overlay {
  69. position: absolute;
  70. inset: 0;
  71. z-index: 2;
  72. pointer-events: none;
  73. .guard-top-mask {
  74. position: absolute;
  75. top: 0;
  76. left: 0;
  77. right: 0;
  78. height: calc(var(--home-header-height) + 150rem);
  79. pointer-events: none;
  80. background: linear-gradient(
  81. 180deg,
  82. rgba(0, 0, 0, 0.67) 0%,
  83. rgba(0, 0, 0, 0.4) 45%,
  84. rgba(0, 0, 0, 0) 100%
  85. );
  86. z-index: 1;
  87. }
  88. .guard-content {
  89. position: relative;
  90. z-index: 2;
  91. height: 100%;
  92. box-sizing: border-box;
  93. padding:
  94. calc(var(--home-header-height) + 18rem)
  95. 12rem
  96. calc(var(--footer-safe-bottom) + 8rem);
  97. pointer-events: none;
  98. .guard-badge {
  99. display: inline-flex;
  100. align-items: center;
  101. gap: 5rem;
  102. padding: 2rem 10rem 2rem 4rem;
  103. border-radius: 25rem;
  104. background: rgba(0, 0, 0, 0.45);
  105. pointer-events: auto;
  106. color: #fff;
  107. .avatar {
  108. width: 32rem;
  109. height: 32rem;
  110. border-radius: 50%;
  111. object-fit: cover;
  112. }
  113. .link {
  114. color: #ff8400;
  115. }
  116. }
  117. .guard-bottom {
  118. display: flex;
  119. align-items: center;
  120. justify-content: space-between;
  121. gap: 20rem;
  122. margin-top: 16rem;
  123. .date-block {
  124. color: #fff;
  125. font-family: 'Times New Roman', 'Songti SC', 'STSong', serif;
  126. .month {
  127. font-size: 16rem;
  128. margin-bottom: -5rem;
  129. }
  130. .day-row {
  131. display: flex;
  132. align-items: flex-end;
  133. }
  134. .day {
  135. font-size: 85rem;
  136. font-weight: 700;
  137. }
  138. .total {
  139. font-size: 23rem;
  140. margin-bottom: 15rem;
  141. }
  142. }
  143. .greeting-block {
  144. text-align: right;
  145. color: #fff;
  146. .title {
  147. font-size: 19rem;
  148. font-weight: 700;
  149. margin-bottom: 6rem;
  150. font-family: 'Times New Roman', 'Songti SC', 'STSong', serif;
  151. }
  152. .quote {
  153. font-size: 12rem;
  154. line-height: 1.6;
  155. font-weight: 700;
  156. font-family: 'Times New Roman', 'Songti SC', 'STSong', serif;
  157. }
  158. }
  159. }
  160. }
  161. }
  162. </style>