基于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 相关文章推荐
js宝典学习笔记(上)
Jan 10 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
May 21 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
Sep 29 Javascript
jQuery+HTML5加入购物车代码分享
Oct 29 Javascript
JS组件Form表单验证神器BootstrapValidator
Jan 26 Javascript
浅析JS动态创建元素【两种方法】
Apr 20 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
May 09 Javascript
全面解析Bootstrap中form、navbar的使用方法
May 30 Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 Javascript
从零开始搭建webpack+react开发环境的详细步骤
May 18 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
使用AutoJs实现微信抢红包的代码
Dec 31 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 采集程序原理分析篇
2010/03/05 PHP
php读取excel文件示例分享(更新修改excel)
2014/02/27 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP实现的敏感词过滤方法示例
2019/03/06 PHP
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
如何提升vue.js中大型数据的性能
2019/06/21 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
简单了解什么是神经网络
2017/12/23 Python
python看某个模块的版本方法
2018/10/16 Python
python实现与redis交互操作详解
2020/04/21 Python
python安装sklearn模块的方法详解
2020/11/28 Python
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
乌克兰数字设备、配件和智能技术的连锁商店:KTC
2020/08/18 全球购物
Python面试题集
2012/03/08 面试题
大学生应聘自荐信
2013/10/11 职场文书
工程专业求职自荐书范文
2014/02/18 职场文书
教师考核评语
2014/04/28 职场文书
2014年协会工作总结
2014/11/22 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
2015最新民情日记范文
2015/06/26 职场文书
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android
详解Nginx的超时keeplive_timeout配置步骤
2022/05/25 Servers
Flink 侧流输出源码示例解析
2022/09/23 Servers