乐趣区

如何使用css创建一个优惠券

需求场景

添加优惠券类目, 展示用户的优惠券

常见的设计样式如下图, 核心为半圆

分步拆解

优惠券的特点是带有反向圆角, 为了展示效果更好, 适配多种场景, 不推荐使用背景图片形式, 建议使用css.

网上有几种方案:

一种是 boder+clip 的形式, 裁剪出 4 个小半圆角, 拼凑在一起

一种是 radial-gradient 径向渐变, 相对上一种需要考虑其兼容性

一种是使用背景图片, 特点是加载稍慢, 体验比 css 差, 兼容性好

具体的代码这里就不一一演示了

参考其他网上内容:https://segmentfault.com/a/1190000015705604

注意细节

有一点要说明的是:

一定要注意细节, 就像考虑到兼容性和带宽以及加载时长一样, 我们也要为以后可能的变动留有空间.

前两种方案的特点是左右的容器都有背景色, 且半圆的边框色是有背景色截取而获得的.

当我们需要指定半圆的边框和其他边框颜色同时变换不同背景色的时候呢?

参考下图:

边框色和背景色可以是不一致的, 并且整个边框颜色可以保持一致, 而这些, 上述两种方法不论是 border 还是 gradient 显然不行.

其他方法

优惠券的样式是两部分拼接在一起, 同时带有半圆样式

那么我们的思路可以是:

  • 创建一个盒子, 包含左右两个卡券部分, 卡券背景色各自定义
  • 盒子上盖上两个半圆, 一个在顶部, 一个在底部, 背景色为白色
  • 卡券和半圆的边框都可以自定义, 同色使用一个色号即可

直接使用 css 创建一个嵌有半圆的边框不太现实, 但是我们可以通过其他方法达到视觉上的实现.

中间需要一些空间思维和想象能力, 过程可能复杂些, 但是能实现目的就行, 另辟蹊径的效果更好.

创建一个总容器

容器控制卡券的宽高和布局上位置, 不带有其他样式

创建左右卡券

添加两个容器, 一个放左边, 一个放右边, 割分总容器空间

左边容器单独设置左上和左下两个圆角, 右边容器单独设置右上和右下两个圆角

左右容器各自设置自定义背景色

贴上半圆

添加两个半圆, 背景色为白色, 边框待定

相对总容器绝对定位, 一个放顶部, 一个放底部

偏移量自定义, 保持一致即可

到这一步就完成了最初的样式, 接下来到了设置边框的时间

设置边框

给左右卡券容器和两个半圆添加边框即可, 不影响背景色

制作半圆

核心是制作半圆(只有轮廓)

<div class="circle"></div>
// 上半圆
.circle{
    width: 200px;
    height: 100px; /* 宽度的一半 */
    border-radius:100px 100px 0 0; /* 上和右为高度的长度 */
    background-color: #fff;
    border: 1px solid gray;
    border-bottom: none;
}
// 下半圆
.circle{
    width: 200px;
    height: 100px; /* 宽度的一半 */
    border-radius: 0 0 100px 100px; /* 上和右为高度的长度 */
    background-color: #fff;
    border: 1px solid gray;
    border-bottom: none;
}
退出移动版