在 CSS 中,倒影是一种比较常见的效果。今天,我们就将尝试,使用 CSS 完成各类不同的倒影效果,话不多说,直接进入主题。

实现倒影的两种方式

首先,快速过一下在 CSS 中,实现倒影的 2 种方式。

使用 -webkit-box-reflect

正常而言,-webkit-box-reflect 是一种非常便捷及快速的实现倒影的方式。

-webkit-box-reflect 的语法非常简单,最基本的用法像是这样:

div {
-webkit-box-reflect: below;
}

其中,below 可以是 below | above | left | right 代表下上左右,也就是有 4 个方向可以选。

看这么一个例子:

div {
background-image: url('image.png');
-webkit-box-reflect: below 2px linear-gradient(transparent, rgba(0, 0, 0, .5));
}

看看效果,有了虚实变化之后,这样就更像是一个倒影。

简单而言,使用 -webkit-box-reflec 可以做到:

  1. 不同方向的投影
  2. 投影的距离
  3. 投影的虚实,可叠加一层蒙版控制透明度

上面 3 点即是 -webkit-box-reflec 的特点,同时,也表明了它存在一定的局限性,同时,在今天,从 -webkit-box-reflec 的名字也能看出来,存在一点兼容性问题。所以,如果,我们想实现更负杂一点的倒影效果。利用下面一种方式可能更好。

利用实现多一个反向元素实现

这个方法其实是更为普遍的。也就是我们实现一个反向的效果即可。通常会利用元素的伪元素。

代码非常简单,以文字为例子:

<p content="Reflect">Reflect</p>
p {
position: relative; &::before {
content: attr(content);
position: absolute;
inset: 0;
transform: rotatex(180deg) translatey(15px);
transform-origin: 50% 100%;
}
}

就是通过元素的伪元素,再旋转 180 度,放置到正确合适的位置即可,效果如下:

虽然这个代码多一点,但是由于这是一整个可控制的元素,所以基于它,我们可以实现的效果就能够非常丰富。

实现各式倒影效果

下面,我们就基于上述的 DEMO,丰富我们的倒影效果。

我们核心要做的,就是通过改造伪元素,实现不同的效果,得到不一样的倒影。

  1. 通过 mask,控制透明度,控制条纹

我们可以通过 mask,有效的控制倒影的透明度:

p::before {
mask: linear-gradient(transparent, #000);
}

效果如下:

透明度的控制也可以是这种从左往右的:

p::before {
mask:
linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.01) 25%,
white,
rgba(255, 255, 255, 0.01) 75%,
transparent
);
}

效果如下:

当然,mask 可以有不同的作用,不仅仅是控制透明度,也可以实现横线分隔、竖线分隔、斜线分隔:

p::before {
mask: repeating-linear-gradient(
transparent,
transparent 3px,
white 3px,
white 4px
);
}

这个是横线,效果如下:

改变 mask 的角度,就可以得到各种不同方向的效果:

p::before {
mask: repeating-linear-gradient(
90deg,
transparent,
transparent 3px,
white 3px,
white 4px
);
}

是的,我们还可以把上述两个不同的 mask 效果叠加在一起,那么就会是这样:

p::before {
mask:
repeating-linear-gradient(
transparent,
transparent 3px,
white 3px,
white 4px
),
linear-gradient(transparent 40%, white 90%);
}

那么,就会是渐变消失叠加线段分隔的效果:

上面的效果,再叠加上角度控制,就是另外一种效果:

p::before {
mask:
repeating-linear-gradient(
35deg,
transparent,
transparent 3px,
white 3px,
white 4px
),
linear-gradient(-90deg, transparent, transparent, white);
}

效果如下:

  1. 配合 transform,实现斜体

通过叠加 transform,我们就能很好的让字体有一个适合的倾斜角度,像是这样:

p::before {
mask: linear-gradient(transparent 20%, rgba(255, 255, 255, .7) 95%);
transform: rotatex(180deg) translatey(15px) skew(135deg) translatex(-10px);
}

效果如下:

当然,控制 mask,能有各式的纹理:

