feat: 移动端适配

This commit is contained in:
2026-03-27 10:54:14 +08:00
parent 60ebdb3d77
commit 14b951d3fb
21 changed files with 315 additions and 141 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 407 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 494 B

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 816 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Binary file not shown.

View File

@@ -80,12 +80,12 @@ export default {
panelOfJudges: 'Panel of Judges', panelOfJudges: 'Panel of Judges',
expertise: 'Expertise', expertise: 'Expertise',
judgesHat: { judgesHat: {
jae: 'Code-Create\nKorea Branch Director\nBesfxxk creative director', jae: 'Code-Create Branch Director\nBesfxxk creative director\n(Korea)',
diego: 'Co-founder & Chief Father\nOfficer of OnTheList\n(Hong Kong)', diego: 'Co-founder & Chief Father\nOfficer of OnTheList\n(Hong Kong)',
gregory: 'Senior Designer at\nGabriela Heasrst (Italy)', gregory: 'Senior Designer at\nGabriela Hearst (Italy)',
vincenzo: 'Cheif Editor of SCMP Style\n(Hong Kong)', vincenzo: 'Cheif Editor of SCMP Style\n(Hong Kong)',
tim: 'Group Fashion Direction of\n Modern Media Group\n(Shanghai)', tim: 'Group Fashion Direction of\n Modern Media Group\n(Shanghai)',
desmond: 'Cheif Editor of Vogue\n(Singapore)' desmond: 'Chief Editor of Vogue\n(Singapore)'
}, },
awardPrizes: 'Award & Prizes', awardPrizes: 'Award & Prizes',
recognition: 'Recognition', recognition: 'Recognition',
@@ -136,7 +136,7 @@ export default {
receivingOutfits: 'Receiving Outfits', receivingOutfits: 'Receiving Outfits',
fromFinalistsLabel: 'from Finallists', fromFinalistsLabel: 'from Finallists',
timeOctober: 'October', timeOctober: 'October',
receivingOutfitsDesc: 'AiDA receives physical\noutfits from all 20\nfinalists.', receivingOutfitsDesc: 'Finalists send one physical outfit to Code-Create (address to advise)',
awardCeremony: 'Award', awardCeremony: 'Award',
ceremonyLabel: 'Ceremony', ceremonyLabel: 'Ceremony',
timeNov12: 'Nov 12', timeNov12: 'Nov 12',

View File

@@ -131,7 +131,7 @@ export default {
receivingOutfits: '入围者', receivingOutfits: '入围者',
fromFinalistsLabel: '提交成衣', fromFinalistsLabel: '提交成衣',
timeOctober: '10月', timeOctober: '10月',
receivingOutfitsDesc: 'AiDA 接收每位入围\n的1套实物服装', receivingOutfitsDesc: '入围者需向Code-Create寄送一套实物服装地址另行通知',
awardCeremony: '奖项颁发仪式', awardCeremony: '奖项颁发仪式',
ceremonyLabel: '', ceremonyLabel: '',
timeNov12: '11月12日', timeNov12: '11月12日',

View File

@@ -402,7 +402,7 @@ ul {
// width: 46.8rem; // width: 46.8rem;
text-align: center; text-align: center;
color: #585858; color: #585858;
font-family: 'Arial'; font-family: 'Instrument';
font-weight: 400; font-weight: 400;
line-height: 3rem; line-height: 3rem;
font-size: 2.4rem; font-size: 2.4rem;
@@ -581,6 +581,7 @@ ul {
padding: 0 6rem; padding: 0 6rem;
font-size: 2rem; font-size: 2rem;
text-align: left; text-align: left;
width: 100%;
} }
} }
} }
@@ -652,7 +653,7 @@ ul {
.step-4 { .step-4 {
margin-top: 4rem; margin-top: 4rem;
width: 100%; width: 100%;
.desc-lists li{ .desc-lists li {
white-space: initial !important; white-space: initial !important;
} }
} }

View File

@@ -211,6 +211,7 @@ p {
padding: 0 8.5vw; padding: 0 8.5vw;
font-size: 2rem; font-size: 2rem;
line-height: 3rem; line-height: 3rem;
white-space: normal;
} }
} }
&.pad { &.pad {

View File

@@ -229,6 +229,7 @@ onBeforeUnmount(() => {
line-height: 7.6rem; line-height: 7.6rem;
&.smaller { &.smaller {
font-size: 3.6rem; font-size: 3.6rem;
line-height: 3.8rem;
} }
} }
.prize-name { .prize-name {
@@ -265,7 +266,7 @@ onBeforeUnmount(() => {
.right { .right {
.prize-item { .prize-item {
width: 29.2rem; width: 29.2rem;
height: 27rem; height: auto;
padding: 5rem 3rem; padding: 5rem 3rem;
row-gap: 1.8rem; row-gap: 1.8rem;
&, &,

View File

@@ -167,6 +167,8 @@ onBeforeUnmount(() => {
color: #e0e0e0; color: #e0e0e0;
text-align: center; text-align: center;
white-space: pre-line; white-space: pre-line;
line-height: 3rem;
width: 28.2rem;
} }
} }
} }
@@ -174,7 +176,7 @@ onBeforeUnmount(() => {
height: auto; height: auto;
padding: 6rem 0 13rem; padding: 6rem 0 13rem;
background: url('@/assets/images/mobile_version_background/section_bg.png') no-repeat; background: url('@/assets/images/mobile_version_background/section_bg.png') no-repeat;
background-size: 100% 100%; background-size: cover;
.title { .title {
font-size: 3.2rem; font-size: 3.2rem;
margin-bottom: 0.8rem; margin-bottom: 0.8rem;
@@ -193,10 +195,11 @@ onBeforeUnmount(() => {
.item { .item {
width: initial; width: initial;
height: initial; height: initial;
&:nth-of-type(3) { &:nth-of-type(3) {
width: 30rem; width: 30rem;
height: 36.8rem; height: auto;
padding: 3.2rem 0; padding: 3.2rem 0;
} }
.icon { .icon {
width: 16rem; width: 16rem;
@@ -206,6 +209,10 @@ onBeforeUnmount(() => {
font-size: 2.4rem; font-size: 2.4rem;
margin: 0.8rem 0 1.2rem; margin: 0.8rem 0 1.2rem;
} }
.desc {
width: 23rem;
line-height: 2.4rem;
}
} }
} }
} }

View File

@@ -1,5 +1,9 @@
<template> <template>
<nav class="step-bar" role="tablist" :aria-label="t('AwardApply.applicationForm')"> <nav
class="step-bar flex align-center space-between"
role="tablist"
:aria-label="t('AwardApply.applicationForm')"
>
<button <button
v-for="(key, index) in tabKeys" v-for="(key, index) in tabKeys"
:key="key" :key="key"
@@ -11,7 +15,7 @@
:tabindex="modelValue === index ? 0 : -1" :tabindex="modelValue === index ? 0 : -1"
@click="onSelect(index)" @click="onSelect(index)"
> >
<div class="step-cluster"> <div class="step-cluster flex flex-center">
<div class="step-head"> <div class="step-head">
<span class="step-badge">{{ index + 1 }}</span> <span class="step-badge">{{ index + 1 }}</span>
<span class="step-label">{{ t(`AwardApply.${key}`) }}</span> <span class="step-label">{{ t(`AwardApply.${key}`) }}</span>
@@ -56,17 +60,14 @@ function onSelect(index: number) {
@label-inactive: #9e9e9e; @label-inactive: #9e9e9e;
@badge-inactive-bg: #dcdcdc; @badge-inactive-bg: #dcdcdc;
@badge-inactive-text: #9f9f9f; @badge-inactive-text: #9f9f9f;
@bar-height: 0.4rem; @bar-height: 0.6rem;
.step-bar { .step-bar {
height: 100%; height: 100%;
display: flex;
align-items: stretch;
justify-content: space-between;
width: 100%; width: 100%;
background: #fff; background: #fff;
border-bottom: 1px solid #e5e5e5; border-bottom: 0.1rem solid #dcdcdc;
padding: 0 3rem; padding: 0 3.8rem;
box-sizing: border-box; box-sizing: border-box;
} }
@@ -75,88 +76,65 @@ function onSelect(index: number) {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
min-width: 0;
margin: 0; margin: 0;
padding: 1.6rem 0.4rem 0;
border: none; border: none;
background: transparent; background: transparent;
cursor: pointer; position: relative;
font: inherit; height: 100%;
color: inherit;
-webkit-tap-highlight-color: transparent;
&:focus-visible { &:focus-visible {
outline: 2px solid @active-red; outline: 2px solid @active-red;
outline-offset: 2px; outline-offset: 2px;
} }
} .step-cluster {
height: 100%;
.step-head {
display: inline-flex;
align-items: center;
gap: 1.2rem;
max-width: 100%;
}
.step-cluster { .step-badge {
display: inline-flex; font-family: 'Poppins';
flex-direction: column; font-weight: 400;
align-items: center; font-size: 2.4rem;
max-width: 100%; color: #9f9f9f;
} }
.step-head { .step-label {
display: inline-flex; font-family: 'Poppins';
align-items: center; font-weight: 400;
gap: 1rem; font-size: 2.4rem;
max-width: 100%; color: @label-inactive;
} white-space: nowrap;
color: #9f9f9f;
.step-badge { }
flex-shrink: 0; .step-indicator {
width: 3.2rem; width: 100%;
height: 3.2rem; height: @bar-height;
border-radius: 50%; position: absolute;
display: flex; bottom: 0;
align-items: center; left: 0;
justify-content: center; .step-indicator-bar {
font-family: 'ArialBold'; display: block;
font-weight: 700; height: @bar-height;
font-size: 1.8rem; width: 100%;
line-height: 1; // min-width: 0;
background: @badge-inactive-bg; background: @active-red;
color: @badge-inactive-text; border-radius: 1rem;
transition: background 0.2s ease, color 0.2s ease; }
} }
.step-label {
font-family: 'Poppins';
font-weight: 400;
font-size: 1.6rem;
color: @label-inactive;
white-space: nowrap;
}
.step-item.active {
.step-badge {
background: @active-red;
color: #fff;
} }
.step-label { &.active {
color: @label-active; .step-badge,
.step-label {
color: #c7342c;
font-family: 'PoppinsBold';
font-weight: 700;
// background: @active-red;
}
} }
} }
.step-indicator {
width: 120%;
min-height: @bar-height;
margin-top: 1.2rem;
display: flex;
justify-content: center;
align-items: flex-end;
}
/* 略宽于上方徽章+文案(与 step-head 同宽基准 + 左右扩展) */
.step-indicator-bar {
display: block;
height: @bar-height;
width: calc(100% + 1.2rem);
min-width: 0;
background: @active-red;
border-radius: 0.1rem 0.1rem 0 0;
}
</style> </style>

View File

@@ -2,13 +2,17 @@
<div <div
ref="containerRef" ref="containerRef"
class="timeline-container container flex flex-col align-center" class="timeline-container container flex flex-col align-center"
:class="{ mobile: isMobile && !isPad, vertical: isMobile && !isPad ,'is-pad': isPad}" :class="{ mobile: isMobile && !isPad, vertical: isMobile && !isPad, 'is-pad': isPad }"
> >
<div class="timeline-title">{{ $t('AwardsPage.competitionTimeline') }}</div> <div class="timeline-title">{{ $t('AwardsPage.competitionTimeline') }}</div>
<div class="desc">{{ $t('AwardsPage.shapingTheFuture') }}</div> <div class="desc">{{ $t('AwardsPage.shapingTheFuture') }}</div>
<!-- 纵向时间线移动端排除平板 --> <!-- 纵向时间线移动端排除平板 -->
<div v-if="isMobile && !isPad" class="timeline-point timeline-vertical flex flex-col" ref="timelineRef"> <div
v-if="isMobile && !isPad"
class="timeline-point timeline-vertical flex flex-col"
ref="timelineRef"
>
<div class="vertical-line"></div> <div class="vertical-line"></div>
<div v-for="(item, index) in points" :key="'vertical-' + item.time" class="vertical-item"> <div v-for="(item, index) in points" :key="'vertical-' + item.time" class="vertical-item">
<div class="vertical-node"> <div class="vertical-node">
@@ -16,7 +20,12 @@
</div> </div>
<div class="vertical-content"> <div class="vertical-content">
<div class="vertical-time">{{ $t(item.time) }}</div> <div class="vertical-time">{{ $t(item.time) }}</div>
<div class="vertical-label">{{ $t(item.label) }}</div> <div class="vertical-label">
{{ $t(item.label)
}}<template v-if="item.subLabel">
{{ $t(item.subLabel) }}
</template>
</div>
<div class="vertical-desc">{{ $t(item.desc) }}</div> <div class="vertical-desc">{{ $t(item.desc) }}</div>
</div> </div>
</div> </div>
@@ -64,7 +73,7 @@ import { nextTick, onBeforeUnmount, onMounted, ref, computed, inject } from 'vue
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { gsap } from 'gsap' import { gsap } from 'gsap'
const { t } = useI18n() // const { t } = useI18n()
const isMobile = inject<boolean>('isMobile') const isMobile = inject<boolean>('isMobile')
const isPad = inject<boolean>('isPad') const isPad = inject<boolean>('isPad')
@@ -188,9 +197,10 @@ const playAnimation = () => {
// 行内内容:桌面端用 .grid-cell纵向用 .vertical-item // 行内内容:桌面端用 .grid-cell纵向用 .vertical-item
// 纵向时,每个 item 从上方落下 + 渐显 // 纵向时,每个 item 从上方落下 + 渐显
const textItems = isMobile.value && !isPad.value const textItems =
? containerRef.value.querySelectorAll('.vertical-item') isMobile.value && !isPad.value
: containerRef.value.querySelectorAll('.grid-cell') ? containerRef.value.querySelectorAll('.vertical-item')
: containerRef.value.querySelectorAll('.grid-cell')
if (textItems && textItems.length) { if (textItems && textItems.length) {
if (isMobile.value && !isPad.value) { if (isMobile.value && !isPad.value) {
// 纵向:每个 item 从上方落下 + 渐显 // 纵向:每个 item 从上方落下 + 渐显

View File

@@ -5,7 +5,7 @@
<div class="header-left"> <div class="header-left">
<img src="@/assets/images/award/code_create_logo.png" class="logo" /> <img src="@/assets/images/award/code_create_logo.png" class="logo" />
</div> </div>
<div class="header-right flex align-center"> <div class="header-right flex align-center" v-if="!isMobile">
<div class="contact flex align-center" @click="handleContactClick"> <div class="contact flex align-center" @click="handleContactClick">
<img src="@/assets/images/award/mail.png" class="contact-icon" /> <img src="@/assets/images/award/mail.png" class="contact-icon" />
<div class="text" v-if="!isMobile">{{ $t('AwardsPage.contactUs') }}</div> <div class="text" v-if="!isMobile">{{ $t('AwardsPage.contactUs') }}</div>
@@ -34,11 +34,25 @@
<img src="@/assets/images/award/arrow.png" alt="" class="arrow" /> <img src="@/assets/images/award/arrow.png" alt="" class="arrow" />
</div> </div>
</div> </div>
<div v-else class="header-right mobile">
<img
v-show="!showDrawer"
src="@/assets/images/award/menu.png"
class="menu-icon"
@click="handleChangeDrawer"
/>
<img
v-show="showDrawer"
src="@/assets/images/award/close-menu.png"
class="menu-icon close"
@click="handleChangeDrawer"
/>
</div>
</div> </div>
<div class="header-placeholder"></div> <div class="header-placeholder"></div>
</div> </div>
<router-view /> <router-view />
<div class="footer flex space-between align-center"> <div class="footer flex space-between align-center" :class="{ mobile: isMobile || isTablet }">
<div class="social-list flex"> <div class="social-list flex">
<a href="https://xhslink.com/m/5Ony2FapizV" target="_blank"> <a href="https://xhslink.com/m/5Ony2FapizV" target="_blank">
<img src="@/assets/images/award/xiaohongshu.svg" alt="" /> <img src="@/assets/images/award/xiaohongshu.svg" alt="" />
@@ -72,6 +86,7 @@
<div class="code-title" :class="{ 'flex space-between': isMobile }"> <div class="code-title" :class="{ 'flex space-between': isMobile }">
<span>{{ $t('AwardsPage.wechatTitle') }}</span> <span>{{ $t('AwardsPage.wechatTitle') }}</span>
<img <img
v-if="isMobile"
src="@/assets/images/award/close.svg" src="@/assets/images/award/close.svg"
class="close mobile" class="close mobile"
@click="handleCloseQRcode" @click="handleCloseQRcode"
@@ -113,8 +128,9 @@
<div class="mail-address">awards2026@code-createcom.hk</div> <div class="mail-address">awards2026@code-createcom.hk</div>
<img src="@/assets/images/award/copy.png" class="copy-icon" @click="handleClickCopyEmail" /> <img src="@/assets/images/award/copy.png" class="copy-icon" @click="handleClickCopyEmail" />
</div> </div>
<div class="send-btn" @click="handleContactUs"> <div class="send-btn flex flex-center" @click="handleContactUs">
{{ $t('AwardsPage.sendEmail') }} <img v-if="isMobile" src="@/assets/images/award/mail.png" class="contact-icon" />
<span>{{ $t('AwardsPage.sendEmail') }}</span>
</div> </div>
<div v-if="isMobile" class="send-btn copy" @click="handleClickCopyEmail"> <div v-if="isMobile" class="send-btn copy" @click="handleClickCopyEmail">
{{ $t('AwardsPage.copyMailAddress') }} {{ $t('AwardsPage.copyMailAddress') }}
@@ -122,6 +138,41 @@
</div> </div>
<!-- <div class="contact-modal-mobile-wrapper"></div> --> <!-- <div class="contact-modal-mobile-wrapper"></div> -->
</div> </div>
<div
class="drawer-mask"
:class="{ 'drawer-closing': drawerClosing }"
v-if="showDrawer || drawerClosing"
>
<div class="drawer-wrapper" @animationend="handleDrawerAnimationEnd">
<div class="drawer-item flex align-center space-between" @click="handleBtnClick">
<span class="text">{{ t('AwardsPage.submitApplication') }}</span>
<img src="@/assets/images/award/drawer-arrow.png" class="drawer-icon arrow" />
</div>
<div class="gap" />
<div class="drawer-item flex align-center space-between" @click="handleContactClick">
<span class="text">{{ $t('AwardsPage.contactUs') }}</span>
<img src="@/assets/images/award/drawer-mail.png" class="drawer-icon mail" />
</div>
<div class="gap" />
<div class="drawer-item language flex align-center">
<div
class="text"
:class="{ active: locale === 'CHINESE_SIMPLIFIED' }"
@click="handleChangeLanguage('CHINESE_SIMPLIFIED')"
>
中文
</div>
<span class="line">/</span>
<div
class="text"
:class="{ active: locale === 'ENGLISH' }"
@click="handleChangeLanguage('ENGLISH')"
>
EN
</div>
</div>
</div>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
@@ -161,20 +212,11 @@ const handleCloseQRcode = () => {
type BtnType = 'index' | 'form' type BtnType = 'index' | 'form'
const btnType = ref<BtnType>('index') const btnType = ref<BtnType>('index')
const btnText = computed(() => { const btnText = computed(() => {
if (isMobile.value) { if (btnType.value === 'index') {
if (btnType.value === 'index') { return t('AwardsPage.submitApplication')
return t('AwardsPage.submitMobile') }
} if (btnType.value === 'form') {
if (btnType.value === 'form') { return t('AwardApply.backToIntroduction')
return locale.value === 'CHINESE_SIMPLIFIED' ? '赛事介绍' : 'Back'
}
} else {
if (btnType.value === 'index') {
return t('AwardsPage.submitApplication')
}
if (btnType.value === 'form') {
return locale.value === 'CHINESE_SIMPLIFIED' ? '赛事介绍' : 'Back to Introduction'
}
} }
}) })
@@ -192,8 +234,28 @@ watch(
} }
) )
const showDrawer = ref(false)
const drawerClosing = ref(false)
const handleChangeDrawer = () => {
if (showDrawer.value) {
drawerClosing.value = true
} else {
drawerClosing.value = false
showDrawer.value = true
}
}
const handleDrawerAnimationEnd = () => {
if (drawerClosing.value) {
showDrawer.value = false
drawerClosing.value = false
}
}
const showContactModal = ref(false) const showContactModal = ref(false)
const handleContactClick = () => { const handleContactClick = () => {
if (showDrawer.value) {
handleChangeDrawer()
}
showContactModal.value = true showContactModal.value = true
} }
const handleContactUs = () => { const handleContactUs = () => {
@@ -357,6 +419,12 @@ const handleBtnClick = () => {
height: 2.4rem; height: 2.4rem;
} }
} }
&.mobile {
.menu-icon {
width: 5rem;
height: 5rem;
}
}
} }
} }
} }
@@ -379,6 +447,77 @@ const handleBtnClick = () => {
font-weight: 400; font-weight: 400;
font-size: 1.2rem; font-size: 1.2rem;
} }
&.mobile {
padding: 0 6.6rem;
img {
width: 4rem;
height: 4rem;
}
.copyright {
font-size: 2rem;
}
}
}
.drawer-mask {
position: fixed;
top: 8rem;
left: 0;
right: 0;
bottom: 0;
background-color: #00000033;
z-index: 8;
.drawer-wrapper {
padding: 7.8rem 6.6rem 8.2rem;
background-color: #fff;
font-family: 'PoppinsBold';
font-weight: 600;
font-size: 2.4rem;
border-bottom-left-radius: 2.4rem;
border-bottom-right-radius: 2.4rem;
animation: drawer-in 0.3s ease-in-out;
.drawer-item {
&.language {
column-gap: 0.8rem;
// padding: 0 1.25rem;
color: #c0c0c0;
.line {
user-select: none;
}
.text {
&.active {
color: #232323;
}
}
}
}
.gap {
border: 1px solid #d5d5d5;
margin: 3.2rem 0;
}
}
}
@keyframes drawer-in {
0% {
transform: translateY(-100%);
}
100% {
transform: translateY(0);
}
}
@keyframes drawer-out {
0% {
transform: translateY(0);
}
100% {
transform: translateY(-100%);
}
}
.drawer-closing {
background-color: transparent;
.drawer-wrapper {
animation: drawer-out 0.3s ease-in-out forwards;
}
} }
.qrcode-mask { .qrcode-mask {
position: fixed; position: fixed;
@@ -430,15 +569,15 @@ const handleBtnClick = () => {
border-top-right-radius: 2.4rem; border-top-right-radius: 2.4rem;
padding: 4.8rem 3.2rem 10rem; padding: 4.8rem 3.2rem 10rem;
} }
.code-title{ .code-title {
width: 100%; width: 100%;
border-bottom: 1px solid #E0E0E0; border-bottom: 1px solid #e0e0e0;
padding-bottom: 1.6rem; padding-bottom: 1.6rem;
} }
.qrcode{ .qrcode {
margin: 7.4rem 0 2rem; margin: 7.4rem 0 2rem;
} }
.tips{ .tips {
font-size: 2rem; font-size: 2rem;
} }
} }
@@ -521,7 +660,11 @@ const handleBtnClick = () => {
border-radius: 0; border-radius: 0;
border-top-left-radius: 2.4rem; border-top-left-radius: 2.4rem;
border-top-right-radius: 2.4rem; border-top-right-radius: 2.4rem;
display: flex;
flex-direction: column;
align-items: center;
.header { .header {
width: 100%;
border-bottom: 1px solid #e0e0e0; border-bottom: 1px solid #e0e0e0;
// height: 9.6rem; // height: 9.6rem;
padding-top: 4.8rem; padding-top: 4.8rem;
@@ -543,10 +686,22 @@ const handleBtnClick = () => {
margin-bottom: 2rem; margin-bottom: 2rem;
} }
.desc { .desc {
width: 46rem;
font-size: 2.2rem; font-size: 2.2rem;
line-height: 3rem; line-height: 3rem;
margin-bottom: 11rem; margin-bottom: 11rem;
} }
.send-btn {
width: 100%;
height: 8rem;
line-height: 8rem;
font-size: 2.4rem;
column-gap: 0.8rem;
.contact-icon{
width: 2.4rem;
// height: 1.8rem;
}
}
.send-btn.copy { .send-btn.copy {
background-color: #f1f1f1; background-color: #f1f1f1;
color: #969696; color: #969696;
@@ -574,10 +729,10 @@ const handleBtnClick = () => {
} }
} }
} }
.footer { // .footer {
row-gap: 0.8rem; // row-gap: 0.8rem;
flex-direction: column; // flex-direction: column;
justify-content: center; // justify-content: center;
} // }
} }
</style> </style>

