Ajax 板


LINE

※ [本文转录自 Web_Design 看板] 作者: TonyQ (沉默是金) 看板: Web_Design 标题: [心得]从 js 到 jQuery 之六:五光四色的特效世界 时间: Tue Aug 12 11:45:59 2008 本章一开始 , 我们先来看看一个小弟精心准备的小小demo吧. http://tonyq.org/jqtalk/jq6_effectDemo.html ──────────────────────────────── 呵 , 一个小小的demo , 带下我们今天的主题 , 与其说是特效 , 其实指的是 animation , 动态效果. 其实说到这一章 , 算是会让我比较热血沸腾 , 担心会写到失控的一章 , 当初学 javascript 很大的一个因素是因为这个 ,从第一篇到第五篇, 我们不断的强调 js 的用途主要在於修改页面上的属性 , 而用得最淋漓尽 致的应用 , 就在动态效果. @demo页的code好像有一点复杂 , 而且好像没看到 jQuery呢? 我之所以要特地在最前面放一个传统js写出来的demo页 , 主要是想强调 的是 jQuery 并不能平白生出各种效果 , 也是透过一些搭配来产生这些效果. 比方说在 #18dWSoRf (web_design) 一文中我就用js展示能做到opacity fade 跟color fade的模拟代码 , 当然并没有把所有情境考虑进去 , 但是只要把握 本章我们提的工具 , 你就不会迷失在各种令人目眩神迷的特效里面. js底下没有新把戏 , 只是看你有没有想到而已 . 这章算是传统 js 跟 jQuery差距比较小的一章 , 因为观念是 jQuery无法简化 的 , 只有学习才能真的把非常复杂的事情简化. 当然如果你不是立志要当一个开发效果的coder , 而只是想套用别人的效果 , 本章可以让你对於套用这些效果的「副作用」更了解一些. @demo 是怎麽做的? 我以demo中有用到的一些技巧先行介绍 , 首先各位读者应该有发现 , 他是一个行为一个行为依序进行的 , 在这里我们是透过计时器来处理 . 虽然说计时器是被我包装成我比较习惯使用的模样 , 不过我还是得介绍原型. 传统 js 提供两种计时器 , 其不仅仅是能够提供我们计算时间而已 , 同时他也是属於非同步(Asynchronous)运算的 , 对 multi-thread有了解的版友们可以把它想像成另一个thread. @计时器 这两个分别为 Timeout / Interval , 分别有对应的使用跟移除的function, 为 window.setTimeout(expr,time) window.setInterval(expr,time) window.clearTimeout(id) window.clearInterval(id) 先谈谈用法 , expr 可以是javascript的字串 , 像是 "alert('hi');" 它会用eval的方式来呼叫,也可以是函数 , 像是 function(){alert('hi'); 而time则是距离下一次执行的间隔时间(以ms为单位 , 1秒=1000ms) 不管是timeout或interval , 他们第一次都会是在计时器时间到时执行, 但 timeout 跟 interal最大的差异就是 , 前者呼叫时只会执行一次, 後者则是每隔指定时间就会呼叫expr这个函数,直到你把它clear掉. 每次当你呼叫 setTimeout或 setInterval时 , 他都会回传一个数字 , 那个数字就是所谓的timerId , 用来识别多个timer中是哪一个, 你需要透过timerId来clear掉对应的 Timeout 或 Interval. @timer这麽猛 , 那我可以什麽都用timeout做非同步处理吗? 由於多一个计时器本身就是不小的成本 , 建议是仅在必要时使用. @计时器的时间准确吗? 他本身难免还是会有一些误差 , 不过我个人经验是在100~200ms左右而已 , 需要较高精确度时 , 时间区间要设小一点 , 然後透过纪录date的时间差来算 目前差距时间,这样会更准确一点. @还有其他的东西吗? 目前扣掉最基本的 show/hide , 你可能会比较想知道怎麽把元素指到指定的 位置,基本上我们也是透过css中的 position:absolute 搭配 left/top移动到 指定的位置 . 当然这样另一个问题就来了 , 我们常会有一个画面上的标地物. 比方说以tip效果而言 , mouseover後显示资料在对应的物品旁边, 我会需要这个事件对象的座标 , 一般在传统js我们会用 offsetLeft跟 offsetTop , 不过这两个dom元件的属性在ie跟fx解读下不同 , 前者会解读成自己跟父元素的left-top差距 , 後者则是在页面上得left-top , 所以在ie底下要取得 正确的 offsetLeft 要跑一个for loop 往父元素加总. 这其实一直都是许多人所碰到的钉子,因为这也是个常见的需求. 以 jQuery而言 ,用原为 dimension plug-in 的 offset(), 它现已被整合进1.2.6 jQuery Core , 可用来取得left跟top , 就不需要自行维护写function找左 上 , 宽高则可透过 css取. 传统作法在这里我先引用别人的文章来做说明 , 实际代码可见底下连结. http://0rz.tw/c74xz function GetTopLeft(elm) @我注意到你的图形是跑圆形的 , 圆形的轨迹怎麽来的? 如果各位读者有看source的话 , 应该会看到我是用 ( rCosΘ , rSinθ) 的方案 , 并且让半径r 成比例缩小来达到螺旋状的效果 , 对於三角函数还有印象的朋友, 可以看底下这个简单的示意图, 回想圆投影的公式,当然这不是这里的重点 , 就不多做着墨. . - . . r /|. . . . /θ| . .  ̄ ̄ . . . ` 我想表达的是对一个平面物来讲 , 他就是只有 x,y座标 , 你必须去计算他每个时间点的每个位置才能做出一连串的轨迹, 这过程中你偶尔会需要一些数学的辅助 , 像是线性递增的等加级数就是常 用的技巧之一, 相对的 , 算法的优劣也就是决定效果出来好不好的关键 . 我们继续分享一些操作上得基本技巧 , 当你想把一个位置从 0,0 慢慢移动到 50,15 时, 假设设定移动15次时走到 , 那你每次就要走 ((50-0)/15, (15-0)/15) 的长度 , 就可以在次数到达时 , 走到目的地 . 当然如果你想扭扭腰之类的 , 就得去计算各个折点 , 或者仰赖简谐运动公式. (这边都还在高中物理/高中数学的范畴 , 想想高中真是学了一堆鬼东西..) 至於立体轨迹 , 可能需要去找一下怎麽把 x,y,z投影到x,y平面的公式. 想把移动轨迹做水平扭曲或垂直扭曲的话 , 旋转矩阵 会是个好帮手. 好啦 , 我知道不少位读者现在心理正在哀号这些是什麽鬼东西 , 我只是想提醒大家 , 学习可以简化问题的难度... 有付出去学习就会有对应的收获 .. 如果做不到 , 就是要多花时间学 , 而不是说对方就像神一样平白变魔术 , 仰赖jQuery协助我们做到许多 特效时 , 也可以顺便思考它是怎麽做的 , 笔者是一直对於没把离散跟线代给学好 , 觉得有些遗憾 , 当然本身不是数学相关科系出身 , 所以知道的也不是很多, 对於常常有人在讨论数学到底有没有用的议题 , 我想学习对於简化事情都是有正面帮助的. 无趣的碎碎念与闲话谈的够多了 , 让我们进下一个部份吧. @副作用? 像我红色点的轨迹纪录中是用多个div 当纪录点 , 这在本来就很庞大的 网页的话就可能会造成负担 , 当然像这种额外插几个元素进去处理 在各plug-in都是很常见的作法 . 有时候可能一来是需要考虑运算的复杂度 , 二来是要考虑到多个元件 会不会有互相干扰的状况 , 这些都是需要列入考虑的 . 在底下两个前提下 , js能透过计算作不少事情. 1.不绘图: 虽然js可以做到类似点阵绘图的效果 , 可是效能很差 ,而且又不能存成图片 , 基本上是接近废物 , 2.不需要对图片做特别处理(扭曲翻转 ) 但是相对的 js 只要一多 , 对浏览器来讲负担就很重 , 使用者应该有经验就是逛网页逛一逛突然间记忆体用量暴增 , 那通常都是 js 跟 图片过多且没有好好的释放掉所导致的 , 这点在 map 类的网页特别常见 , firefox以前有一只叫leak Monitor的 plug-in可以观察哪些资料没被释放掉 , 不过後来一直看到各网站都有, 就乾脆关掉了...有兴趣者可参考下方连结. https://addons.mozilla.org/zh-TW/firefox/addon/2490 虽然由一个推广 js的人来讲很奇怪 , 不过请不要觉得 javascript 是万灵药, 很多事情不是不存在 ,只是还没遇上(泪目), 在要考虑到 js solution时 , 记得把对应的 loding风险列入评估. 基本上我会建议不会再用到的物件可以用 [delete]这个关键字顺手删掉, 虽然把需要用到的东西顺手delete掉的情况也是偶尔会发生 . (摊手) 关於js coding上得一些减轻负担或增加体验的经验 , 有机会再跟大家分享 . @关於 js 我们谈的够多了 , 来点 jQuery吧 基本上在特效这点 jQuery可说没什麽特别好帮忙的 .(才怪!) 它只是帮你处理许多做动态效果所需要的跨平台支援 , 跟提供了数种基本实用的基本动态实做效果而已嘛...^^ 接下来就来看看两种最常见的特效 fadeIn跟 slideDown 吧 像是fadeIn/fadeOut/fadeTo (采透明度方案的) , 还有 slideDown / slideUp 这类花俏的弹出弹入 , 几乎是各家都不会少的. 简单demo就好 :) http://tonyq.org/jqtalk/jq6_jqEffectsDemo.html @我可以简单的做到其他的效果吗? 这里要特别介绍的是 animate( ) 这个方法 , 他可以让你提供多个参数, 包括 param duration (经过时间,也可填'fast','slow','normal') easing(缓和方式,目前预设是'inear' 线性法 ,另有 'swing'可选) 还有callback 指的是在animate动作结束後要呼叫的方法. 我想应该看到这里还有很多人跟我一样不晓得这能干麻吧? 他的概念其实很简单 , 你结果想要达到什麽 , 就写在 param 里面 , 过程想要什麽效果 , 就交给 easing决定 . 比方说我现在想从现在的 , 宽度变400px ,高度变200px. 并且希望他在 1.5秒内完成 , 就这样写 $("#helloButton").click( function(){ $("#anNode").animate( { width: "400px", height: "200px" } , 1500 ); } ); 简单示例 http://tonyq.org/jqtalk/jq6_jqAnimateDemo.html 不过比较遗憾的是 animate目前只支援可成为单一数字化的栏位, 比方说border宽度 , height , width , left, top 之类的 像color跟background color 目前都得透过 plug-in做到 . 关於color的相关的mailing 问题 http://www.mail-archive.com/[email protected]/msg17329.html 扩充 animate color的 plug-in http://plugins.jquery.com/project/color 目前试用过 , 至少backgroundColor没问题 (background不行就是了:P) 加上颜色变换之後的简单demo http://tonyq.org/jqtalk/jq6_jqAnimateColorDemo.html @还有什麽好东西? 新版目前还支援 queue的效果 , 可以让你依序执行多个 function , 用这东西写的话我本来的code就不用写那麽长了...:P 直接看doc上得demo页 , 把多个效果组合在一起 . http://docs.jquery.com/Effects/queue @体验时间 由於这整章几乎都在体验时间...这次就先不介绍了 :P (另外是这章的撰写时间破历史新高 , 害我打破一天一篇的计画..) --- 这篇看起来好像写了很多 , 其实又好像什麽都没写 ,真的是学了越多忘了越多 .XD 顺便祝贺一下 , 家里网路终於在请假半天的代价下搞定了 , 希望晚上回来能有比较正常的网路频宽可以用 ,逛个ptt打个字都要0.5秒 delay 还要写长文真是太折磨我了些... 如果有错字或者缺字就是频宽害的(牵托ing...) 总之 , 第六篇希望给大家有一点惊艳的感觉 , 下一篇我们要回头讲新增/删除网页元素 , 一样会很有趣的 . :) -- What do you want to have ? / What do you have? 从书本中,你可以发现我的各种兴趣。 从CD中,你可以了解我所喜欢的偶像明星。 或许从文字你很难以了解一个人,但从物品可以。 My PPolis , My past. http://ppolis.tw/user/Tony --- 重新修整一些我觉得极度不通畅的文句 , 跟放上我忘记放的两个sample link. 另摘於下 http://tonyq.org/jqtalk/jq6_jqAnimateDemo.html http://tonyq.org/jqtalk/jq6_jqAnimatecolorDemo.html /*加入color plug-in*/ --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.59.247
1F:推 JYHuang:网路断线推 XD08/12 12:38
2F:推 gpmm:push08/12 12:48
3F:推 ateclean:推08/12 13:21
4F:推 chrisQQ:推,终於逃出旧的慢网路…08/12 13:22
5F:推 dspswen:推 !08/12 13:33
※ 编辑: TonyQ 来自: 220.128.219.202 (08/12 13:58) -- What do you want to have ? / What do you have? 从书本中,你可以发现我的各种兴趣。 从CD中,你可以了解我所喜欢的偶像明星。 或许从文字你很难以了解一个人,但从物品可以。 My PPolis , My past. http://ppolis.tw/user/Tony --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.128.219.202
6F:推 awpadam:推!认真的范例网页!! 08/12 17:25
7F:推 ilake:推推推 08/13 07:06
8F:→ TonyQ:ilake欸 好久不见 , 改天再去你那抢鸟(误) XD 08/13 11:43
9F:推 superGA:push 08/13 19:49
10F:→ kosgroup:推 05/04 02:43
※ 编辑: TonyQ 来自: 61.224.239.208 (12/16 00:00)







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP