没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2009-10-14 11:20:43.000|阅读 346 次
概述:javascript在处理图像的能力其实是不弱的,可惜浏览器大战连累了它,这还不算,Adobe 收购Macromedia更让SVG处于怠工状态。作为新力军,苹果为我们带来了canvas标签。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
上部分我们逐一分析了各浏览器的可行方法,这部分将搞鼓出一个统一的类来实现跨浏览器的线性渐变。
先来IE的,这是最大的用户群,如果这部分开发不出来,基本可以说不用做了。IE虽然有Gradient滤镜,但对比其他浏览器的实现特弱,没有多重渐变(stop-color),不能实现角度渐变,而且还经常失效。我的思路是这样,假如有一个带文本的DIV,要实现多重线性渐变,我们首先得把它里面的文本取出来,然后里面放几个DIV,有几重就放几个,然后把它们渐变。如果是垂直渐变,这好办,什么也不用做,只需设置其滤镜与各个高就行了。如果水平,就让其浮动或绝对定位,放到适当的位置,设置其滤镜与宽。但渐变滤镜竟然会在浮动后或定位后失效,这是在使用透明滤镜时闻所未闻的。没有办法,祭出上古神器table。但设置长与宽时,使用style来设置是不顶用的,一定要用DOM属性。渐变则由它的td元素负责。为了去除table元素与td元素之间,td元素与其内容之间的空白,我们还得用到cellPadding与cellSpacing。
01.
//④使用IE滤镜实现渐变
02.
function
setFilter(el,start,end,type){
03.
el.style.filter =
"progid:DXImageTransform.Microsoft.Gradient(enabled='true',startColorstr="
+start+
",GradientType="
+type+
", endColorstr="
+end+
")"
;
04.
}
05.
//③每个渐变体的实现,是用table还是div
06.
function
createStop(parent,top,left,width,height,type){
07.
if
(type){
08.
var
table = document.createElement(
"table"
);
09.
parent.appendChild(table);
10.
var
tr = table.insertRow(0),
11.
td = tr.insertCell(0)
12.
table.height = height+
"px"
;
13.
table.width = width+
"px"
;
14.
table.cellPadding = 0;
15.
table.cellSpacing = 0;
16.
table.style.cssText =
"position:absolute;top:"
+top+
"px;left:"
+left+
"px"
17.
td.innerHTML =
" "
;
18.
return
td;
19.
}
20.
var
div = document.createElement(
"div"
);
21.
parent.appendChild(div);
22.
div.style.height = height+
"px"
;
23.
div.style.width = width+
"px"
;
24.
return
div;
25.
}
26.
//②渐变的具体实现,确定要使用多少渐变体,每个渐变体的颜色(是渐变色还是纯色)与长宽坐标
27.
var
IEgradient =
function
(entity,stops,width,height,type){
28.
var
offset,color,beforeColor,stopWidth,stopHeight,left,top,stop;
29.
for
(
var
i=0,j=0,l=stops.length;i<l;i++,j++){
30.
offset = stops[i].split(
","
)[0];
31.
color = stops[i].split(
","
)[1];
32.
stopWidth = (offset/100 * width).toFixed(1);
33.
stopHeight = (offset/100 * height).toFixed(1);
34.
switch
(i){
35.
case
0 :
36.
beforeColor = color;
37.
left = stopWidth;
38.
top = stopHeight;
39.
if
(offset != 0){
40.
//插入一个纯色的table
41.
stop = type? createStop(entity,0,0,stopWidth,height,type) :
42.
createStop(entity,0,0,width,stopHeight,type);
43.
stop.style.backgroundColor = color;
44.
}
45.
break
;
46.
case
l-1:
47.
//先插入一个渐变的table
48.
var
w2 = ((100-offset)/100 * width).toFixed(1),
49.
h2 = ((100-offset)/100 * height).toFixed(1),
50.
stop = type? createStop(entity,0,left,width - left -w2,height,type):
51.
createStop(entity,0,0,width,height - top -h2,type);
52.
setFilter(stop,beforeColor,color,type);
53.
if
(offset != 100){
54.
//再插入一个纯色的table
55.
var
stop2 = type? createStop(entity,0,stopWidth,w2,height,type):
56.
createStop(entity,0,0,width,h2,type);
57.
stop2.style.backgroundColor = color;
58.
}
59.
break
;
60.
default
:
61.
//插入一个渐变的table
62.
stop = type ? createStop(entity,0,left,stopWidth - left,height,type) :
63.
createStop(entity,0,0,width,stopHeight-top,type);
64.
setFilter(stop,beforeColor,color,type);
65.
beforeColor = color;
66.
left = stopWidth;
67.
top = stopHeight;
68.
break
;
69.
}
70.
}
71.
}
72.
//①渐变的主体函数
73.
var
gradient =
function
(id){
74.
var
entity = document.getElementById(id),
75.
options = arguments[1] || {},
76.
width = options.width,
77.
height = options.height,
78.
type = options.type ,
79.
stops = options[
"color-stop"
];
80.
entity.style.position =
"relative"
;
81.
var
content = entity.innerHTML;
82.
entity.innerHTML =
""
;
83.
//向目标对象进行渐变。
84.
IEgradient(entity,stops,width,height,type);
85.
//把原来的内容重新加入的目标对象。
86.
var
contentDiv = document.createElement(
"div"
);
87.
contentDiv.style.cssText =
"position:absolute;top:0;left:0"
;
88.
contentDiv.innerHTML = content;
89.
entity.appendChild(contentDiv);
90.
}
safari,chrome与opera打算都用SVG实现。为了减少函数的长度,特意搞了两个辅助函数。
01.
var
createSVG =
function
(tag){
02.
return
document.createElementNS(
"http://www.w3.org/2000/svg"
,tag);
03.
};
04.
var
attr=
function
(node,bag){
05.
for
(
var
i
in
bag){
06.
if
(bag.hasOwnProperty(i))
07.
node.setAttribute(i,bag[i])
08.
}
09.
};
10.
var
COSgradient =
function
(entity,stops,width,height,type){
11.
var
svg = createSVG(
"svg"
);
12.
attr(svg,{width:width+
"px"
,height:height+
"px"
})
13.
entity.appendChild(svg);
14.
var
defs = createSVG(
"defs"
);
15.
svg.appendChild(defs);
16.
var
linearGradient = createSVG(
"linearGradient"
);
17.
defs.appendChild(linearGradient);
18.
attr(linearGradient,{id:
"nasami"
,x1:
"0%"
,y1:
"0%"
})
19.
if
(type){
20.
attr(linearGradient,{x2:
"100%"
,y2:
"0%"
})
21.
}
else
{
22.
attr(linearGradient,{x2:
"0%"
,y2:
"100%"
})
23.
}
24.
for
(
var
i=0,j=0,l=stops.length;i<l;i++,j++){
25.
var
offset = stops[i].split(
","
)[0] +
"%"
,
26.
color = stops[i].split(
","
)[1],
27.
stop = createSVG(
"stop"
);
28.
attr(stop,{offset:offset,
"stop-color"
:color});
29.
linearGradient.appendChild(stop);
30.
}
31.
var
rect = createSVG(
"rect"
);
32.
svg.appendChild(rect);
33.
attr(rect,{x:
"0px"
,y:
"0px"
,width:width+
"px"
,height:height+
"px"
,fill:
"url(#nasami)"
});
34.
}
firefox则利用其私有属性:
01.
var
FFgradient=
function
(entity,stops,width,height,type){
02.
var
cssText =
";background: -moz-linear-gradient("
03.
cssText += type?
"top,bottom,"
:
"left,right,"
;
04.
for
(
var
i=0,j=0,l=stops.length;i<l;i++,j++){
05.
var
offset = stops[i].split(
","
)[0] +
"%"
,
06.
color = stops[i].split(
","
)[1];
07.
cssText +=
"color-stop("
+[offset,color]+
"),"
08.
}
09.
cssText = cssText.replace(/,$/,
""
)+
") no-repeat;"
;
10.
entity.style.cssText = cssText+
"width:"
+width+
"px;height:"
+height+
"px;"
11.
}
不过今天研磨一下,发现firefox还是支持SVG的线性渐变的,因此纠正我原来的观点。上面的函数只是作用一种实现手段放在这里,它并没有整合到我最终的版本中(虽然它比SVG实现短很多。)这样一来,在老一点版本的firefox中我们也能实现线性渐变了。
下面这个运行框里的渐变效果可在所有主流浏览器中正常运作。
再把它做成类。扼要说明一下:它的第一个参数为IE,第二个为哈希。哈希中的各参数都为必选的,width,height的单位为px;type为0或者1,0代表垂直,1为水平;color-stop代表渐变体,由一个字符串数组构成,每个字符串都是由数字加逗号加颜色值组成,数字表代偏移量,单位为%,颜色值可以是red,green等名词,也可以是六位或三位的哈希值。渐变体至少要有一个。
1.
2.
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"
]})
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:博客园接DevExpress原厂商通知,将于近日上调旗下产品授权价格,现在下单客户可享受优惠报价!
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号