javascript 线性渐变三

IE还有一个利器至今没有被使用过,那就是VML。虽然比不上SVG,但它还是非常强大的。在实现渐变上,其fill还比IE的Gragient滤镜强悍得多了。不过VML出现得比较早,只支持很少的颜色名,如red,blue,yellow,其他如orange就可以搞死它了。因此要使用VML做线性渐变,我们得对这些颜色名做一下转换。
HTML4的颜色值






















black = #000000 green = #008000 silver = #c0c0c0 lime = #00ff00
gray = #808080 olive = #808000 white = #ffffff yellow = #ffff00
maroon = #800000 navy = #000080 red = #ff0000 blue = #0000ff
purple = #800080 teal = #008080 fuchsia = #ff00ff aqua = #00ffff
我们可以在火狐官网以及W3C了解到更多的颜色值。


代码如下:

var htmlcolor={ black :"#000",green :"#008000",silver :"#c0c0c0",lime :"#0f0",
gray :"#808080",olive :"#808000",white :"#fff",yellow :"#ff0",
maroon :"#800000",navy :"#000080",red :"#f00",blue :"#00f",
purple :"#800080",teal :"#008080",fuchsia :"#f0f",aqua :"#0ff",
indigo :"#4b0082",orange : "#ffa500",sienna :"#a0522d",plum :"#dda0dd",
gold :"#ffd700", tan :"#d2b48c", snow :"#fffafa",violet :"#ee82ee"
}

接着我们在需要线性渐变的那个元素内部创建一个同样大小的rect元素,然后里面再添加一个fill元素,用来设置渐变。伪码如下:


代码如下:

<div class="gradient" style="position:relative;width:width;height:height">
javascript线性渐变 by 司徒正美 实现多重水平渐变效果
<vml:rect style="position:absolute;width:width;height;top:0;left:0" stroked="f" >
<vml:fill colors="与SVG相对应的color-stop" focus="100%" type="gradient" method="linear"/>
</vml:rect>
</div>

javascript线性渐变 by 司徒正美

.gradient{
width:800px;
height:100px;
}

