前一陣對三角邊稍作了一點總結。昨天下班前同事又提到它。我在想,或許我們利用它做的事可能還不止那么多。也許它還能欺騙我們的眼球更多的東西。比如我一直在想的css3中目前只有webkit核心支持的transition變換屬性。能否利用三角邊做點它能做的事情呢?于是下班回家隨便寫了點測試的東西。。。發(fā)現(xiàn)如果要求不是很嚴格的話,某些時候還是能欺騙到我們的眼球的。比如下面的一個demo: <!doctype html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style> html {background:#000} body, ul {margin:0;padding:0} li {list-style:none} img {border:none;display:block} .slide-wp { width: 520px; height: 280px; overflow: hidden; position: absolute; left: 50%; top: 50%; margin-left: -250px; margin-top: -150px; } .nav-wp { position: absolute; background: #ccc; top: 50%; margin-top: 170px; left: 50%; margin-left: -100px; border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; padding: 0 20px 6px 10px; _padding: 0 20px 2px 10px; } .nav li { float: left; margin-left: 10px; font-size: 20px; font-weight: bold; font-family: tahoma; color: #22739e; cursor: pointer; height: 22px; } .nav li.cur{color: #ff7a00} .next { position:absolute; top: 0; left: 160px; padding: 4px 8px; color: #ff7a00; background: #ccc; height: 20px; border-radius: 4px; -moz-border-radius: 4px; -webkit-border-radius: 4px; cursor: pointer; } </style> </head> <body> <h2 style="color:#fff">對于使用IE6的同學看到的斑點,我只能表示很無奈。。。</h2> <div id="slider" class="slide-wp"> <ul> <li><a href="http://www./" target="_blank"><img src="http://www./images/1.jpg" alt="" /></a></li> <li><a href="http://www./" target="_blank"><img src="http://www./images/2.jpg" alt="" /></a></li> <li><a href="http://www./" target="_blank"><img src="http://www./images/3.jpg" alt="" /></a></li> <li><a href="http://www./" target="_blank"><img src="http://www./images/4.jpg" alt="" /></a></li> <li><a href="http://www./" target="_blank"><img src="http://www./images/5.jpg" alt="" /></a></li> </ul> </div> <div class="nav-wp"> <ul id="nav" class="nav"> <li onclick="mySlider.pos(0)">●</li> <li onclick="mySlider.pos(1)">●</li> <li onclick="mySlider.pos(2)">●</li> <li onclick="mySlider.pos(3)">●</li> <li onclick="mySlider.pos(4)">●</li> </ul> <a class="next" onclick="mySlider.move()">next</a> </div> <script type="text/javascript"> var HR = { $ : function(i) {return document.getElementById(i)}, $$ : function(c, p) {return p.getElementsByTagName(c)}, ce : function(i, t) { var o = document.createElement(i); t.appendChild(o); return o; } }; HR.slider3D = function () { var init = function (o) { this.o = o; var wp = HR.$(o.id), ul = HR.$$('ul', wp)[0], li = this.li = HR.$$('li', ul); this.l = li.length; this.w = wp.offsetWidth; this.h = wp.offsetHeight; this.at = o.auto? o.auto : 4; var con = this.con = HR.ce('div', wp); con.style.cssText = 'position:absolute;left:0;top:0;width:'+this.w+'px;height:'+this.h+'px'; ul.style['display'] = 'none'; this.a1 = HR.ce('a', con); this.a1.style.cssText = 'position:absolute;left:0;top:0;overflow:hidden'; this.a2 = HR.ce('a', con); this.a2.style.cssText = 'position:absolute;top:0;right:0;overflow:hidden'; this.a1.innerHTML = this.a2.innerHTML = '<img alt="" />'; this.img = HR.$$('img', ul); this.s = o.maskSize ? o.maskSize : 5; this.mask11 = HR.ce('span', this.a1); this.mask12 = HR.ce('span', this.a1); this.mask21 = HR.ce('span', this.a2); this.mask22 = HR.ce('span', this.a2); this.pos(0); } init.prototype = { pos : function (i) { clearInterval(this.li[i].a); clearInterval(this.au); this.au = 0; this.cur = i; var navli = HR.$$('li', HR.$(this.o.navId)); for (var j=0; j<navli.length; j++) { navli[j].className = i == j ? 'cur' : ''; } var img1 = HR.$$('img', this.a1)[0], img2 = HR.$$('img', this.a2)[0], _this = this; img1.src = i==0 ? this.img[this.l-1].src : this.img[i-1].src; img1.width = this.w; img2.src = this.img[i].src; img2.width = 0; img1.height = img2.height = this.h; this.mask11.style.cssText = 'position:absolute;left:0;top:0;font-size:0;overflow:hidden;width:0;height:0;border-color:black transparent transparent black;border-style:solid dashed dashed solid;border-width:0 '+this.w/2+'px'; this.mask12.style.cssText = 'position:absolute;left:0;bottom:0;font-size:0;overflow:hidden;width:0;height:0;border-color:transparent transparent black black;border-style:dashed dashed solid solid;border-width:0 '+this.w/2+'px'; this.mask21.style.cssText = 'position:absolute;right:0;top:0;font-size:0;overflow:hidden;width:0;height:0;border-color:black black transparent transparent;border-style:solid solid dashed dashed;border-width:0px'; this.mask22.style.cssText = 'position:absolute;right:0;bottom:0;font-size:0;overflow:hidden;width:0;height:0;border-color:transparent black black transparent;border-style:dashed solid solid dashed;border-width:0px'; this.li[i].a = setInterval(function(){_this.anim(i)}, 20); }, anim : function (i) { var w1 = HR.$$('img', this.a1)[0].width, w2 = HR.$$('img', this.a2)[0].width; if (w2 == this.w) { clearInterval(this.li[i].a); HR.$$('img', this.a1)[0].width = 0; HR.$$('img', this.a2)[0].width = this.w; this.mask11.style.borderLeftWidth = this.mask11.style.borderRightWidth = this.mask12.style.borderLeftWidth = this.mask12.style.borderRightWidth = '0px'; this.mask11.style.borderTopWidth = this.mask11.style.borderBottomWidth = this.mask12.style.borderTopWidth = this.mask12.style.borderBottomWidth = this.h/this.s + 'px'; this.mask21.style.borderLeftWidth = this.mask21.style.borderRightWidth = this.mask22.style.borderLeftWidth = this.mask22.style.borderRightWidth = this.w/2 + 'px'; this.mask21.style.borderTopWidth = this.mask21.style.borderBottomWidth = this.mask22.style.borderTopWidth = this.mask22.style.borderBottomWidth = '0px'; }else { HR.$$('img', this.a1)[0].width -= Math.ceil((this.w-w2)*.13); HR.$$('img', this.a2)[0].width += Math.ceil((this.w-w2)*.13); this.mask11.style.borderLeftWidth = this.mask11.style.borderRightWidth = this.mask12.style.borderLeftWidth = this.mask12.style.borderRightWidth = HR.$$('img', this.a1)[0].width/2 + 'px'; this.mask11.style.borderTopWidth = this.mask11.style.borderBottomWidth = this.mask12.style.borderTopWidth = this.mask12.style.borderBottomWidth = HR.$$('img', this.a2)[0].width*this.h/(this.s*this.w) + 'px'; this.mask21.style.borderLeftWidth = this.mask21.style.borderRightWidth = this.mask22.style.borderLeftWidth = this.mask22.style.borderRightWidth = HR.$$('img', this.a2)[0].width/2 + 'px'; this.mask21.style.borderTopWidth = this.mask21.style.borderBottomWidth = this.mask22.style.borderTopWidth = this.mask22.style.borderBottomWidth = this.h/this.s - HR.$$('img', this.a2)[0].width*this.h/(this.s*this.w) + 'px'; if (!this.au) this.auto(); } }, auto : function () { var _this = this; this.au = setInterval(function(){_this.move()}, this.at*1000); }, move : function () { var n = this.cur==this.l-1 ? 0 : this.cur+1; this.pos(n); } } return init; }(); var mySlider = new HR.slider3D({ id: 'slider', maskSize: 6, navId: 'nav', auto: 4 })</script></body> </html>乍一看,其實還是有點3d的效果的。不過明眼細心一點就會發(fā)現(xiàn),其實我騙了你們。這哪是什么3d?只是利用三角邊耍的一點小把戲。真正的類似的3d效果是按照我們人眼的透視原理,物體高寬根據(jù)遠近按比例壓縮的。而我上面的demo并沒有用任何壓縮的方法來做高或寬的改變的??纯创a就知道,只是用了一些遮罩來做的掩飾。 所以說這根本不是3d,我在作弊...不過我仍然不怕拍磚的把這種東西作為一種思路分享出來,我是覺得互聯(lián)網(wǎng)這個行業(yè)是需要一些所謂的創(chuàng)意的??赡芪疑厦娴拇植诘膁emo不能說是創(chuàng)意,我希望我的某些"拋磚"或許能"引玉"... 如果對三角邊還不甚了解的朋友,可以稍微看下我前文對于三角邊的例子,很簡單的東西。代碼我并沒做過多的優(yōu)化和修正。因為只是昨晚一時興起寫的測試demo。可能有一點點可用性是在于不care IE6表現(xiàn)的朋友,或許可以優(yōu)化下代碼,做成你自己的幻燈片或者其他的演示。 care IE6的朋友僅當一陣清風,因為IE6的三角邊支持的確不好,出現(xiàn)斑點我也只能表示無能為力。 最后還是稍稍說一下思路,利用三角邊在輪播區(qū)域的四個角做了四個遮罩,然后同時改變兩張圖片的寬度(或高度)以及四個遮罩的borderWidth,稍作調整即可。由于黑色的三角邊遮擋了一部分變化的圖片,所以不注意的時候會有圖片被漸進壓縮的感覺。其實僅僅是被遮住了一部分而已。 我只稍作的封裝,調用方式和可配置參數(shù)如下:
id為輪播列表父元素id,maskSize為視井深度大小,建議為高或寬可以整除的大于3的數(shù)。navId為控制器列表id。auto為自動滾動時間間隔。 可以優(yōu)化的地方:
|
|
來自: CevenCheng > 《高性能Web》