Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

48 linhas
2.2 KiB

  1. <template>
  2. <!--
  3. 工具页 Hero 右侧的「前后对比」示例卡片。
  4. 动漫头像 / 老照片 / 形象照三个页面共用这一个组件,保证切页时示例卡片位置和尺寸完全重叠
  5. (尺寸:190×142,lg 下 200×150;hero 内边距 py-10 = 80px,加 200px 与其它页 hero 等高)。
  6. -->
  7. <div
  8. class="cursor-pointer lg:w-[200px]"
  9. role="button"
  10. :aria-label="`查看${afterLabel}效果对比`"
  11. tabindex="0"
  12. @click="emit('open')"
  13. @keydown.enter.prevent="emit('open')"
  14. @keydown.space.prevent="emit('open')"
  15. >
  16. <div class="relative mx-auto h-[190px] w-[142px] overflow-hidden rounded-[28px] bg-[var(--c-dfe8f4)] shadow-[0_18px_38px_var(--sh-31-62-112-180)] lg:h-[200px] lg:w-[150px]">
  17. <!--
  18. 两张图必须落在同一个盒子里、用同一套 object-fit 参数,再用 clip-path 裁掉原图右半边,
  19. 这样左右两半才是同一处画面的前后对照(写法与大图对比弹层一致)。
  20. 早先把原图塞进半宽容器 + 固定像素宽度,两张图的缩放基准不同,人物就会错位。
  21. -->
  22. <img :src="after" class="absolute inset-0 h-full w-full object-cover" :alt="`${afterLabel}示例`">
  23. <img
  24. :src="before"
  25. class="absolute inset-0 h-full w-full object-cover"
  26. style="clip-path: inset(0 50% 0 0)"
  27. :alt="`${beforeLabel}示例`"
  28. >
  29. <div class="absolute bottom-0 left-1/2 top-0 -ml-px w-0.5 bg-[var(--c-ffffff)]/95 shadow-[0_0_12px_var(--sh-20-37-66-220)]" />
  30. <div class="absolute left-3 top-3 rounded-full bg-[var(--c-0f172a)]/50 px-2 py-0.5 text-[10px] font-bold text-white">{{ beforeLabel }}</div>
  31. <div class="absolute right-3 top-3 rounded-full bg-[var(--c-0f172a)]/50 px-2 py-0.5 text-[10px] font-bold text-white">{{ afterLabel }}</div>
  32. </div>
  33. </div>
  34. </template>
  35. <script setup>
  36. defineProps({
  37. /** 原图 */
  38. before: { type: String, required: true },
  39. /** 效果图 */
  40. after: { type: String, required: true },
  41. beforeLabel: { type: String, default: '原图' },
  42. /** 效果图角标:动漫 / 修复 / 艺术 */
  43. afterLabel: { type: String, default: '效果' },
  44. })
  45. const emit = defineEmits(['open'])
  46. </script>