基于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 相关文章推荐
ext 代码生成器
Aug 07 Javascript
apycom出品的jQuery精美菜单破解方法
Feb 18 Javascript
基于jquery实现的表格分页实现代码
Jun 21 Javascript
JS特权方法定义作用以及与公有方法的区别
Mar 18 Javascript
Javascript全局变量var与不var的区别深入解析
Dec 09 Javascript
JavaScript通过prototype给对象定义属性用法实例
Mar 23 Javascript
js和jq使用submit方法无法提交表单的快速解决方法
May 17 Javascript
layer弹出层父子页面事件相互调用方法
Aug 17 Javascript
element-ui 设置菜单栏展开的方法
Aug 22 Javascript
浅谈Angular 观察者模式理解
Nov 01 Javascript
记一次vue去除#问题处理经过小结
Jan 24 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
Aug 07 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
国内php原创论坛
2006/10/09 PHP
destoon设置自定义搜索的方法
2014/06/21 PHP
关于Laravel Route重定向的一个注意点
2017/01/16 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
探寻Javascript执行效率问题
2014/11/12 Javascript
jQuery实现简易的天天爱消除小游戏
2015/10/16 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
Layer+Echarts构建弹出层折线图的方法
2019/09/25 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
Python机器学习之决策树算法
2017/12/22 Python
tensorflow实现KNN识别MNIST
2018/03/12 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
资生堂美国官网:Shiseido美国
2016/09/02 全球购物
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
台湾最大网路书店:博客来
2018/03/18 全球购物
意大利和国际最佳时尚品牌:Drestige
2019/12/28 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
七夕情人节促销方案
2014/06/07 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
南湾猴岛导游词
2015/02/09 职场文书
辞职书格式样本
2015/02/26 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
Python Django搭建文件下载服务器的实现
2021/05/10 Python
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android