javascript 線性漸層二

來源:互聯網
上載者:User

先來IE的,這是最大的使用者群,如果這部分開發不出來,基本可以說不用做了。IE雖然有Gradient濾鏡,但對比其他瀏覽器的實現特弱,沒有多重漸層(stop-color),不能實現角度漸層,而且還經常失效。我的思路是這樣,假如有一個帶文本的DIV,要實現多重線性漸層,我們首先得把它裡面的文本取出來,然后里面放幾個DIV,有幾重就放幾個,然後把它們漸層。如果是垂直漸層,這好辦,什麼也不用做,只需設定其濾鏡與各個高就行了。如果水平,就讓其浮動或絕對位置,放到適當的位置,設定其濾鏡與寬。但漸層濾鏡竟然會在浮動後或定位後失效,這是在使用透明濾鏡時聞所未聞的。沒有辦法,祭出上古神器table。但設定長與寬時,使用style來設定是不頂用的,一定要用DOM屬性。漸層則由它的td元素負責。為了去除table元素與td元素之間,td元素與其內容之間的空白,我們還得用到cellPadding與cellSpacing。 <meta charset="utf-8"><meta name="keywords" content="javascript線性漸層 by 司徒正美"><meta name="description" content="javascript線性漸層 by 司徒正美"><br /><style type="text/css"> #gradient{ width:800px; height:200px; border:1px solid red; } </style><p>javascript線性漸層 by 司徒正美 實現多重水平漸層效果<p>必須在IE中才能看到效果!</p><p>
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]

safari,chrome與opera打算都用SVG實現。為了減少函數的長度,特意搞了兩個輔助函數。 複製代碼 代碼如下:var createSVG = function(tag){
return document.createElementNS("http://www.w3.org/2000/svg",tag);
};
var attr= function(node,bag){
for(var i in bag){
if(bag.hasOwnProperty(i))
node.setAttribute(i,bag[i])
}
};
var COSgradient = function(entity,stops,width,height,type){
var svg = createSVG("svg");
attr(svg,{width:width+"px",height:height+"px"})
entity.appendChild(svg);
.
var defs = createSVG("defs");
svg.appendChild(defs);
var linearGradient = createSVG("linearGradient");
defs.appendChild(linearGradient);
attr(linearGradient,{id:"nasami",x1:"0%",y1:"0%"})
if(type){
attr(linearGradient,{x2:"100%",y2:"0%"})
}else{
attr(linearGradient,{x2:"0%",y2:"100%"})
}
for(var i=0,j=0,l=stops.length;i<l;i++,j++){
var offset = stops[i].split(",")[0] + "%",
color = stops[i].split(",")[1],
stop = createSVG("stop");
attr(stop,{offset:offset,"stop-color":color});
linearGradient.appendChild(stop);
}
var rect = createSVG("rect");
svg.appendChild(rect);
attr(rect,{x:"0px",y:"0px",width:width+"px",height:height+"px",fill:"url(#nasami)"});
}

firefox則利用其私人屬性: 複製代碼 代碼如下:var FFgradient= function(entity,stops,width,height,type){
var cssText = ";background: -moz-linear-gradient("
cssText += type? "top,bottom," :"left,right,";
.
for(var i=0,j=0,l=stops.length;i<l;i++,j++){
var offset = stops[i].split(",")[0] + "%",
color = stops[i].split(",")[1];
cssText += "color-stop("+[offset,color]+"),"
}
cssText = cssText.replace(/,$/,"")+") no-repeat;";
entity.style.cssText = cssText+"width:"+width+"px;height:"+height+"px;"
}

不過今天研磨一下,發現firefox還是支援SVG的線性漸層的,因此糾正我原來的觀點。上面的函數只是作用一種實現手段放在這裡,它並沒有整合到我最終的版本中(雖然它比SVG實現短很多。)這樣一來,在老一點版本的firefox中我們也能實現線性漸層了。
下面這個運行框裡的漸層效果可在所有主流瀏覽器中正常運作。 <meta charset="utf-8"><meta name="keywords" content="javascript線性漸層 by 司徒正美"><meta name="description" content="javascript線性漸層 by 司徒正美"><br /><style type="text/css"> #gradient{ width:800px; height:100px; border:1px solid red; } </style><p>javascript線性漸層 by 司徒正美 實現多重水平漸層效果<p>https://developer.mozilla.org/en/SVG/Tutorial/Fill_Stroke_and_Gradients</p><p>
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]

再把它做成類。扼要說明一下:它的第一個參數為IE,第二個為雜湊。雜湊中的各參數都為必選的,width,height的單位為px;type為0或者1,0代表垂直,1為水平;color-stop代表漸層體,由一個字串數組構成,每個字串都是由數字加逗號加顏色值組成,數字表代位移量,單位為%,顏色值可以是red,green等名詞,也可以是六位或三位的雜湊值。漸層體至少要有一個。 複製代碼 代碼如下:new Gradient("gradient",{width:800,height:100,type:0,"color-stop":["0,red",
3."16,orange","32,yellow","48,green","64,blue","80,indigo","100,violet"]})

<meta charset="utf-8"><meta name="keywords" content="javascript線性漸層 by 司徒正美"><meta name="description" content="javascript線性漸層 by 司徒正美"><br /><style type="text/css"> .gradient{ width:800px; height:100px; } </style><p>javascript線性漸層 by 司徒正美 實現多重水平漸層效果javascript線性漸層 by 司徒正美 實現多重垂直漸層效果<p>
[Ctrl+A 全選 注:如需引入外部Js需重新整理才能執行]

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.