基于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 相关文章推荐
使用TextRange获取输入框中光标的位
Oct 14 Javascript
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
Nov 23 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
Nov 17 Javascript
javascript数组去重方法终极总结
Jun 05 Javascript
JavaScript使用FileSystemObject对象写入文本文件内容的方法
Aug 05 Javascript
js实现超简单的展开、折叠目录代码
Aug 28 Javascript
javascript自定义滚动条实现代码
Apr 20 Javascript
AngularJS 遇到的小坑与技巧小结
Jun 07 Javascript
JS匹配日期和时间的正则表达式示例
May 12 Javascript
微信小程序Redux绑定实例详解
Jun 07 Javascript
npm scripts 使用指南详解
Oct 08 Javascript
vue中监听返回键问题
Aug 28 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与SQL注入攻击[一]
2007/04/17 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
Jquery ui css framework
2010/06/28 Javascript
JQuery最佳实践之精妙的自定义事件
2010/08/11 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
Bootstrap学习系列之使用 Bootstrap Typeahead 组件实现百度下拉效果
2016/07/07 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
easyui简介_动力节点Java学院整理
2017/07/14 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
vue ssr 指南详读
2018/06/29 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
python将unicode转为str的方法
2017/06/21 Python
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
佛罗里达州印第安河新鲜水果:Hale Groves
2017/02/20 全球购物
Pamela Love官网:纽约设计师Pamela Love的精美、时尚和穿孔珠宝
2020/10/19 全球购物
.NET是怎么支持多种语言的
2015/02/24 面试题
大学生家政服务项目创业计划书
2014/01/30 职场文书
运动会入场式解说词
2014/02/18 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
倡议书的格式写法
2015/04/28 职场文书
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL