在 CSS 或画布中绘制一条曲线,并沿着它移动圆圈

2023-11-29

今天我得到了一个设计,它是一个沿着曲线移动的圆圈。我用纯 css 到目前为止所取得的进展创建了一个 JSBin,但我觉得我的方向是错误的。我认为也许用画布更好,但我不知道从哪里开始。这不仅仅是沿着一条线绘制,它还填充了条形。

Fiddle

这是设计:

enter image description here

以下是我目前为止对 CSS 的了解:

enter image description here


以下是如何沿着曲线(三次贝塞尔曲线)对圆进行动画处理。

  • 使用画布绘制曲线context.bezierCurveTo method.

  • 使用一系列画布关闭你的彩虹路径context.lineTo method.

  • 要仅用彩虹颜色填充弯曲路径,您可以使用context.clip限制绘图仅在路径内显示。然后你可以使用context.fillRect填充您的多色带。

  • Use requestAnimationFrame创建一个动画循环,沿着曲线在不断增加的路点处绘制球。

  • 使用以下方法计算沿曲线的路点De Casteljau's Algorithm

这是示例代码和演示:

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var cw=canvas.width;
var ch=canvas.height;
   
var colors=[[229,133,50],[251,183,50],[133,206,63],[22,155,116],[26,160,219]];
var points=[35,120,317,511,709,792];
var p0={x:37,y:144};
var p1={x:267,y:143};
var p2={x:651,y:129};
var p3={x:794,y:96};
var waypoints=cubicBezierPoints(p0,p1,p2,p3);
var currentIndex=0;
var radius=10;
//
requestAnimationFrame(animate);

// draw the rainbow curve thing
function drawCurve(){
    ctx.save();
    ctx.moveTo(37,144);
    ctx.bezierCurveTo(267,143,651,129,794,96);
    ctx.lineTo(794,158);
    ctx.lineTo(37,158);
    ctx.closePath();
    ctx.fill(); 
    ctx.globalCompositeOperation='source-atop';
    for(var i=0;i<points.length-1;i++){
        var c=colors[i];
        ctx.fillStyle='rgb('+c[0]+','+c[1]+','+c[2]+')';
        ctx.fillRect(points[i],0,points[i+1],ch);
    }
    ctx.restore();    
}
//
function drawBall(){
    var pt=waypoints[currentIndex];
    ctx.beginPath();
    ctx.arc(pt.x,pt.y,radius,0,Math.PI*2);
    ctx.fillStyle='white';
    ctx.fill();
    ctx.strokeStyle='black'
    ctx.lineWidth=3;
    ctx.stroke();
}

// the animation loop
function animate(){
    ctx.clearRect(0,0,cw,ch);
    drawCurve();
    drawBall();
    ctx.beginPath();
    currentIndex++;
    if(currentIndex<waypoints.length){
        requestAnimationFrame(animate);
    }
}

// calculate the waypoints
function cubicBezierPoints(p0,p1,p2,p3){
    var ticksPerSecond=60;
    var seconds=4;
    var totalTicks=ticksPerSecond*seconds;
    var pts=[];
    for(var t=0;t<totalTicks;t++){
        pts.push(getCubicBezierXYatT(p0,p1,p2,p3,t/totalTicks));
    }
    return(pts);
}

