brand页面交互调整

This commit is contained in:
X1627315083@163.com
2026-05-11 16:16:59 +08:00
parent 87b071c319
commit b8c844363c
19 changed files with 624 additions and 146 deletions

View File

@@ -0,0 +1,150 @@
<script setup lang="ts">
import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue";
import img from "@/assets/images/collectionStory/Rectangle.png";
//const props = defineProps({
//})
const emit = defineEmits([
'addShopping'
])
let data = reactive({
})
const list = ref([
{
url: img,
title: "Windswept Burden",
price: "$100.00",
},{
url: img,
title: "Windswept Burden",
price: "$100.00",
},{
url: img,
title: "Windswept Burden",
price: "$100.00",
},{
url: img,
title: "Windswept Burden",
price: "$100.00",
},{
url: img,
title: "Windswept Burden",
price: "$100.00",
},{
url: img,
title: "Windswept Burden",
price: "$100.00",
},{
url: img,
title: "Windswept Burden",
price: "$100.00",
}
])
const type = ref('All')
const addShopping = (item) => {
emit('addShopping', item)
}
onMounted(()=>{
})
onUnmounted(()=>{
})
defineExpose({})
const {} = toRefs(data);
</script>
<template>
<div class="commodityList">
<div class="header">
<div class="title">
Items
</div>
<div class="menu">
<div :class="{'active': type === 'All'}" @click="type = 'All'">All</div>
<div :class="{'active': type === 'Male'}" @click="type = 'Male'">Male</div>
<div :class="{'active': type === 'Female'}" @click="type = 'Female'">Female</div>
</div>
</div>
<div class="list">
<div class="item" v-for="item in list" :key="item.url">
<CommodityItem :url="item.url" :name="item.title" :price="item.price" @addShopping="addShopping(item)"></CommodityItem>
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.commodityList{
width: 100%;
height: 100%;
position: relative;
display: flex;
flex-direction: column;
.header{
position: sticky;
top: 0;
z-index: 2;
background-color: #fff;
.title{
font-family: "KaiseiOpti-Bold";
font-weight: 700;
font-size: 3.6rem;
line-height: 6rem;
color: #121212;
padding: 4rem 0 3.6rem 1.2rem;
}
.menu{
padding: 0 1.2rem;
display: flex;
gap: 2rem;
margin-bottom: 6rem;
> div{
min-width: 6rem;
text-align: center;
font-family: "KaiseiOpti-Bold";
font-weight: 700;
font-size: 1.98rem;
line-height: 100%;
position: relative;
color: #7B7B7B;
cursor: pointer;
&::after{
content: '';
position: absolute;
bottom: -5px;
left: 0;
display: block;
width: 100%;
border-bottom: 1px solid #232323;
display: none;
}
&.active{
color: #232323;
&::after{
display: block;
}
}
}
}
}
.list{
width: 100%;
flex: 1;
// display: grid;
// align-content: start;
// grid-template-columns: repeat(3, 1fr);
overflow: hidden;
display: grid;
align-content: start;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 28rem), 1fr));
border-top: 0.5px solid #585858;
padding: .5px 0 0 .5px;
/* 垂直线(右边框) */
.item{
position: relative;
padding: 1.2rem;
border-bottom: 0.5px solid #585858;
border-right: 0.5px solid #585858;
margin-right: -1px;
margin-bottom: -1px;
}
}
}
</style>

View File

