📄 rounded.js
字号:
/* Copyright (c) 2004-2006, The Dojo Foundation All Rights Reserved. Licensed under the Academic Free License version 2.1 or above OR the modified BSD license. For more information on Dojo licensing, see: http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.lfx.rounded");
dojo.require("dojo.lang.common");
dojo.require("dojo.html.common");
dojo.require("dojo.html.style");
dojo.require("dojo.html.display");
dojo.require("dojo.html.layout");
/* Port of curvyCorners, by Cameron Cooke and Tim Hutchison.
* Original port done by Brian Lucas.
* Refactor and function by trt.
*/
dojo.lfx.rounded = function(/* object */settings /* ... */){
// summary
// Creates a set of rounded corners based on settings.
var options={
validTags:settings.validTags || ["div"], // tags we can apply this to
autoPad:settings.autoPad!=null ? settings.autoPad : true, // automatically pad
antiAlias:settings.antiAlias!=null ? settings.antiAlias : true, // anti-alias corners
radii:{ // corner radii
tl:(settings.tl && settings.tl.radius!=null) ? settings.tl.radius:5,
tr:(settings.tr && settings.tr.radius!=null) ? settings.tr.radius:5,
bl:(settings.bl && settings.bl.radius!=null) ? settings.bl.radius:5,
br:(settings.br && settings.br.radius!=null) ? settings.br.radius:5
}
};
// get the node list to operate on.
var nodes;
if(typeof(arguments[1]) == "string"){
// a CSS classname was passed, grab a node list.
nodes=dojo.html.getElementsByClass(arguments[1]);
} else if(dojo.lang.isArrayLike(arguments[1])){
// we assume that the second argument is an array of nodes to apply this to.
nodes=arguments[1];
for(var i=0; i<nodes.length; i++){ nodes[i]=dojo.byId(nodes[i]); }
}
if(nodes.length == 0) return; // don't bother.
////////////////////////////////////////////////////////////////////
for(var i=0; i<nodes.length; i++){
dojo.lfx.rounded.applyCorners(options, nodes[i]);
}
};
// can call this directly if one wants.
dojo.lfx.rounded.applyCorners = function(/* object */options, /* HTMLElement */node){
// summary
// Rounds corners based on options to passed node.
var top = null;
var bottom = null;
var contentNode = null;
var fns=dojo.lfx.rounded._fns;
// node details
var width = node.offsetWidth;
var height = node.offsetHeight;
var borderWidth = parseInt(dojo.html.getComputedStyle(node, "border-top-width"));
var borderColor = dojo.html.getComputedStyle(node, "border-top-color");
var color = dojo.html.getComputedStyle(node, "background-color");
var bgImage = dojo.html.getComputedStyle(node, "background-image");
var position = dojo.html.getComputedStyle(node, "position");
var padding = parseInt(dojo.html.getComputedStyle(node, "padding-top"));
// formatting details
// TODO: use Dojo equivilents for these if exists.
var format={
height : height,
width : width,
borderWidth : borderWidth,
color : fns.getRGB(color),
padding : padding,
borderColor : fns.getRGB(borderColor),
borderString : borderWidth + "px" + " solid " + fns.getRGB(borderColor),
bgImage : ((bgImage != "none")? bgImage : ""),
content : node.innerHTML
};
if(!dojo.html.isPositionAbsolute(node)){ node.style.position="relative"; }
node.style.padding="0px";
if(dojo.render.html.ie && width=="auto" && height=="auto"){ node.style.width="100%"; }
if(options.autoPad && format.padding>0){
node.innerHTML="";
}
var topHeight=Math.max(options.radii.tl, options.radii.tr);
var bottomHeight=Math.max(options.radii.bl, options.radii.br);
// build the containers.
if(options.radii.tl || options.radii.tr){
top = document.createElement("div");
top.style.width="100%";
top.style.fontSize="1px";
top.style.overflow="hidden";
top.style.position="absolute";
top.style.paddingLeft=format.borderWidth+"px";
top.style.paddingRight=format.borderWidth+"px";
top.style.height=topHeight+"px";
top.style.top=(0-topHeight)+"px";
top.style.left=(0-format.borderWidth)+"px";
node.appendChild(top);
}
if(options.radii.bl || options.radii.br){ // bottom
bottom = document.createElement("div");
bottom.style.width="100%";
bottom.style.fontSize="1px";
bottom.style.overflow="hidden";
bottom.style.position="absolute";
bottom.style.paddingLeft=format.borderWidth+"px";
bottom.style.paddingRight=format.borderWidth+"px";
bottom.style.height=bottomHeight+"px";
bottom.style.bottom=(0-bottomHeight)+"px";
bottom.style.left=(0-format.borderWidth)+"px";
node.appendChild(bottom);
}
// turn off the borders
if(top){ node.style.borderTopWidth = "0px"; }
if(bottom){ node.style.borderBottomWidth = "0px"; }
// do the corners
var corners = ["tr", "tl", "br", "bl"];
for(var i=0; i<corners.length; i++){
var cc=corners[i];
if(options.radii[cc]==0){
// fill up the space with a div.
if((cc.charAt(0)=="t"&&top) || (cc.charAt(0)=="b"&&bottom)){
var corner=document.createElement("div");
corner.style.position="relative";
corner.style.fontSize="1px;";
corner.style.overflow="hidden";
if(format.bgImage==""){
corner.style.backgroundColor=format.color;
} else {
corner.style.backgroundImage=format.bgImage;
}
switch(cc){
case "tl":{
corner.style.height=topHeight-format.borderWidth+"px";
corner.style.marginRight=options.radii[cc]-(format.borderWidth*2)+"px";
corner.style.borderLeft=format.borderString;
corner.style.borderTop=format.borderString;
corner.style.left=-format.borderWidth+"px";
break;
}
case "tr":{
corner.style.height=topHeight-format.borderWidth+"px";
corner.style.marginLeft=options.radii[cc]-(format.borderWidth*2)+"px";
corner.style.borderRight=format.borderString;
corner.style.borderTop=format.borderString;
corner.style.backgroundPosition="-"+(topHeight-format.borderWidth)+"px 0px";
corner.style.left=format.borderWidth+"px";
break;
}
case "bl":{
corner.style.height=bottomHeight-format.borderWidth+"px";
corner.style.marginRight=options.radii[cc]-(format.borderWidth*2)+"px";
corner.style.borderLeft=format.borderString;
corner.style.borderBottom=format.borderString;
corner.style.left=format.borderWidth+"px";
corner.style.backgroundPosition="-"+format.borderWidth+"px -"+(format.height+(bottomHeight+format.borderWidth))+"px";
break;
}
case "br":{
corner.style.height=bottomHeight-format.borderWidth+"px";
corner.style.marginLeft=options.radii[cc]-(format.borderWidth*2)+"px";
corner.style.borderRight=format.borderString;
corner.style.borderBottom=format.borderString;
corner.style.left=format.borderWidth+"px";
corner.style.backgroundPosition="-"+(bottomHeight+format.borderWidth)+"px -"+(format.height+(bottomHeight+format.borderWidth))+"px";
break;
}
}
}
} else {
// NB: this version will not do the caching they built into the
// current version of curvyCorners.
var corner=document.createElement("div");
corner.style.height=options.radii[cc]+"px";
corner.style.width=options.radii[cc]+"px";
corner.style.position="absolute";
corner.style.fontSize="1px";
corner.style.overflow="hidden";
var borderRadius=Math.floor(options.radii[cc] - format.borderWidth);
for(var x=0, j=options.radii[cc]; x<j; x++){
// figure out y coords
var y1=Math.floor(Math.sqrt(Math.pow(borderRadius,2)-Math.pow((x+1),2)))-1;
if((x+1) >= borderRadius){ var y1=-1; }
var y2=Math.ceil(Math.sqrt(Math.pow(borderRadius,2)-Math.pow(x,2)));
if(x >= borderRadius){ y2=-1; }
var y3=Math.floor(Math.sqrt(Math.pow(j,2)-Math.pow((x+1),2)))-1;
if((x+1) >= j){ y3=-1; }
var y4=Math.ceil(Math.sqrt(Math.pow(j, 2)-Math.pow(x, 2)));
if(x >= j){ y4=-1; }
// start drawing
if(y1 > -1){
fns.draw(x, 0, format.color, 100, (y1+1), corner, -1, j, topHeight, format);
}
// cycle the y-axis
for(var y=(y1+1); y<y2; y++){
if(options.antiAlias){
if(format.bgImage != ""){
var fract=fns.fraction(x, y, borderRadius)*100;
if(fract < 30){
fns.draw(x, y, format.borderColor, 100, 1, corner, 0, options.radii[cc], topHeight, format);
} else {
fns.draw(x, y, format.borderColor, 100, 1, corner, -1, options.radii[cc], topHeight, format);
}
} else {
var clr=fns.blend(format.color, format.borderColor, fns.fraction(x, y, borderRadius));
fns.draw(x, y, clr, 100, 1, corner, 0, options.radii[cc], topHeight, format);
}
}
}
// bar for the border
if(options.antiAlias){
if(y3 >= y2){
if(y2 == -1){ y2 = 0; }
fns.draw(x, y2, format.borderColor, 100, (y3-y2+1), corner, 0, 0, topHeight, format)
} else {
if(y3 >= y1){
fns.draw(x, (y1+1), format.borderColor, 100, (y3-y1), corner, 0, 0, topHeight, format);
}
}
for(var y=(y3+1); y<y4; y++){
fns.draw(x, y, format.borderColor, (fns.fraction(x, y, j)*100), 1, corner, (format.borderWidth>0 ? 0:-1), options.radii[cc], topHeight, format);
}
} else {
y3=y1;
}
}
// reposition pixels if not the bottom right.
if(cc != "br"){
for(var t=0, k=corner.childNodes.length; t<k; t++){
var bar=corner.childNodes[t];
var barTop = parseInt(dojo.html.getComputedStyle(bar, "top"));
var barLeft = parseInt(dojo.html.getComputedStyle(bar, "left"));
var barHeight = parseInt(dojo.html.getComputedStyle(bar, "height"));
// reposition.
if(cc.charAt(1)=="l"){
bar.style.left = (options.radii[cc]-barLeft-1)+"px";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -