CSS奇技淫巧之实现波浪效果

2023-11-07

一直以来,使用纯 CSS 实现波浪效果都是十分困难的。

因为实现波浪的曲线需要借助贝塞尔曲线。 而使用纯 CSS 的方式,实现贝塞尔曲线,额,暂时是没有很好的方法。 当然,借助其他力量(SVG、CANVAS),是可以很轻松的完成所谓的波浪效果的。

下面先来看看非 CSS 方式实现的波浪效果

SVG 实现波浪效果

借助 SVG ,是很容易画出三次贝塞尔曲线的。

<svg width="200px" height="200px" version="1.1" xmlns="http://www.w3.org/2000/svg">
    <text class="liquidFillGaugeText" text-anchor="middle" font-size="42px" transform="translate(100,120)" style="fill: #000">50.0%</text>
    <!-- Wave -->
    <g id="wave">
    <path id="wave-2" fill="rgba(154, 205, 50, .8)" d="M 0 100 C 133.633 85.12 51.54 116.327 200 100 A 95 95 0 0 1 0 100 Z">
    <animate dur="5s" repeatCount="indefinite" attributeName="d" attributeType="XML" values="M0 100 C90 28, 92 179, 200 100 A95 95 0 0 1 0 100 Z;
    M0 100 C145 100, 41 100, 200 100 A95 95 0 0 1 0 100 Z;
    M0 100 C90 28, 92 179, 200 100 A95 95 0 0 1 0 100 Z"></animate>
    </path>
    </g>
    <circle cx="100" cy="100" r="80" stroke-width="10" stroke="white" fill="transparent"></circle>
    <circle cx="100" cy="100" r="90" stroke-width="20" stroke="yellowgreen" fill="none" class="percentage-pie-svg"></circle>
</svg>

有句话叫做“方法不对,努力白费”所有的前端大神都有自己的学习方法,而学web前端的学习也基本一致,而对于一个什么都不懂的初学者,根本不会知道该怎么学,这也是造成失败的最直接原因。所以学web前端一定要有人指点。如果你处在迷茫期,找不到方向。可以加入我们的前端学习交流qun: 784783012 。有任何不明白的东西随时来问我。点击:前端学习圈

画出三次贝塞尔曲线的核心在于 <path id="wave-2" fill="rgba(154, 205, 50, .8)" d="M 0 100 C 133.633 85.12 51.54 116.327 200 100 A 95 95 0 0 1 0 100 Z">这一段。感兴趣的可以自行去研究研究。</path>

canvas 实现波浪效果

使用 canvas 实现波浪效果的原理与 SVG 一样,都是利用路径绘制出三次贝塞尔曲线并赋予动画效果。

$(function() {
    let canvas = $("canvas");
    let ctx = canvas[0].getContext('2d');
    let radians = (Math.PI / 180) * 180;
    let startTime = Date.now();
    let time = 2000;
    let clockwise = 1;
    let cp1x, cp1y, cp2x, cp2y;

    // 初始状态
    // ctx.bezierCurveTo(90, 28, 92, 179, 200, 100);
    // 末尾状态
    // ctx.bezierCurveTo(145, 100, 41, 100, 200, 100);

    requestAnimationFrame(function waveDraw() { 
        let t = Math.min(1.0, (Date.now() - startTime) / time);

        if(clockwise) {
            cp1x = 90 + (55 * t);
            cp1y = 28 + (72 * t);
            cp2x = 92 - (51 * t);
            cp2y = 179 - (79 * t);
        } else {
            cp1x = 145 - (55 * t);
            cp1y = 100 - (72 * t);
            cp2x = 41 + (51 * t);
            cp2y = 100 + (79 * t);
        }

        ctx.clearRect(0, 0, 200, 200); 
        ctx.beginPath();
        ctx.moveTo(0, 100);
        // 绘制三次贝塞尔曲线
        ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, 200, 100);
        // 绘制圆弧
        ctx.arc(100, 100, 100, 0, radians, 0);
        ctx.fillStyle = "rgba(154, 205, 50, .8)";
        ctx.fill();
        ctx.save(); 

        if( t == 1 ) {
            startTime = Date.now();
            clockwise = !clockwise;
        }

        requestAnimationFrame(waveDraw);
    });
})

主要是利用了动态绘制 ctx.bezierCurveTo() 三次贝塞尔曲线实现波浪的运动效果,感兴趣的可以自行研究。

CSS实现波浪效果

最开始不是说css不能实现吗?是,我们没有办法直接绘制出三次贝塞尔曲线,但是我们可以利用一些讨巧的方法,模拟达到波浪运动时的效果,下面来看看这种方法。

原理

原理十分简单,我们都知道,一个正方形,给它添加 border-radius: 50%,将会得到一个圆形。

width: 240px;
height: 240px;
background: #f13f84;
border-radius: 50%;

好的,如果 border-radius 没到 50%,但是接近 50% ,我们会得到一个这样的图形(注意边角,整个图形给人的感觉是有点圆,却不是很圆。)

width: 240px;
height: 240px;
background: #f13f84;
border-radius: 40%;

好的,那整这么个图形又有什么用?还能变出波浪来不成?

我们让上面这个图形滚动起来(rotate) ,看看效果:

CSS实现波浪效果

@keyframes rotate{
	from{transform: rotate(0deg)}
	to{transform: rotate(359deg)}
}
.ripple{
	width: 240px;
	height: 240px;
	background: #f13f84;
	border-radius: 40%;
	animation: rotate 3s linear infinite;
}

可能很多人看到这里还没懂旋转起来的意图,仔细盯着一边看,是会有类似波浪的起伏效果的。

而我们的目的,就是要借助这个动态变换的起伏动画,模拟制造出类似波浪的效果。

实现

当然,这里看到是全景实现图,所以感觉并不明显,OK,让我们用一个个例子看看具体实现起来能达到什么样的效果。

我们利用上面原理可以做到的一种波浪运动背景效果图:

后面漂浮的波浪效果,其实就是利用了上面的 border-radius: 40% 的椭圆形,只是放大了很多倍,视野之外的图形都 是隐藏的 ,只留下了一条边的视野,并且增加了一些相应的transform 变换。

可能有部分同学,还存在疑问,OK,那我们把上面的效果隐藏部分显示处理,将视野之外的动画也补齐,那么其实生成波浪的原理是这样的:

图中的红色框就是我们实际的视野范围。

值得注意的是,要看到,这里我们生成波浪,并不是利用旋转的椭圆本身,而是利用它去切割背景,产生波浪的效果。

转载于:https://my.oschina.net/zybc/blog/3037266

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CSS奇技淫巧之实现波浪效果 的相关文章

  • 程序员常用快捷键整理(VS、Windows,提高效率,只有一步之遥)

    前言 本篇博客整理了程序员常用的快捷键 主要包括VS visual studio 编译器的快捷键 Windows操作系统快捷键 由于我目前只是一个刚学了C的程序员小白 对于其他的编译环境的相关快捷键等之后学到后会继续补充在这篇博客 提高编程
  • 浅谈STL

    一 函数对象概念 概念 重载函数调用操作符的类 其对象常称为函数对象 函数对象使用重载的 时 行为类似函数调用 也叫仿函数 本质 函数对象 仿函数 是一个类 不是一个函数 特点 函数对象在使用时 可以像普通函数那样调用 可以有参数 可以有返
  • CentOS中安装Docker

    Docker 要求 CentOS 系统的内核版本高于 3 10 通过 uname r 命令查看你当前的内核版本 uname r 确保 yum 包更新到最新 sudo yum update 移除旧的版本 sudo yum remove doc
  • 【人物访谈·03期】关于对数据分析前辈的一次行业探讨

    小飞象 人物访谈 做一个独立的人 不要依赖别人 独立会给你的魅力加分 出品 小飞象 人物访谈 嘉宾 冰冰老师 采访 整理 木兮 排版 木兮 背景 本期03 访谈邀请到了小飞象社群特别嘉宾 冰冰 个人公众号 冰云数据 作为访谈对象 而且通过此
  • Uncaught TypeError: Cannot read properties of undefined (reading ‘MethodInfo‘)

    VUE前端项目问题记录 vue grpc web 错误描述 user grpc web pb js 95 Uncaught TypeError Cannot read properties of undefined reading Meth
  • 多任务学习中的数据分布问题(一)

    今天这个专题源于我在做分布式多任务学习实验时在选取数据集的时候的疑惑 以下我们讨论多任务学习中 尤其是在分布式的环境下 如何选择数据集和定义任务 多任务学习最初的定义是 多任务学习是一种归纳迁移机制 基本目标是提高泛化性能 多任务学习通过相
  • 打通大前端最后一公里之前端埋点与日志系统架构设计

    什么是埋点 所谓 埋点 是数据采集领域 尤其是用户行为数据采集领域 的术语 指的是针对特定用户行为或事件进行捕获 处理和发送的相关技术及其实施过程 埋点的技术实质 是先监听软件应用运行过程中的事件 当需要关注的事件发生时进行判断和捕获 埋点
  • C51单片机 串口通信RX&TX---适合初学

    原料 keil 仿真软件 虚拟串口工具 群文件里的tools vspdctl dll记得覆盖 说明 串口中断允许位ES 1时 单片机一接收到数据或者发送数据就会进入串口中断函数 我认为是因为SBUF一有动静 便会触发到中断 所以单片机发送数
  • 2022年高考都结束了,还有人真觉得程序员下班后不需要学习吗?

    一转眼 高考已经过去十来天了 近期 各省市也陆续公布了高考成绩 还有今年的各批次录取日程 最近一些有转行想法的 刚毕业想进入这个行业的人 甚至还有刚高考完的小朋友私信问我以后想当去大厂当程序员的话需要提前学些什么 属实 卷 得可以 哈哈前浪
  • windows常见后门隐藏和权限维持方法及排查技术

    https xz aliyun com t 4842 这片文章中隐藏webshell我觉得很nice 进程注入以前试过 wmi 和 bitsadmin 可以了解下 常见backdoor和persistence方式方法 系统工具替换后门 Im
  • linux嵌入式常见面试问题(持续更新)

    1 采用DMA方式进行串口通信 如何解析数据才能提高吞吐量 DMA 直接内存访问 是一种通过硬件控制器直接访问内存的方式 而不需要CPU的干预 在串口通信中 采用DMA方式可以减少CPU的负担 提高数据传输的效率 为了提高吞吐量 需要对DM
  • Python错误:ModuleNotFoundError: No module named ‘keras‘(已解决)

    出现错误 进入 Settings Project interpreter 点击右边 在左边出现的组件中找到keras 点击下方的Install Pakage 安装成功
  • Java 格式化字符串

    7 4 1 常规类型的格式化 String类的format 方法用于创建格式化的字符串以及连接多个字符串对象 熟悉C语言的读者应该记得C语言的sprintf 方法 两者有类似之处 format 方法有两种重载形式 l format Stri
  • java通过redis实现排行榜功能

    1 数据存储规划 在排行榜中 每个用户都会有一个唯一的标识 ID 同时需要记录该用户的积分 Score 因此 我们可以将每个用户的ID作为有序集合中的一个元素 将用户的积分作为该元素的分数 ZADD rank 1000 user1 ZADD
  • Qt操作表格

    文章目录 一 使用QAxObject 1 环境配置 二 使用QXlsx 一 使用QAxObject 1 环境配置 首先在Qt Modules中引入axserver axcontainer 代码中包含相关头文件 include
  • 计算机内存是ram,电脑ram内存不足怎么办

    电脑ram内存不足怎么办 电脑用久了就会经常出现内存不足的情况 今天小编要给大家介绍的便是电脑ram内存不足怎么办 欢迎阅读 电脑ram内存不足怎么办 设置虚拟内存按照微软认证系统工程师刘岸松的方法设置方法如下 设置虚拟内存方法 右击我的电
  • A Simple RGB ISP

    设计一个最简单的RGB ISP需要多少个模块呢 答案可能是4个 分别是CFA CCM GAMMA和RGB2YUV 有了这4个模块 我们就可以将Sensor输出的RAW data转化为在显示器上可以观看的画面了 CFA Color Filte
  • 基于组合双向拍卖的共享储能机制研究(Matlab代码实现)

    目录 1 概述 2 运行结果 2 1 算例数据 2 2 买家中标 2 3 卖家中标 3 文献来源 4 Matlab代码实现 1 概述 文献来源 摘要 为满足共享储能中储能用户的互补性和替代性需求 解决常规单向拍卖中可能存在的垄断竞争问题 提
  • 怎样才算一个好的产品经理?

    虽然是小公司全能型人员 但是随着实际写代码变得越来越少 产品的规划和运营越来越多 自己的主要职能也在向产品经理上转变 所以最近几年比较关注产品经理方面的功能 那么怎么才能算是一个好的产品经理呢 周鸿伟的观点 这个名字相信让很多人又爱有恨 但
  • Vue.js模板语法

    模板语法 Vue js使用了基于HTML的模板语法 允许开发者声明式地将DOM绑定至底层Vue实例的数据 所有vue js的模板都是合法的HTML 所以能被遵循规范的浏览器和HTML解析器解析 在底层的实现上 Vue将模板编译成虚拟DOM渲

随机推荐

  • Python与OpenCV(一)——基于帧差法的运动目标检测程序分析

    OpenCV提供了强大的图像处理功能 与Python的结合堪称完美 这一次 我们试一下用帧差法来完成对运动目标的检测与跟踪 帧差法的原理是这样的 由于摄像机采集的视频序列具有连续性的特点 所以如果所采集场景内没有运动目标的时候 连续帧的变化
  • git本地删除后如何再pull下来_实践总结——Git 常见错误及解决方法

    Git 是当下最常用的代码管理库 是程序员日常工作中使用频率最高的工具 在频繁的使用过程中 难免会遇到各种各样的问题 今天跟大家分享 Git 常见的错误和解决方法 问题一 执行Git add somefile 的时候 出现如下错误 If n
  • 如何利用Parsec+Zerotier+moon实现远程电脑云电脑、云办公、云游戏

    前期说明 RD Client 没法串流 向日葵带宽受限 同时也没办法打游戏 那么可不可以自己实现一台云电脑来实现云游戏呢 答案当然是可以的了 下面文章将进行介绍Parsec 远程电脑的三种方案 快速跳转链接 利用IPv6实现公网访问远程桌面
  • Python爬虫时遇到SSL证书验证错误解决办法汇总

    在进行Python爬虫任务时 遇到SSL证书验证错误是常见的问题之一 SSL证书验证是为了确保与服务器建立的连接是安全和可信的 但有时候可能会由于证书过期 不匹配或未受信任等原因导致验证失败 为了解决这个问题 本文将提供一些实用的解决办法
  • 大数据采集、清洗、处理:使用MapReduce进行离线数据分析完整案例

    1 大数据处理的常用方法 大数据处理目前比较流行的是两种方法 一种是离线处理 一种是在线处理 基本处理架构如下 在互联网应用中 不管是哪一种处理方式 其基本的数据来源都是日志数据 例如对于web应用来说 则可能是用户的访问日志 用户的点击日
  • R语言练习题(1)

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 R语言练习 打开Rgui 1 在R控制台中提示符后依次输入下列语句 理解R的交互过程 2 3 45 6 x lt 3 4 5 6 x lt x 1 x 1 2 如何打开R的帮助
  • Python小白项目体系练习500例(附源代码),练完可就业

    1 有一个jsonline格式的文件file txt大小约为10K 2 补充缺失的代码 3 输入日期 判断这一天是这一年的第几天 4 打乱一个排好序的list对象alist 5 现有字典 d a 24 g 52 i 12 k 33 请按va
  • SpringBoot框架下,前后端实现文件交互——文件上传

    pc端实现文件上传与下载 前后端进行文件交互 主要形式为文件的上传与下载 1 上传的主要形式为前端通过文件上传插件将文件通过文件流形式传递到后端 后端进行处理 保存至目标地址 2 下载的主要形式为前端访问后台下载地址 实现文件下载 然后弹出
  • java多选下拉列表框_Java+Selenium3自动化入门4---Select多选框下拉列表

    在做自动化的过程中我们会遇到很多的控件 有的控件在WebDriver中都有封装好的API 我们使用这些方法来操作会提高我们的测试用例编写效率和准确性 今天我就来介绍下关于select多选框的操作方法 在Selenium中 针对html的标签
  • VTK:显式结构化网格实战详解

    VTK 显式结构化网格实战详解 本篇文章将详细介绍如何使用 VTK 库对显式结构化网格进行建模 可视化等操作 我们将通过 Python 语言的代码实现对显式结构化网格的读取与显示 并对其中的数据进行处理和分析 首先 我们需要导入必要的 Py
  • iOS项目统计总代码行数

    快速统计Xcode工程项目代码量 步骤一 打开终端 用cd命令 定位到工程所在的目录 然后调用以下命名即可把每个源代码文件行数及总数统计出来 find name m or name mm or name cpp or name h or n
  • JAVA后台接收前台传过来的json字符串并解析获得key 和value

    前台代码 ajax type post url project updateProject data formdata JSON stringify formdata tabname tabname val id proid val suc
  • Ubuntu16.04中python2.7、python3.5和python3.7共存

    Ubuntu中默认安装了python2 7和python3 5 由于一次测试 我需要python3 7的环境 所以进行了安装 其中涉及到 python源码安装 软链接的增添 删除修改 对应版本的pip安装和查看 一 python源码安装 1
  • IT项目管理八

    作业一 假定你的组织想聘用新教师来教授项目管理课程 制定一个质量标准清单 可用于做出此次聘用决定 质量标准项 质量标准度量 学历要求 985硕士及以上学历 资格要求 具有教室资格证 专业要求 计算机或者软件工程专业 从业经历 任教5年以上
  • Qt一步一步实现插件调用(附源码)

    最近手里几个项目都采用插件的方式进行开发工作 这里记录一下实现方法 给需要的同学一个参考 在linux系统和window系统都能成功编译通过 不废话直接步骤 第一步 建立插件原型 新建一个Qt项目 实现一个一个实时刷新当前时间这这么一个功能
  • C++ 比较浮点型数据(float,double)

    学习来源 C Lern bool approximatelyEqualAbsRel double a double b double absEpsilon double relEpsilon Check if the numbers are
  • past_key_values在P-TuningV2中的巧用

    背景 目前HuggingFace发布了关于微调LLMs的方法包 Parameter Efficient Fine Tuning PEFT 其中包含下面6种方法 LoRA LORA LOW RANK ADAPTATION OF LARGE L
  • 命令执行攻击与防御

    命令执行漏洞效果类似包含攻击 主要时由于输入的参数被当成命令来执行 远程命令执行漏洞 如果目标站点在设计时其过滤功能不严格或数据与代码区分不明显 及其导致命令执行漏洞的存在 利用系统函数实现远程命令执行 在PHP下 允许远程命令执行的函数有
  • 阿里云部署Node.js服务器(Windows环境)

    花了大半个月做的网站终于要上线了 周围的同学们很多都在使用阿里云的服务器 我也入手了一台 考虑到自己不是很适应ubuntu的命令行界面 于是买了个windows的 上网搜了一下 似乎都是用linux来部署nodejs的 所以只能自己摸索着来
  • CSS奇技淫巧之实现波浪效果

    为什么80 的码农都做不了架构师 gt gt gt 一直以来 使用纯 CSS 实现波浪效果都是十分困难的 因为实现波浪的曲线需要借助贝塞尔曲线 而使用纯 CSS 的方式 实现贝塞尔曲线 额 暂时是没有很好的方法 当然 借助其他力量 SVG