javascript canvas 模拟mac最小化

2023-11-07

文章是别人写的,不是我自己的,链接忘记了。


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>模拟 Mac OS 窗口最小化的神奇效果</title>
<meta name="description" content="模拟 Mac OS 窗口最小化的神奇效果(阿拉丁神灯)" />
<meta name="author" content="impony.com" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<style type="text/css">
html,body{margin:0;padding:0;height:100%;background:#69C;font:14px/1.5 sans-serif;}
.window{background:#FFF;box-shadow:0 0 2em rgba(0, 0, 0, .3);}
.window>.t{margin:0;padding:.3em;border-bottom:1px solid #888;background:#CCC;}
.window>.c{padding:.3em;min-height:15em;}
footer{position:fixed;bottom:0;left:0;width:100%;height:3em;background:rgba(0, 0, 0, .2);}
.dock{display:inline-block;margin:.3em;
  margin-left:40px;width:5em;height:2.4em;line-height:2.4em;text-align:center;color:#FFF;background:rgba(0, 0, 0, .6);cursor:pointer;vertical-align: top}
.dock:first-child{margin-right:0;}
.folded{background:rgba(0, 0, 0, .3);}
footer>span:last-child{color:#69C;}
#w0_window{position:absolute;left:5%;top:10%;width:60%;height:70%;}
#w1_window{position:fixed;left: 0;right:0;top:0;bottom:0;width:100%;height:100%;}
canvas{position:absolute;z-index:-1;}
</style>
</head>
<body>

<div id="w0_window" class="window">
	<h3 class="t">窗口一</h3>
	<div class="c">窗口中的内容</div>
</div>
<div id="w1_window" class="window">
	<h3 class="t">窗口二</h3>
	<div class="c">窗口中的内容</div>
</div>
<footer>
	<!--<span id="w0" class="dock" lock="false"></span>-->
	<span id="w1" class="dock" lock="false">窗口二</span>
</footer>
<canvas></canvas>

<script type="text/javascript">
(function () {
	"use strict";
	var canvas = document.querySelector("canvas");
	var ctx = canvas.getContext("2d");
	/**
	 * 绘制形状
	 * @param s1 {Number} 起点一
	 * @param s2 {Number} 起点二
	 * @param p1 {Number} 结束点一
	 * @param p2 {Number} 结束点二
	 */
	function draw(s1, s2, p1, p2) {
		ctx.clearRect(0, 0, canvas.width, canvas.height);
		ctx.beginPath();
		ctx.moveTo(s1, 0);
		ctx.bezierCurveTo(s1, canvas.height * 0.2, p1, canvas.height * 0.6, p1, canvas.height);
		ctx.lineTo(p2, canvas.height);
		ctx.bezierCurveTo(p2, canvas.height * 0.6, s2, canvas.height * 0.2, s2, 0);
		ctx.lineTo(s1, 0);
		ctx.fillStyle = "rgba(0, 0, 0, .2)";
		ctx.fill();
	}
	/**
	 * 擦除方式
	 * @param y {Number}
	 * @param speed {Number}
	 * @param type 类型,放大或缩小 zoomin、zoomout
	 */
	function clearRect(y, speed, type) {
		if(type === "zoomout") {
			ctx.clearRect(0, y, canvas.width, speed);
		} else if(type === "zoomin") {
			ctx.clearRect(0, 0, canvas.width, y);
		}
	}
	/**
	 * 缩放效果
	 * @param s1 {Number} 起点一
	 * @param s2 {Number} 起点二
	 * @param p1 {Number} 结束点一
	 * @param p2 {Number} 结束点二
	 * @param type {String} 类型,放大或缩小 zoomin、zoomout
	 */
	function scale(s1, s2, p1, p2, type, callback) {
		var dist1 = Math.abs(p1 - s1);
		var dist2 = Math.abs(p2 - s2);
		var d1, d2, _p1, _p2, speed1, y, speed2;
		if(dist1 === 0 || dist2 === 0) {
			dist1 = 1;
			dist2 = 1;
		}
		speed1 = 30;
		speed2 = 30;
		if(type === "zoomout") {
			d1 = (p1 >= s1 && p1 < speed1) ? 0 : p1 < s1 ? -speed1 : speed1;
			d2 = p2 < s2 ? -speed1 * dist2 / dist1 : speed1 * dist2 / dist1;
			_p1 = s1;
			_p2 = s2;
			y = 0;
			var t = setInterval(function () {
				if(_p2 - _p1 <= p2 - p1) {
					clearInterval(t);
					var timer = setInterval(function () {
						if(y > canvas.height) {
							clearInterval(timer);
							callback && callback();
						}
						clearRect(y, speed2, type);
						y += speed2;
						speed2 += 1;
					}, 17);
				}
				draw(s1, s2, _p1, _p2);
				_p1 += d1;
				_p2 += d2;
				if((d1 < 0 && _p1 <= p1) || (d1 > 0 && _p1 >= p1)) {
					_p1 = p1;
				}
				if((d2 < 0 && _p2 <= p2) || (d2 > 0 && _p2 >= p2)) {
					_p2 = p2;
				}
			}, 17);
		} else if(type === "zoomin") {
			d1 = (p1 >= s1 && p1 < speed1) ? 0 : p1 < s1 ? speed1 : -speed1;
			d2 = p2 < s2 ? speed1 * dist2 / dist1 : -speed1 * dist2 / dist1;
			_p1 = p1;
			_p2 = p2;
			y = canvas.height;
			var timer = setInterval(function () {
				if(y <= 0) {
					clearInterval(timer);
					var t = setInterval(function () {
						if(_p2 - _p1 >= s2 - s1) {
							clearInterval(t);
							callback && callback();
						}
						draw(s1, s2, _p1, _p2);
						_p1 += d1;
						_p2 += d2;
					}, 17);
				}
				draw(s1, s2, _p1, _p2);
				clearRect(y, speed2, type);
				y -= speed2;
				speed2 += 1;
			}, 17);
		}
	}
	document.addEventListener("DOMContentLoaded", function () {
		var docks = document.querySelectorAll(".dock");
		if(docks && docks.length > 0) {
			for(var i = 0, len = docks.length; i < len; i++) {
				docks[i].addEventListener("click", function () {
					if(this.getAttribute("lock") === "false") {
						var win = document.getElementById(this.id + "_window");
						var _this = this;
						_this.setAttribute("lock", "true");
						canvas.width = document.body.offsetWidth;
						canvas.height = _this.parentNode.offsetTop - win.offsetTop;
						canvas.style.top = win.offsetTop + "px";
						canvas.style.zIndex = 1;
						win.style.visibility = "hidden";
						var s1 = win.offsetLeft;
						var s2 = win.offsetLeft + win.offsetWidth;
						var p1 = _this.offsetLeft;
						var p2 = _this.offsetLeft + _this.offsetWidth;
						var cname = _this.className;
						if(cname.indexOf(" folded") === -1) {
							scale(s1, s2, p1, p2, "zoomout", function () {
								canvas.style.zIndex = -1;
								_this.setAttribute("lock", "false");
							});
							_this.className = cname + " folded";
						} else {
							scale(s1, s2, p1, p2, "zoomin", function () {
								canvas.style.zIndex = -1;
								win.style.visibility = "visible";
								_this.setAttribute("lock", "false");
							});
							_this.className = cname.replace(" folded", "");
						}
					}
				}, false);
			}
		}
	}, false);
})();
</script>

</body>
</html>


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javascript canvas 模拟mac最小化 的相关文章

  • 使用referrer javascript从google获取查询参数

    是否可以从google搜索中获取查询参数 IE 如果有人用谷歌搜索自行车 网址就会变成 https www google es search q bicycles 如果您随后进入搜索结果并且有人点击您的页面 您将无法看到带有 documen
  • Socket.io 如何判断某人何时离开

    我正在使用 socket io 创建一个实时游戏 目前 当有人离开时 什么也不会发生 我想以某种方式通知服务器说谁离开了 有没有办法在用户离开时发出正确的信息 我可以让服务器每 1000 毫秒对每个人执行一次 ping 操作 或者通过其他方
  • JQuery UI Draggable - 如何知道元素是否可拖动初始化?

    我的逻辑是 if this draginited a drag disabled element shouldn t get pass here as it is inited this draggable 我搜索了很多 找不到实现这个逻辑
  • (IE 特定)如何确定输入的文本是否比输入元素的宽度长

    这是所有版本 IE 特有的问题 在所有其他浏览器中 当文本溢出时 输入元素的scrollWidth 大于输入元素的clientWidth 有没有办法确定IE中输入字段中的文本超出了输入元素宽度的键 下面是一个检查 clientWidth 与
  • 当 img.crossOrigin="Anonymous" 时,Chrome MJPEG CORS“响应无效”

    Image from origin http 192 168 1 67 5555 has been blocked from loading by Cross Origin Resource Sharing policy Invalid r
  • 图表js不显示

    我正在尝试使用 Charts js 创建一个简单的折线图 当我运行下面的代码时 没有出现图表 我究竟做错了什么 我正在关注这个教程http www chartjs org docs latest getting started http w
  • 如何在 Ionic 2 中动态创建具有特定类的模式?

    嗨 我已经被一个问题困扰好几天了 到目前为止还没有研究证明足够 我正在尝试在 Ionic 2 中创建一个具有特定类 或 id 的简单模式 我需要这样简单的东西
  • 在 angularJS 中覆盖模块值/常量的最佳方法

    我用 angularJS 编写了一个模块 封装了所有后端通信 为了获得更大的灵活性 我将 api 前缀作为模块上的常量值 可能是值 因为我没有在配置阶段使用它 所以像 angular module myapp data constant a
  • 如何使用谷歌地图检测一个点是否在多边形内部?

    我想检测到google maps LatLng是在一个里面google maps Polygon 我怎样才能做到这一点 Cheers 你可以使用这个谷歌地图V3 google maps geometry poly containsLocat
  • React:未捕获的引用错误:未定义需求

    我正在阅读 React 教程 http facebook github io react docs animation html http facebook github io react docs animation html 并且我无法
  • 为什么 Bootstrap 需要 jQuery? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经多次用谷歌搜索这个问题 但从未找到满意的答案 大多数答案似乎只是说 是的 Bootstrap 插件确实需要 jQuery https st
  • 使用 ngx-translate 时更改 URL

    当有人使用 ngx translate 单击所选语言时 我尝试更改 URL 我想我应该通过订阅语言更改事件然后修改当前的 url 以反映所选的语言来做到这一点 因为我是新手 所以我不确定是否需要服务来做到这一点 或者可能是另一种解决方法 我
  • 如何设置第三方 cookie

    我如何设置第三方 cookie 我有要求设置cookie 并且cookie将在访问的网站中启用 就像我在访问cde com或def com或ghi com时在abc com中设置cookie一样 所以设置的cookie将在所有网站上获取 我
  • 如何在没有查询参数的情况下重新加载页面?

    假设我想重新加载www domain com abc num 4 但我想重新加载www domain com abcONLY 问号后没有所有内容 window location window location href split 0
  • Boolean("false") 返回 true..还有其他选择吗?

    我正在使用 jquery 将 true 和 false 字符串写入 data html 属性 但是 当我将 false 写入其中一个属性 然后检查它是否为 false 时 它 会返回 true 我还在网上读到它应该这样做 这真的毫无意义 有
  • 同源政策目的可疑

    正如我所读到的 同源策略是防止源自 邪恶 域 A 的脚本向 良好 域 B 发出请求 换句话说 跨站点请求伪造 玩了一下我了解到的Access Control Allow Origin标头和CORS据我了解 它允许从好域 B 指定服务器 域
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 以特定顺序运行具有效果的 jQuery 函数

    我在 javascript 函数中有一些 jQuery 可以更改页面上的文本并以特定的时间间隔淡入和淡出 我希望这些函数在每个函数完成其效果后按顺序运行 dialogueExchange1 dialogueExchange2 dialogu
  • 如何找出javascript中加载了哪些javascript?

    继另一个问题的评论之后 我问自己是否有办法获取页面上加载的所有 js 代码的列表 就像 Firebug 或 chrome Inspector 所做的那样 有没有一种纯javascript的方法 一种方法是抓取脚本标签 但这样你可能会错过动态
  • 为什么转换 new.Date() .toISOString() 会改变时间?

    我正在以两种不同的格式在数据库中插入日期 这是作为日期时间插入 var mydate mydate new Date document getElementById clockinhour value mydate toISOString

随机推荐