基于JavaScript canvas绘制贝塞尔曲线


Posted in Javascript onDecember 25, 2018

简单描述:页面上有四个点,鼠标拖动四个点的位置来改变贝塞尔曲线的形状,双击放置点位

效果图:

基于JavaScript canvas绘制贝塞尔曲线

基于JavaScript canvas绘制贝塞尔曲线

基于JavaScript canvas绘制贝塞尔曲线

代码:

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
   html{overflow: hidden;}
   * {padding: 0;margin: 0;}
   #box {background-color: #000000;}
   .point {
    width: 20px;
    height: 20px;
    background-color: #fff;
    border-radius: 50%;
    position: absolute;
    left: 100px;
    top:200px;
    text-align: center;
    line-height: 20px;
   }
  </style>
 </head>
 <body>
  <canvas id="box"></canvas>

  <div class="point startPoint">b</div>
  <div class="point endPoint">e</div>
  <div class="point point1">1</div>
  <div class="point point2">2</div>
 <script src="js/max.js"></script>
 </body>
</html>

js:

/**
 * Created by Administrator on 2017/8/11.
 * js/max.js
 */
(function () {
 var curEle = null;
 var startPointView = document.querySelector(".startPoint");
 var endPointPointView = document.querySelector(".endPoint");
 var point1View = document.querySelector(".point1");
 var point2View = document.querySelector(".point2");
 var context = null;
 function init() {
  var canvasEle = document.querySelector("#box");
  canvasEle.width = innerWidth;
  canvasEle.height = innerHeight;
  //实时监听网页大小
  window.onresize = function () {
   canvasEle.width = innerWidth;
   canvasEle.height = innerHeight;
  };
  context = canvasEle.getContext("2d");

  context.strokeStyle = "white";
  context.lineWidth = 10;
  //贝塞尔曲线简单用法
  context.beginPath();
  context.moveTo(300,300);
  context.bezierCurveTo(500,200,600,250,600,600);
  context.stroke();
  //循环获取四个点的数组
  for(var i=0;i<4;i++){
  addEvent([startPointView,endPointPointView,point1View,point2View][i]);
  }
  //鼠标双击移除鼠标滑动事件 放下拖动的点
  document.ondblclick = function () {
   document.removeEventListener("mousemove",move);
  };
 }
 //鼠标按下拖动
 function addEvent(ele) {
  ele.onmousedown = function () {
   curEle = this;
   document.addEventListener("mousemove",move);
  };
 }
 //获取拖动位置并绘制贝塞尔曲线
 function move(event) {
  curEle.style.left = event.pageX+"px";
  curEle.style.top = event.pageY+"px";
  context.clearRect(0,0,innerWidth,innerHeight);
  context.beginPath();
  context.moveTo(getLeft(startPointView),getTop(startPointView));
  context.bezierCurveTo(getLeft(point1View),getTop(point1View),getLeft(point2View),getTop(point2View),getLeft(endPointPointView),getTop(endPointPointView));
  context.stroke();
 }
 function getLeft(ele) {
  return parseInt(ele.style.left);
 }
 function getTop(ele) {
  return parseInt(ele.style.top);
 }
 init();
})();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
理解Javascript_11_constructor实现原理
Oct 18 Javascript
jquery 图片上传按比例预览插件集合
May 28 Javascript
javascript 45种缓动效果 非常酷
Jun 28 Javascript
jQuery获取注册信息并提示实现代码
Apr 21 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
May 25 Javascript
JavaScript面向对象程序设计教程
Mar 29 Javascript
node基于puppeteer模拟登录抓取页面的实现
May 09 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
Jun 19 Javascript
jQuery实现ajax回调函数带入参数的方法示例
Jun 26 jQuery
微信小程序在其他页面监听globalData中值的变化
Jul 15 Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
Feb 27 Javascript
Vue 同步异步存值取值实现案例
Aug 05 Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 #Javascript
JavaScript实现小球沿正弦曲线运动
Sep 07 #Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 #Javascript
微信小程序开发问题之wx.previewImage
Dec 25 #Javascript
微信小程序使用for循环动态渲染页面操作示例
Dec 25 #Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 #Javascript
使用gulp构建前端自动化的方法示例
Dec 25 #Javascript
You might like
多文件上传的例子
2006/10/09 PHP
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
PHP运行模式的深入理解
2013/06/03 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
php+laravel依赖注入知识点总结
2019/11/04 PHP
JS判断不同分辨率调用不同的CSS样式文件实现思路及测试代码
2013/01/23 Javascript
JS前端框架关于重构的失败经验分享
2013/03/17 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
javascript在myeclipse中报错的解决方法
2013/10/29 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
jsPDF导出pdf示例
2014/05/02 Javascript
javascript 兼容各个浏览器的事件
2015/02/04 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
2018/10/09 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
[02:51]2018年度DOTA2最佳中单位选手-完美盛典
2018/12/17 DOTA
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
python实现3D地图可视化
2020/03/25 Python
英国网上花店:Bunches
2016/11/29 全球购物
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
造价工程师个人求职信
2013/09/21 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
国庆节标语大全
2014/10/08 职场文书
大学生自荐材料范文
2014/12/30 职场文书