var Gradient = function(id){
var entity = document.getElementById(id),
options = arguments[1] || {},
width = options.width,
height = options.height,
type = options.type ,
stops = options["color-stop"];
this.init(entity,stops,width,height,type);
}
Gradient.prototype ={
constructor: Gradient,
init: function(entity,stops,width,height,type) {
this.css(entity,{position:"relative"});
var content = entity.innerHTML;
entity.innerHTML = "";
!+"\v1"? this.IEgradient(entity,stops,width,height,type):
this.SVGgradient(entity,stops,width,height,type)
var contentDiv = document.createElement("div");
this.css(contentDiv,{position:"absolute",top:0,left:0})
contentDiv.innerHTML = content;
entity.appendChild(contentDiv);
},
css: function(node,bag){
var str = ";"
for(var i in bag){
if(bag.hasOwnProperty(i))
str += i == "opacity" ? ("filter:alpha(opacity="+ bag[i] * 100+");"):(i+":"+bag[i]+";")
}
node.style.cssText = str;
},
attr: function(node,bag){
for(var i in bag){
if(bag.hasOwnProperty(i))
node.setAttribute(i,bag[i])
}
},
createSVG:function(tag){
return document.createElementNS("http://www.w3.org/2000/svg",tag);
},
IEgradient:function(entity,stops,width,height,type){
if(!document.namespaces.vml){
document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml');
var vmlobj = document.createElement(""),
head = document.getElementsByTagName("head")[0];
head.appendChild(vmlobj)
document.createStyleSheet().addRule(".vml", "behavior: url(#VMLRender); display:inline-block;");
}
var rect = document.createElement('');
entity.appendChild(rect);
this.css(rect,{width:width+"px",height:height+"px"});
this.attr(rect,{stroked:"f"});
var fill = document.createElement('');
var colors ="";
for(var i=0,l=stops.length;i

javascript线性渐变 by 司徒正美 实现多重水平渐变效果

javascript线性渐变 by 司徒正美 实现多重垂直渐变效果

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

利用VML实现IE的线性渐变后整个类的长度减少一半。
我们再来看如何实现角度渐变,IE那边好办,直接传入一个角就行了(0—360,也可以为负数)。SVG比较麻烦,它由linearGradient 的四个属性来控制倾斜度,x1,x2,y2,y2,实质就是两个点。假设第一个点为(0,0),第二个点为(100,0),它就是水平渐变。假设第一个点为(0,0),第二个点为(0,100),它就是垂直渐变。要实现倾斜就必须让第二个点的坐标与第一个点的坐标完全不相等,无论是X轴还是Y轴。这就要用到三角函数了。


代码如下:

var x = (Math.sin(angle*Math.PI/180) * 100).toFixed(2)+"%";
var y = (Math.cos(angle*Math.PI/180)* 100).toFixed(2)+"%";
this.attr(linearGradient,{x2:x,y2:y});

我们也应该看得出水平渐变与垂直渐变其实只是一个特例,我们大可以废除type这个属性,改成angle,传入一个0至360的数。

javascript线性渐变 by 司徒正美

.gradient{
width:800px;
height:100px;
}

var Gradient = function(id){
var entity = document.getElementById(id),
options = arguments[1] || {},
width = options.width,
height = options.height,
angle = options.angle ,
stops = options["color-stop"];
this.init(entity,stops,width,height,angle);
}
Gradient.prototype ={
constructor: Gradient,
init: function(entity,stops,width,height,angle) {
this.css(entity,{position:"relative"});
var content = entity.innerHTML;
entity.innerHTML = "";
!+"\v1"? this.IEgradient(entity,stops,width,height,angle):
this.SVGgradient(entity,stops,width,height,angle)
var contentDiv = document.createElement("div");
this.css(contentDiv,{position:"absolute",top:0,left:0})
contentDiv.innerHTML = content;
entity.appendChild(contentDiv);
},
css: function(node,bag){
var str = ";"
for(var i in bag){
if(bag.hasOwnProperty(i))
str += i == "opacity" ? ("filter:alpha(opacity="+ bag[i] * 100+");"):(i+":"+bag[i]+";")
}
node.style.cssText = str;
},
attr: function(node,bag){
for(var i in bag){
if(bag.hasOwnProperty(i))
node.setAttribute(i,bag[i])
}
},
createSVG:function(tag){
return document.createElementNS("http://www.w3.org/2000/svg",tag);
},
IEgradient:function(entity,stops,width,height,angle){
if(!document.namespaces.vml){
document.namespaces.add('vml', 'urn:schemas-microsoft-com:vml');
var vmlobj = document.createElement(""),
head = document.getElementsByTagName("head")[0];
head.appendChild(vmlobj)
document.createStyleSheet().addRule(".vml", "behavior: url(#VMLRender); display:inline-block;");
}
var rect = document.createElement('');
entity.appendChild(rect);
this.css(rect,{width:width+"px",height:height+"px"});
this.attr(rect,{stroked:"f"});
var fill = document.createElement('');
var colors ="";
for(var i=0,l=stops.length;i

javascript线性渐变 by 司徒正美 实现多重水平渐变效果

javascript线性渐变 by 司徒正美 实现多重垂直渐变效果

javascript线性渐变 by 司徒正美 实现多重角度渐变效果

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

(0)

相关推荐

  • javascript 线性渐变三

    IE还有一个利器至今没有被使用过,那就是VML.虽然比不上SVG,但它还是非常强大的.在实现渐变上,其fill还比IE的Gragient滤镜强悍得多了.不过VML出现得比较早,只支持很少的颜色名,如red,blue,yellow,其他如orange就可以搞死它了.因此要使用VML做线性渐变,我们得对这些颜色名做一下转换. HTML4的颜色值 black = #000000 green = #008000 silver = #c0c0c0 lime = #00ff00 gray = #808080

  • javascript 线性渐变二

    先来IE的,这是最大的用户群,如果这部分开发不出来,基本可以说不用做了.IE虽然有Gradient滤镜,但对比其他浏览器的实现特弱,没有多重渐变(stop-color),不能实现角度渐变,而且还经常失效.我的思路是这样,假如有一个带文本的DIV,要实现多重线性渐变,我们首先得把它里面的文本取出来,然后里面放几个DIV,有几重就放几个,然后把它们渐变.如果是垂直渐变,这好办,什么也不用做,只需设置其滤镜与各个高就行了.如果水平,就让其浮动或绝对定位,放到适当的位置,设置其滤镜与宽.但渐变滤镜竟然会

  • javascript线性渐变一

    作为新力军,苹果为我们带来了canvas标签.canvas首次在Mac OS X中的Dashboard中被引入,之后又被苹果公司的Safari浏览器所支持,紧接着就成为HTML5的标准,被IE内核以外的标准浏览器所支持.苹果做的好事还不止这一桩,它认为SVG太笨重了,于是它把SVG里的滤镜标签统统CSS属性化(SVG的滤镜比IE滤镜还多呢,而且功能更全面).firefox一看不对劲,连忙自己也搞一套私有属性,只不过是前缀由-webkit-改为-moz-罢了.opera的反应比较呆滞,应该说私底下

  • javascript图片渐显效果代码

    在<head>到</head>之间插入如下的JAVASCRIPT代码: nereidFadeObjects = new Object(); nereidFadeTimers = new Object(); function nereidFade(object, destOp, rate, delta){ if (!document.all) return if (object != "[object]"){ setTimeout("nereidFade

  • JavaScript让网页出现渐隐渐显背景颜色的方法

    本文实例讲述了JavaScript让网页出现渐隐渐显背景颜色的方法.分享给大家供大家参考.具体如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>javascript渐隐渐显的背景颜色</title> <style fprolloverstyle>A:hover

  • javascript实现图片循环渐显播放的方法

    本文实例讲述了javascript实现图片循环渐显播放的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <html> <title>图片的循环渐显播放效果代码</title> <head> <!--1.将下面的代码插入到HEML的<head></head>之间: --> <script language=javaScript> <!--// sandra0 = new Image()

  • 基于JavaScript实现瀑布流效果(循环渐近)

    1.建立Html模版 想法是先用一个div container承载所有内容,然后div box用来放置图片,最后div box_border来当图片框,代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>瀑布流</title> </head> <body> <div class="container

  • JavaScript可视化图表库D3.js API中文参考

    D3库所提供的所有 API 都在 d3 命名空间下.d3 库使用语义版本命名法(semantic versioning). 你可以用 d3.version 查看当前的版本信息. d3 (核心部分) 选择集 d3.select - 从当前文档中选择一系列元素. d3.selectAll - 从当前文档中选择多项元素. selection.attr - 设置或获取指定属性. selection.classed - 添加或删除选定元素的 CSS 类(CSS class). selection.styl

  • javascript基本算法汇总

    本文为大家分享了五个javascript算法,供大家参考,具体内容如下 1. 线性查找 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>线性查找</title> </head> <body> <p>数组为:[2,4,6,23,53,545,65,3,24,5,3,6]&

  • JavaScript实现判断图片是否加载完成的3种方法整理

    有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示效果.本文主要整理了几种常见的javascipt判断图片加载完成时的方法,并通过代码与实际应用相结合进行解释与说明. onload方法 通过向img标签添加onload属性,并填入相应的函数来执行后续的javascipt代码.如下代码例子中img元素默认是不显示的,通过onload判断加载完成后再将图片显示出来. 复制代码 代码如下: <img class=

随机推荐