CSS实现优惠券镂空效果(周围有阴影)

999 阅读2分钟

起始

项目中常用到优惠券的镂空效果,要考虑“镂空遇到阴影”哦。 baby~ 来瞅一眼你的西雅图

预览

实现

1.考虑的点

1.布局方式
2.镂空效果
3.阴影效果(有镂空的前提下)

1.注意的点

调整两个镂空半圆inset的阴影效果,尽量让其和盒子的阴影融合,但是也不是很完美,边缘还能看到痕迹。

2.代码

1>.page

<View className='listBox'>
    <View className='item'>
        <View className='left'>
            <Text className='tipBox'>满减券</Text>
            <View className='infoBox'>
                <View className='info'><Text className='num'>40</Text></View>
                <View className='desc'>满300可用</View>
            </View>
        </View>
        <View className='shape'>
            <View className='color color1'></View>
            <View className='color color2'></View>
        </View>
        <View className='right'>
            <View className='infoBox'>
                <View className='name'>满300减40</View>
                <View className='time'>有效期至2020-12-18</View>
                <View className='desc'>所有商品可用</View>
            </View>
            <View className='bt'>领取</View>
        </View>
    </View>
    <View className='item disItem'>
        <View className='left'>
            <Text className='tipBox'>满减券</Text>
            <View className='infoBox'>
                <View className='info'><Text className='num'>40</Text></View>
                <View className='desc'>满300可用</View>
            </View>
        </View>
        <View className='shape'>
            <View className='color color1'></View>
            <View className='color color2'></View>
        </View>
        <View className='right'>
            <View className='infoBox'>
                <View className='name'>满300减40</View>
                <View className='time'>有效期至2020-12-18</View>
                <View className='desc'>所有商品可用</View>
            </View>
            <View className='bt'>已过期</View>
        </View>
    </View>
</View>

2>.scss

.listBox{
    height: calc(100vh - 340px);
    padding: 40px 30px;
    .item{
        @include flex-direction;
        margin-bottom: 30px;
        >.left{
            @include flex-center;
            position: relative;
            width: 188px;
            height: 200px;
            border-radius: 8px 0 0 8px;
            box-shadow: 0 8px 15px 0 rgba($color: #000, $alpha: .1);
            background: linear-gradient(to right, #ff9249 0%, #ff5e16 90%);
            overflow: hidden;
            .tipBox{
                @include position-way-tl(absolute, 0, 0);
                padding: 6px 12px;
                border-top-left-radius: 10px;
                border-bottom-right-radius: 10px;
                background-color: rgba($color: #fff, $alpha: .2);
                @include font-sc(22, white);
            }
            .infoBox{
                @include flex-center(column);
                .info{
                    @include position-way-tl(relative, 0, -10px);
                    @include font-sc(28, white);
                    .num{
                        font-size: 56px;
                        font-weight: bold;
                    }
                }
                .desc{
                    @include font-sc(28, white);
                }
            }
        }
        >.right{
            @include position-way-tl(relative, 0, -2px);
            width: 420px;
            height: 200px;
            padding: 0 30px;
            background-color: #fff;
            border-radius: 0 8px 8px 0;
            box-shadow: 0 8px 15px 0 rgba($color: #000, $alpha: .1);
            overflow: hidden;
            .infoBox{
                @include flex-direction(column);
                margin-top: 30px;
                .name{
                    @include font-sc(30, theme);
                    font-weight: bold;
                    margin-bottom: 15px;
                }
                .time, .desc{
                    @include font-sc(26, desc);
                    margin-bottom: 10px;
                }
            }
            .bt{
                @include position-way-tr(absolute, 76px, 30px);
                width: 140px;
                height: 54px;
                border-radius: 30px;
                background: linear-gradient(to right, #ff9249 0%, #ff5e16 100%);
                @include font-sc(30, white);
                line-height: 54px;
                text-align: center;
                z-index: 1;
            }
            &::before, &::after{
                display: block;
                content: '';
                border-radius: 50%;
                background-color: rgba($color: $color-theme, $alpha: .1);
            }
            &::before{
                @include position-way-tr(absolute, -15px, 100px);
                width: 70px;
                height: 70px;
            }
            &::after{
                @include position-way-br(absolute, -42px, -20px);
                width: 170px;
                height: 170px;
            }
        }
        >.shape{
            position: relative;
            @include flex-direction;
            width: 24px;
            height: 200px;
            z-index: 1;
            .color{
                width: 12px;
                height: 200px;
                &1{
                    background: linear-gradient(to right, #ff5e16 90%, #ff5e16 100%);
                }
                &2{
                    background: #fff;
                }
            }
            &::before, &::after{
                display: block;
                content: '';
                width: 24px;
                height: 12px;
                background-color: $color-bg;
            }
            &::before{
                @include position-way-tr(absolute, 0, 0);
                border-bottom-left-radius: 24px;
                border-bottom-right-radius: 24px;
                box-shadow: 0 -5px 2px rgba(0,0,0, .1) inset;
            }
            &::after{
                @include position-way-br(absolute, 0, 0);
                border-top-left-radius: 24px;
                border-top-right-radius: 24px;
                box-shadow: 0 5px 2px rgba(0,0,0, .1) inset;
            }
        }
        // disabled状态
        &.disItem{
            .left{
                background: linear-gradient(to right, #dbdbdb 0%, #bbb 90%);
                .tipBox{
                    @include font-sc(22, desc);
                }
            }
            >.shape{
                .color1{
                    background: linear-gradient(to right, #bbb 90%, #bbb 100%);
                }
            }
            .right{
                .infoBox{
                    .name{
                        @include font-sc(30, info);
                    }
                }
                .bt{
                    background: linear-gradient(to right, #dbdbdb 0%, #bbb 100%);
                }
                &::before, &::after{
                    background-color: rgba($color: #bbb, $alpha: .15);
                }
            }
        }
    }
}