WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堝姛缂佺娀绠栭弻宥堫檨闁告挻姘ㄩ幑銏犫槈濞嗘劕顎撻梺鍛婂姇瀵爼骞栭幇顔炬/闁告挆鍕畬闂佸疇顫夐崹鍧楀箖閳哄啠鍋撻崷顓炐㈡い銉︾箞濮婂搫效閸パ€鍋撳Δ鍛;闁规崘顕ф闂佸憡娲﹂崹鎵不濞戙垺鐓曟い鎰剁稻缁€鍐┿亜鎼达紕效婵﹨娅g划娆忊枎閹冨闂備礁鎽滄慨鐢稿礉濞嗘劒绻嗛柣銏⑶圭粈瀣亜閺嶃劏澹橀柛鐐姂濮婃椽妫冨ù銈嗙⊕閹峰懘骞撻幒宥咁棜闂備礁婀遍崕銈夈€冮崱娑樼厱闁圭儤顨嗛悡鏇㈡煛閸ャ儱濡煎ù婊勭矋閵囧嫯绠涢敐鍛睄闂佸搫澶囬埀顒€纾弳鍡涙倵閿濆骸澧伴柡鍡欏█閺屟勫濞嗘垵鍩岄梺闈涙鐢帡锝炲┑瀣亗閹艰揪绲奸悽鑽ょ磽娴h娈曢柛銊ョ仢椤繒绱掑Ο璇差€撶紓浣圭☉椤戝懎鈻撻鐐╂斀妞ゆ梹鏋婚崗顒傜磼閻樿櫕宕岄柕鍡曠椤繈骞囨担鍏夋瀸濠电姷鏁告慨顓㈠磻閹捐秮褰掓晲閸モ斂鈧﹪鏌¢埀顒佺鐎n偆鍘藉┑鈽嗗灡椤戞瑩宕电€n兘鍋撶憴鍕仩闁稿氦绮鹃悘鍐⒑缂佹◤顏勵嚕閸洖鐤柣鎰暩绾惧ジ鏌涚仦鐐殤閺佸牓鎮楃憴鍕缂侇喖绻樿棟閻庨潧鎽滃Λ顖炴煙椤栧棔绀佹禒顕€鎮楀▓鍨灈闁绘牜鍘ч悾鐑芥偂鎼存ɑ顫嶅┑鈽嗗灟鐠€锕傛倵瀹曞洨纾介柛灞剧懅閸斿秵銇勯妸銉︻棞闁伙絾绻堥獮鏍ㄦ媴濮濆本鎲伴梻浣虹帛濡啴藟閹捐姹查悗锝庡枟閻撶喐淇婇妶鍌氫壕闂佺粯顨呭Λ妤呭煝閹炬緞鏃堝川椤旇瀚奸梺鑽ゅТ濞茬娀鍩€椤掑啯鐝柣蹇婂亾闂傚倷绀侀幖顐﹀箠閹邦厽鍙忛柟缁㈠枟閸嬧晠鏌i妶搴$仜濞存粌缍婇弻鐔兼倻濡偐鐣洪梺鍝勬噺缁诲牆顫忓ú顏咁棃婵炴垶鑹鹃。鍝勨攽閳藉棗浜濋柣鐔叉櫊閵嗕礁鈻庨幒鏃傛澑闂佸搫鍟崐濠氭儊閸儲鈷戞慨鐟版搐閻忓弶绻涙担鍐插椤╃兘鏌ㄩ弴鐐测偓褰掓偂閺囥垺鐓忓┑鐐茬仢閸斻倝鏌涢埡瀣ɑ妞ゃ劊鍎甸幃娆撳级閹存繍娼氭俊銈囧Х閸嬬偤鏁冮姀銈冣偓浣糕枎閹炬潙娈愰梺鍐叉惈椤戝洭鐛姀銈嗏拻闁稿本鐟︾粊鐗堛亜椤愩埄妲搁柣锝呭槻铻i柤娴嬫櫇閻撳顪冮妶鍡橆梿闁跨喆鍎茬粋宥堛亹閹烘挾鍘甸梺缁樺灦钃遍悘蹇e幖闇夋繝濠傚暟缁夌儤鎱ㄦ繝鍛仩缂佽鲸甯掕灒闁惧繘鈧稒顢橀梻鍌欑劍鐎笛兠哄澶婄柧婵炴垶绮庢禍閬嶆⒒娴e憡鍟炴繛璇х畵瀹曞綊鏌嗗鍛幈闂佺鎻梽鍕偂濞嗘挻鐓犳繛鏉戭儐濞呭懎霉閻樺磭鐭婇柍瑙勫灴閸ㄩ箖鎮欓挊澶夊垝闂備浇顕栭崰妤呫€冮崨鏉戠叀濠㈣埖鍔曠粻鎶芥煙閹屽殶鐟滄澘娲ㄧ槐鎾诲磼濞嗘垼绐楅梺鍝ュУ閻楃娀銆侀弽顓炲窛闁圭⒈鍘介弲锝夋⒑缁嬭法绠抽柛妯犲懏顐介柣鎰節缁诲棙銇勯弽銊х煂閻㈩垱绋掔换娑㈠川椤撶喎鏋犲┑顔硷功缁垶骞忛崨瀛樺仭闂侇叏绠戝▓婵堢磽閸屾瑦绁版い鏇嗗洤纾归柛顭戝櫘閸ゆ洜绱撴担璐細缂佲檧鍋撻梻浣规偠閸庮垶宕濆鍛瀺闁搞儺鍓氶埛鎴犵磼鐎n偄顕滄繝鈧幍顔剧<閻庯綆鍋呭畷宀€鈧娲忛崹浠嬪箖娴犲宸濆┑鐘插楠炴姊洪悷鏉挎倯闁伙綆浜畷瑙勭節濮橆剛鍘愰梺鍝勬储閸ㄦ椽鎮¢妷锔藉弿婵☆垰鐏濋悡鎰版煟閹捐泛鏋涢柣鎿冨亰瀹曞爼濡烽妷銉バ戠紓鍌欑椤戝牆鐣烽悽鍨潟闁圭儤姊荤壕鍏间繆椤栨繂浜归柣锝堟缁辨挻鎷呴搹鐟扮缂備浇顕ч悧鍡涙偩瀹勯偊娼ㄩ柍褜鍓氭穱濠傤潰瀹€濠冃ㄧ紓鍌欐祰妞村摜鎹㈤崼婵愭綎缂備焦蓱婵绱掑☉姗嗗剰婵炲牊鍔欏娲箹閻愭彃顬嗛梺鍛婎殔閸熷潡鎮鹃悜绛嬫晬闁绘劘灏欐鍥⒑閻熼偊鍤熷┑顕€娼ч埢鎾淬偅閸愨斁鎷虹紓鍌欑劍钃遍柍閿嬪浮閺屽秴鐣¢幍顔尖叺閻庢鍣崑濠傜暦閹烘鍊烽悗鐢登归獮鍫ユ⒒娴g懓鈻曢柡渚囧櫍瀹曟垿骞樼紒妯煎幐闂佸憡渚楅崰姘跺箠閸涱喕绻嗛柛娆忣槸婵洭鎽堕敐澶嬪仩婵炴垶甯掓晶鏌ユ煛閸屾浜鹃梻鍌氬€烽懗鍓佸垝椤栫偛绀夐柡鍥╁€i悢鍝ョ瘈闁搞儜鍐╁劒闂備胶绮弻銊╂儍濠靛缁╅柤鎭掑劘娴滄粓鏌¢崘銊﹀妞ゃ儱顦甸弻娑㈠棘鐠囨祴鍋撳┑瀣闁割偅娲橀崐鐑芥煟閹寸偍缂氶柛姗€浜跺娲传閸曨剙鍋嶉梺鍛婃煥閺堫剟寮查崼鏇ㄦ晬闁绘劕顕崢鍗炩攽閻愬弶顥滅紒缁樺笧缁粯绻濆顓犲幐闁诲繒鍋熼弲顐f櫏闁诲氦顫夊ú锕傚磻婵犲倻鏆﹂柣鏃傗拡閺佸棝鏌嶈閸撴瑩鍩㈠澶嬫櫜闁搞儮鏅濋敍婵囩箾鏉堝墽绋荤憸鏉垮暞缁傚秹鎮欓鍌滅槇闂侀潧楠忕徊鍓ф兜閻愵兙浜滈柟瀛樼箖瀹告繄绱掗鍓у笡闁靛牞缍佸畷姗€鍩¢崘銊ョ闂備浇顕х€涒晝绮欓幒鎴犲箵閻犳亽鍔庢稉宥嗘叏濡炶浜鹃梺鍝勮閸斿矂鍩ユ径濞㈢喐寰勯惂鍝ョɑ闁靛洤瀚版俊鎼佹晲閸涱厼袝闂備浇顕栭崰妤呮偡閳哄懌鈧線寮崼婵堫槹濡炪倖鎸荤换鍕矆閸曨垱鈷掗柛灞剧懄缁佺増銇勯弴鐔哄⒌鐎规洑鍗冲浠嬵敃閵堝浂妲稿┑鐘垫暩婵挳宕愭繝姘辈闁挎洖鍊归悡娆愩亜閺嶎偄浠滃ù婊呭娣囧﹪鎳犳0婵嗘闂佸疇顫夐崹鍧楀春閸曨垰绀冮柕濞у懌鍋″┑锛勫亼閸娿倝宕㈡ィ鍐ㄧ婵☆垯璀﹂崵鏇㈡偣閸ャ劎銈存俊鎻掔墦閺屾洝绠涢弴鐑嗘綌闂佸啿鎼幊蹇涙偂韫囨搩鐔嗛悹楦挎婢ф洟鏌涢弮鈧幐鎶藉蓟濞戙垹妫樻繛鍡欏亾妤旂紓鍌欐祰妞存悂骞愭繝姘闁告侗鍨抽惌娆撳箹鐎涙ɑ灏ù婊堢畺閺屾稑鈹戦崟顐㈠Б闂佹椿鍘介幐楣冨箟閹间焦鍋嬮柛顐g箘閻熴劑姊洪崫鍕靛剮缂佽埖宀稿濠氭偄閻撳海顦悷婊冪箳閺侇喖鈽夐姀锛勫幐闂佸憡渚楅崰妤呭磹閹扮増鐓涢悘鐐额嚙婵倿鏌熼鍝勨偓婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛濠傛健閺屻劑寮崼鐔告闂佺ǹ顑嗛幐鍓у垝椤撶偐妲堟俊顖氭惈缁犺鈹戦悙鍙夆枙濞存粍绮撻幃鈥斥槈閵忥紕鍘卞┑鐐村灥瀹曨剟鐛Ο姹囦簻闁哄倹瀵чˉ銏℃叏婵犲懏顏犻柟鐟板婵℃悂濡烽敂鎯х稈闂傚倷鑳堕幊鎾诲吹閺嶎厼绠柨鐕傛嫹
开发学院网页设计JavaScript 不间断滚动图片Javascript特效讲解 阅读

不间断滚动图片Javascript特效讲解

 2008-11-24 20:01:56 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑娑⑺囬悽绋挎瀬闁瑰墽绮崑鎰版煙缂佹ê绗ч柍褜鍓﹂崣鍐潖閸濆嫅褔宕惰娴犲ジ姊虹拠鑼闁煎綊绠栭幃楣冩倻閽樺鎽曢梺闈涱檧婵″洭宕㈤悽鍛娾拺閻熸瑥瀚烽崯蹇涙煕閻樺磭澧甸柕鍡楀€圭缓浠嬪川婵犲嫬骞堥梺纭呭閹活亞妲愰弴鐔哄ⅰ闂傚倷绶氬ḿ褍煤閵堝洠鍋撳顐㈠祮闁绘侗鍣i獮鎺懳旈埀顒傜不閿濆棛绡€闂傚牊绋戦弳娆徝瑰⿰鍫㈢暫闁哄矉缍佹慨鈧柍鎯版硾濠€杈ㄧ珶閺囩喓绡€婵﹩鍘鹃崢鐢告⒑缂佹ê濮﹂柛鎾村哺閹ɑ娼忛妸銈囩畾闂佸湱绮敮鐐存櫠濞戞氨纾肩紓浣贯缚濞插鈧娲栧畷顒冪亙闂佸憡鍔曢崯鐘诲礈濠靛牊宕叉繛鎴炨缚閺嗗棗鈹戦悩杈厡闁轰焦鐗滅槐鎾存媴娴犲鎽甸梺鍦嚀濞层倝鎮鹃悜钘夌闁规惌鍘介崓鐢告⒑閻熸澘鎮侀柣鎺炵畵閹骞栨担鍏夋嫽婵炶揪绲块崕銈夊吹閳ь剟姊洪幖鐐测偓鏍偋閻樿崵宓侀煫鍥ㄧ⊕閺呮悂鏌ㄩ悤鍌涘濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻戦妵鍕箻閸楃偟浠肩紓浣哄閸ㄥ爼寮诲☉銏犵疀闂傚牊绋掗悘鍫ユ倵閻熺増鍟炵紒璇插暣婵$敻宕熼姘鳖啋闁诲酣娼ч幗婊堟偩婵傚憡鈷戠痪顓炴媼濞兼劖绻涢懠顒€鏋庢い顐㈢箳缁辨帒螣閼测晜鍤岄梻渚€鈧偛鑻晶顔肩暆閿濆牆鍔垫い锔界叀閹繝濡舵径瀣帾闂佸壊鍋呯换鍐磻椤忓懐绠剧€瑰壊鍠曠花濠氬箚閻斿吋鈷戦悗鍦У閵嗗啴鏌ら崘鑼煟鐎规洘绻堥弫鍐焵椤掑嫧鈧棃宕橀鍢壯囨煕閳╁喚娈橀柣鐔稿姍濮婃椽鎮℃惔鈩冩瘣闂佺粯鐗曢妶绋跨暦閻戞ḿ绡€闁搞儜鍐ㄧギ闂備線娼ф蹇曟閺囥垹鍌ㄦい蹇撶墛閳锋垿鏌熼懖鈺佷粶闁告梹顨婇弻锟犲川椤旈敮濮囩紓浣稿€圭敮鐔妓囩€靛摜纾奸弶鍫涘妼缁楁碍绻涢悡搴g闁糕斁鍓濋幏鍛存煥鐎e灚缍楅梻鍌氬€峰ù鍥ь浖閵娾晜鍊块柨鏇炲€哥粻鏌ユ煕閵夘喖澧柡瀣╃窔閺岀喖宕滆鐢盯鏌¢崨顔藉€愰柡灞诲姂閹倝宕掑☉姗嗕紦闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛銈呭閺屻倝宕妷锔芥瘎婵炲濮靛銊ф閹捐纾兼繛鍡樺笒閸橈紕绱撴笟鍥ф珮闁搞劌鐖兼俊鎾礃椤旂厧绐涢梺鍝勵槹閸ㄥ綊宕㈠ú顏呭€垫鐐茬仢閸旀碍銇勯敂璇茬仸鐎规洩绻濋獮搴ㄦ嚍閵壯冨妇闂傚⿴鍋勫ú锕€煤閺嶃劎澧¢梻鍌欐祰椤曆呪偓鍨浮瀹曟粓鎮㈡總澶嬬稁闂佹儳绻愬﹢杈╁閸忛棿绻嗘い鏍ㄧ閹牊銇勯銏⑿㈡い顏勫暣婵″爼宕卞Δ鈧~搴ㄦ⒑閸涘⿴鐒奸柛銉戝懎寮ㄥ┑鐘灱濞夋稖鐧岄梺缁樻煥閸氬鎮¢妷鈺傚€甸柨婵嗛閸樻挳鏌涚€n偅灏扮紒缁樼箓椤繈顢樺☉娆忣伖闂佽崵鍠愮划搴㈡櫠濡ゅ啯鏆滈柟鐑樻尵椤╂彃霉閻撳海鎽犻柣鎾存礋閺岀喖骞嗚閸ょ喖鏌嶉挊澶樻█闁哄苯绉剁槐鎺懳熼懡銈呭汲婵$偑鍊ら崑鍛崲閸儱绠犳繝濠傛噹閺嬪牊淇婇婵愬殭妞ゅ繐缍婂濠氬磼濞嗘埈妲梺纭咁嚋缁辨洜鍒掑▎鎾崇闁挎柨鎼禍濂告⒑閸濆嫷妲归柛銊у枛瀵悂寮崼鐔哄幐闂佸憡鍔х徊鑺ョ閸撗呯=濞达綀娅g敮娑氱磼鐎n偅灏扮紒鍌涘浮閺佸啴宕掑鎲嬬床婵犳鍠楅敃鈺呭礈閿曞倹鍊甸柟鎯板Г閳锋帒霉閿濆懏鎲搁柨娑樼Ф缁辨帡顢氶崨顓犱桓濡ょ姷鍋為崹鍨暦閸洦鏁嗛柛灞炬皑閵堬箓姊虹拠鎻掑毐缂傚秴妫欑粋宥夊冀椤撶偟鍝楁繛瀵稿Т椤戝棝鎮″▎鎾粹拺妞ゆ挶鍔庨悾鍗烆熆瑜滈崹閬嶅Φ閸曨垰妫橀柛顭戝枓閸嬫挾鎲撮崟顓涙敵婵犵數濮村ú锕傚磹闁垮浜滈煫鍥ㄦ尭椤忋倝鏌涚€n偅宕岀€殿喖鈧噥妾ㄥ┑鐐插悑閻楁洟鍩為幋锔藉亹閻庡湱濮撮ˉ婵嬫⒑缁嬭儻顫﹂柛鏂块叄楠炲顫㈠畝鈧悿鈧┑鐐村灦宀e潡鎮块崨瀛樷拺闁革富鍙€濡炬悂鏌涢悩鎰佹疁鐎殿喗鐓¢獮鏍ㄦ媴閸︻厼寮抽梻浣虹帛濞叉牠宕愰崷顓涘亾濮樼偓瀚�
核心提示:转自:蓝色理想 作者:yaohaixiao演示地址:index.html代码下载:scrollpic.rar大家先不要急着下载代码,你随时都可以下,不间断滚动图片Javascript特效讲解,我们来分析下代码(代码中我已经写了很详细的注释),要之其所以然,可能才能完全明白和掌握,我这里不可能一一都讲清楚,在解读别人的代

转自:蓝色理想 作者:yaohaixiao 

演示地址:index.html

代码下载:scrollpic.rar

大家先不要急着下载代码,你随时都可以下,我们来分析下代码(代码中我已经写了很详细的注释),要之其所以然,在解读别人的代码中学习提高自己,然后可以灵活运用,这个才是我将这个效果贴出来的主要目的,代码如下:

scrollver.js

scrollVertical.PRototype.scrollArea=null;    // 滚动的区域
scrollVertical.prototype.scrollMsg=null;    // 要滚动的内容
scrollVertical.prototype.unitHeight=0;     // 单独一行滚动内容的高度(程序中通过过的要滚动行的一个节点的offsetHeight获得)
scrollVertical.prototype.msgHeight=0;      // 整个滚动内容的高度
scrollVertical.prototype.copyMsg=null;     // 复制滚动内容(程序中使用复制scrollMsg.innerHTML来获得的)
scrollVertical.prototype.scrollValue=0;     // 滚动的值
scrollVertical.prototype.scrollHeight=0;    // 滚动高度
scrollVertical.prototype.isStop=true;      // 停止滚动
scrollVertical.prototype.isPause=false;     // 暂停滚动
scrollVertical.prototype.scrollTimer=null;   // 滚动计时器
scrollVertical.prototype.speed=2000;      // (默认)滚动的时间间隔2秒
/**
* @method isMoz - 判断是否为Mozilla系列浏览器
*/
scrollVertical.prototype.isMoz = function(){
   return navigator.userAgent.toLowerCase().indexOf('gecko') > 0;
};
/**
* @method play - 滚动信息的处理方法(函数)
* @param {Object} o - 滚动类
*/
scrollVertical.prototype.play = function(o){
   var s_msg = o.scrollMsg;
   var c_msg = o.copyMsg;
   var s_area = o.scrollArea;
   var msg_h = o.msgHeight;
  
   var anim = function(){
     // 如果已经开始计时(间隔时间执行向上滚动),
     // 就停止它(以免无限制执行,耗系统资源)。
     if (o.scrollTimer) {
       clearTimeout(o.scrollTimer);
     }
     // 如果暂停了滚动(鼠标放到了滚动层上)
     // 开始以10毫秒的时间间隔运行滚动  
     if (o.isPause) {
       o.scrollTimer = setTimeout(anim, 10);
       return;
     }
     // 当显示完所有信息后(这时滚动的距离就等于要滚动信息的高度msg_h)
     // 这时又重新开始滚动,将滚动距离清零
     if (msg_h - o.scrollValue <= 0) {
       o.scrollValue = 0;
     }
     else {
       o.scrollValue += 1;
       o.scrollHeight += 1;
     }
     // 根据浏览器的不同,处理滚动
     if (o.isMoz) { // Mozilla引擎浏览器
       s_area.scrollTop = o.scrollValue;
     }
     else { // 其余的浏览器则使用控制CSS样式处理滚动
       s_msg.style.top = -1 * o.scrollValue + "px";
       c_msg.style.top = (msg_h - o.scrollValue) + "px";
     }
     // 滚动高度等于显示滚动区域高度时(滚动完一行,一行内容全部显示)
     // 暂停4秒中,然后再开始执行下依次滚动。
     if (o.scrollHeight % s_area.offsetHeight == 0) {
       o.scrollTimer = setTimeout(anim, o.speed);
     }
     else {
       // 在两行内容之间过度滚动时,每10豪秒上升1px
       o.scrollTimer = setTimeout(anim, 10);
     }
   };
   // 执行滚动
   anim();
};
/**
* scrollVertical 垂直滚动的构造函数
* @param {Object} disp  - 必须 显示滚动区域的DOM节点(或节点ID)
* @param {Object} msg   - 必须 被显示的信息的DOM节点(或节点ID)
* @param {string} tg   - 可选 以什么标记为一行的标签名称(tagName)
*/
function scrollVertical(disp, msg, tg){
   // 给在之前定义的this.scrollArea付值
   if (typeof(disp) == 'string') {
     // 如果disp给的是节点的ID,通过document.getElementById获取该节点
     // 然后付值给this.scrollArea
     this.scrollArea = document.getElementById(disp);
   }
   else {
     // 如果是DOM节点,直接付给this.scrollArea
     this.scrollArea = disp;
   }
   // 以给this.scrollArea相同的方法给this.scrollMsg付值
   if (typeof(msg) == 'string') {
     this.scrollMsg = document.getElementById(msg);
   }
   else {
     this.scrollMsg = msg;
   }
  
   // 为了开发方便,
   // 不用一直写this.scrollMsg这么常的名字,
   // 将两个对象付给局部变量
   var s_msg = this.scrollMsg;
   var s_area = this.scrollArea;
  
   // 如果没有给定一行的识别标签,
   // 默认将li标签认为是一行的标签
   // 所以上面介绍的,tag参数是可选的
   if (!tg) {
     var tg = 'li';
   }
  
   // 获取单行的高度
   // 获取到第一(s_msg.getElementsByTagName(tg)[0])tg(一行的标签)的高度,作为单行的高度
   this.unitHeight = s_msg.getElementsByTagName(tg)[0].offsetHeight;
   // 获取整个信息框的高度
   // 公式为 单行高度(unitHeight)*行数(s_msg.getElementsByTagName(tg).length,显示信息中包含多少个tg(行)标签)
   this.msgHeight = this.unitHeight * s_msg.getElementsByTagName(tg).length;
   /*
   * 复制要显示的信息:
   * 连续滚动的实现其实就是通过复制信息,
   * 并将复制的信添加到原始信息后
   * 当原始信息滚动显示完成,就接着滚动显示复制的信息
   * 但给人的错觉是,我们看到信息连续不断的显示
   */
   // 创建复制内容节点
   var copydiv = document.createElement('div');
   // 这个地方感觉有点嵌妥
   // 直接使用element.id的方式,不过看上去,主流的浏览器都支持
   // 标准的DOM Core方法:
   // copydiv.setAttribute('id',s_area.id + "_copymsgid")
   copydiv.id = s_area.id + "_copymsgid";
   // 复制原始的信息
   // 将原始的信息s_msg中的内容,直接用innerHTML写到
   copydiv.innerHTML = s_msg.innerHTML;
   // 设置复制信息节点的高度
   copydiv.style.height = this.msgHeight + "px";
   // 将复制节点添加到原始接点(scrollMsg)后
   // 其实实现的方法就是将复制信息节点(copydiv)添家到显示区域的节点(scrollArea)中
   s_area.appendChild(copydiv);
  
   this.copyMsg = copydiv;
   // 开始执行滚动方法
   this.play(this);
}

