feat(PointsCollector): 添加响应式高度适配平板设备
为PointsCollector组件添加响应式高度计算逻辑,根据设备类型调整容器高度和中心圆位置
Showing
1 changed file
with
38 additions
and
3 deletions
| ... | @@ -6,7 +6,7 @@ | ... | @@ -6,7 +6,7 @@ |
| 6 | </view> | 6 | </view> |
| 7 | 7 | ||
| 8 | <!-- 积分收集器主体 --> | 8 | <!-- 积分收集器主体 --> |
| 9 | - <view class="points-collector" :style="{ height: height }"> | 9 | + <view class="points-collector" :style="{ height: responsiveHeight }"> |
| 10 | 10 | ||
| 11 | <!-- 中心圆形显示总积分 --> | 11 | <!-- 中心圆形显示总积分 --> |
| 12 | <view class="center-circle"> | 12 | <view class="center-circle"> |
| ... | @@ -83,6 +83,24 @@ const floatingItems = ref([]) // 漂浮的积分项 | ... | @@ -83,6 +83,24 @@ const floatingItems = ref([]) // 漂浮的积分项 |
| 83 | const isCollecting = ref(false) // 是否正在收集,防止重复触发 | 83 | const isCollecting = ref(false) // 是否正在收集,防止重复触发 |
| 84 | 84 | ||
| 85 | /** | 85 | /** |
| 86 | + * 计算响应式容器高度 | ||
| 87 | + */ | ||
| 88 | +const responsiveHeight = computed(() => { | ||
| 89 | + const { windowWidth, windowHeight } = Taro.getWindowInfo(); | ||
| 90 | + | ||
| 91 | + // iPad和平板设备检测 | ||
| 92 | + const isTablet = windowWidth >= 768 || (windowWidth > windowHeight && windowWidth >= 1024); | ||
| 93 | + | ||
| 94 | + if (isTablet) { | ||
| 95 | + // 平板设备使用更保守的高度,确保圆圈不被切掉 | ||
| 96 | + return Math.min(windowHeight * 0.6, 600) + 'px'; | ||
| 97 | + } else { | ||
| 98 | + // 手机设备使用传入的height或默认值 | ||
| 99 | + return props.height; | ||
| 100 | + } | ||
| 101 | +}) | ||
| 102 | + | ||
| 103 | +/** | ||
| 86 | * 根据数值长度动态计算字体大小 | 104 | * 根据数值长度动态计算字体大小 |
| 87 | */ | 105 | */ |
| 88 | const dynamicFontSize = computed(() => { | 106 | const dynamicFontSize = computed(() => { |
| ... | @@ -187,7 +205,7 @@ const generatePointsData = () => { | ... | @@ -187,7 +205,7 @@ const generatePointsData = () => { |
| 187 | 205 | ||
| 188 | // 检查与中心禁飞区的距离 | 206 | // 检查与中心禁飞区的距离 |
| 189 | const dxCenter = x - 50; | 207 | const dxCenter = x - 50; |
| 190 | - const dyCenter = y - 75; // 中心点在75% | 208 | + const dyCenter = y - 65; // 更新中心点位置为65% |
| 191 | const distanceFromCenter = Math.sqrt(dxCenter * dxCenter + dyCenter * dyCenter); | 209 | const distanceFromCenter = Math.sqrt(dxCenter * dxCenter + dyCenter * dyCenter); |
| 192 | if (distanceFromCenter < centerNoFlyZone) { | 210 | if (distanceFromCenter < centerNoFlyZone) { |
| 193 | hasCollision = true; | 211 | hasCollision = true; |
| ... | @@ -476,7 +494,7 @@ const handleGoToRewards = () => { | ... | @@ -476,7 +494,7 @@ const handleGoToRewards = () => { |
| 476 | .center-circle { | 494 | .center-circle { |
| 477 | position: absolute; | 495 | position: absolute; |
| 478 | left: 50%; | 496 | left: 50%; |
| 479 | - top: 75%; | 497 | + top: 65%; // 从75%调整到65%,为iPad等大屏设备留出更多底部空间 |
| 480 | transform: translate(-50%, -50%); | 498 | transform: translate(-50%, -50%); |
| 481 | width: 200rpx; | 499 | width: 200rpx; |
| 482 | height: 200rpx; | 500 | height: 200rpx; |
| ... | @@ -615,4 +633,21 @@ const handleGoToRewards = () => { | ... | @@ -615,4 +633,21 @@ const handleGoToRewards = () => { |
| 615 | font-size: 20rpx; | 633 | font-size: 20rpx; |
| 616 | } | 634 | } |
| 617 | } | 635 | } |
| 636 | + | ||
| 637 | +// iPad和平板设备适配 | ||
| 638 | +@media screen and (min-width: 768px) { | ||
| 639 | + .center-circle { | ||
| 640 | + top: 60%; // 平板设备进一步上移,确保不被切掉 | ||
| 641 | + width: 240rpx; | ||
| 642 | + height: 240rpx; | ||
| 643 | + } | ||
| 644 | + | ||
| 645 | + .points-number { | ||
| 646 | + font-size: 52rpx; | ||
| 647 | + } | ||
| 648 | + | ||
| 649 | + .points-label, .family-points-label { | ||
| 650 | + font-size: 28rpx; | ||
| 651 | + } | ||
| 652 | +} | ||
| 618 | </style> | 653 | </style> | ... | ... |
-
Please register or login to post a comment