You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1493 lines
31 KiB

8 months ago
<template>
<view class="container">
<view class="carousel">
<swiper indicator-dots circular=true duration="400">
<swiper-item class="swiper-item" v-for="(item,index) in imgList" :key="index">
<view class="image-wrapper">
<image :src="item.src" class="loaded" mode="aspectFill"></image>
</view>
</swiper-item>
</swiper>
</view>
<view class="introduce-section">
<text class="title">{{product.name}}</text><br>
<text class="title2">{{product.subTitle}}</text>
<view class="price-box">
<text class="price-tip">¥</text>
<text class="price">{{product.price}}</text>
<text class="m-price">¥{{product.originalPrice}}</text>
<!-- <text class="coupon-tip">7</text> -->
</view>
<view class="bot-row">
<text>销量: {{product.sale}}</text>
<text>库存: {{product.stock}}</text>
<text>浏览量: 768</text>
</view>
</view>
<!-- 分享 -->
<view class="share-section" @click="share">
<view class="share-icon">
<text class="yticon icon-xingxing"></text>
</view>
<text class="tit">该商品分享可领49减10红包</text>
<text class="yticon icon-bangzhu1"></text>
<view class="share-btn">
立即分享
<text class="yticon icon-you"></text>
</view>
</view>
<view class="c-list">
<view class="c-row b-b" @click="toggleSpec">
<text class="tit">购买类型</text>
<view class="con">
<text class="selected-text" v-for="(sItem, sIndex) in specSelected" :key="sIndex">
{{sItem.name}}
</text>
</view>
<text class="yticon icon-you"></text>
</view>
<view class="c-row b-b" @click="toggleAttr">
<text class="tit">商品参数</text>
<view class="con">
<text class="con t-r">查看</text>
</view>
<text class="yticon icon-you"></text>
</view>
<view class="c-row b-b" @click="toggleCoupon('show')">
<text class="tit">优惠券</text>
<text class="con t-r red">领取优惠券</text>
<text class="yticon icon-you"></text>
</view>
<view class="c-row b-b">
<text class="tit">促销活动</text>
<view class="con-list">
<text v-for="item in promotionTipList" :key="item">{{item}}</text>
</view>
</view>
<view class="c-row b-b">
<text class="tit">服务</text>
<view class="bz-list con">
<text v-for="item in serviceList" :key="item">{{item}} ·</text>
</view>
</view>
</view>
<!-- 评价 -->
<view class="eva-section">
<view class="e-header">
<text class="tit">评价</text>
<text>(86)</text>
<text class="tip">好评率 100%</text>
<text class="yticon icon-you"></text>
</view>
<view class="eva-box">
<image class="portrait" src="http://img3.imgtn.bdimg.com/it/u=1150341365,1327279810&fm=26&gp=0.jpg" mode="aspectFill"></image>
<view class="right">
<text class="name">Leo yo</text>
<text class="con">商品收到了79元两件质量不错试了一下有点瘦但是加个外罩很漂亮我很喜欢</text>
<view class="bot">
<text class="attr">购买类型XL 红色</text>
<text class="time">2019-04-01 19:21</text>
</view>
</view>
</view>
</view>
<!-- 品牌信息 -->
<view class="brand-info">
<view class="d-header">
<text>品牌信息</text>
</view>
<view class="brand-box" @click="navToBrandDetail()">
<view class="image-wrapper">
<image :src="brand.logo" class="loaded" mode="aspectFit"></image>
</view>
<view class="title">
<text>{{brand.name}}</text>
<text>品牌首字母{{brand.firstLetter}}</text>
</view>
</view>
</view>
<view class="detail-desc">
<view class="d-header">
<text>图文详情</text>
</view>
<rich-text :nodes="desc"></rich-text>
</view>
<!-- 底部操作菜单 -->
<view class="page-bottom">
<navigator url="/pages/index/index" open-type="switchTab" class="p-b-btn">
<text class="yticon icon-xiatubiao--copy"></text>
<text>首页</text>
</navigator>
<navigator url="/pages/cart/cart" open-type="switchTab" class="p-b-btn">
<text class="yticon icon-gouwuche"></text>
<text>购物车</text>
</navigator>
<view class="p-b-btn" :class="{active: favorite}" @click="toFavorite">
<text class="yticon icon-shoucang"></text>
<text>收藏</text>
</view>
<view class="action-btn-group">
<button type="primary" class=" action-btn no-border buy-now-btn" @click="buy"></button>
<button type="primary" class=" action-btn no-border add-cart-btn" @click="addToCart"></button>
</view>
</view>
<!-- 规格-模态层弹窗 -->
<view class="popup spec" :class="specClass" @touchmove.stop.prevent="stopPrevent" @click="toggleSpec">
<!-- 遮罩层 -->
<view class="mask"></view>
<view class="layer attr-content" @click.stop="stopPrevent">
<view class="a-t">
<image :src="product.pic"></image>
<view class="right">
<text class="price">¥{{product.price}}</text>
<text class="stock">库存{{product.stock}}</text>
<view class="selected">
已选
<text class="selected-text" v-for="(sItem, sIndex) in specSelected" :key="sIndex">
{{sItem.name}}
</text>
</view>
</view>
</view>
<view v-for="(item,index) in specList" :key="index" class="attr-list">
<text>{{item.name}}</text>
<view class="item-list">
<text v-for="(childItem, childIndex) in specChildList" v-if="childItem.pid === item.id" :key="childIndex" class="tit"
:class="{selected: childItem.selected}" @click="selectSpec(childIndex, childItem.pid)">
{{childItem.name}}
</text>
</view>
</view>
<button class="btn" @click="toggleSpec"></button>
</view>
</view>
<!-- 属性-模态层弹窗 -->
<view class="popup spec" :class="attrClass" @touchmove.stop.prevent="stopPrevent" @click="toggleAttr">
<!-- 遮罩层 -->
<view class="mask"></view>
<view class="layer attr-content no-padding" @click.stop="stopPrevent">
<view class="c-list">
<view v-for="item in attrList" class="c-row b-b" :key="item.key">
<text class="tit">{{item.key}}</text>
<view class="con">
<text class="con t-r">{{item.value}}</text>
</view>
</view>
</view>
</view>
</view>
<!-- 优惠券面板 -->
<view class="mask" :class="couponState===0 ? 'none' : couponState===1 ? 'show' : ''" @click="toggleCoupon">
<view class="mask-content" @click.stop.prevent="stopPrevent">
<!-- 优惠券页面仿mt -->
<view class="coupon-item" v-for="(item,index) in couponList" :key="index" @click="addCoupon(item)">
<view class="con">
<view class="left">
<text class="title">{{item.name}}</text>
<text class="time">有效期至{{item.endTime | formatDateTime}}</text>
</view>
<view class="right">
<text class="price">{{item.amount}}</text>
<text>{{item.minPoint}}可用</text>
</view>
<view class="circle l"></view>
<view class="circle r"></view>
</view>
<text class="tips">{{item.useType | formatCouponUseType}}</text>
</view>
</view>
</view>
<!-- 分享 -->
<share ref="share" :contentHeight="580" :shareList="shareList"></share>
</view>
</template>
<script>
import share from '@/components/share.vue';
8 months ago
import {
fetchProductDetail
} from '@/api/product.js';
import {
addCartItem
} from '@/api/cart.js';
import {
fetchProductCouponList,
addMemberCoupon
} from '@/api/coupon.js';
import {
createReadHistory
} from '@/api/memberReadHistory.js';
import {
createProductCollection,
deleteProductCollection,
productCollectionDetail
} from '@/api/memberProductCollection.js';
import {
mapState
} from 'vuex';
import {
formatDate
} from '@/utils/date';
const defaultServiceList = [{
id: 1,
name: "无忧退货"
}, {
id: 2,
name: "快速退款"
}, {
id: 3,
name: "免费包邮"
}];
const defaultShareList = [{
type: 1,
icon: '/static/temp/share_wechat.png',
text: '微信好友'
},
{
type: 2,
icon: '/static/temp/share_moment.png',
text: '朋友圈'
},
{
type: 3,
icon: '/static/temp/share_qq.png',
text: 'QQ好友'
},
{
type: 4,
icon: '/static/temp/share_qqzone.png',
text: 'QQ空间'
}
]
export default {
components: {
share
},
data() {
return {
specClass: 'none',
attrClass: 'none',
specSelected: [],
favorite: false,
shareList: [],
imgList: [],
desc: '',
specList: [],
specChildList: [],
product: {},
brand: {},
serviceList: [],
skuStockList: [],
attrList: [],
promotionTipList: [],
couponState: 0,
couponList: []
};
},
async onLoad(options) {
let id = options.id;
this.shareList = defaultShareList;
this.loadData(id);
},
computed: {
...mapState(['hasLogin'])
},
filters: {
formatDateTime(time) {
if (time == null || time === '') {
return 'N/A';
}
let date = new Date(time);
return formatDate(date, 'yyyy-MM-dd hh:mm:ss')
},
formatCouponUseType(useType) {
if (useType == 0) {
return "全场通用";
} else if (useType == 1) {
return "指定分类商品可用";
} else if (useType == 2) {
return "指定商品可用";
}
return null;
},
},
methods: {
async loadData(id) {
fetchProductDetail(id).then(response => {
this.product = response.data.product;
this.skuStockList = response.data.skuStockList;
this.brand = response.data.brand;
this.initImgList();
this.initServiceList();
this.initSpecList(response.data);
this.initAttrList(response.data);
this.initPromotionTipList(response.data);
this.initProductDesc();
this.handleReadHistory();
this.initProductCollection();
});
},
//规格弹窗开关
toggleSpec() {
if (this.specClass === 'show') {
this.specClass = 'hide';
setTimeout(() => {
this.specClass = 'none';
}, 250);
} else if (this.specClass === 'none') {
this.specClass = 'show';
}
},
//属性弹窗开关
toggleAttr() {
if (this.attrClass === 'show') {
this.attrClass = 'hide';
setTimeout(() => {
this.attrClass = 'none';
}, 250);
} else if (this.attrClass === 'none') {
this.attrClass = 'show';
}
},
//优惠券弹窗开关
toggleCoupon(type) {
fetchProductCouponList(this.product.id).then(response => {
this.couponList = response.data;
if(this.couponList==null||this.couponList.length==0){
uni.showToast({
title:"暂无可领优惠券",
icon:"none"
})
return;
}
let timer = type === 'show' ? 10 : 300;
let state = type === 'show' ? 1 : 0;
this.couponState = 2;
setTimeout(() => {
this.couponState = state;
}, timer)
});
},
//选择规格
selectSpec(index, pid) {
let list = this.specChildList;
list.forEach(item => {
if (item.pid === pid) {
this.$set(item, 'selected', false);
}
})
this.$set(list[index], 'selected', true);
//存储已选择
/**
* 修复选择规格存储错误
* 将这几行代码替换即可
* 选择的规格存放在specSelected中
*/
this.specSelected = [];
list.forEach(item => {
if (item.selected === true) {
this.specSelected.push(item);
}
})
this.changeSpecInfo();
},
//领取优惠券
addCoupon(coupon) {
this.toggleCoupon();
addMemberCoupon(coupon.id).then(response => {
uni.showToast({
title: '领取优惠券成功!',
duration: 2000
});
});
},
//分享
share() {
this.$refs.share.toggleMask();
},
//收藏
toFavorite() {
if (!this.checkForLogin()) {
return;
}
if (this.favorite) {
//取消收藏
deleteProductCollection({
productId: this.product.id
}).then(response => {
uni.showToast({
title: "取消收藏成功!",
icon: 'none'
});
this.favorite = !this.favorite;
});
} else {
//收藏
let productCollection = {
productId: this.product.id,
productName: this.product.name,
productPic: this.product.pic,
productPrice: this.product.price,
productSubTitle: this.product.subTitle
}
createProductCollection(productCollection).then(response => {
uni.showToast({
title: "收藏成功!",
icon: 'none'
});
this.favorite = !this.favorite;
});
}
},
buy() {
uni.showToast({
title: "暂时只支持从购物车下单!",
icon: 'none'
});
},
stopPrevent() {},
//设置头图信息
initImgList() {
let tempPics = this.product.albumPics.split(',');
tempPics.unshift(this.product.pic);
for (let item of tempPics) {
if (item != null && item != '') {
this.imgList.push({
src: item
});
}
}
},
//设置服务信息
initServiceList() {
for (let item of defaultServiceList) {
if (this.product.serviceIds.indexOf(item.id) != -1) {
this.serviceList.push(item.name);
}
}
},
//设置商品规格
initSpecList(data) {
for (let i = 0; i < data.productAttributeList.length; i++) {
let item = data.productAttributeList[i];
if (item.type == 0) {
this.specList.push({
id: item.id,
name: item.name
});
if (item.handAddStatus == 1) {
//支持手动新增的
let valueList = data.productAttributeValueList;
let filterValueList = valueList.filter(value => value.productAttributeId == item.id);
let inputList = filterValueList[0].value.split(',');
for (let j = 0; j < inputList.length; j++) {
this.specChildList.push({
pid: item.id,
pname: item.name,
name: inputList[j]
});
}
} else if (item.handAddStatus == 0) {
//不支持手动新增的
let inputList = item.inputList.split(',');
for (let j = 0; j < inputList.length; j++) {
this.specChildList.push({
pid: item.id,
pname: item.name,
name: inputList[j]
});
}
}
}
}
let availAbleSpecSet = new Set();
for (let i = 0; i < this.skuStockList.length; i++) {
let spDataArr = JSON.parse(this.skuStockList[i].spData);
for (let j = 0; j < spDataArr.length; j++) {
availAbleSpecSet.add(spDataArr[j].value);
}
}
// 根据商品sku筛选出可用规格
this.specChildList = this.specChildList.filter(item => {
return availAbleSpecSet.has(item.name)
});
// 规格 默认选中第一条
this.specList.forEach(item => {
for (let cItem of this.specChildList) {
if (cItem.pid === item.id) {
this.$set(cItem, 'selected', true);
this.specSelected.push(cItem);
this.changeSpecInfo();
break;
}
}
})
},
//设置商品参数
initAttrList(data) {
for (let item of data.productAttributeList) {
if (item.type == 1) {
let valueList = data.productAttributeValueList;
let filterValueList = valueList.filter(value => value.productAttributeId == item.id);
let value = filterValueList[0].value;
this.attrList.push({
key: item.name,
value: value
});
}
}
},
//设置促销活动信息
initPromotionTipList(data) {
let promotionType = this.product.promotionType;
if (promotionType == 0) {
this.promotionTipList.push("暂无优惠");
} else if (promotionType == 1) {
this.promotionTipList.push("单品优惠");
} else if (promotionType == 2) {
this.promotionTipList.push("会员优惠");
} else if (promotionType == 3) {
this.promotionTipList.push("多买优惠");
for (let item of data.productLadderList) {
this.promotionTipList.push("满" + item.count + "件打" + item.discount * 10 + "折");
}
} else if (promotionType == 4) {
this.promotionTipList.push("满减优惠");
for (let item of data.productFullReductionList) {
this.promotionTipList.push("满" + item.fullPrice + "元减" + item.reducePrice + "元");
}
} else if (promotionType == 5) {
this.promotionTipList.push("限时优惠");
}
},
//初始化商品详情信息
initProductDesc() {
let rawhtml = this.product.detailMobileHtml;
let tempNode = document.createElement('div');
tempNode.innerHTML = rawhtml;
let imgs = tempNode.getElementsByTagName('img');
for (let i = 0; i < imgs.length; i++) {
imgs[i].style.width = '100%';
imgs[i].style.height = 'auto';
imgs[i].style.display = 'block';
}
this.desc = tempNode.innerHTML;
},
//处理创建浏览记录
handleReadHistory() {
if (this.hasLogin) {
let data = {
productId: this.product.id,
productName: this.product.name,
productPic: this.product.pic,
productPrice: this.product.price,
productSubTitle: this.product.subTitle,
}
createReadHistory(data);
}
},
//当商品规格改变时,修改商品信息
changeSpecInfo() {
let skuStock = this.getSkuStock();
if (skuStock != null) {
this.product.originalPrice = skuStock.price;
if (this.product.promotionType == 1) {
//单品优惠使用促销价
this.product.price = skuStock.promotionPrice;
} else {
this.product.price = skuStock.price;
}
this.product.stock = skuStock.stock;
}
},
//获取当前选中商品的SKU
getSkuStock() {
for (let i = 0; i < this.skuStockList.length; i++) {
let spDataArr = JSON.parse(this.skuStockList[i].spData);
let availAbleSpecSet = new Map();
for (let j = 0; j < spDataArr.length; j++) {
availAbleSpecSet.set(spDataArr[j].key, spDataArr[j].value);
}
let correctCount = 0;
for (let item of this.specSelected) {
let value = availAbleSpecSet.get(item.pname);
if (value != null && value == item.name) {
correctCount++;
}
}
if (correctCount == this.specSelected.length) {
return this.skuStockList[i];
}
}
return null;
},
//将商品加入到购物车
addToCart() {
if (!this.checkForLogin()) {
return;
}
let productSkuStock = this.getSkuStock();
let cartItem = {
price: this.product.price,
productAttr: productSkuStock.spData,
productBrand: this.product.brandName,
productCategoryId: this.product.productCategoryId,
productId: this.product.id,
productName: this.product.name,
productPic: this.product.pic,
productSkuCode: productSkuStock.skuCode,
productSkuId: productSkuStock.id,
productSn: this.product.productSn,
productSubTitle: this.product.subTitle,
quantity: 1
};
addCartItem(cartItem).then(response => {
uni.showToast({
title: response.message,
duration: 1500
})
});
},
//检查登录状态并弹出登录框
checkForLogin() {
if (!this.hasLogin) {
uni.showModal({
title: '提示',
content: '你还没登录,是否要登录?',
confirmText: '去登录',
cancelText: '取消',
success: function(res) {
if (res.confirm) {
uni.navigateTo({
url: '/pages/public/login'
})
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
return false;
} else {
return true;
}
},
//初始化收藏状态
initProductCollection() {
if (this.hasLogin) {
productCollectionDetail({
productId: this.product.id
}).then(response => {
this.favorite = response.data != null;
});
}
},
//跳转到品牌详情页
navToBrandDetail(){
let id = this.brand.id;
uni.navigateTo({
url: `/pages/brand/brandDetail?id=${id}`
})
},
},
}
</script>
<style lang='scss'>
page {
background: $page-color-base;
padding-bottom: 160upx;
}
.icon-you {
font-size: $font-base + 2upx;
color: #888;
}
.carousel {
height: 722upx;
position: relative;
swiper {
height: 100%;
}
.image-wrapper {
width: 100%;
height: 100%;
}
.swiper-item {
display: flex;
justify-content: center;
align-content: center;
height: 750upx;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
}
}
/* 标题简介 */
.introduce-section {
background: #fff;
padding: 20upx 30upx;
.title {
font-size: 32upx;
color: $font-color-dark;
height: 50upx;
line-height: 50upx;
}
.title2 {
font-size: 28upx;
color: $font-color-light;
height: 46upx;
line-height: 46upx;
}
.price-box {
display: flex;
align-items: baseline;
height: 64upx;
padding: 10upx 0;
font-size: 26upx;
color: $uni-color-primary;
}
.price {
font-size: $font-lg + 2upx;
}
.m-price {
margin: 0 12upx;
color: $font-color-light;
text-decoration: line-through;
}
.coupon-tip {
align-items: center;
padding: 4upx 10upx;
background: $uni-color-primary;
font-size: $font-sm;
color: #fff;
border-radius: 6upx;
line-height: 1;
transform: translateY(-4upx);
}
.bot-row {
display: flex;
align-items: center;
height: 50upx;
font-size: $font-sm;
color: $font-color-light;
text {
flex: 1;
}
}
}
/* 分享 */
.share-section {
display: flex;
align-items: center;
color: $font-color-base;
background: linear-gradient(left, #fdf5f6, #fbebf6);
padding: 12upx 30upx;
.share-icon {
display: flex;
align-items: center;
width: 70upx;
height: 30upx;
line-height: 1;
border: 1px solid $uni-color-primary;
border-radius: 4upx;
position: relative;
overflow: hidden;
font-size: 22upx;
color: $uni-color-primary;
&:after {
content: '';
width: 50upx;
height: 50upx;
border-radius: 50%;
left: -20upx;
top: -12upx;
position: absolute;
background: $uni-color-primary;
}
}
.icon-xingxing {
position: relative;
z-index: 1;
font-size: 24upx;
margin-left: 2upx;
margin-right: 10upx;
color: #fff;
line-height: 1;
}
.tit {
font-size: $font-base;
margin-left: 10upx;
}
.icon-bangzhu1 {
padding: 10upx;
font-size: 30upx;
line-height: 1;
}
.share-btn {
flex: 1;
text-align: right;
font-size: $font-sm;
color: $uni-color-primary;
}
.icon-you {
font-size: $font-sm;
margin-left: 4upx;
color: $uni-color-primary;
}
}
.c-list {
font-size: $font-sm + 2upx;
color: $font-color-base;
background: #fff;
.c-row {
display: flex;
align-items: center;
padding: 20upx 30upx;
position: relative;
}
.tit {
width: 140upx;
}
.con {
flex: 1;
color: $font-color-dark;
.selected-text {
margin-right: 10upx;
}
}
.bz-list {
height: 40upx;
font-size: $font-sm+2upx;
color: $font-color-dark;
text {
display: inline-block;
margin-right: 30upx;
}
}
.con-list {
flex: 1;
display: flex;
flex-direction: column;
color: $font-color-dark;
line-height: 40upx;
}
.red {
color: $uni-color-primary;
}
}
/* 评价 */
.eva-section {
display: flex;
flex-direction: column;
padding: 20upx 30upx;
background: #fff;
margin-top: 16upx;
.e-header {
display: flex;
align-items: center;
height: 70upx;
font-size: $font-sm + 2upx;
color: $font-color-light;
.tit {
font-size: $font-base + 2upx;
color: $font-color-dark;
margin-right: 4upx;
}
.tip {
flex: 1;
text-align: right;
}
.icon-you {
margin-left: 10upx;
}
}
}
.eva-box {
display: flex;
padding: 20upx 0;
.portrait {
flex-shrink: 0;
width: 80upx;
height: 80upx;
border-radius: 100px;
}
.right {
flex: 1;
display: flex;
flex-direction: column;
font-size: $font-base;
color: $font-color-base;
padding-left: 26upx;
.con {
font-size: $font-base;
color: $font-color-dark;
padding: 20upx 0;
}
.bot {
display: flex;
justify-content: space-between;
font-size: $font-sm;
color: $font-color-light;
}
}
}
/* 详情 */
.detail-desc {
background: #fff;
margin-top: 16upx;
.d-header {
display: flex;
justify-content: center;
align-items: center;
height: 80upx;
font-size: $font-base + 2upx;
color: $font-color-dark;
position: relative;
text {
padding: 0 20upx;
background: #fff;
position: relative;
z-index: 1;
}
&:after {
position: absolute;
left: 50%;
top: 50%;
transform: translateX(-50%);
width: 300upx;
height: 0;
content: '';
border-bottom: 1px solid #ccc;
}
}
}
.detail-desc img {
width: 100%;
height: auto;
}
/* 规格选择弹窗 */
.attr-content {
padding: 10upx 30upx;
.a-t {
display: flex;
image {
width: 170upx;
height: 170upx;
flex-shrink: 0;
margin-top: -40upx;
border-radius: 8upx;
;
}
.right {
display: flex;
flex-direction: column;
padding-left: 24upx;
font-size: $font-sm + 2upx;
color: $font-color-base;
line-height: 42upx;
.price {
font-size: $font-lg;
color: $uni-color-primary;
margin-bottom: 10upx;
}
.selected-text {
margin-right: 10upx;
}
}
}
.attr-list {
display: flex;
flex-direction: column;
font-size: $font-base + 2upx;
color: $font-color-base;
padding-top: 30upx;
padding-left: 10upx;
}
.item-list {
padding: 20upx 0 0;
display: flex;
flex-wrap: wrap;
text {
display: flex;
align-items: center;
justify-content: center;
background: #eee;
margin-right: 20upx;
margin-bottom: 20upx;
border-radius: 100upx;
min-width: 60upx;
height: 60upx;
padding: 0 20upx;
font-size: $font-base;
color: $font-color-dark;
}
.selected {
background: #fbebee;
color: $uni-color-primary;
}
}
}
.no-padding {
padding: 0upx 0upx;
}
/* 弹出层 */
.popup {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
z-index: 99;
&.show {
display: block;
.mask {
animation: showPopup 0.2s linear both;
}
.layer {
animation: showLayer 0.2s linear both;
}
}
&.hide {
.mask {
animation: hidePopup 0.2s linear both;
}
.layer {
animation: hideLayer 0.2s linear both;
}
}
&.none {
display: none;
}
.mask {
position: fixed;
top: 0;
width: 100%;
height: 100%;
z-index: 1;
background-color: rgba(0, 0, 0, 0.4);
}
.layer {
position: fixed;
z-index: 99;
bottom: 0;
width: 100%;
min-height: 40vh;
border-radius: 10upx 10upx 0 0;
background-color: #fff;
.btn {
height: 66upx;
line-height: 66upx;
border-radius: 100upx;
background: $uni-color-primary;
font-size: $font-base + 2upx;
color: #fff;
margin: 30upx auto 20upx;
}
}
@keyframes showPopup {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
@keyframes hidePopup {
0% {
opacity: 1;
}
100% {
opacity: 0;
}
}
@keyframes showLayer {
0% {
transform: translateY(120%);
}
100% {
transform: translateY(0%);
}
}
@keyframes hideLayer {
0% {
transform: translateY(0);
}
100% {
transform: translateY(120%);
}
}
}
/* 底部操作菜单 */
.page-bottom {
position: fixed;
left: 30upx;
bottom: 30upx;
z-index: 95;
display: flex;
justify-content: center;
align-items: center;
width: 690upx;
height: 100upx;
background: rgba(255, 255, 255, .9);
box-shadow: 0 0 20upx 0 rgba(0, 0, 0, .5);
border-radius: 16upx;
.p-b-btn {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: $font-sm;
color: $font-color-base;
width: 96upx;
height: 80upx;
.yticon {
font-size: 40upx;
line-height: 48upx;
color: $font-color-light;
}
&.active,
&.active .yticon {
color: $uni-color-primary;
}
.icon-fenxiang2 {
font-size: 42upx;
transform: translateY(-2upx);
}
.icon-shoucang {
font-size: 46upx;
}
}
.action-btn-group {
display: flex;
height: 76upx;
border-radius: 100px;
overflow: hidden;
box-shadow: 0 20upx 40upx -16upx #fa436a;
box-shadow: 1px 2px 5px rgba(219, 63, 96, 0.4);
background: linear-gradient(to right, #ffac30, #fa436a, #F56C6C);
margin-left: 20upx;
position: relative;
&:after {
content: '';
position: absolute;
top: 50%;
right: 50%;
transform: translateY(-50%);
height: 28upx;
width: 0;
border-right: 1px solid rgba(255, 255, 255, .5);
}
.action-btn {
display: flex;
align-items: center;
justify-content: center;
width: 180upx;
height: 100%;
font-size: $font-base;
padding: 0;
border-radius: 0;
background: transparent;
}
}
}
/* 优惠券面板 */
.mask {
display: flex;
align-items: flex-end;
position: fixed;
left: 0;
top: var(--window-top);
bottom: 0;
width: 100%;
background: rgba(0, 0, 0, 0);
z-index: 9995;
transition: .3s;
.mask-content {
width: 100%;
min-height: 30vh;
max-height: 70vh;
background: #f3f3f3;
transform: translateY(100%);
transition: .3s;
overflow-y: scroll;
}
&.none {
display: none;
}
&.show {
background: rgba(0, 0, 0, .4);
.mask-content {
transform: translateY(0);
}
}
}
/* 优惠券列表 */
.coupon-item {
display: flex;
flex-direction: column;
margin: 20upx 24upx;
background: #fff;
.con {
display: flex;
align-items: center;
position: relative;
height: 120upx;
padding: 0 30upx;
&:after {
position: absolute;
left: 0;
bottom: 0;
content: '';
width: 100%;
height: 0;
border-bottom: 1px dashed #f3f3f3;
transform: scaleY(50%);
}
}
.left {
display: flex;
flex-direction: column;
justify-content: center;
flex: 1;
overflow: hidden;
height: 100upx;
}
.title {
font-size: 32upx;
color: $font-color-dark;
margin-bottom: 10upx;
}
.time {
font-size: 24upx;
color: $font-color-light;
}
.right {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 26upx;
color: $font-color-base;
height: 100upx;
}
.price {
font-size: 44upx;
color: $base-color;
&:before {
content: '¥';
font-size: 34upx;
}
}
.tips {
font-size: 24upx;
color: $font-color-light;
line-height: 60upx;
padding-left: 30upx;
}
.circle {
position: absolute;
left: -6upx;
bottom: -10upx;
z-index: 10;
width: 20upx;
height: 20upx;
background: #f3f3f3;
border-radius: 100px;
&.r {
left: auto;
right: -6upx;
}
}
}
.brand-info {
margin-top: 16upx;
background-color: #fff;
display: flex;
flex-direction: column;
.brand-box {
display: flex;
align-items: center;
padding: 30upx 50upx;
.image-wrapper {
width: 210upx;
height: 70upx;
image {
width: 100%;
height: 100%;
}
}
.title {
flex: 1;
display: flex;
flex-direction: column;
font-size: $font-lg+4upx;
margin-left: 30upx;
color: $font-color-dark;
text:last-child {
font-size: $font-sm;
color: $font-color-light;
margin-top: 8upx;
&.Skeleton {
width: 220upx;
}
}
}
}
.d-header {
display: flex;
justify-content: center;
align-items: center;
height: 80upx;
font-size: $font-base + 2upx;
color: $font-color-dark;
position: relative;
text {
padding: 0 20upx;
background: #fff;
position: relative;
z-index: 1;
}
&:after {
position: absolute;
left: 50%;
top: 50%;
transform: translateX(-50%);
width: 300upx;
height: 0;
content: '';
border-bottom: 1px solid #ccc;
}
}
}
</style>