p::before {
mask:
repeating-linear-gradient(35deg, transparent, transparent 2px, white 2px, white 4px),
repeating-linear-gradient(-35deg, transparent, transparent 2px, white 2px, white 4px),
linear-gradient(transparent 30%, white 95%);
transform: rotatex(180deg) translatey(15px) skew(135deg) translatex(-10px);
}

效果如下:

如果把另外一个伪元素也用上呢,就能丰富倒影的方向:

p {
&::before {
mask: linear-gradient(transparent 5%, rgba(255, 255, 255, .9) 95%);
transform: rotatex(180deg) translatey(11px) skew(125deg) translatex(-10px);
background: #333;
color: transparent;
background-clip: text;
z-index: 1;
}
&::after {
transform: rotatex(180deg) translatey(11px) skew(-125deg) translatex(8px);
background: #ddd;
color: transparent;
background-clip: text;
mask: linear-gradient(transparent 5%, rgba(255, 255, 255, .9) 95%);
}
}

像是这样:

  1. 借助滤镜实现虚化

再接着,我们可以借助滤镜,继续丰富倒影的效果。

譬如简单的一层模糊滤镜:

p::before {
mask: linear-gradient(transparent 5%, rgba(255, 255, 255, .9) 99%);
transform: rotatex(180deg) translatey(6px) skew(135deg) translatex(-8px);
filter: blur(8px);
}

效果如下:

或者是半截式的,模糊倒影:

p::before {
transform: rotatex(180deg) translatey(15px);
filter: blur(4px);
mask: linear-gradient(transparent 30%, white 90%);
}

或者是多个滤镜叠加在一起:

p::before {
transform: rotatex(180deg) translatey(15px);
filter: blur(9px) brightness(1.5);
}

效果如下:

上述所有效果的 Demo,你可以在这里找到:

CodePen Demo -- Text Reflect Effect Demo

尝试更换字体以及利用 background-clip: text

再接着,我们可以尝试更换不同的字体。其实,通过 background-clip: text 的特性,给文字染上不同的效果。

譬如,我们选择了这样一张图片:

通过 background-clip: text 作用给文字,像是这样:

p {
position: relative;
font-family: 'new font', sans-serif;
background: url(花里胡哨的图片.jpg);
background-clip: text;
color: transparent; &::before {
content: attr(content);
position: absolute;
inset: 0;
transform: rotatex(180deg) translatey(24px);
transform-origin: 50% 100%;
background: inherit;
background-clip: text;
color: transparent;
}
}

再重复上述的效果一次,我们就能得到更为多样的不同的效果,下面是整体效果展示图:

完整的代码,你可以戳这里:CodePen Demo -- Text Reflect Effect Demo

最后

当然,倒影能做的效果远不止这些,感兴趣的读者可以尝试使用更多 CSS 属性,制作更多有意思的倒影效果。

好了,本文到此结束,希望本文对你有所帮助

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