View File

@@ -40,7 +40,7 @@
v-if="!isCompleted && !isExpired" v-if="!isCompleted && !isExpired"
:class="{ mobile: isMobile, tablet: isTablet }" :class="{ mobile: isMobile, tablet: isTablet }"
> >
<div class="form-header" v-if="showStep(0) && isMobile || isTablet"> <div class="form-header" v-if="showStep(0) && (isMobile || isTablet)">
<div class="form-title poppins-bold"> <div class="form-title poppins-bold">
{{ t('AwardApply.emailVerification') }} {{ t('AwardApply.emailVerification') }}
</div> </div>
@@ -340,7 +340,7 @@
{{ t('AwardApply.submitYourDesign') }} {{ t('AwardApply.submitYourDesign') }}
</div> </div>
<div class="desc"> <div class="desc">
{{ t('AwardApply.unfinishedFormTip') }} {{ t('AwardApply.stepTips') }}
</div> </div>
</div> </div>
</div> </div>
@@ -1264,7 +1264,7 @@ onUnmounted(() => {
position: absolute; position: absolute;
} }
.steps-container { .steps-container {
height: 6.8rem; height: 10rem;
background-color: #fff; background-color: #fff;
position: absolute; position: absolute;
bottom: 0; bottom: 0;
@@ -1676,7 +1676,7 @@ onUnmounted(() => {
} }
:deep(.ant-checkbox-wrapper) { :deep(.ant-checkbox-wrapper) {
line-height:initial; line-height: initial;
.ant-checkbox-inner { .ant-checkbox-inner {
width: 2rem; width: 2rem;
height: 2rem; height: 2rem;

View File

@@ -1,15 +1,16 @@
<template> <template>
<div class="award-page" :class="{ 'is-zh': isZh, mobile: isMobile }"> <div class="award-page" :class="{ 'is-zh': isZh, mobile: isMobile }">
<div class="banner" :class="{ mobile: isMobile }"> <div class="banner" :class="{ mobile: isMobile, tablet: isTablet }">
<video <video
:src="bannerUrl" :src="bannerUrl"
class="banner-video"
autoplay autoplay
muted muted
loop loop
class="banner-video"
playsinline playsinline
webkit-playsinline webkit-playsinline
x5-playsinline x5-playsinline
:controls="false"
></video> ></video>
<div class="submit-btn flex flex-center" @click="handleSubmitApplication"> <div class="submit-btn flex flex-center" @click="handleSubmitApplication">
<div>{{ $t('AwardsPage.submitApplication') }}</div> <div>{{ $t('AwardsPage.submitApplication') }}</div>
@@ -43,6 +44,8 @@ import banner from '@/assets/images/award/banner.mp4'
import bannerMobile from '@/assets/images/award/banner_mobile.mp4' import bannerMobile from '@/assets/images/award/banner_mobile.mp4'
import bannerZh from '@/assets/images/award/banner_chinese.mp4' import bannerZh from '@/assets/images/award/banner_chinese.mp4'
import bannerZhMobile from '@/assets/images/award/banner_mobile_chinese.mp4' import bannerZhMobile from '@/assets/images/award/banner_mobile_chinese.mp4'
import bannerPad from '@/assets/images/pad_version/banner_pad.mp4'
import bannerPadZh from '@/assets/images/pad_version/banner_pad_chinese.mp4'
import { useIsMobile, useIsTablet } from '@/utils/isMobile' import { useIsMobile, useIsTablet } from '@/utils/isMobile'
const { isMobile } = useIsMobile() const { isMobile } = useIsMobile()
const { isTablet } = useIsTablet() const { isTablet } = useIsTablet()
@@ -53,17 +56,14 @@ provide('isMobile', isMobile)
provide('isPad', isTablet) provide('isPad', isTablet)
onMounted(() => { onMounted(() => {
router.replace('/') router.replace('/')
setTimeout(() => { // setTimeout(() => {
console.log('是否平板-------', isTablet.value) // console.log('是否平板-------', isTablet.value)
console.log('是否移动端-------', isMobile.value) // console.log('是否移动端-------', isMobile.value)
}, 1000) // }, 1000)
}) })
const isZh = computed(() => { const isZh = computed(() => {
return locale.value === 'CHINESE_SIMPLIFIED' return locale.value === 'CHINESE_SIMPLIFIED'
}) })
@@ -72,10 +72,11 @@ const bannerUrl = computed(() => {
let url = null let url = null
if (isMobile.value) { if (isMobile.value) {
url = isZh.value ? bannerZhMobile : bannerMobile url = isZh.value ? bannerZhMobile : bannerMobile
} else if (isTablet.value) {
url = isZh.value ? bannerPadZh : bannerPad
} else { } else {
url = isZh.value ? bannerZh : banner url = isZh.value ? bannerZh : banner
} }
return url return url
}) })
@@ -153,13 +154,33 @@ const handleSubmitApplication = () => {
} }
.banner.mobile { .banner.mobile {
height: auto; height: 123.4rem;
.submit-btn { .submit-btn {
top: 52%; top: 52%;
left: 8%; left: 8%;
width: 41rem; width: 46.1rem;
font-size: 2.4rem; font-size: 2.6rem;
column-gap: 1rem; column-gap: 1rem;
letter-spacing: 0%;
.arrow{
width: 4rem;
height: 4rem;
}
.ddl {
white-space: pre-line;
text-align: left;
padding-left: 4rem;
bottom: -6rem;
}
}
}
.banner.tablet {
height: 136vw;
.submit-btn{
top: 74vw;
left: 11vw;
width: 46.1rem;
.ddl { .ddl {
white-space: pre-line; white-space: pre-line;
text-align: left; text-align: left;