@@ -0,0 +1,80 @@
<script setup lang="ts">
import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue";
import CommodityList from "./commodity-list.vue";
import MerchantInfo from "./merchant-info.vue";
import { useRouter } from "vue-router";
import myEvent from '@/utils/myEvent'
//const props = defineProps({
//})
//const emit = defineEmits([
//])
const router = useRouter()
let data = reactive({
})
const addShopping = (item) => {
myEvent.emit('addShopping', item)
}
const openDetail = (item) => {
router.push({name: 'digitalDetail', params: {id: item.id}})
}
onMounted(()=>{
})
onUnmounted(()=>{
})
defineExpose({})
const {} = toRefs(data);
</script>
<template>
<div class="brand">
<div class="header-img">
<img src="@/assets/images/brand/brandDetailBg.png" alt="">
</div>
<div class="content">
<div class="merchant-info">
<MerchantInfo></MerchantInfo>
</div>
<div class="commodity-list">
<CommodityList @addShopping="addShopping" @openDetail="openDetail"></CommodityList>
</div>
</div>
<Footer></Footer>
</div>
</template>
<style lang="less" scoped>
.brand{
width: 100%;
height: 100%;
position: relative;
overflow-y: auto;
.header-img{
width: 100%;
>img{
width: 100%;
}
}
.content{
display: flex;
height: auto;
align-items: flex-start;
.merchant-info{
width: 40rem;
padding-left: 12.7rem;
padding-right: 2.7rem;
height: var(--app-view-height);
overflow-y: auto;
position: sticky;
top: 0;
&::-webkit-scrollbar{
width: 0;
height: 0;
}
}
.commodity-list{
flex: 1;
border-left: 0.5px solid #585858;
border-right: 0.5px solid #585858;
margin-right: 9rem;
}
}
}
</style>

View File

@@ -0,0 +1,129 @@
<script setup lang="ts">
import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue";
//const props = defineProps({
//})
//const emit = defineEmits([
//])
let data = reactive({
})
onMounted(()=>{
})
onUnmounted(()=>{
})
defineExpose({})
const {} = toRefs(data);
</script>
<template>
<div class="merchantInfo">
<div class="profile">
<img src="@/assets/images/collectionStory/Rectangle.png" alt="">
</div>
<div class="info">
<div class="detail">
<div class="name">Lian Su</div>
<div class="title">Roaming Clouds</div>
</div>
<div class="contact">
<div class="title">Contact</div>
<div class="email label">
<div class="icon">
<svg-icon name="brand-email" size="24" />
</div>
<div>lian.su@urieworweoo.com</div>
</div>
<div class="phone label">
<div class="icon">
<svg-icon name="brand-call" size="24" />
</div>
<div>+86 139 4829 7710</div>
</div>
<div class="address label">
<div class="icon">
<svg-icon name="brand-link" size="24" />
</div>
<div>746312432</div>
</div>
<div class="website label">
<div class="icon">
<svg-icon name="brand-link" size="24" />
</div>
<div>https://urieworweoo.com</div>
</div>
</div>
<div class="about">
<div class="title">About</div>
<div class="content">Lian Sus work weaves understated ethnic influences into contemporary minimalism. She explores materials and silhouettes that bridge heritage and modern sensibilities. Her designs reflect a quiet dialogue between cultural memory and forward-looking innovation.</div>
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.merchantInfo{
width: 100%;
height: auto;
position: relative;
padding-top: 4rem;
padding-bottom: 4rem;
.profile{
width: 20rem;
height: 20rem;
margin-left: 1.8rem;
>img{
width: 100%;
height: 100%;
object-fit: cover;
}
}
.info{
display: flex;
flex-direction: column;
gap: 6rem;
margin-top: 4rem;
.title{
font-family: "KaiseiOpti-Bold";
font-weight: 700;
font-size: 3.4rem;
line-height: 3.6rem;
}
> .detail{
.name{
margin-bottom: .8rem;
font-weight: 500;
font-size: 1.8rem;
line-height: 100%;
color: #232323;
}
}
> .contact{
.title{
margin-bottom: 2rem;
}
.label{
display: flex;
gap: 2rem;
margin-bottom: .6rem;
font-family: "KaiseiOpti-Regular";
font-weight: 400;
font-size: 1.4rem;
line-height: 100%;
color: #585858;
&:last-child{
margin-bottom: 0;
}
}
}
> .about{
.title{
margin-bottom: 2rem;
}
.content{
font-family: "KaiseiOpti-Regular";
font-weight: 400;
font-size: 1.6rem;
line-height: 2.3rem;
color: #585858;
}
}
}
}
</style>