专注于WEB前端开发, 追求更好的用户体验, 更好的开发体验 [长沙前端QQ群:234746733]

实践

  • Kplayer 1.2.2 发布

    / 分类: 实践 / 27 Comments

    Kplayer简介:一款MP3播放器,支持单曲、列表播放,自动记录播放位置,刷新页面可接着上次位置继续播放。代码用as3制作,UI部分全部是用代码画出来的,没有用到一点flash导出的素材。界面仿照Chrome的HTML5播放器界面,差不多类似HTML5的audio标签。还可以配合HTML5标签一起使用

    功能列表:

    • 1、自动记录播放歌曲的位置,即使刷新页面也会接着继续播放(并且,比如在firefox下播放,然后关闭页面,再用IE或其他浏览器打开,还会接着播放,这个记录是跨浏览器的)。
    • 2、不仅支持播放单曲,还支持播放json或xml格式的歌曲列表。
    • 3、可定义json/xml列表的路径。
    • 4、支持单曲循环、歌曲列表循环播放。
    • 5、可自定义从歌曲列表的第几首开始播放。
    • 6、歌曲加载错误会自动切换下一首,xml/json格式错误、加载错误会提示。
    • 7、可自定义默认的播放音量,可拖动、点击、滚轮控制音量。
    • 8、歌曲播放进度(在已加载的范围内)可拖动或点击控制。
    • 9、可显示歌手、歌曲名称。
    • 10、键盘控制:暂停、继续播放、上一首、下一首、快进、快退、音量调节。
    • 类似:暂停、继续播放、切换静音、加载进度条这些普遍的就不详细列出了。

    update log:

    2011-07-26: 更新版本号为1.2.2
    fix:修复储存播放信息的判断,之前的不严格会导致记录冲突
    fix:如果歌曲列表的歌曲地址全部失效(播放器没有1首歌可以正常播放),提示加载歌曲失败,并停止播放和记录。
    fix:增加一个极少数情况发生的歌曲加载失败的判断
    fix:一些操作如果不影响记录结果,就暂停自动记录,减少资源占用。
    add:新增参数:record,为0就不自动记录播放位置
    是否开启自动记录就看个人需求吧,我测试同时播放3个(每个都自动记录),内存变化不大,cpu使用和那些视频门户播放1个视频时差不多,此时应该算很正常了。所以如果一个页插入多个播放器一起播放(每个都开启自动记录),就控制在3-4个左右吧,这样应该没啥问题。Ps:同页面多个播放器千万不可把name参数的值都设置成一样的,例子可看下面参数列表的说明。
    add:鼠标移到按钮上显示提示按钮功能
    add:焦点在播放器上时,Tab键显示快捷键提示
    Note:不使用Tab键切换按钮焦点的原因:
    1、flash里的元素获得焦点后,默认空格、回车都会触发焦点的事件,所以会与播放器产生冲突:
    静音按钮获得焦点时,按空格即触发了静音按钮,也触发了暂停/播放按钮;音量滑块获得焦点,焦点会跳到其他按钮(因为按上下左右键会触发改变焦点)。
    2、如果是flex做的表单,tab切换是有必要的,就播放器来说tab切换焦点来控制意义不大(已经做了键盘绑定和鼠标提示)。
    3、为了满足用tab切换的同学,tab被改成了快捷键的帮助。采用这个折中的办法,我想是最好的解决方案。如果要tab让按钮获得焦点并高亮,不仅要对每个按钮加上focus事件的侦听,还要解决焦点冲突,增加的代码太多了。

    2011-07-22: 更新版本号为1.2.1
    加入键盘控制快进、快退,代码部分发现了几处可以优化的地方,优化了下。

    2011-07-20: 更新版本号为1.2
    fix: 修复当拖动音量到0,再点击静音按钮时的切换(改为初始音量)
    fix: 播放上一首没加载完,切换下一首有时出现的拖动问题
    fix: 重载页面时,播放进度条位置和播放时间没有对应记录的播放位置
    add: 键盘控制: 暂停(空格键)、继续播放(空格键)、上一首(ctrl+Left)、下一首(ctrl+Right)、快进(Right)、快退(Left)、音量调节(Up,Down)

    2011-06-22: 因为之前做了个基础版了,这次做了些重构,加了些功能,版本定位1.1吧,功能应该足够用了。

    演示:(播放歌曲并刷新页面试试。。)

    下载:http://pan.baidu.com/share/link?shareid=284648&uk=3338835672
    1.2.2演示:http://www.fantxi.com/demo/KPlayer/

    查看全文 »

  • google css、js实现的动画 logo

    / 分类: 开发,实践 / No Comments

    google纪念玛莎·葛兰姆的logo,一大早就听群里面讨论,也许这个logo创意不错,得到大家的热捧。晚上抽空研究了下google的实现方法,此次的logo利用css的背景图定位+js实现。

    自己找了个gif图改成css sprite背景图,做了个演示:查看
    google的那个logo动画:查看

    css、js部分其实不难,不过话说google攻城师的水平真不错。难点是把原始动画制作成CSS Sprites的部分,要规划好:如何才能用最小的图实现这个动画,如果仅仅单纯把动画里每帧的图铺起来,那意义就不是很大了。下面是注释过的js部分:

    (function() {
    	var K = {
    		get:function(I){
    			return document.getElementById(I);
    		},
    		create:function(T){
    			return document.createElement(T);
    		},
    		remove:function(E){
    			return E && E.parentNode && E.parentNode.removeChild(E);
    		},
    		on:function(E, N, FN){
    			E.addEventListener ? E.addEventListener(N, FN, !1) : E.attachEvent("on" + N, FN);
    		}
    	},
    	//把每个div的left、top、width、height信息存在js数组里
    	coords = [
    		[1, 6, 70, 74], [10, 4, 70, 76], [10, 4, 69, 76], [9, 4, 69, 76], [8, 4, 70, 76], [8, 5, 69, 75], [8, 6, 68, 74], [7, 6, 69, 74], [6, 7, 69, 73],[6, 6, 69, 74, 1], // 这里多了个值,表示下面开始调用背景图的下一行了
    		[5, 6, 69, 74], [4, 6, 70, 74], [4, 6, 70, 74], [3, 6, 70, 74], [2, 6, 70, 74], [1, 6, 70, 73], [1, 6, 70, 74], [1, 6, 70, 74], [1, 7, 70, 73], [1, 7, 70, 73, 1], [1, 6, 70, 74], [1, 6, 70, 74], [1, 7, 70, 74], [1, 7, 70, 74], [1, 6, 70, 74], [1, 6, 70, 74], [1, 6, 70, 74], [1, 6, 70, 74], [1, 6, 70, 74], [1, 6, 70, 74, 1], [1, 6, 70, 74], [1, 6, 70, 74], [1, 6, 70, 74]
    	],
    	length = coords.length, num, repeatX, repeatY, rowHeight, timer = -1,
    	logoId = K.get("hplogo"),
    	nav = function() {
    		alert("跳转页面");
    	},
    	draw = function() {
    		var arr = coords[num];
    		if ( logoId && arr[0]) {
    			var b = K.create("p");
    			b.id = "hplogo" + num;
    			b.style.left = arr[0] + "px";
    			b.style.top = arr[1] + "px";
    			b.style.width = arr[2] + "px";
    			b.style.height = arr[3] + "px";
    			b.style.backgroundPosition = - repeatX + "px " + - repeatY + "px";
    			b.onmousedown = nav; //for IE、opera 点击涂鸦跳转
    			arr[3] > rowHeight && ( rowHeight = arr[3]); //记录当前背景片段所在行的高度(sprite图片中)
    			//如果有arr[4],就表示开始调用背景图的下一行了,背景图的y坐标就需要 + 上一行的高度;背景x坐标当然要重置为0了, rowHeight当然也重置为0。
    			//如果没有arr[4],表示还在调用同一行的背景图,那么只需要增加x坐标的位置就OK了。
    			arr[4] ? ( repeatX = 0, repeatY += rowHeight, rowHeight = 0) : repeatX += arr[2];
    			logoId.appendChild(b);
    
    			//本动画比google 动画简单,上一帧图像没有用途,所以直接隐藏掉了,google的那个这句就没必要了
    			num != 0 && (K.get("hplogo"+(num-1)).style.display="none");
    
    			++ num;
    
    			//num < length && ( timer = setTimeout( draw, 83)); //播放1次
    
    			timer = setTimeout( draw, 120); num === length && init(); //循环播放
    		}
    	},
    	init = function() { //加载sprite图片完成,开始涂鸦
    		rowHeight = repeatY = repeatX = num = 0; //变量值初始化
    
    		//下面的代码起到循环播放的作用;只播放一次,可以删掉
    		timer != -1 && (clearTimeout( timer), timer = -1);
    		for (var a = 0; a < length; ++a) {//如果已经添加了动画div,就移除
    			K.remove(K.get("hplogo" + a))
    		}
    		draw(); // 开始涂鸦
    	};
    	//加载完成后才绘制动画
    	var bg = K.create("img");
    	K.on(bg,"load",init);
    	bg.src = "sprite.png"
    })();

    对比这个葛兰姆logo,我更喜欢“罗伯特·本生诞辰200周年”的logo,利用canvas、css、js。

    verne,这个也还可以,支持css3的浏览器使用transform来做动画,不支持css3使用position来定位实现。

    围观更多logo:http://www.google.com/logos/index.html

  • html5、css3模版 K Blue for typecho、sablog-x、wordpress

    / 分类: 开发,实践 / 56 Comments

    sablog转换成typecho了。sablog仍然保留,感觉sablog的速度那是相当的快,舍不得啊,就是加独立页面麻烦些。typecho虽然慢了点,但是制定比较方便。两个都是优秀的程序,两个都用。

    新制作的模版用html5、css3,使用了css3的很多效果: Border Radius、Box Shadow、Text Shadow、RGBA、Transitions、Gradients,还有目前只有webkeit内核支持的text-stroke。

    基于蓝色调的,所以命名:K Blue
    特点:
    1、基于html5、css3,使用了很多css3的特性。在实现css3效果的同时尽可能的让其他浏览器保持效果一致。
    2、此风格没有使用一张图片,一个小图标是base64存在css里面,令一个是头部的高亮,cr、ff可以直接渲染,op需要svg,但是还是不能打到满意的效果,所以为ie9/8、op准备了一个base64的图。由于ie6/ie7不支持data uri,MHTML在这里也显得没必要,就设置ie6/ie7使用默认样式了,效果差距不太大。所以这个模版,无论那种浏览器,加载页面的样式只有一个css的连接数。
    3、由于各浏览器对css3的支持不同,按显示效果由好到差:chrome/safari>firefox3+>oprea>ie9>ie8>ie6/ie7
    G1、G2这样的比较绚的效果只做了chrome/safari下的,原因:ff也可以实现这个效果,但是渲染不流畅。其他浏览器只能尽可能实现类似的感觉了。
    4、html用的html5,但ff2不支持html5标签,所以ff2下会变形,解决方法也是有的,只是比较麻烦,用ff的人应该也不会像IE6那么根深蒂固,该升级的应该都升级了吧。再者这个是个人博客,不是大众网站,所以不考虑ff2了。
    5、经过检测的浏览器:chrome10、safari5、firefox3.6、ff4、k-meleon、ie9、ie8、ie7、ie6
    6、很多细节都做了,不全部阐述了,用chrome/safari浏览你会发现那是相当滴帅气。

    注意:
    首页调用了指定分类的内容,如果没有该分类肯定就有问题,index.php
    <h2 class="tit"><?php _e('开发'); ?></h2>
    <h2 class="tit"><?php _e('工具'); ?></h2>
    这两行下面的<ul>...</ul>里面的php语句。我这里调用的是mid= 6、7分类下面的文章(Widget_Archive@7、"mid= 7")。你的应该和我的不同,需要自己修改自己的分类id。令需要安装随机日志插件

    K Blue、K Blue G1、K Blue G2的区别:
    K Blue :基础简洁版,背景色是灰色的过度,背景无彩色圆。
    K Blue G1 : 跟"K Blue"类似,背景色加上了26个彩色的圆。
    K Blue G2 : 暗色调,背景色是黑色加上了26个彩色的圆。

    演示:
    K blue 基本版演示
    K blue G1演示
    K blue G2演示
    G1、G2还有几种显示方式,演示页面有说明(请用chrome、safari体验)。所以这次相当于发布了几个模版了。。

    下载:

    K blue 基本版for Typecho 0.8 (2011-01-06更新)
    地址2 mega
    K blue 基本版for Sablog-x 2.0 Beta(20100802) (2011-02-17更新)
    K blue 基本版for WordPress 3.0.5 (2011-02-20更新)
    Change: 链接文字、底部列表动画;数字分页动画;增加sablog、wordpress版。
    Note: te、sa、wp的sidebar请自己diy。

    非常感叹css3的强大,用chrome/safari看下面的K blue G2演示链接,就明白了,背景里的那些渐变的圆都是css3的效果,而且按照百分比排列。以前做到这样的效果需要做一张很大的图去实现,这张图要足够大,否则宽屏下面就有问题,但是这里无论你的显示器多宽,它们还是按照比例排列。可惜目前只有webkeit支持的比较好,firefox虽然也可以,但是滚动页面时很不流畅。另外,头部的高亮也是css3的效果。

    G1、G2的背景那里我做了很久,一共添加了26个渐变的圆形,而且尽量做出随机的感觉。其实是一个一个排出来的。喜欢前端开发的同学可以看看。

    另外我下的svn最新打包版0.8 | 10.8.15,附件不能上传。看了下是js报错,解决办法:编辑admin/file-upload-js.php,编辑:142行,post_params: {"cid" : <?php $fileParentContent->cid(); ?>}, 注意后面的","号。

  • 在VIM里 调用多种浏览器 预览html php 等文件

    / 分类: 工具,实践 / 23 Comments

    最近这段时间睡眠严重不足,脑袋发晕的时候就要放送下,so改善vim。产生个想法:把自己喜欢的editplus的功能都搞到vim上面来。这个就是其中之一:在浏览器中预览当前文件。有时间的话,可能要写点从editplus转型到VIM的东西。

    优点1:
    囊括了主要的浏览器:chrome、firefox、oprea、ie、ietester(随自己喜欢可以增加更多,比如safari),浏览器的简称:cr、ff、op、ie、ie6、ie7、ie8、ie9、iea,简称、路径以键值对方式都保存到browsers中。
    上面的简称大部分人应该都明白了,ie就是系统默认的ie,最后一个iea是在ietester中使用所有版本的ie同时预览(IE5.5-IE9)。

    IETester 的Arguments可以见 : http://www.my-debugbar.com/wiki/IETester/CommandLineArguments

    优点2:
    本地文件自动以file://开头或http://开头的两种方式预览。如果文件在htdocs就用http方式打开,否则用file方式。
    file://开头的地址预览html一般没问题,但是预览php或aspx等就显得苍白无力了。这里可以设置一个htdocs/wwwroot的文件夹地址,然后预览的时候匹配文件是否在这个文件夹内(支持子目录),如果在就用http://方式打开,否则就用file://方式。

    无论前端开发者或者程序员都及其适合。自夸完毕,下面说下使用:
    在_vimrc中加入下面的代码,然后按F4+cr - 在chrome预览,F4+ff  - 在firefox下预览……。方式就是F4+浏览器简称(应该比用F4+1234的数字形式便于记忆)。当然,这个完全可以自己diy的。

    下面fuc里面的浏览器地址需要自己修改,我的文件夹目录和你的可能是有不同的。还有htdocs文件夹、本地的预览的端口号,我使用的是8090.

    " 在浏览器预览 for win32
    function! ViewInBrowser(name)
        let file = expand("%:p")
        exec ":update " . file
        let l:browsers = {
            \"cr":"D:/WebDevelopment/Browser/Chrome/Chrome.exe",
            \"ff":"D:/WebDevelopment/Browser/Firefox/Firefox.exe",
            \"op":"D:/WebDevelopment/Browser/Opera/opera.exe",
            \"ie":"C:/progra~1/intern~1/iexplore.exe",
            \"ie6":"D:/WebDevelopment/Browser/IETester/IETester.exe -ie6",
            \"ie7":"D:/WebDevelopment/Browser/IETester/IETester.exe -ie7",
            \"ie8":"D:/WebDevelopment/Browser/IETester/IETester.exe -ie8",
            \"ie9":"D:/WebDevelopment/Browser/IETester/IETester.exe -ie9",
            \"iea":"D:/WebDevelopment/Browser/IETester/IETester.exe -all"
        \}
        let htdocs='E:\\apmxe\\htdocs\\'
        let strpos = stridx(file, substitute(htdocs, '\\\\', '\', "g"))
        if strpos == -1
           exec ":silent !start ". l:browsers[a:name] ." file://" . file
        else
            let file=substitute(file, htdocs, "http://127.0.0.1:8090/", "g")
            let file=substitute(file, '\\', '/', "g")
            exec ":silent !start ". l:browsers[a:name] file
        endif
    endfunction
    nmap <f4>cr :call ViewInBrowser("cr")<cr>
    nmap <f4>ff :call ViewInBrowser("ff")<cr>
    nmap <f4>op :call ViewInBrowser("op")<cr>
    nmap <f4>ie :call ViewInBrowser("ie")<cr>
    nmap <f4>ie6 :call ViewInBrowser("ie6")<cr>
    

    另外有同学想要linux下面的例子, 我没有环境, Mac下面这样是OK的,可以参考:

    " 在浏览器预览 for Mac
    function! ViewInBrowser(name)
        let file = expand("%:p")
        let l:browsers = {
            \"cr":"open -a \"Google Chrome\"",
            \"ff":"open -a Firefox",
        \}
        let htdocs='/Users/leon1/'
        let strpos = stridx(file, substitute(htdocs, '\\\\', '\', "g"))
        let file = '"'. file . '"'
        exec ":update " .file
        "echo file .' ## '. htdocs
        if strpos == -1
            exec ":silent ! ". l:browsers[a:name] ." file://". file
        else
            let file=substitute(file, htdocs, "http://127.0.0.1:8090/", "g")
            let file=substitute(file, '\\', '/', "g")
            exec ":silent ! ". l:browsers[a:name] file
        endif
    endfunction
    nmap <Leader>cr :call ViewInBrowser("cr")<cr>
    nmap <Leader>ff :call ViewInBrowser("ff")<cr>
    
  • PHP 读取大文件的X行到Y行的内容

    / 分类: 开发,实践 / 5 Comments

    最新写了个小程序,需要读取一个文件的几行内容,但是文件比较大,所以研究了下PHP读取大文件的几行内容的方法,写了一个方法,代码如下(加了注释):

    //返回文件从X行到Y行的内容(支持php5、php4)
    function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
    $content = array();
    $count = $endLine - $startLine;
    if(version_compare(PHP_VERSION, '5.1.0', '>=')){// 判断php版本(因为要用到SplFileObject,PHP>=5.1.0)
    $fp = new SplFileObject($filename, $method);
    $fp->seek($startLine-1);// 转到第N行, seek方法参数从0开始计数
    for($i = 0; $i <= $count; ++$i) {
    $content[]=$fp->current();// current()获取当前行内容
    $fp->next();// 下一行
    }
    }else{//PHP<5.1
    $fp = fopen($filename, $method);
    if(!$fp) return 'error:can not read file';
    for ($i=1;$i<$startLine;++$i) {// 跳过前$startLine行
    fgets($fp);
    }
    for($i;$i<=$endLine;++$i){
    $content[]=fgets($fp);// 读取文件行内容
    }
    fclose($fp);
    }
    return array_filter($content); // array_filter过滤:false,null,''
    }

    Ps:
    上面都没加"读取到末尾的判断":!$fp->eof() 或者 !feof($fp),加上这个判断影响效率,自己加上测试很多很多很多行的运行时间就晓得了,而且这里加上也完全没必要。

    从上面的函数就可以看出来使用SplFileObject比下面的fgets要快多了,特别是文件行数非常多、并且要取后面的内容的时候。fgets要两个循环才可以,并且要循环$endLine次。

    此方法花了不少功夫,测试了很多中写法,就是想得出效率最高的方法。哪位觉得有值得改进的欢迎赐教。

    使用,返回35270行-35280行的内容:

    echo '<pre>';var_dump(getFileLines('test.php',35270,35280));