accessability check
This commit is contained in:
parent
fa1f912089
commit
5771bb7cdd
@ -1,149 +1,190 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="contactBubble"
|
class="contactBubble"
|
||||||
:class="{ active: isContactBubbleOpen }"
|
:class="{ active: isContactBubbleOpen }"
|
||||||
aria-hidden="false"
|
:aria-hidden="!isContactBubbleOpen"
|
||||||
:aria-expanded="isContactBubbleOpen"
|
:aria-expanded="isContactBubbleOpen"
|
||||||
aria-labelledby="controlIcon"
|
aria-labelledby="controlIcon"
|
||||||
role="dialog"
|
role="dialog"
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
id="controlIcon"
|
id="controlIcon"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
role="button"
|
role="button"
|
||||||
aria-label="Toggle contact form"
|
aria-label="Toggle contact form"
|
||||||
@click="toggleContactBubble"
|
@click="toggleContactBubble"
|
||||||
>
|
>
|
||||||
<use :xlink:href="`/assets/icons/collection.svg#${isContactBubbleOpen ? 'times' : 'talk'}`"/>
|
<use :xlink:href="`/assets/icons/collection.svg#${isContactBubbleOpen ? 'times' : 'talk'}`" />
|
||||||
</svg>
|
</svg>
|
||||||
<div
|
|
||||||
v-show="isContactBubbleOpen"
|
<div
|
||||||
class="contactContainer"
|
v-show="isContactBubbleOpen"
|
||||||
role="form"
|
class="contactContainer"
|
||||||
aria-labelledby="contactTitle"
|
role="form"
|
||||||
>
|
aria-labelledby="contactTitle"
|
||||||
<div class="row left m-2">
|
>
|
||||||
<div id="hintBox" class="col-md-6">
|
<div class="row left m-2">
|
||||||
<NuxtImg
|
<!-- Linke Seite -->
|
||||||
v-if="screenWidth <= 768"
|
<div id="hintBox" class="col-md-6">
|
||||||
class="mobileAspBox"
|
<NuxtImg
|
||||||
:src="companyinfo?.profileImage?.data?.attributes?.url"
|
v-if="screenWidth <= 768"
|
||||||
alt="Sabrina Hennrich"
|
class="mobileAspBox"
|
||||||
:width="400"
|
:src="companyinfo?.profileImage?.data?.attributes?.url"
|
||||||
format="webp"
|
alt="Sabrina Hennrich"
|
||||||
provider="strapi"
|
:width="400"
|
||||||
loading="lazy"
|
format="webp"
|
||||||
/>
|
provider="strapi"
|
||||||
<h2 id="contactTitle">{{ $t('contactForm.yourcontact2us') }}</h2>
|
loading="lazy"
|
||||||
<p class="my-4">
|
/>
|
||||||
<svg aria-hidden="true">
|
<h2 id="contactTitle">{{ $t('contactForm.yourcontact2us') }}</h2>
|
||||||
<use xlink:href="/assets/icons/collection.svg#phone"/>
|
<p class="my-4">
|
||||||
</svg>
|
<svg aria-hidden="true">
|
||||||
<span>{{ companyinfo.phone }}</span>
|
<use xlink:href="/assets/icons/collection.svg#phone" />
|
||||||
</p>
|
</svg>
|
||||||
<div v-if="screenWidth > 768" class="pt-3">
|
<span>{{ companyinfo.phone }}</span>
|
||||||
<h3>{{ $t('contactForm.ourOffice') }}</h3>
|
</p>
|
||||||
<p class="address">
|
|
||||||
{{ companyinfo.company }}<br>{{ companyinfo.street }} <br>{{ companyinfo.postalcode }} {{ companyinfo.city }}
|
<div v-if="screenWidth > 768" class="pt-3">
|
||||||
</p>
|
<h3>{{ $t('contactForm.ourOffice') }}</h3>
|
||||||
<p class="aspProf">{{ $t('contactForm.yourcontactperson') }} <b>Sabrina Hennrich</b></p>
|
<p class="address">
|
||||||
<div class="aspBox">
|
{{ companyinfo.company }}<br />
|
||||||
<NuxtImg
|
{{ companyinfo.street }} <br />
|
||||||
:src="companyinfo?.profileImage?.data?.attributes?.url"
|
{{ companyinfo.postalcode }} {{ companyinfo.city }}
|
||||||
alt="Ansprechpartner Sabrina Hennrich"
|
</p>
|
||||||
:width="150"
|
<p class="aspProf">{{ $t('contactForm.yourcontactperson') }} <b>Sabrina Hennrich</b></p>
|
||||||
format="webp"
|
<div class="aspBox">
|
||||||
provider="strapi"
|
<NuxtImg
|
||||||
loading="lazy"
|
:src="companyinfo?.profileImage?.data?.attributes?.url"
|
||||||
/>
|
alt="Ansprechpartner Sabrina Hennrich"
|
||||||
</div>
|
:width="150"
|
||||||
</div>
|
format="webp"
|
||||||
</div>
|
provider="strapi"
|
||||||
<div class="col-md-6">
|
loading="lazy"
|
||||||
|
/>
|
||||||
<div v-if="!formSent">
|
</div>
|
||||||
<div class="form-group">
|
|
||||||
<label for="name">{{ $t('contactForm.name') }}</label>
|
|
||||||
<input
|
|
||||||
id="name"
|
|
||||||
v-model="form.name"
|
|
||||||
type="text"
|
|
||||||
name="name"
|
|
||||||
aria-required="true"
|
|
||||||
autocomplete="name"
|
|
||||||
@blur="validateName"
|
|
||||||
>
|
|
||||||
<span v-if="errors.name" class="error">{{ errors.name }}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="email">{{ $t('contactForm.email') }}</label>
|
|
||||||
<input
|
|
||||||
id="email"
|
|
||||||
v-model="form.email"
|
|
||||||
type="email"
|
|
||||||
name="email"
|
|
||||||
autocomplete="email"
|
|
||||||
@blur="validateEmail"
|
|
||||||
>
|
|
||||||
<span v-if="errors.email" class="error">{{ errors.email }}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="phone">{{ $t('contactForm.phone') }}</label>
|
|
||||||
<input
|
|
||||||
id="phone"
|
|
||||||
v-model="form.phone"
|
|
||||||
type="tel"
|
|
||||||
name="phone"
|
|
||||||
autocomplete="tel"
|
|
||||||
@blur="validatePhone"
|
|
||||||
>
|
|
||||||
<span v-if="errors.phone" class="error">{{ errors.phone }}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="message">{{ $t('contactForm.message') }}</label>
|
|
||||||
<textarea
|
|
||||||
id="message"
|
|
||||||
v-model="form.message"
|
|
||||||
name="message"
|
|
||||||
class="mt-4"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p class="smallText">
|
|
||||||
<span class="check">✔</span>
|
|
||||||
{{ $t('contactForm.privacyInfotextBeforeLink') }}
|
|
||||||
<NuxtLinkLocale
|
|
||||||
:to="getRoute('privacy')"
|
|
||||||
:aria-label="$t('privacy')"
|
|
||||||
>
|
|
||||||
{{ $t('contactForm.privacyInfotextLinkText') }}
|
|
||||||
</NuxtLinkLocale>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
<button
|
|
||||||
type="submit"
|
|
||||||
:aria-label="$t('contactForm.sendMessage')"
|
|
||||||
class="pinkBtn"
|
|
||||||
@click="submitForm"
|
|
||||||
>
|
|
||||||
{{ $t('contactForm.sendMessage') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div v-else class="mt-5 thx">
|
|
||||||
<h3 class="pt-5">{{ $t('contactForm.confirmation.thx') }}</h3>
|
|
||||||
<p>{{ $t('contactForm.confirmation.info') }}</p>
|
|
||||||
<p>{{ $t('contactForm.confirmation.salutation') }}</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Rechte Seite -->
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div v-if="!formSent">
|
||||||
|
<form @submit.prevent="submitForm" novalidate>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="name">{{ $t('contactForm.name') }}</label>
|
||||||
|
<input
|
||||||
|
id="name"
|
||||||
|
class="form-control"
|
||||||
|
v-model="form.name"
|
||||||
|
type="text"
|
||||||
|
name="name"
|
||||||
|
required
|
||||||
|
autocomplete="name"
|
||||||
|
@blur="validateName"
|
||||||
|
:aria-invalid="!!errors.name"
|
||||||
|
:aria-describedby="errors.name ? 'error-name' : null"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
v-if="errors.name"
|
||||||
|
id="error-name"
|
||||||
|
class="error"
|
||||||
|
role="alert"
|
||||||
|
>
|
||||||
|
{{ errors.name }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="email">{{ $t('contactForm.email') }}</label>
|
||||||
|
<input
|
||||||
|
id="email"
|
||||||
|
class="form-control"
|
||||||
|
v-model="form.email"
|
||||||
|
type="email"
|
||||||
|
name="email"
|
||||||
|
required
|
||||||
|
autocomplete="email"
|
||||||
|
@blur="validateEmail"
|
||||||
|
:aria-invalid="!!errors.email"
|
||||||
|
:aria-describedby="errors.email ? 'error-email' : null"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
v-if="errors.email"
|
||||||
|
id="error-email"
|
||||||
|
class="error"
|
||||||
|
role="alert"
|
||||||
|
>
|
||||||
|
{{ errors.email }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="phone">{{ $t('contactForm.phone') }}</label>
|
||||||
|
<input
|
||||||
|
id="phone"
|
||||||
|
class="form-control"
|
||||||
|
v-model="form.phone"
|
||||||
|
type="tel"
|
||||||
|
name="phone"
|
||||||
|
autocomplete="tel"
|
||||||
|
@blur="validatePhone"
|
||||||
|
:aria-invalid="!!errors.phone"
|
||||||
|
:aria-describedby="errors.phone ? 'error-phone' : null"
|
||||||
|
/>
|
||||||
|
<span
|
||||||
|
v-if="errors.phone"
|
||||||
|
id="error-phone"
|
||||||
|
class="error"
|
||||||
|
role="alert"
|
||||||
|
>
|
||||||
|
{{ errors.phone }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="message">{{ $t('contactForm.message') }}</label>
|
||||||
|
<textarea
|
||||||
|
id="message"
|
||||||
|
class="form-control mt-4"
|
||||||
|
v-model="form.message"
|
||||||
|
name="message"
|
||||||
|
rows="4"
|
||||||
|
required
|
||||||
|
></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="smallText">
|
||||||
|
<span class="check">✔</span>
|
||||||
|
{{ $t('contactForm.privacyInfotextBeforeLink') }}
|
||||||
|
<NuxtLinkLocale
|
||||||
|
:to="getRoute('privacy')"
|
||||||
|
:aria-label="$t('privacy')"
|
||||||
|
>
|
||||||
|
{{ $t('contactForm.privacyInfotextLinkText') }}
|
||||||
|
</NuxtLinkLocale>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<button
|
||||||
|
type="submit"
|
||||||
|
class="pinkBtn"
|
||||||
|
:aria-label="$t('contactForm.sendMessage')"
|
||||||
|
>
|
||||||
|
{{ $t('contactForm.sendMessage') }}
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Dankeschön-Text -->
|
||||||
|
<div v-else class="mt-5 thx">
|
||||||
|
<h3 class="pt-5">{{ $t('contactForm.confirmation.thx') }}</h3>
|
||||||
|
<p>{{ $t('contactForm.confirmation.info') }}</p>
|
||||||
|
<p>{{ $t('contactForm.confirmation.salutation') }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useMainStore } from '@/stores/main';
|
import { useMainStore } from '@/stores/main';
|
||||||
|
|||||||
@ -1,272 +1,232 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="banner-wrapper">
|
||||||
<div class="banner-wrapper">
|
<!-- Obere Welle -->
|
||||||
<!-- Obere Welle -->
|
<svg
|
||||||
<svg
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
viewBox="0 0 500 20"
|
||||||
viewBox="0 0 500 20"
|
class="svgwavetop"
|
||||||
class="svgwavetop"
|
style="transform: scaleY(-1)"
|
||||||
style="transform: scaleY(-1)"
|
>
|
||||||
>
|
<g clip-path="url(#_clipPath_5kVoellZ93LI5Lc2i2b27JZsraaBm0XM)">
|
||||||
<g clip-path="url(#_clipPath_5kVoellZ93LI5Lc2i2b27JZsraaBm0XM)">
|
<path
|
||||||
<path
|
id="wave"
|
||||||
id="wave"
|
d="M 0 0 L 500 0 L 500 14 Q 354.4 -2.8 250 11 Q 145.6 24.8 0 14 L 0 0 Z"
|
||||||
d="M 0 0 L 500 0 L 500 14 Q 354.4 -2.8 250 11 Q 145.6 24.8 0 14 L 0 0 Z"
|
fill="#EEEBE5"
|
||||||
fill="#EEEBE5"
|
/>
|
||||||
/>
|
</g>
|
||||||
</g>
|
</svg>
|
||||||
</svg>
|
|
||||||
|
<div class="box pb-5">
|
||||||
<div class="box pb-5">
|
<div class="container">
|
||||||
<div class="container">
|
<h2 class="pt-4 pb-3">{{ title }}</h2>
|
||||||
<h2 class="pt-4 pb-3">{{ title }}</h2>
|
|
||||||
|
<div class="marquee">
|
||||||
<div class="marquee marquee--hover-pause mt-5">
|
<div class="marquee-track">
|
||||||
<!-- Haupt-Liste -->
|
<ul class="marquee-list">
|
||||||
<ul class="marquee__content">
|
<li
|
||||||
<li v-for="(item, index) in items" :key="index">
|
v-for="(item, index) in items"
|
||||||
<NuxtLink v-if="item.link" :to="item.link" class="custLogoLink">
|
:key="index"
|
||||||
<NuxtImg
|
class="marquee-item"
|
||||||
provider="strapi"
|
>
|
||||||
:src="item.logo.url"
|
<NuxtLink v-if="item.link" :to="item.link" class="custLogoLink">
|
||||||
:alt="item.logo.alternativeText || 'Logo'"
|
|
||||||
width="250"
|
|
||||||
format="webp"
|
|
||||||
loading="lazy"
|
|
||||||
class="custLogo"
|
|
||||||
/>
|
|
||||||
</NuxtLink>
|
|
||||||
<NuxtImg
|
<NuxtImg
|
||||||
v-else
|
|
||||||
provider="strapi"
|
provider="strapi"
|
||||||
:src="item.logo.url"
|
:src="item.logo.url"
|
||||||
:alt="item.logo.alternativeText || 'Logo'"
|
:alt="item.logo.alternativeText || 'Logo'"
|
||||||
width="250"
|
width="250"
|
||||||
|
height="50"
|
||||||
format="webp"
|
format="webp"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
class="custLogo"
|
class="custLogo"
|
||||||
/>
|
/>
|
||||||
</li>
|
</NuxtLink>
|
||||||
</ul>
|
<NuxtImg
|
||||||
|
v-else
|
||||||
<!-- Duplizierte Liste für Endlos-Scroll -->
|
provider="strapi"
|
||||||
<ul class="marquee__content duplicate" aria-hidden="true">
|
:src="item.logo.url"
|
||||||
<li v-for="(item, index) in items" :key="'dup-' + index">
|
:alt="item.logo.alternativeText || 'Logo'"
|
||||||
<NuxtLink v-if="item.link" :to="item.link" class="custLogoLink">
|
width="250"
|
||||||
<NuxtImg
|
height="50"
|
||||||
provider="strapi"
|
format="webp"
|
||||||
:src="item.logo.url"
|
loading="lazy"
|
||||||
:alt="item.logo.alternativeText || 'Logo'"
|
class="custLogo"
|
||||||
width="250"
|
|
||||||
format="webp"
|
|
||||||
loading="lazy"
|
|
||||||
class="custLogo"
|
|
||||||
/>
|
|
||||||
</NuxtLink>
|
|
||||||
<NuxtImg
|
|
||||||
v-else
|
|
||||||
provider="strapi"
|
|
||||||
:src="item.logo.url"
|
|
||||||
:alt="item.logo.alternativeText || 'Logo'"
|
|
||||||
width="250"
|
|
||||||
format="webp"
|
|
||||||
loading="lazy"
|
|
||||||
class="custLogo"
|
|
||||||
/>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Untere Wellen -->
|
|
||||||
<div class="waveBox">
|
|
||||||
<div id="waver">
|
|
||||||
<div class="waveWrapper waveAnimation">
|
|
||||||
<div class="waveWrapperInner bgTop">
|
|
||||||
<div
|
|
||||||
class="wave waveTop"
|
|
||||||
:style="{ backgroundImage: `url('${cmsUrl}/uploads/wave_top_8fe067e598.svg')` }"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</li>
|
||||||
<div class="waveWrapperInner bgMiddle">
|
</ul>
|
||||||
<div
|
|
||||||
class="wave waveMiddle"
|
|
||||||
:style="{ backgroundImage: `url('${cmsUrl}/uploads/wave_middle_24d8a84a35.svg')` }"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div class="waveWrapperInner bgBottom">
|
|
||||||
<div
|
|
||||||
class="wave waveBottom"
|
|
||||||
:style="{ backgroundImage: `url('${cmsUrl}/uploads/wave_bottom_6fc8184efb.svg')` }"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
|
||||||
|
<!-- Wellen unten -->
|
||||||
|
<div class="waveBox">
|
||||||
|
<div id="waver">
|
||||||
<script setup>
|
<div class="waveWrapper waveAnimation">
|
||||||
import { computed } from 'vue'
|
<div class="waveWrapperInner bgTop">
|
||||||
|
<div
|
||||||
// Runtime config & base CMS URL
|
class="wave waveTop"
|
||||||
const runtimeConfig = useRuntimeConfig()
|
:style="{ backgroundImage: `url('${cmsUrl}/uploads/wave_top_8fe067e598.svg')` }"
|
||||||
const cmsUrl = computed(() => runtimeConfig.public.cmsBaseUrl)
|
/>
|
||||||
|
</div>
|
||||||
// Props
|
<div class="waveWrapperInner bgMiddle">
|
||||||
const props = defineProps({
|
<div
|
||||||
items: {
|
class="wave waveMiddle"
|
||||||
type: Array,
|
:style="{ backgroundImage: `url('${cmsUrl}/uploads/wave_middle_24d8a84a35.svg')` }"
|
||||||
required: true,
|
/>
|
||||||
},
|
</div>
|
||||||
logoHeight: {
|
<div class="waveWrapperInner bgBottom">
|
||||||
type: Number,
|
<div
|
||||||
default: 50,
|
class="wave waveBottom"
|
||||||
},
|
:style="{ backgroundImage: `url('${cmsUrl}/uploads/wave_bottom_6fc8184efb.svg')` }"
|
||||||
title: {
|
/>
|
||||||
type: String,
|
</div>
|
||||||
default: '',
|
</div>
|
||||||
},
|
</div>
|
||||||
link: {
|
</div>
|
||||||
type: String,
|
</div>
|
||||||
default: 'projekt',
|
</template>
|
||||||
},
|
|
||||||
})
|
<script setup>
|
||||||
</script>
|
const runtimeConfig = useRuntimeConfig()
|
||||||
|
const cmsUrl = computed(() => runtimeConfig.public.cmsBaseUrl)
|
||||||
<style lang="sass">
|
|
||||||
.banner-wrapper
|
const props = defineProps({
|
||||||
position: relative
|
items: {
|
||||||
|
type: Array,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
title: {
|
||||||
|
type: String,
|
||||||
|
default: '',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="sass" scoped>
|
||||||
|
.banner-wrapper
|
||||||
|
position: relative
|
||||||
|
svg
|
||||||
|
margin: 0 0 -3px 0
|
||||||
|
@media(max-width: $breakPointSM)
|
||||||
svg
|
svg
|
||||||
margin: 0 0 -3px 0
|
|
||||||
@media(max-width: $breakPointSM)
|
|
||||||
svg
|
|
||||||
margin: 0
|
|
||||||
.box
|
|
||||||
background-color: $beige
|
|
||||||
width: 100%
|
|
||||||
min-height: 50px
|
|
||||||
margin-top: -20px
|
|
||||||
|
|
||||||
h2
|
|
||||||
color: #333
|
|
||||||
font-size: 1.2rem
|
|
||||||
font-family: 'Mainfont-Bold'
|
|
||||||
|
|
||||||
.marquee
|
|
||||||
--gap: 1rem
|
|
||||||
position: relative
|
|
||||||
display: flex
|
|
||||||
overflow: hidden
|
|
||||||
user-select: none
|
|
||||||
gap: var(--gap)
|
|
||||||
ul
|
|
||||||
list-style-type: none
|
|
||||||
&:hover .marquee__content
|
|
||||||
animation-play-state: paused
|
|
||||||
|
|
||||||
.marquee__content
|
|
||||||
flex-shrink: 0
|
|
||||||
display: flex
|
|
||||||
justify-content: space-around
|
|
||||||
gap: var(--gap)
|
|
||||||
min-width: 100%
|
|
||||||
animation: scroll 30s linear infinite
|
|
||||||
li
|
|
||||||
&::before
|
|
||||||
display: none
|
|
||||||
|
|
||||||
@keyframes scroll
|
|
||||||
from
|
|
||||||
transform: translateX(0)
|
|
||||||
to
|
|
||||||
transform: translateX(calc(-100% - var(--gap)))
|
|
||||||
|
|
||||||
.custLogo
|
|
||||||
width: auto
|
|
||||||
max-width: 250px
|
|
||||||
height: 50px
|
|
||||||
margin: 0 3rem
|
|
||||||
filter: grayscale(100%)
|
|
||||||
transition: filter 0.3s ease
|
|
||||||
&:hover
|
|
||||||
filter: grayscale(0)
|
|
||||||
|
|
||||||
.waveBox
|
|
||||||
position: relative
|
|
||||||
height: 120px
|
|
||||||
#waver
|
|
||||||
display: block
|
|
||||||
position: absolute
|
|
||||||
left: 0
|
|
||||||
height: 120px
|
|
||||||
width: 100%
|
|
||||||
padding: 0
|
|
||||||
margin: 0
|
margin: 0
|
||||||
|
|
||||||
@keyframes move_wave
|
.box
|
||||||
0%
|
background-color: $beige
|
||||||
transform: translateX(0) translateZ(0) scaleY(1)
|
width: 100%
|
||||||
50%
|
min-height: 50px
|
||||||
transform: translateX(-25%) translateZ(0) scaleY(0.55)
|
margin-top: -20px
|
||||||
100%
|
|
||||||
transform: translateX(-50%) translateZ(0) scaleY(1)
|
h2
|
||||||
|
color: #333
|
||||||
.waveWrapper
|
font-size: 1.2rem
|
||||||
overflow: hidden
|
font-family: 'Mainfont-Bold'
|
||||||
position: absolute
|
|
||||||
left: 0
|
.marquee
|
||||||
right: 0
|
overflow: hidden
|
||||||
bottom: 0
|
width: 100%
|
||||||
top: 0
|
|
||||||
margin: auto
|
.marquee-track
|
||||||
|
display: flex
|
||||||
.waveWrapperInner
|
animation: scroll 20s linear infinite
|
||||||
position: absolute
|
width: max-content
|
||||||
width: 100%
|
|
||||||
overflow: hidden
|
.marquee-list
|
||||||
height: 120px
|
display: flex
|
||||||
top: 0
|
gap: 3rem
|
||||||
background-image: linear-gradient(to top, $beige 20%, $beige 80%)
|
list-style: none
|
||||||
|
padding: 1rem 0
|
||||||
@media (max-width: 1024px)
|
margin: 0
|
||||||
.waveWrapperInner
|
|
||||||
height: 50px
|
.marquee-item
|
||||||
|
flex-shrink: 0
|
||||||
.bgTop
|
|
||||||
z-index: 15
|
.custLogo
|
||||||
opacity: 0.5
|
width: auto
|
||||||
|
max-width: 250px
|
||||||
.bgMiddle
|
height: 50px
|
||||||
z-index: 10
|
filter: grayscale(100%)
|
||||||
opacity: 0.75
|
transition: filter 0.3s ease
|
||||||
|
&:hover
|
||||||
.bgBottom
|
filter: grayscale(0)
|
||||||
z-index: 5
|
|
||||||
|
@keyframes scroll
|
||||||
.wave
|
from
|
||||||
position: absolute
|
transform: translateX(0)
|
||||||
left: 0
|
to
|
||||||
width: 200%
|
transform: translateX(-50%)
|
||||||
height: 100%
|
|
||||||
background-repeat: repeat no-repeat
|
.waveBox
|
||||||
background-position: 0 bottom
|
position: relative
|
||||||
transform-origin: center bottom
|
height: 120px
|
||||||
|
|
||||||
.waveTop
|
#waver
|
||||||
background-size: auto 100%
|
display: block
|
||||||
animation: move_wave 18s linear infinite
|
position: absolute
|
||||||
|
left: 0
|
||||||
.waveMiddle
|
height: 120px
|
||||||
background-size: auto 100%
|
width: 100%
|
||||||
animation: move_wave 11s linear infinite
|
padding: 0
|
||||||
|
margin: 0
|
||||||
.waveBottom
|
|
||||||
background-size: auto 100%
|
@keyframes move_wave
|
||||||
animation: move_wave 15s linear infinite
|
0%
|
||||||
</style>
|
transform: translateX(0) translateZ(0) scaleY(1)
|
||||||
|
50%
|
||||||
|
transform: translateX(-25%) translateZ(0) scaleY(0.55)
|
||||||
|
100%
|
||||||
|
transform: translateX(-50%) translateZ(0) scaleY(1)
|
||||||
|
|
||||||
|
.waveWrapper
|
||||||
|
overflow: hidden
|
||||||
|
position: absolute
|
||||||
|
left: 0
|
||||||
|
right: 0
|
||||||
|
bottom: 0
|
||||||
|
top: 0
|
||||||
|
margin: auto
|
||||||
|
|
||||||
|
.waveWrapperInner
|
||||||
|
position: absolute
|
||||||
|
width: 100%
|
||||||
|
overflow: hidden
|
||||||
|
height: 120px
|
||||||
|
top: 0
|
||||||
|
background-image: linear-gradient(to top, $beige 20%, $beige 80%)
|
||||||
|
|
||||||
|
@media (max-width: 1024px)
|
||||||
|
.waveWrapperInner
|
||||||
|
height: 50px
|
||||||
|
|
||||||
|
.bgTop
|
||||||
|
z-index: 15
|
||||||
|
opacity: 0.5
|
||||||
|
|
||||||
|
.bgMiddle
|
||||||
|
z-index: 10
|
||||||
|
opacity: 0.75
|
||||||
|
|
||||||
|
.bgBottom
|
||||||
|
z-index: 5
|
||||||
|
|
||||||
|
.wave
|
||||||
|
position: absolute
|
||||||
|
left: 0
|
||||||
|
width: 200%
|
||||||
|
height: 100%
|
||||||
|
background-repeat: repeat no-repeat
|
||||||
|
background-position: 0 bottom
|
||||||
|
transform-origin: center bottom
|
||||||
|
|
||||||
|
.waveTop
|
||||||
|
background-size: auto 100%
|
||||||
|
animation: move_wave 18s linear infinite
|
||||||
|
|
||||||
|
.waveMiddle
|
||||||
|
background-size: auto 100%
|
||||||
|
animation: move_wave 11s linear infinite
|
||||||
|
|
||||||
|
.waveBottom
|
||||||
|
background-size: auto 100%
|
||||||
|
animation: move_wave 15s linear infinite
|
||||||
|
</style>
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 198 KiB |
Loading…
x
Reference in New Issue
Block a user