// De Casteljau's algorithm which calculates points along a cubic Bezier curve
// plot a point at interval T along a bezier curve
// T==0.00 at beginning of curve. T==1.00 at ending of curve
// Calculating 100 T's between 0-1 will usually define the curve sufficiently
function getCubicBezierXYatT(startPt,controlPt1,controlPt2,endPt,T){
    var x=CubicN(T,startPt.x,controlPt1.x,controlPt2.x,endPt.x);
    var y=CubicN(T,startPt.y,controlPt1.y,controlPt2.y,endPt.y);
    return({x:x,y:y});
}
// cubic helper formula at T distance
function CubicN(T, a,b,c,d) {
    var t2 = T * T;
    var t3 = t2 * T;
    return a + (-a * 3 + T * (3 * a - a * T)) * T
    + (3 * b + T * (-6 * b + b * 3 * T)) * T
    + (c * 3 - c * 3 * T) * t2
    + d * t3;
}
body{ background-color: ivory; }
#canvas{border:1px solid red; margin:0 auto; }
<canvas id="canvas" width=820 height=200></canvas>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 CSS 或画布中绘制一条曲线,并沿着它移动圆圈 的相关文章

  • 使用 flex 将项目与底部对齐

    我正在尝试使用 flex 将父级内部的项目与父级底部对齐 但由于某种原因它不起作用 我究竟做错了什么 login border 1px solid red height 50px display flex login border radi
  • 单击表格行可显示更多信息

    我正在尝试使用 jQuery 来实现以下目标 当单击一个表格行时 会显示表格行内的 info div 如果单击另一个表格行 则当前显示的任何其他 info 元素将被隐藏 并根据表格行显示新的 info div已被点击 这个问题是 代码无法正
  • 如何使用CSS缩进多级select optgroup?

    只是试图通过嵌套深度缩进 optgroup 块 我尝试了一般margin left规则 嵌套元素然后尝试应用相同的规则 尝试过padding left 这样的缩进可能吗 看起来很简单 P 在下面的示例中 标记为 client2 a 的 op
  • 在 R 中修改传单弹出窗口

    我想修改 R 中传单弹出窗口的外观 帮助文件指出 in the popupOptions 函数需要 传递给底层 Javascript 对象构造函数的额外选项 In 这个例子 https rstudio github io leaflet p
  • 从 HTML 字符串中解析和选择

    使用 ajax 调用 我返回了页面的partialView HTML 但在显示它之前 我希望从主 div 中提取信息 如果我创建一个浮动窗口 该数据只是大小信息 Code div class window details more data
  • CSS3 变换:IE 中的缩放

    我想使用CSS3属性transform scale div transform scale 0 5 0 5 有没有办法在 Internet Explorer 8 及更低版本中模仿这个 可能与filter或者 JavaScript 解决方案
  • 将 Regex 对象分配给 html 输入模式

    我需要以编程方式将正则表达式对象分配给输入元素模式属性 以下是我当前的实现 var regex d 5 element attr pattern regex toString slice 1 1 有没有更好的方法来做到这一点而不需要字符串操
  • Bootstrap

    我正在尝试使用 Bootstrap 构建一个网站 到目前为止 一切都按计划进行 我想要一个固定的导航栏 并且我正在使用内置函数 div class navbar navbar fixed top 这很棒 正是我所需要的 但我希望导航和标题从
  • BeautifulSoup4:选择属性不等于x的元素

    我想做这样的事情 soup find all td attrs class foo 我想找到所有不具有 foo 类的 td 显然上面的方法不起作用 那怎么办呢 BeautifulSoup确实使 汤 变得美丽且易于使用 You 可以传递一个函
  • 在问题内显示内联块文本

    我一直在尝试显示内联块 如果我没有在 div 中添加任何内容 一切都会很好 但是当我这样做时 div 会折叠起来 我不知道确切的原因 任何想法 https jsfiddle net giancorzo ebqoptbd https jsfi
  • 固定 Div 与静态 div 的滚动条重叠

    我无法按照我想要的方式设计布局 我有一个内容区 content 您可以在示例图像中看到的灰色 里面有一个黄色元素 这个div是position static height 100 现在我有一个 left paneldiv 也 与positi
  • 如何使用 CSS 或 jQuery 设置第一个和最后一个 li 的样式?

    我如何设计第一个 顶级 li和最后一个 顶层 li使用 CSS 还是 jQuery 我正在使用 CSS 设置第一个li但它也是造型第一li在每个中学阶段ul 那么我怎样才能让它只设置样式li其中包含 Main 1 最后一个包含 Main 6
  • 从选择 onChange 调用 javascript 函数 [重复]

    这个问题在这里已经有答案了 所以我有一个简单的 HTML 选择框和一个 javascript 警报功能 我希望选择框有一个 onchange 事件来调用 javascript 警报函数 这是我到目前为止所拥有的 HTML div Type
  • 检测 Webkit/Chrome 中 HTML5 数字控件更改的事件?

    HTML5 为我们提供了一些新的输入元素 例如
  • Bootstrap 响应式表格在 iOS 设备上无法垂直滚动

    这就是我所拥有的 div class table responsive table class table style background transparent table div 我正在使用以下 bootstrap css 文件 ht
  • Twitter Typeahead 上使用 Bootstrap 3 的 CSS 问题

    随着 Bootstrap 3 的发布 Typeahead 已被删除 取而代之的是 https github com twitter typeahead js https github com twitter typeahead js 我已经
  • 从链接打开本地文件夹

    如何通过单击任何链接打开本地文件夹视图 我尝试了很多选择 例如 a href Open folder a or a Open folder a or a Open folder a 解决方案 启动可下载链接 以下内容适用于所有浏览器 但一如
  • HTML5 文件 API 和 AJAX 上传分块问题

    我编写了一个带有单独进度的拖放多个文件上传等 除了一件事之外 它工作得非常好 上传较大文件时 有时浏览器会锁定 直到上传完成 我认为这是因为该文件存储在浏览器的内存中并占用了浏览器可用的所有资源 我想知道 是否可以逐段读取文件并在读取时通过
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • 将引导程序弹出框保留在视口内

    我正在尝试使用带有按钮的侧边栏创建一个菜单 每个按钮都有一个指定的包含相关数据的弹出窗口 不幸的是 其中一个弹出窗口可能包含任意数量的行 并且在某些情况下它可能部分位于视口之外 See http jsfiddle net bfd9f 1 h

