基于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 处理Iframe自适应高度(同或不同域名下)
Mar 29 Javascript
js特效,页面下雪的小例子
Jun 17 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
May 13 Javascript
简单纯js实现点击切换TAB标签实例
Aug 23 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
EasyUI创建对话框的两种方式
Aug 23 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
从零开始学习Node.js系列教程四:多页面实现数学运算的client端和server端示例
Apr 13 Javascript
微信小程序多音频播放进度条问题
Aug 28 Javascript
vuex actions异步修改状态的实例详解
Nov 06 Javascript
JavaScript函数重载操作实例浅析
May 02 Javascript
JS实现页面鼠标点击出现图片特效
Aug 19 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取整数函数常用的四种方法小结
2012/07/05 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
php中防止恶意刷新页面的代码小结
2012/10/31 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
Javascript 模式实例 观察者模式
2009/10/24 Javascript
利用jQuery 实现GridView异步排序、分页的代码
2010/02/06 Javascript
jQuery中的read和JavaScript中的onload函数的区别
2014/08/27 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
基于ajax实现文件上传并显示进度条
2015/08/03 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
浅谈javascript的闭包
2017/01/23 Javascript
原生js实现瀑布流布局
2017/03/08 Javascript
JavaScript事件方法(实例讲解)
2017/06/27 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
2017/06/14 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
python文字转语音实现过程解析
2019/11/12 Python
python实现拼接图片
2020/03/23 Python
简单了解如何封装自己的Python包
2020/07/08 Python
html Table 表头固定的实现
2019/01/22 HTML / CSS
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
Java面试题:为什么要用Java
2012/05/11 面试题
商场活动策划方案
2014/01/24 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
中国梦口号
2014/06/13 职场文书
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL