写了一个svg七巧板拼图的小东西

写了一个svg七巧板拼图的小东西,可以拖动移动,改变颜色边框,旋转角度,然后保存图片。

保存图片用到的html2canvas.js和canvg.js,canvg用来将svg转换成canvas,html2canvas将html转换成canvas,最后进行保存

效果如下:

 

保存图片:

下面附上代码,canvg.js可以去自行搜索下载:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script src="js/jquery-3.2.1.min.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/canvg.js" type="text/javascript" charset="utf-8"></script>
		<script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.js"></script>
		<style type="text/css">
			.mian {
				width: 600px;
				height: 600px;
				border: 2px solid black;
				overflow: hidden;
				position: relative;
				float: left;
			}
		</style>
	</head>
	<body>
		<div style="float: left;" class="qi">
			<svg height="400" width="400" class="svg">
				<polygon points="0,0,0,400,200,200" style="fill:#ffaa7f;stroke:#000000;stroke-width:1" />
				<polygon points="0,0,400,0,200,200" style="fill:#2e74e6;stroke:#000000;stroke-width:1" />
				<polygon points="400,0,400,200,300,100" style="fill:#00aa00;stroke:#000000;stroke-width:1" />
				<polygon points="400,200,300,100,200,200,300,300" style="fill:#ffff7f;stroke:#000000;stroke-width:1" />
				<polygon points="200,200,300,300,100,300" style="fill:#ffaaff;stroke:#000000;stroke-width:1" />
				<polygon points="300,300,100,300,0,400,200,400" style="fill:#00aaff;stroke:#000000;stroke-width:1" />
				<polygon points="400,400,400,200,200,400" style="fill:#d92b97;stroke:#000000;stroke-width:1" />
			</svg>

		</div>
		<!-- 一正方形:五块等腰直角三角形(两块小型三角形、一块中型三角形和两块大型三角形)、一块正方形和一块平行四边形。 -->
		<div class="mian">

		</div>
		<div class="setting" style="padding: 10px;float: left;">
			<div>
				颜色
				<input class="tbcolor" type="color" onchange="changescolor()" />
			</div>
			<div>
				边框颜色
				<input class="tbstrokcolor" onchange="changestrok()" type="color" />
			</div>
			<div>
				边框宽度
				<input class="tbstrokwidth" min="0" type="number" value="1" onclick="changestrokwidth()" onchange="changestrokwidth()">
			</div>
			<div>
				旋转角度(顺时针)
				<input class="tbchangedeg" type="number" value="0" onclick="changedeg()" onchange="changedeg()">
			</div>
			<div>
				<button onclick="xchange()">左右翻转</button>
				<button onclick="ychange()">上下翻转</button>
			</div>
			<div>
				<button onclick="deletepolgon()">删除</button><button onclick="saveimg()">保存</button>
			</div>
			<div>
				<table>
					<tr>
						<td> </td>
						<td><button onmousedown="up()">上</button></td>
						<td> </td>
					</tr>
					<tr>
						<td><button onmousedown="left()">左</button></td>
						<td> </td>
						<td><button onmousedown="right()">右</button></td>
					</tr>
					<tr>
						<td> </td>
						<td><button onmousedown="down()">下</button></td>
						<td> </td>
					</tr>
				</table>
			</div>
		</div>
		<script>
			var selected; //选择的形状
			//保存图片
			var saveimg = function() {
				var mian = $(".mian").clone().appendTo($("body"));
				showQRCode(mian);//svg转canvas
				html2canvas(mian).then(function(canvas) {
					var strDataURI = canvas.toDataURL("image/jpeg");
					var image = strDataURI.replace("image/jpeg", "image/octet-stream");
					var triggerDownload = $("<a></a>").appendTo($("body")).attr("href", image).attr("download", "ewm.png");
					triggerDownload[0].click();
					mian.remove();
					triggerDownload.remove();
				})
			}
			//svg转canvas
			var showQRCode = function(mian) {
				scrollTo(0, 0);
				if (typeof html2canvas !== 'undefined') {
					//以下是对svg的处理
					var nodesToRecover = [];
					var nodesToRemove = [];
					var svgElem = mian.find('svg');
					svgElem.each(function(index, node) {
						var parentNode = node.parentNode;
						var svg = node.outerHTML.trim();
						var canvas = document.createElement('canvas');
						canvgv2(canvas, svg);
						if (node.style.position) {
							canvas.style.position += node.style.position;
							canvas.style.left += node.style.left;
							canvas.style.top += node.style.top;
						}
						nodesToRecover.push({
							parent: parentNode,
							child: node
						});
						parentNode.removeChild(node);
						nodesToRemove.push({
							parent: parentNode,
							child: canvas
						});
						parentNode.appendChild(canvas);
					});
				}
			}
			//上移
			var up = function() {
				var timer = setInterval(function() {
					if (selected == null) return;
					$(selected).css({
						"top": parseInt((selected).css("top")) - 1
					});
				}, 100)
				$(this).on('mouseup', function() {
					clearInterval(timer);
				})
			}
			//下移
			var down = function() {
				var timer = setInterval(function() {
					if (selected == null) return;
					$(selected).css({
						"top": parseInt((selected).css("top")) + 1
					});
				}, 50)
				$(this).on('mouseup', function() {
					clearInterval(timer);
				})
			}
			//左移
			var left = function() {
				var timer = setInterval(function() {
					if (selected == null) return;
					$(selected).css({
						"left": parseInt((selected).css("left")) - 1
					});
				}, 50)
				$(this).on('mouseup', function() {
					clearInterval(timer);
				})
			}
			//右移
			var right = function() {
				var timer = setInterval(function() {
					if (selected == null) return;
					$(selected).css({
						"left": parseInt((selected).css("left")) + 1
					});
				}, 50)
				$(this).on('mouseup', function() {
					clearInterval(timer);
				})
			}
			//旋转
			var changedeg = function() {
				if (selected == null) return;
				$(selected).css({
					"transform": "rotate(" + $(".tbchangedeg").val() + "deg)"
				});
			}
			//左右翻转
			var xchange = function() {
				if (selected == null) return;
				if ($(selected).css("transform").indexOf("rotateY") != -1) {
					$(selected).css("transform", $(selected).css("transform").replace('rotateY(180deg)', ''));
				} else {
					$(selected).css("transform", $(selected).css("transform").replace('none', '') + ' rotateY(180deg)');
				}
			}
			//上下翻转
			var ychange = function() {
				if (selected == null) return;
				if ($(selected).css("transform").indexOf("rotateX") != -1) {
					$(selected).css("transform", $(selected).css("transform").replace('rotateX(180deg)', ''));
				} else {
					$(selected).css("transform", $(selected).css("transform").replace('none', '') + ' rotateX(180deg)');
				}
			}
			//删形状
			var deletepolgon = function() {
				if (selected == null) return;
				selected.remove();
				$(".tbcolor").val("");
				$(".tbstrokcolor").val("");
				$(".tbstrokwidth").val(0);
				selected = null;
			}
			//改变颜色
			var changescolor = function() {
				var style = $("polygon", selected).attr("style");
				var jsonstr = '{"' + style.replace(/:/g, '":"').replace(/;/g, '","') + '"}';
				var sett = JSON.parse(jsonstr);
				sett.fill = $(".tbcolor").val();
				var newstyle = JSON.stringify(sett).replace('}', '').replace('{', '').replace(/"/g, '').replace(/,/g, ';')
				$("polygon", selected).attr("style", newstyle);

			}
			//边框宽度
			var changestrokwidth = function() {
				if (selected == null) return;
				var style = $("polygon", selected).attr("style");
				var jsonstr = '{"' + style.replace(/:/g, '":"').replace(/;/g, '","') + '"}';
				var sett = JSON.parse(jsonstr);
				sett["stroke-width"] = $(".tbstrokwidth").val()
				var newstyle = JSON.stringify(sett).replace('}', '').replace('{', '').replace(/"/g, '').replace(/,/g, ';')
				$("polygon", selected).attr("style", newstyle);
			}
			//边框颜色
			var changestrok = function() {
				var style = $("polygon", selected).attr("style");
				var jsonstr = '{"' + style.replace(/:/g, '":"').replace(/;/g, '","') + '"}';
				var sett = JSON.parse(jsonstr);
				sett.stroke = $(".tbstrokcolor").val();
				var newstyle = JSON.stringify(sett).replace('}', '').replace('{', '').replace(/"/g, '').replace(/,/g, ';')
				$("polygon", selected).attr("style", newstyle);

			}
			//排序
			Array.prototype.OrderByAsc = function(func) {
				var m = {};
				for (var i = 0; i < this.length; i++) {
					for (var k = 0; k < this.length; k++) {
						if (func(this[i]) < func(this[k])) {
							m = this[k];
							this[k] = this[i];
							this[i] = m;
						}
					}
				}
				return this;
			}

			Array.prototype.OrderByDesc = function(func) {
				var m = {};
				for (var i = 0; i < this.length; i++) {
					for (var k = 0; k < this.length; k++) {
						if (func(this[i]) > func(this[k])) {
							m = this[k];
							this[k] = this[i];
							this[i] = m;
						}
					}
				}
				return this;
			}
			//移动
			$(".svg polygon").on('mousedown', function() {
				var $this = this;
				var move = true;
				var points = $(this).attr("points").split(',');
				var pointlist = [];
				for (var i = 0; i < points.length / 2; i++) {
					pointlist.push([
						parseInt(points[i * 2 + 0]),
						parseInt(points[i * 2 + 1])
					]);
				}
				pointlist.OrderByAsc(function(e) {
					return e[0];
				});
				var minleft = pointlist[0][0];
				var width = pointlist[pointlist.length - 1][0] - pointlist[0][0];
				pointlist.OrderByAsc(function(e) {
					return e[1];
				});
				var mintop = pointlist[0][1];
				var height = pointlist[pointlist.length - 1][1] - pointlist[0][1];
				var newpoint = [];
				for (var i = 0; i < points.length / 2; i++) {
					newpoint.push(parseInt(points[i * 2 + 0]) - minleft);
					newpoint.push(parseInt(points[i * 2 + 1]) - mintop);
				}
				var abulutesite = [event.clientX - minleft, event.clientY - mintop];
				var divmove = $("<div></div>").appendTo($("body"));//移动中的虚影
				divmove.css({
					width: width + "px",
					height: height + "px",
					'position': 'absolute',
					opacity: 0.5,
					left: minleft + 10,
					top: mintop + 10
				});
				divmove.html('<svg style="width:' + width + 'px;height:' + height + 'px;"><polygon points="' + newpoint.join(',') +
					'" style="' + $(this).attr("style") + '" /></svg>');
				$(window).off('mousemove').on('mousemove', function(event2) {
					if (move) {
						var newpostion = {
							left: event2.clientX - abulutesite[0],
							top: event2.clientY - abulutesite[1]
						};
						divmove.css(newpostion);
						//判断位置在容器里面  不是鼠标过,是容器过
						var top = [$(".mian").offset().top, $(".mian").offset().top + $(".mian").height()];
						var left = [$(".mian").offset().left, $(".mian").offset().left + $(".mian").width()];
						if (newpostion.left <= left[1] && (newpostion.left + width) >= left[0] && newpostion.top <= top[1] && (
								newpostion.top + height) >= top[0]) {
							$(".mian").css("border", "2px solid yellow");
						} else {
							$(".mian").css("border", "2px solid black");
						}
					}
				})
				$(window).off('mouseup').on('mouseup', function(event3) {
					if (move) {
						var newpostion = {
							left: event3.clientX - abulutesite[0],
							top: event3.clientY - abulutesite[1]
						};
						divmove.css(newpostion);
						//判断位置在容器里面  不是鼠标过,是容器过
						var top = [$(".mian").offset().top, $(".mian").offset().top + $(".mian").height()];
						var left = [$(".mian").offset().left, $(".mian").offset().left + $(".mian").width()];
						if (newpostion.left <= left[1] && (newpostion.left + width) >= left[0] && (newpostion.top + height) >= top[0]) {
							var newpolygon = $("<div></div>").appendTo($(".mian"));
							newpolygon.html('<svg style="width:' + width + 'px;height:' + height + 'px;"><polygon points="' + newpoint.join(
									',') +
								'" style="' + $($this).attr("style") + '" /></svg>');
							newpostion = {
								left: event3.clientX - abulutesite[0] - $(".mian").offset().left - 2,
								top: event3.clientY - abulutesite[1] - $(".mian").offset().top - 2,
								"position": "absolute"
							};
							newpolygon.css(newpostion);
							setting($("polygon", newpolygon));
						}
						divmove.remove();
					}
					$(".mian").css("border", "2px solid black");
					move = false;
				})
			})
			//容器内形状控制
			var setting = function(ele) {
				//移动
				$(ele).on('mousedown', function() {
					var move = true;
					var $this = $(this).parent().parent();
					var fristsite = {
						left: $(this).offset().left,
						top: $(this).offset().top
					};
					var size = [$(this).width(), $(this).height()]
					var abulutesite = [event.clientX - $(this).offset().left, event.clientY - $(this).offset().top];
					$($this).css({
						opacity: 0.5,
					})
					$(window).off('mousemove').on('mousemove', function(event2) {
						if (move) {
							var newpostion = {
								left: event2.clientX - abulutesite[0] - $(".mian").offset().left - 2,
								top: event2.clientY - abulutesite[1] - $(".mian").offset().top - 2
							};
							$($this).css(newpostion);
						}
					})
					$(window).off('mouseup').on('mouseup', function(event3) {
						if (move) {
							var newpostion = {
								left: event3.clientX - abulutesite[0] - $(".mian").offset().left - 2,
								top: event3.clientY - abulutesite[1] - $(".mian").offset().top - 2
							};
							var left = [$(".mian").offset().left, $(".mian").offset().left + $(".mian").width()];
							$($this).css(newpostion);
							$($this).css({
								opacity: 1
							});
							move = false;
						}
					})
				})
				//设置样式
				$(ele).on('click', function() {
					var style = $(ele).attr("style");
					var jsonstr = '{"' + style.replace(/:/g, '":"').replace(/;/g, '","') + '"}';
					var sett = JSON.parse(jsonstr);
					$(".tbstrokwidth").val(sett["stroke-width"]);
					$(".tbstrokcolor").val(sett.stroke);
					$(".tbcolor").val(sett.fill);
					$(".tbchangedeg").val(0)
					selected = $(this).parent().parent();
				})
				$(ele).click();//移动到容器默认选中
			}
		</script>
	</body>
</html>

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值