随机推荐

  • 解析lxml中的html正文片段

    我正在尝试解析 html 片段 h1 title h1 img src I use lxml html fromstring 这让我发疯 因为它不断剥夺我的片段的标签 gt lxml html fromstring h1 a h1 tag
  • 读取RIP寄存器给出下一条指令的地址? [复制]

    这个问题在这里已经有答案了 我尝试读取x86 64寄存器的值rip 这是什么objdump shows 4017ec 48 8d 35 00 00 00 00 lea 0x0 rip rsi 4017f3 41 89 d4 mov edx
  • 从“mapend”函数到“Monoid”实例的函数?

    我有一个数据结构 它是玫瑰树的一个特定子类 形成具有最大下界和最低上界函数的格 并且它支持两个完全合理的函数作为Monoid班级的mappend 有什么办法支持匿名吗MonoidHaskell 中的实例 这是我应该考虑使用 Template
  • 无法识别的选择器发送到 NSKeyedUnarchiver 实例

    无法弄清楚为什么会不断抛出此错误 NSCFString bytes unrecognized selector sent to instance 0xc3eb200 对于这段代码 void parser SBJsonStreamParser
  • 从 Excel 运行 SQL Server 过程

    我正在使用 SQL Server 2008 Enterprise 我在一个数据库中创建了一个过程 该过程由对不同数据库的多个查询组成 并显示最终的组合结果集 我尝试通过 Excel 执行它 因此结果将自动显示在 Excel 工作表中 但我收
  • ARKit模板Xcode项目主线程检查器日志控制台

    我刚刚启动了一个新的 Xcode ARKit 项目并在物理设备上运行它 但在控制台中我得到以下输出 Main Thread Checker UI API called on a background thread UIApplication
  • 在 Microsoft 依赖注入中获取开放式通用服务

    假设我们有以下服务 interface IService interface IService
  • 如何使用 BehaviourSubjects 在 Angular 组件之间共享 API 调用的数据?

    我目前正在构建一个 Angular 应用程序 在其中向 api 发出请求 并将响应映射到两个不同的数组 我可以在我的app components ts但我会根据我的需要制作新的组件 如何在组件之间共享数据以确保组件始终拥有最新数据 因为我还
  • Maven 中默认的生命周期是什么

    我正在尝试学习 Maven 并通过以下语句Maven 文档 共有三个内置的构建生命周期 默认 干净和站点 默认生命周期处理您的项目部署 干净的 生命周期处理项目清理 而站点生命周期处理 创建项目的站点文档 还有另一份声明说 默认 或构建 这
  • SWIFT - 领域数据库加密不起作用

    我正在尝试加密领域数据库中存储的数据 我跟着示例代码Realm 上提到的快速页面 我想加密数据而不是数据库文件 下面是我正在使用的代码 var error NSError nil let configuration Realm Config
  • Python的“超级”如何做正确的事情?

    我正在运行Python 2 5 所以这个问题可能不适用于Python 3 当您使用多重继承创建菱形类层次结构并创建最派生类的对象时 Python 会做正确的事情 TM 它调用最派生类的构造函数 然后调用从左到右列出的其父类 最后调用祖父类
  • javascript 没有给出计算机名称

    我正在尝试使用 JavaScript 获取客户端计算机名称 如下所示
  • 使用 Angular.js 从 Web 服务获取数据

    我尝试使用 Angular 从远程 WS 获取 Json 格式的数据 但遇到了一些麻烦 数据正确地来自网络服务 但我无法在控制器内使用它 这是为什么 角度代码 var booksJson var app angular module boo
  • 使用 ZipFile 类从多个文件的 zip 存档中解压缩文件

    我想使用ZipFile类 使用文件名从多个文件的存档中解压缩文件 如何获取 zip 文件名和目录的字符串以传递给ZipFile构造函数 您可以使用 AssetManager 和 ZipInputStreamhttp developer an
  • 在页面加载时重置

    如何在页面加载时重置 使用 JSF 或 CommandButton 的 onClick 事件 请在此处发布 Javascript 或 Ajax 示例 请有人帮助我解决这个问题 JSF 代码在这里
  • React componentDidMount 获取 api

    我正在尝试获取 componentDidMount 内的 api api 结果将设置为组件的状态 并将状态映射并传递给子组件 如果我使用获取 api里面的fetch方法componentDidMount 一切正常 componentDidM
  • 出于安全原因,curl_init() 已被禁用

    url http api stackoverflow com 1 1 search tagged php ch curl init curl setopt ch CURLOPT URL url curl setopt ch CURLOPT
  • 如何调试因 github 密钥不可用而出错的“docker build ...”会话?

    我有一个问题docker build 当尝试从私有 git 克隆存储库时该命令会中断 错误消息说我没有权限 17 4 712 转到 github com private 电子邮件受保护 阅读github com private projec
  • 确定php字符串中的重复字符

    我发现了很多如何在字符串中查找重复字符的示例 我相信我的要求是独特的 我有绳子 string aabbbccddd 我需要确定哪个角色重复次数最多 所以对于上面的例子会说 重复最多的字符是 B 然而 在上面的示例中 B 和 D 都重复了 3
  • 在 CSS 或画布中绘制一条曲线,并沿着它移动圆圈

    今天我得到了一个设计 它是一个沿着曲线移动的圆圈 我用纯 css 到目前为止所取得的进展创建了一个 JSBin 但我觉得我的方向是错误的 我认为也许用画布更好 但我不知道从哪里开始 这不仅仅是沿着一条线绘制 它还填充了条形 Fiddle 这