我在脚本的注释中已经说了这个效果的实现原理,而实现一个效果的关键就是在于运用setTimeout方法和clearTimeout方法。

setTimeout(func,time)

setTimeout是window对象的一个方法,所以如果要是看到这么写window.setTimeout你不要感到奇怪,我们平时一般都省略了window。

setTimeout方法接受两个参数:
func - 在指定时间间隔内要执行的函数;
time - 执行函数的时间间隔(以毫秒为单位,1000毫秒等于1秒)

我一开始没有解释setTimeout的功能,而是先说了两个参数的意思,我想大家看了后就会有所了解,setTimeout的功能就是:设置定时器,在一段时间之后执行指定的代码。

不如本例中的:

setTimeout(anim, o.speed);

也许你有看过类似的写法:

function dosomething(){
   // do something
}
setTimeOout('dosomething',1000);

个人建议不要这么写,是这样的代码的可读性太差,虽然也可以正常执行。相信你看到的类似的代码也是很久前的东西了。如果你还在新买的某本书中看到这样的写法,我想你可能很不幸买了本烂书。现在一般我们都这么做:

function whatWeDoNow(){
   var str = 'this is what we do now';
   if(doalert) {
    clearTimeout(doalert)
   } 
   var doalert = setTimeout(function(){
    alert(str);
   },1000);
}

而且不知道你发现没有,这么写还有一个好处,你的function还可以接受其他的参数,比如这里我们可以接受whatWeDoNow()函数中的局部变量。如果你再结合闭包的使用,好处会更显而易见。

刚才说的一点应该说是一个不好的使用setTimeout的习惯。呵呵,接下来我还要说的一个更不好的使用习惯就是只使用setTimeout()方法,而不使用clearTimeout()方法。

clearTimeout(itimeoutid)

clearTimeout()方法的功能是停止定时器,大家看上面的代码:

clearTimeout(o.scrollTimer);

Timer(定时器),够直接吧。那么为什么要停止定时器?什么时候停止呢?

为什么要停,我想用个反问:能一直不停吗,你的机器受得了吗?这里我想应该说说我们使用setTimeout的目的,我们通常使用它来实现像本例这 样的动画效果。需要在很短的时间内连续不断的执行定时器,当然它是要占资源的啊。想想,只是不断的创建,而且往往我们做的处理,在1秒中内会执行很多次函 数,一两次还好,上百上千次,而且一个复杂些的动画,执行很短的时间内几万次也不是没有可能事情。你想想,如果我们不在每执行完一次后,销毁它。要是再加 上定时器执行的函数又是个比较NB点的运算,你的宝贵的系统资源...,呵呵!

所以应该向我给的例子中那样,记得在每次执行了定时器后停止(销毁,释放资源)它。

function whatWeDoNow(){
   var str = 'this is what we do now';
   if(doalert) {
    clearTimeout(doalert); // clear
   } 
   var doalert = setTimeout(function(){
    alert(str);
   },1000);
}
if (o.scrollTimer) {
   clearTimeout(o.scrollTimer); // clear
}

呵呵,其实销毁的方法很简单,就是在每次创建定时器前,判断是否已经创建了订时器,就像特效例子中的

if (o.scrollTimer) {
   clearTimeout(o.scrollTimer); // clear
}
....
....
if (o.scrollHeight % s_area.offsetHeight == 0) {
   o.scrollTimer = setTimeout(anim, o.speed);
}
else {
   o.scrollTimer = setTimeout(anim, 10);
}

逻辑就是:

是不是一个很流畅的循环?现在大家应该知道了,为什么要clearTimeout和何时clearTimeout了吗?

介绍了大半天的setTimeout和clearTimeout,呵呵,现在可以看看怎么使用这个特效吧,页面代码:

<!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>滚动图片</title>
<style type="text/css">
<!--
*{
   margin:0;
   padding:0;
}
body{
   text-align:center;
   background-color:#FFF;
   color:#000;
   font:'宋体',sans-serif;
}
img{
   border:0;
}
ul,li{
   list-style-type:none;
}
a:link,
a:visited{
   color:#000;
   text-decoration:none;
}
a:hover{
   color:#F00;
   text-decoration:none;
}
#container{
   margin:0 auto;
   position:relative;
   margin-top:10px;
   width:720px;
   height:100px;
   overflow:hidden;
}
#message,
#message_copymsgid{
   margin:0;
   width:720px;
   overflow:hidden;
}
#container ul{
   float:left;
   width:720px;
   height:100px;
   overflow:hidden;
   clear:both;
}
#container li{
   float:left;
   text-align:center;
   width:120px;
   height:100px;
   line-height:100px;
   overflow:hidden;
   padding:0;
}
#container li img{
   width:96px;
   height:96px;
   margin-bottom:10px;
   padding:1px;
   border:1px solid #999;
}
-->
</style>
</head>
<body>
<div id="container">
<div id="message">
<ul><li><a href="http://www.yaohaixiao.com/" target="_blank" title="听海"><img src="http://www.cncms.com/img/img1.gif" alt="听海" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="听海"><img src="http://www.cncms.com/img/img1.gif" alt="听海" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="听海"><img src="http://www.cncms.com/img/img1.gif" alt="听海" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="听海"><img src="http://www.cncms.com/img/img1.gif" alt="听海" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="听海"><img src="http://www.cncms.com/img/img1.gif" alt="听海" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="听海"><img src="http://www.cncms.com/img/img1.gif" alt="听海" /></a></li>
</ul>
<ul>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="宝贝"><img src="http://www.cncms.com/img/img2.gif" alt="宝贝" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="宝贝"><img src="http://www.cncms.com/img/img2.gif" alt="宝贝" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="宝贝"><img src="http://www.cncms.com/img/img2.gif" alt="宝贝" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="宝贝"><img src="http://www.cncms.com/img/img2.gif" alt="宝贝" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="宝贝"><img src="http://www.cncms.com/img/img2.gif" alt="宝贝" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="宝贝"><img src="http://www.cncms.com/img/img2.gif" alt="宝贝" /></a></li>
</ul>
<ul>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="因为你"><img src="http://www.cncms.com/img/img3.gif" alt="因为你" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="因为你"><img src="http://www.cncms.com/img/img3.gif" alt="因为你" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="因为你"><img src="http://www.cncms.com/img/img3.gif" alt="因为你" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="因为你"><img src="http://www.cncms.com/img/img3.gif" alt="因为你" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="因为你"><img src="http://www.cncms.com/img/img3.gif" alt="因为你" /></a></li>
<li><a href="http://www.yaohaixiao.com/" target="_blank" title="因为你"><img src="http://www.cncms.com/img/img3.gif" alt="因为你" /></a></li>
</ul>
</div>
</div>
<script type="text/javascript" language="Javascript" src="js/event.js"></script>
<script type="text/javascript" language="javascript" src="js/scrollver.js"></script>
<script type="text/javascript" language="javascript">
<!--
function init_Scroll(){
   // 创建一个垂直滚动对象的实例
   // 显示容器为container,你也可以直接写document.getElement('container')
   var scrollPics = new scrollVertical('container','message','ul');
     scrollPics.speed = 4000;   // 间隔时间,更准确的说,是滚动完一行,停留的时间
     scrollPics.isPause = true;  // 是否暂停为true,不能一开始就滚动,需要先停留下,然后再滚动
  
   // 这个则是指定,第一次显示滚动内容第一行停留的时间为2秒
   // 2秒后isPause为false,也就不暂停滚动,开始滚动了。
   // 这个时间大家可以自己设定
   var timer_start = setTimeout(function(){clearTimeout(timer_start);scrollPics.isPause = false;},2000);
   Event.addEvent(scrollPics.scrollArea,"mouSEOver",function(){scrollPics.isPause = true;});
   Event.addEvent(scrollPics.scrollArea,"mouseout",function(){scrollPics.isPause = false;});
}
/*
* 其实这里也可以直接写init_Scroll();
* 应为我已经把脚本放到文档的最后面,
* 在加载脚本之前,所有的DOM节点已经加载完毕
* 已经可以直接用脚本访问DOM节点了
*/
Event.addEvent(window,'load',init_Scroll);
//-->
</script>
</body>
</html>

刚才给大家介绍了JS的一些知识点,现在就讲下相关的CSS技巧。

#container{
   margin:0 auto;
   margin-top:10px;
   width:720px;
   height:100px;
   overflow:hidden;
}

一定要“overflow:hidden;”,为什么?呵呵,看看我们把高度设置为了height:100px;,正好是只一行信息的高度,如果你 不overflow:hidden,在Firefox也许没有问题,它会严格按照你指定的高度显示相应高度的内容,而隐藏多余的部分(多余的5行),而在 IE中,一直就自做聪明把容器挤高,让它把里面的全部内容都显示出来。而我们的效果也是只显示一行,而隐藏多余的5行。

你可能要问了,怎么有多余的5行?呵呵,其实代码中已经解释了:

// 创建复制内容节点
   var copydiv = document.createElement('div');
   // 这个地方感觉有点嵌妥
   // 直接使用element.id的方式,不过看上去,主流的浏览器都支持
   // 标准的DOM Core方法:
   // copydiv.setAttribute('id',s_area.id + "_copymsgid")
   copydiv.id = s_area.id + "_copymsgid";
   // 复制原始的信息
   // 将原始的信息s_msg中的内容,直接用innerHTML写到
   copydiv.innerHTML = s_msg.innerHTML;
   // 设置复制信息节点的高度
   copydiv.style.height = this.msgHeight + "px";
   // 将复制节点添加到原始接点(scrollMsg)后
   // 其实实现的方法就是将复制信息节点(copydiv)添家到显示区域的节点(scrollArea)中
   s_area.appendChild(copydiv);

因为我们又复制了一份信息,并添加到要显示滚动信息的容器中了,所以3行变6行了。

呵呵,接下的也没有什么好讲了,大家看我的注释,应该可以很清楚了。唯一要注意的一点就是这里

   // 滚动高度等于显示滚动区域高度时(滚动完一行,一行内容全部显示)
     // 暂停4秒中,然后再开始执行下依次滚动。
     if (o.scrollHeight % s_area.offsetHeight == 0) {
       o.scrollTimer = setTimeout(anim, o.speed);
     }
     else {
       // 在两行内容之间过度滚动时,每10豪秒上升1px
       o.scrollTimer = setTimeout(anim, 10);
     }

o.scrollHeight % s_area.offsetHeight == 0,要明白它确切的意思。

#container{
   margin:0 auto;
   margin-top:10px;
   width:720px;
   height:100px;
   overflow:hidden;
}
#message,
#message_copymsgid{
   margin:0;
   width:720px;
   overflow:hidden;
}
#container ul{
   float:left;
   width:720px;
   height:100px;
   overflow:hidden;
   clear:both;
}

ul也就是我们一行的高度为100px,o.scrollHeight已经滚动的高度。呵呵,不知道你发现了问题没有?

对了,问题就在 % s_area.offsetHeight,我之所以没有更正原程序里的这个缺点,是因为如果你不对#container做任何修饰,这么写没有错。因为 s_area也就是#container这里我只定义了height:100px;,如果我要是这么写:

#container{
   margin:0 auto;
   margin-top:10px;
   width:720px;
   height:100px;
   overflow:hidden;
   border:1px;
   padding:1px;
}

呵呵,你觉得会有什么结果?这里我就卖个官子,给大家出个作业,看看像我这样做了会,有一个什么结果,还有o.scrollHeight % s_area.offsetHeight == 0要怎么改该呢?

好了,特效讲解完毕,也不知道我这么讲解一个特效,对你有没有帮助。像里面的ceateElement,appendChild等等DOM的方法,大家还是需要不断的学习,可能才能完全明白和掌握,我这里不可能一一都讲清楚。好了,收工!

Tags:间断 滚动 图片

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接