纯CSS实现中间透明的关闭图标

一、背景和意义

关闭图标是网页中最常见的图标之一。有时候为了美观,需要把关闭图标中间的叉叉做做透明的:

让UI设计师弄一个中间透明的png图片是一种解决方案,但相比之下纯CSS实现的关闭图标占用流量更少、加载速度快、且方便修改图标的颜色。本文给出纯CSS实现中间透明的关闭图标的简单示例。

二、代码示例

2.1 创建背景图

首先,为了方便看出中间透明的效果,先弄一张windows操作系统的经典背景图:

html 复制代码
<style>
    .origin {
        width: 320px;
        height: 240px;
        background-size: cover;
        background-image: url("https://5b0988e595225.cdn.sohucs.com/images/20171010/2ab85e31fee24a36b3e9bb79d71885b2.jpeg");
    }
</style>
<div class="origin">
</div>

效果如下:

2.2 用svg画叉叉图标

用svg画叉叉还比较简单,先从(0, 0)到(100, 100)两个坐标之间画一条从左上到右下的线,再从(0, 100)到(100, 0)两个坐标之间画一条从左下到右上的线:

html 复制代码
<style>
    .origin {
        width: 320px;
        height: 240px;
        background-size: cover;
        background-image: url("https://5b0988e595225.cdn.sohucs.com/images/20171010/2ab85e31fee24a36b3e9bb79d71885b2.jpeg");
    }
    .line {
        stroke: #888;
        stroke-width: 17;
    }
</style>
<div class="origin">
    <svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 100 100">
        <line class="line" x1="0" y1="0" x2="100" y2="100" />
        <line class="line" x1="0" y1="100" x2="100" y2="0" />
    </svg>
</div>

展示效果为:

2.3 调整叉叉的大小和背景

给svg外面包一层a标签,控制其大小,并使用白色做为背景色:

html 复制代码
<style>
    .origin {
        width: 320px;
        height: 240px;
        background-size: cover;
        background-image: url("https://5b0988e595225.cdn.sohucs.com/images/20171010/2ab85e31fee24a36b3e9bb79d71885b2.jpeg");
    }
    .close {
        display: block;
        background-color: #fff;
        padding: 0.75rem;
        width: 2rem;
        border-radius: 50%;
    }
    .line {
        stroke: #888;
        stroke-width: 17;
    }
</style>
<div class="origin">
    <a class="close" href="javascript:void(0)">
        <svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 100 100">
            <line class="line" x1="0" y1="0" x2="100" y2="100" />
            <line class="line" x1="0" y1="100" x2="100" y2="0" />
        </svg>
    </a>
</div>

为了方便对比,这里特意地将图标做得大一些,当然在实际应用中一般不做那么大。展示效果如下:

2.4 将图标中间叉叉变透明

为图标增加mix-blend-mode属性,取值hard-light,可以将叉叉变成透明,修改后的代码如下:

html 复制代码
<style>
    .origin {
        width: 320px;
        height: 240px;
        background-size: cover;
        background-image: url("https://5b0988e595225.cdn.sohucs.com/images/20171010/2ab85e31fee24a36b3e9bb79d71885b2.jpeg");
    }
    .close {
        mix-blend-mode: hard-light;
        display: block;
        background-color: #fff;
        padding: 0.75rem;
        width: 2rem;
        border-radius: 50%;
    }
    .line {
        stroke: #888;
        stroke-width: 17;
    }
</style>
<div class="origin">
    <a class="close" href="javascript:void(0)">
        <svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 100 100">
            <line class="line" x1="0" y1="0" x2="100" y2="100" />
            <line class="line" x1="0" y1="100" x2="100" y2="0" />
        </svg>
    </a>
</div>

运行效果为:

2.5 其他优化

关闭图标一般放右上角,给图标加一个float: right可以将其挪到右上角,另外图标内的叉叉四个角太尖锐不好看,增加border-radius: 0.15rem可以变圆润一点:

html 复制代码
<style>
    .origin {
        width: 320px;
        height: 240px;
        background-size: cover;
        background-image: url("https://5b0988e595225.cdn.sohucs.com/images/20171010/2ab85e31fee24a36b3e9bb79d71885b2.jpeg");
    }
    .close {
        float: right;
        mix-blend-mode: hard-light;
        display: block;
        background-color: #fff;
        padding: 0.75rem;
        width: 2rem;
        border-radius: 50%;
    }
    .close svg {
        border-radius: 0.15rem;
    }
    .line {
        stroke: #888;
        stroke-width: 17;
    }
</style>
<div class="origin">
    <a class="close" href="javascript:void(0)">
        <svg xmlns="https://www.w3.org/2000/svg" viewBox="0 0 100 100">
            <line class="line" x1="0" y1="0" x2="100" y2="100" />
            <line class="line" x1="0" y1="100" x2="100" y2="0" />
        </svg>
    </a>
</div>

展示效果如下:

相关推荐
dly_blog1 小时前
Vue 响应式陷阱与解决方案(第19节)
前端·javascript·vue.js
消失的旧时光-19431 小时前
401 自动刷新 Token 的完整架构设计(Dio 实战版)
开发语言·前端·javascript
console.log('npc')2 小时前
Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果
前端·javascript·vue.js
用户47949283569152 小时前
React Hooks 的“天条”:为啥绝对不能写在 if 语句里?
前端·react.js
我命由我123452 小时前
SVG - SVG 引入(SVG 概述、SVG 基本使用、SVG 使用 CSS、SVG 使用 JavaScript、SVG 实例实操)
开发语言·前端·javascript·css·学习·ecmascript·学习方法
用户47949283569153 小时前
给客户做私有化部署,我是如何优雅搞定 NPM 依赖管理的?
前端·后端·程序员
C_心欲无痕3 小时前
vue3 - markRaw标记为非响应式对象
前端·javascript·vue.js
qingyun9893 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构
熬夜敲代码的小N3 小时前
Vue (Official)重磅更新!Vue Language Tools 3.2功能一览!
前端·javascript·vue.js
90后的晨仔3 小时前
用 Python 脚本一键重命名序列帧图片的名称
前端