2 条评论基于 HTML5 的 Windows 画图程序

2010年4月7日

Windows 画图程序一直伴随着 Windows 各个版本,这个很简单,几乎没有什么用处的程序拥有最基本的绘图功能,很适合用来涂鸦。HTML5 的 Canvas 对象使在线绘图成为可能,虽然 HTML5 还远未成熟,但很多人已经迫不及待地用它设计一些让人惊叹的应用。

CanvasPaint 是一个基于 HTML5 的标准 Windows 画图程序,它拥有和 Windows 画图程序一模一样的界面和操作,功能也几乎完全一样,在特定浏览器的支持下,你甚至可以将最后的作品保存到本机。这并不是最近的项目,2006年就有了, 因此,目前绝大多数支持标准的浏览器(Firefox,Safari,Chrome,Opera)都可以正常使用这个程序。以下是作者对这个项目的一些解 释。

为什么要开发这个程序?

目的不是为了开发一个 Windows 画图程序,而是体验 HTML5 的 Canvas 功能。

如何使用

和标准 Windows 绘图程序一样。

能保存吗?

是的,但只支持 Firefox 2 和 Opera 9 (译者注:这是作者2006年就实现的一个程序)。在本机保存,选择 File 菜单中的 Download,在线保存,选择 Save online,会自动生成一个 URL 在线显示你的作品。

浏览器本身的右键菜单影响使用

可以在浏览器的设置中禁用右键菜单。

为什么有些功能不能用?

一些功能支持特定版本的浏览器(译者注:这是就2006年而言):

Color picker
Firefox 2.0
Opera 9
Flood fill
Opera 9
Save image
Firefox 2.0
Opera 9
Open URL
Firefox 1.5
Opera 9
Latest WebKit

Canvas 对象好用吗?

对那些不需要跨浏览器支持的应用很好用。但在绘画中,最大的问题是,受限于 mousemove 事件的刷新率,你不太容易发现光标的位置,使用喷笔的时候尤其明显。另外,当尺寸变得很大时,速度变得很慢,没有 getPixel() 功能。

技术细节

程序中使用了 5 个 Canvas 对象。

一个主画板,一个是透明画板层浮动在上方显示预览绘画内容,一个隐藏的 Canvas 用来缓存选择的内容,另一个用来缓存反悔状态,一个用在程序标题栏,用来显示渐变色。

其他人的 HTML5 Canvas 实验

Canvascape 3D (用 HTML5 实现简单的第一人称射击游戏)
CanvasGraph (一个 HTML5 Canvas 绘图 JavaScript 类库 )
Image reflections (用 HTML5 Canvas 实现图像倒影)
Canvas Painter (一个更为简单的 Canvas 画图程序)

真正令人赞叹的 HTML 画图程序

如果上面的程序已经让你对 HTML5 的 Canvas 功能感到鼓舞,下面这个画图程序会让你赞叹 。拥有不输桌面的界面体验和流畅 感,在多屏幕电脑上,我甚至有将那些浮动工具面板拖到第二个屏幕的冲动。

演示地址:http://mugtug.com/sketchpad/

本文素材来源:http://canvaspaint.org/#
http://mugtug.com/sketchpad/

中文编译来源:锐商企业CMS 网站内容管理系统 官方网站

没有评论在文本框or文本域的光标位置操作

2010年4月5日

今天碰上一个同学的需求,记录一下
DEMO:http://www.iamued.com/demo/addtext.html
核心代码如下:

function addText(txt,eid) {
//txt要添加的文本 eid:要操作的文本框,或文本域的id
				obj = document.getElementById(eid);
				selection = document.selection;
				obj.focus();
				if (typeof obj.selectionStart != "undefined") {
				    var s = obj.selectionStart;
					obj.value = obj.value.substr(0, obj.selectionStart) + txt + obj.value.substr(obj.selectionEnd);
					obj.selectionEnd = s + txt.length;
				} else if (selection && selection.createRange) {
					var sel = selection.createRange();
					sel.text = txt;
				} else {
					obj.value += txt;
				}
        }

9 条评论博客建立半年了,借着PR更新说说

2010年4月5日

博客自09年10月建立,至今已经半年了

说实话,自己还是挺上心的,怎么说呢,博客里的内容很多都是转载收藏来的
但是也算是自己的一些积累吧,也通过博客,认识了不少同仁

说说PR更新,经历了2次PR更新了
10年1月 更新至PR1
10年4月 更新至PR4
我是UED-PR值

自己还是很高兴的,毕竟这次更新让自己意外了一下

加油吧,自己!

分类: 随便乱侃 标签:

没有评论即拷即用动画函数:透明度渐变、位置移动、尺寸变化

2010年3月31日

首先感谢一下 51js的 abeet 同学 给我们提取出这么简洁的函数
和大家分享一下吧 查看Demo
这三个函数适用于以下情况
1、在做前端页面时,只需要简单的动画效果,不想引入整个动画类,使用本函数。
2、在写js类时,需要用到简单的动画,为了降低藕合性,使用本函数。

使用方法如下:

var fade = function(element, transparency, speed, callback){……}
透明度渐变:transparency:透明度 0(全透)-100(不透);speed:速度1-100,默认为1
例<input onclick="fade('testDiv', 40)" type="button" value="透明度变化" />

var move = function(element, position, speed, callback){……}
//移动到指定位置,position:移动到指定left及top 格式{left:120, top:340}或{left:120}或{top:340};speed:速度 1-100,默认为10
例<input onclick="move('testDiv', {top:400})" type="button" value="垂直移动" />

var resize = function(element, size, speed, callback){……}
//长宽渐变:size:要改变到的尺寸 格式 {width:400, height:250}或{width:400}或{height:250};speed:速度 1-100,默认为10
例<input onclick="resize('testDiv', {height:300})" type="button" value="改变高度" />

核心代码分析
1、获取一个元素的透明度

如果是IE浏览器,则攻取最终样式的滤镜filter的值,再通过正则表达式获取到透明度滤镜alpha的值,如果不存在透明度滤镜值,则透明度为100。
如果是非IE浏览器,那么可以获取最终样式的opacity属性,

function getOpacity(elem){
var alpha;
if(navigator.userAgent.toLowerCase().indexOf('msie') != -1){
alpha=elem.currentStyle.filter.indexOf("opacity=") &gt;= 0?(parseFloat( elem.currentStyle.filter.match(/opacity=([^)]*)/)[1] )) + '':
'100';
}else{
alpha=100*elem.ownerDocument.defaultView.getComputedStyle(elem,null)['opacity'];
}
return alpha;
};

2、设置透明度
这个就简单了,不用管浏览器,通通的设置opacity及filter,
element.style.opacity = start / 100;
element.style.filter = ‘alpha(opacity=’ + start + ‘)’;
实际上这儿我偷了个懒,真正无懈可击的写法,应该是判断一下是否IE浏览器,因为在一些情况下可能使用多个滤镜,这时应该用正则替换alpha滤镜的值,而不是直接设置style.filter = ‘alpha(opacity=’ + start + ‘)’;

3、element.offsetWidth、element.offsetHeight与element.style.width、element.style.height的关系
只有在IE的border-content式盒模型情况下,这两个值才是相等的,即elementoffsetWidth==element.style.width+element.style.paddingLeft+element.style.paddingRight+element.style.borderLeftWidth+element.style.borderRightWidth
而我认为border-content式盒模型是符合修改元素尺寸时的心理预期的,对非border-content式盒模型情况下要作一个尺寸的修正。
在其它情况下应该对该值加以修正

if(!(navigator.userAgent.toLowerCase().indexOf('msie') != -1&&document.compatMode == 'BackCompat')){
//除了ie下border-content式盒模型情况外,需要对size加以修正
var CStyle=document.defaultView?document.defaultView.getComputedStyle(element,null):element.currentStyle;
if(typeof(size.width)=='number'){
size.width=size.width-CStyle.paddingLeft.replace(/D/g,'')-CStyle.paddingRight.replace(/D/g,'');
}
if(typeof(size.height)=='number'){
size.height=size.height-CStyle.paddingTop.replace(/D/g,'')-CStyle.paddingBottom.replace(/D/g,'');
}
}

有人认为以上的修正中默认了padding值的单位是px并且为整数,是不对的,
实际上经由我在ie及firefox下的测试,引用最终样式的padding值,必然是整数,并以px为单位。

4、关于把三个函数合并成一个通用动画函数
以上三个函数的主要逻辑都是一样的:
通过setInterval每隔一定时间修改元素的style属性,以达到动画效果。
所以,把三个函数合并成一个函数是可以的
只是需要在修改特定的属性时出于兼容性,必须作些处理,
因为不同的属性其值类型及单位不一样,不同浏览器下也有区别
如透明度 在非ie下为小数,在ie下是一个特别的滤镜设置
如颜色 一般是用16进制,并有#号前缀
预计这个通用的动画函数的参数会有点多,接口类下
function animator(element, interval, start, end, style, speed, tmp, callback){……}
说明
function animator(元素或元素ID, 计时器句柄,起始值,目标值,需修改的属性, 步进值(增量),值转换过滤方法(用于修改非普通递增递减形的数据,比如16进制颜色递增、前缀符号后缀单位修正), 回调函数)
function animator(‘testdiv’,'bgcolor’,'#336699′,’#aabbcc’,'backgroundColor’,2,changeColor,callback)
颜色修改方法示例(仅供参考,未测试)

changeColor=function(start,end,speed){
var _10to16 = function(color){
function tmp(index){
var tmp = color[index].toString(16);
return tmp.length == 1 ? "0" + tmp : tmp;
};
return "#" + tmp(0) + tmp(1) + tmp(2);
};
var x16to10 = function(color){
if(!/^#[0-9A-Fa-f]{3,6}$/i.test(color))retun color;
function tmp(index){
return color.charAt(index);
};
color = color.substring(1);
if(color.length == 3)
color = tmp(0) + tmp(0) + tmp(1) + tmp(1) + tmp(2) + tmp(2);
return [parseInt(tmp(0) + tmp(1), 16), parseInt(tmp(2) + tmp(3), 16), parseInt(tmp(4) + tmp(5), 16)];
};
var color = x16to10(start),
var end = x16to10(end),
var index = 3;
while(index--)
color[index] = color[index] < end[index] ? min(color[index] + speed, end[index]) : max(color[index] - speed, end[index]);
reutn color;
}

原文见:http://bbs.51js.com/viewthread.php?tid=86901

6 条评论第六期WEB标准化交流会 会后总结 By 刘钢

2010年3月28日

今天去参加了第六期WEB标准化交流会,重复下话题:前端开发在研发流程中与其他岗位协作效率的提升 做个小总结 

先感谢一下北京腾讯给我们提供了场地,水,和公仔,今天听了很多“大虾”们的分享,感受颇深
就说一下小公司前端开发在研发中如何更好的协作吧 

今天会议上几个突出的词:“流程”,“沟通”,“专业“,“吃饭喝酒”:) 

那我就分别说一下自己的见解
1.“流程”,存在即是合理的,社会所必须承受的,就像高房价一样,很多时候“流程”被我们吹捧的就像一个神一样,貌似能解决一切问题,而实际上我认为,流程只是一个比较虚的东西,什么是流程?就是一种大家认可的协作方式,在中小企业里我认为无流程就是最好的流程 

2.“沟通”,为什么沟通?怎样沟通?今天腾讯的页面组leader说得好:“沟通就是情商,情商会从你的绩效考评里反映出来”,什么意思呢?也就是“强制沟通”,我认同这个观点,有效的沟通能够大大提升我们的效率,以及信息不对称等问题,我也希望所有的前端朋友们,一定要学会使用“沟通”这个武器,很多时候他能解决你技能所解决不了的问题 

3.“专业”,专业是什么?kejun兄补充的好-“专业就是饭碗”,我们要提升自身专业度,在研发流程中承担更多的职能,现在有多少公司里,后端不做一些“前端”的活呢?这也可能目前前端开发是“解耦”的最好途径 

4.“吃饭喝酒”,同事间朋友间,需要有一些私下的沟通与了解,适当的有些活动,能够在工作配合上更加的顺畅,当然了吃饭喝酒只是其中之一,更多的在轻松地环境下交流交流,增进一下友谊,本次讨论会后聚餐共16人哦:) 

kejun在最后公布了之前出的html面试题的答案 有兴趣的 移步这里
http://www.iamued.com/qianduan/1373.html

最后借用一张崔凯发的合影结尾吧:) 

第六期WEB标准化交流会合影{点击放大}