前言

我们在平时的网页中,经常会见到这样的优惠券或者其他的券(特征就是会有反方向的圆角)。

可能大部分前端人员为了简单,直接采用图片的方式,直接把整张图作为背景。其实这也没什么不好的,简单,方便,还没有兼容性问题,ie6跑起来都没得问题。

如果不考虑那些低旧浏览器的话,还是有办法直接用css来实现,有几个好处

1.扩展方便,比如之前是300 100的,现在要改成300 150的,就一行代码的事

2.没有图片,加载起来也更快了,也节省了带宽

思路

我们先实现大致的框架,左右两部分

html,body{

box-sizing:border-box;

margin:0;

padding:20px;

height:100%;

background:#fadaa7;

}

.coupon{

display:inline-block;

overflow:hidden;

border-radius:10px;

}

.coupon-left{

float:left;

width:150px;

height:150px;

background:#252525;

}

.coupon-con{

float:left;

width:350px;

height:150px;

background:#fff;

}

下面就来实现中间看着比较复杂的"凹槽"部分

我能想到跟圆角相关的有圆角、圆形、径向...这些吧

有人说svg也可以,确实svg什么都可以做,不光是这种形状,只要画个路径,填充一下就完事,这个比较通用,并不是这个特例,所以在这里不讨论用这个方式。

还有一个原因,svg生成的形状也是固定了的,只能等比缩放,不能做其他自适应了。

1.圆角

看到这样的形状,一般人可能会想会不会可以用border-radius的负值呢,毕竟像margin那些,使用负值往往可以带来意想不到的效果

.con{

border-radius:-10px;

}

很可惜,这种写法根本就是不合法的,在谷歌浏览器上打开控制台可以看到直接被删除了。

2.圆形

虽然说这种思路不行,但是我们可以换一种思路。

假设我们现在有一个圆,它本身没有颜色,但是它有一个黑色的边框

现在我们想象一下,假如这个圆的边框越来越大,外面有个容器如果超出就会隐藏,会发生什么呢

如果这个圆在右下角,那么就变成了这样

这不就是我们需要的吗?

现在我们用css来实现

根据上面的分析,我们背景的颜色应该是圆的边框的颜色,所以原背景要去掉

.coupon-left{

position:relative;

overflow:hidden;

/*background:#252525*/

}

/*为了减少html的结构,我们使用伪元素*/

.coupon-left::before{

position:absolute;

width:20px;

height:20px;

top:-210px;

right:-210px;

border-radius:50%;

border:200px solid #252525;/*边框只要能够覆盖整个容器就行*/

}

这样就实现了一个凹槽。

本来以为这样下去,复制一下,改写一下就完事了的,结果发现没这么简单,因为现在形状是被裁剪出来的,所以我们不能让上一个圆角把整个都覆盖,不然下面的圆角就出不来了,这时我们要用到clip裁剪功能

关于clip这里简单介绍一下,我们一般会用到rect这个功能,有四个值,分别是上右下左

clip: rect(, , , );

这里我们改造一下我们刚才写的样式,添加如下代码

.coupon-left::before{

clip: rect(0,210px,285px,0);

}

这样就和下半部分隔离开来了,下面做下半部分的凹槽,我们用::after,写法完全一致,注意一下坐标就行了

.coupon-left::after{

content: '';

position: absolute;

top: -210px;

display: block;

right: -210px;

width: 20px;

height: 20px;

border-radius: 50%;

border: 200px solid #252525;

clip: rect(135px,210px,285px,0);

}

这样就完美的实现了两个凹槽,右边的原理同样,下面是完整的css代码

html,body{

box-sizing:border-box;

margin:0;

padding:20px;

height:100%;

background:#fadaa7;

}

.coupon{

display:inline-block;

overflow:hidden;

border-radius:10px;

}

.coupon-left{

float:left;

width:150px;

height:150px;

position:relative;

}

.coupon-left::before{

content: '';

position: absolute;

top: -210px;

display: block;

right: -210px;

width: 20px;

height: 20px;

border-radius: 50%;

border: 200px solid #252525;

clip: rect(0,210px,285px,0);

}

.coupon-left::after{

content: '';

position: absolute;

bottom: -210px;

display: block;

right: -210px;

width: 20px;

height: 20px;

border-radius: 50%;

border: 200px solid #252525;

clip: rect(135px,210px,285px,0);

}

.coupon-con{

float:left;

width:350px;

height:150px;

position:relative;

}

.coupon-con::before{

content: '';

position: absolute;

top: -410px;

display: block;

left: -410px;

width: 20px;

height: 20px;

border-radius: 50%;

border: 400px solid #fff;

clip: rect(0,800px,485px,410px);

}

.coupon-con::after{

content: '';

position: absolute;

bottom: -410px;

display: block;

left: -410px;

width: 20px;

height: 20px;

border-radius: 50%;

border: 400px solid #fff;

clip: rect(335px,800px,485px,410px);

}

下面是codepen演示

3.径向渐变

还有一个思路就是径向渐变。

那么怎样实现我们要的效果呢

我们先看看径向渐变的语法

radial-gradient([[ || ] [at ]?,| at ,]?[,]+);

径向渐变由它的中心定义。

用法

{

background:radial-gradient(circle at 50px 50px, yellow, orange 33.33%, red 66.666%, white)

}

我们把渐变的颜色改成透明到黑色的渐变

{

background:radial-gradient(circle at 50px 50px, transparent, #252525)

}

现在把透明的部分给一个距离,灰色的部分也给一个距离,让他们之前的渐变区域重合,就变成纯色了

{

background:radial-gradient(circle at 50px 50px, transparent 20px, #252525 20px)

}

现在把这个空心圆移到边缘

{

background:radial-gradient(circle at right top, transparent 20px, #252525 20px)

}

现在就是如何做出两个凹槽的问题

我们有两种方式,一种是和上面的一样,用两个伪元素拼接而成,第二种就是直接利用css3的多背景拼接

我们先说说第二种

{

background:radial-gradient(circle at right top, transparent 20px, #252525 20px, #252525 100px, transparent 100px),radial-gradient(circle at right bottom, transparent 20px, #252525 20px, #252525 100px, transparent 100px)

}

我们可以继续拼接,可能可以实现我们想要的效果

现在来说说第一种方法

我们把代码放入我们的例子当中

.coupon-left::before{

content: '';

position: absolute;

top: 0;

left: 0;

right:0;

height:50%;

background:radial-gradient(circle at right top, transparent 10px, #252525 10px, #252525 10px)

}

.coupon-left::after{

content: '';

position: absolute;

bottom: 0;

left: 0;

right:0;

height:50%;

background:radial-gradient(circle at right bottom, transparent 10px, #252525 10px, #252525 10px)

}

.coupon-con::before{

content: '';

position: absolute;

top: 0;

left: 0;

right:0;

height:50%;

background:radial-gradient(circle at left top, transparent 10px, #252525 10px, #fff 10px)

}

.coupon-con::after{

content: '';

position: absolute;

bottom: 0;

left: 0;

right:0;

height:50%;

background:radial-gradient(circle at left bottom, transparent 10px, #252525 10px, #fff 10px)

怎么样,是不是很方便?里面都是相对值,意味着有更好的适应性

下面是codepen演示

小节

相比于用圆形来实现,这种径向渐变更方便扩展,写起来也容易。

但是并不是说圆形的思路不对,如果只是做一个圆形缺口的话,那种写法更方便,在思维上,也更领先一步,更能锻炼一个人的空间思考和想象能力,更有设计师角度的意味,这大概是和一般程序员思维最大的不同之处吧

径向渐变一直以来的兼容性问题要比圆角大的多,每种浏览器内核的写法都不尽相同,虽然目前都基本支持标准写法了,但平时的项目还是要注意一些。实在是兼容性要求,那只能用图片代替了,谁叫客户第一呢

css绘制卡券优惠券_用纯css来实现一个优惠券相关推荐

  1. 纯css实现手风琴效果_创建纯CSS手风琴的4种方法

    内容手风琴是一种有用的设计模式. 您可以将它们用于许多不同的事物:用于菜单,列表,图像,文章摘录,文本片段甚至视频 那里的大多数手风琴都依赖JavaScript,主要是jQuery ,但是由于高级CS ...

  2. css实现图片虚化_前端纯css 图片的模糊处理

    最近做的一个项目需要用到背景图的模糊处理,在网上查资料,发现用css的 filter 属性就可以解决,但是因为模糊度比较高,四周会有很长的模糊边,百度上也没找到解决的方法,,可喜的是最后我在分析一个d ...

  3. html select 样式t调整_用纯css改变下拉列表select框的默认样式

    **社区评论 ( Beta版 )** #0 危汤讽 2015-04-02 09:57:05 firefox浏览器支持不好,貌似是浏览器bug 回复 #1 林甩土 2015-04-03 09:06:57 ...

  4. bootstrap4侧边栏_使用纯CSS和Bootstrap 4构建多个堆叠式粘性侧边栏

    bootstrap4侧边栏 Making high performant, pure CSS sticky sidebars that stack with Bootstrap 4. 制作与Boots ...

  5. css单标签,单标签!纯CSS实现动态晴阴雨雪

    封面.jpg 1 引言 本期分享一下如何仅用CSS3,实现单标签的动态晴阴雨雪.技术关键点就是"单标签"和"纯CSS".先看下最终效果: 效果预览.gif 再看 ...

  6. css 商城 两列_如何使用css伪元素实现超实用的图标库(附源码)

    今天我们来复盘一下前端中css伪元素的知识以及如何用css伪元素来减轻javascript的压力,做出一些脑洞大开的图形. 预备知识 伪元素 伪元素是一个附加至选择器末的关键词,允许你对被选择元素的特 ...

  7. 谈谈一些有趣的CSS题目(十四)-- 纯 CSS 方式实现 CSS 动画的暂停与播放!

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  8. css颜色 333是什么颜色,纯css实现的颜色扇附图

    今天我们实现一个纯css实现的颜色扇,继续学习sass的使用,效果见下图所示. html文件 复制代码代码如下: 然后是css文件,使用scss.prefire free和css reset. 复制代 ...

  9. 用纯css实现优雅的tab页,纯CSS实现Tab页切换效果的方法

    纯CSS实现Tab页切换效果的方法 发布时间:2020-10-26 09:30:20 来源:亿速云 阅读:104 作者:小新 小编给大家分享一下纯CSS实现Tab页切换效果的方法,希望大家阅读完这篇文 ...

最新文章

  1. 20155328 《信息安全系统设计基础》 课程总结
  2. OpenGL与CUDA互操作方式总结
  3. tensorflow 进阶(二),BP神经网络
  4. flask和vue的冲突问题
  5. ginkgo spi 错误_开发SPI时不要犯这个错误
  6. 关于Unity实现AR功能(五)摄像头转换与闪光灯开关控制
  7. 动点四边形周长最短_初中几何--线段之和最小值 Part 1:通过点关于直线对称点得到两定点之间直线段长度最短。...
  8. 作者:韩芳(1987-),女,中国科学院计算机网络信息中心工程师
  9. 【软件工程】用例间的关系
  10. 近期 AI 领域,招聘招生信息汇总
  11. Android 功耗(4)---MTK平台待机功耗分析流程
  12. php判断字符串里有英文,PHP针对中英文混合字符串长度判断及截取方法示例
  13. vue 请求在子组件加载后了_从零单排vue第九课--Vue实例及生命周期
  14. on the fly
  15. 突破领英限制如何查找非好友电话,邮箱技巧
  16. MySQL借助Excel快速区间分段统计思路(客单价分布 IOS账单分月)
  17. UE4(Unreal Engine 4)显示FPS
  18. 学习如逆水行舟,不进则退
  19. Unity可视化编程插件bolt1.4.15 (一)bolt下载与安装
  20. x²-dy²=-1有多少整数解?近30年无人解开的数学难题有答案了

热门文章

  1. JavaScript学习笔记(6)变量
  2. C++ 之基本结构语法
  3. 排序——使每位学生都有座位的最少移动次数
  4. 分享5款超级实用的电脑软件
  5. http://bbs.pediy.com/showthread.php?p=1365122
  6. 深入理解卷积网络的卷积
  7. 经典小船过河问题,附Python,java题解
  8. Gaussian Process understanding
  9. 安装一个新的int 9中断例程【在DOS下,按Tab建后改变当前屏幕的显示颜色,其它键照常处理】...
  10. linux音频子系统 - DAPM