CSS 奇思妙想之酷炫倒影的更多相关文章

  1. Amazing!巧用 CSS 视差实现酷炫交互动效

    本文将介绍利用 CSS 实现滚动视差效果的一个小技巧,并且,利用这个技巧来制作一些有意思的交互特效. 关于使用 CSS 实现滚动视差效果,在之前有一篇文章详细描述过具体方案 - CSS 实现视差效果, ...

  2. 使用纯 CSS 实现超酷炫的粘性气泡效果

    最近,在 CodePen 上看到这样一个非常有意思的效果: 这个效果的核心难点在于气泡的一种特殊融合效果. 其源代码在:CodePen Demo -- Goey footer,作者主要使用的是 SVG ...

  3. 【CSS进阶】试试酷炫的 3D 视角

    写这篇文章的缘由是因为看到了这个页面: 戳我看看(移动端页面,使用模拟器观看) 运用 CSS3 完成的 3D 视角,虽然有一些晕3D,但是使人置身于其中的交互体验感觉非常棒,运用在移动端制作一些 H5 ...

  4. 15个来自 CodePen 的酷炫 CSS 动画效果【下篇】

    CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果.你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果. 今天这篇文 ...

  5. 赞!15个来自 CodePen 的酷炫 CSS 动画效果

    CodePen 是一个在线的前端代码编辑和展示网站,能够编写代码并即时预览效果.你在上面可以在线分享自己的 Web 作品,也可以欣赏到世界各地的优秀开发者在网页中实现的各种令人惊奇的效果. 今天这篇文 ...

  6. 一个酷炫的,基于HTML5,Jquery和Css的全屏焦点图特效,兼容各种浏览器

    基于HTML5和CSS的焦点图特效,梅花图案的背景很有中国特色,而且还会动哦,效果超炫,推荐下载! 演示图 html代码 <!DOCTYPE html PUBLIC "-//W3C// ...

  7. 学习animate.css包含了一组炫酷、有趣、跨浏览器的动画

    1.animate.css包含了一组炫酷.有趣.跨浏览器的动画,可以在你的项目中直接使用. 第一步:引入animate.css样式文件或者引入某些平台的CDN文件: <head> < ...

  8. 用 CSS 实现酷炫的动画充电效果

    巧用 CSS 实现酷炫的充电动画 循序渐进,看看只使用 CSS ,可以鼓捣出什么样的充电动画效果. 画个电池 当然,电池充电,首先得用 CSS 画一个电池,这个不难,随便整一个: 欧了,勉强就是它了. ...

  9. 百度前端技术学院2018笔记 之 利用 CSS animation 制作一个炫酷的 Slider

    前言 题目地址 利用 CSS animation 制作一个炫酷的 Slider 思路整理 首先页面包含三种东西 一个是type为radio的input其实就是单选框 二是每个单选框对应的label 三 ...

  10. 3个CSS动画库,比Animated还好用,让你的网站酷炫起来

    本文首发于https://www.1024nav.com/tools/css-animation-library 转载请注明出处 整理了日常前端开发中常用的css动画库,让你的网页动起来,可以在生成中 ...

随机推荐

  1. 7.MongoDB系列之聚合框架

    1. 管道阶段和可调参数 聚合框架基于管道的概念.他由多个阶段组成,每个阶段都会提供一组按钮或可调参数.每个阶段对其输入执行不同的数据处理任务,并生成文档已作为输出传递到下一阶段. 2. 阶段常见操作 ...

  2. Docker之介绍与安装

    Docker 说明 本章,我们主要从Docker简介.Docker中几个核心概念和Docker安装这几个方面对Docker进行介绍! 1. Docker 简介 1.1. 什么是 Docker Dock ...

  3. 7. url反向解析和静态文件

    一.代码中url出现的位置 1.模版[html]中 1.<a href='urk'>超链接点击跳转<a/> 2.<form action='url' method='po ...

  4. idea如何生成jar包

    最近在研究RMI反序列化命令执行的漏洞,让我这个java新手吃尽了苦头,能多学习一些是一些吧. 记录一下写好的java文件生成jar包的过程. 环境: Win10,jdk1.7, idea2016.2 ...

  5. Mybatis-Plus多表联查

    表格结构: CREATE TABLE `ssmpdemo`.`person_test` ( `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_gener ...

  6. Element基本组件

    Element按钮组件: <el-row> <el-button>默认按钮</el-button> <el-button type="primary ...

  7. Android10 dex2oat实践

    最近看到一篇博客:Android性能优化之Android 10+ dex2oat实践,对这个优化很感兴趣,打算研究研究能否接入到项目中.不过该博客只讲述了思路,没有给完整源码.本项目参考该博客的思路, ...

  8. TASK 总结

    信相连知识 1.python操作EXCEL 库:xlwings. 基本操作:打开.读写.关闭. 2.python操作问题库 库:JIRA 基本操作:提交问题 3.网页信息在网址不变时的获取 库:req ...

  9. Java8新特性—四大内置函数式接口

    Java8新特性--四大内置函数式接口 预备知识 背景 Lambda 的设计者们为了让现有的功能与 Lambda 表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念. 什么是函数式接口? 函数 ...

  10. 最新的ZooKeeper GUI

    Zookeeper 是一个分布式的.开源的程序协调服务,是 hadoop 项目下的一个子项目.他提供的主要功 能包括:配置管理.名字服务.分布式锁.集群管理. 平时用zkCli.sh进行管理不免有点不 ...