众所周知,比较古老的圆角的做法是通过表格和图像构成。但随着AJAX的流行、CSS + DIV的页面布局技术的风靡,古老的做法显得苍白无力,所以人们不断寻求改进的方法。本文的实现就是一种现在比较流行的做法。
实现原理
其实这种方法的原理很简单——在要圆角的元素的上下堆放一些边缘(MARGIN)不同的<DIV>元素(也有的使用其它元素的,如<B>等,不过原理是一样的),如下图所示:
清单1 原理图
接下来的问题就是计算margin的长度。这也不难只要运用一下初中所学的勾股定理便可以求出来,如下图所示:
清单2 MARGIN求解图
具体编码
下面该工具类的源码:
var Corner = {
// 标志圆角位置的旗标
TOP_LEFT: 0x1 ,
TOP_RIGHT: 0x2 ,
BOTTOM_LEFT: 0x4 ,
BOTTOM_RIGHT: 0x8 ,
ALL: 0xf ,
/**/ /* *******************************************************
* target: 要圆角的目标元素
* radius: 圆角的半径,默认值为5
* flags: 圆角位置的旗标或其组合,默认值为全部
* backgroundColor: 圆角的背景色,默认值为目标元素的背景色
******************************************************* */
round: function (target, radius, flags, backgroundColor) {
var t = $(target);
var r = radius || 5 ;
var f = flags || Corner.ALL;
var c = Element.getStyle(t, 'backgroundColor');
var b = backgroundColor || c;
// 修正在IE里元素样式为FLOAT时,圆角DIV宽度为0的BUG
var ft = Element.getStyle(t, ' float ');
if (navigator.appVersion.match( / \bMSIE\b / ) && ft != 'none' && ! t.style.width) {
Element.setStyle(t, { width: Element.getWidth(t) + 'px' } );
}
// 创建DIV,并把目标元素的内容剪切到其中
var d = document.createElement('div');
d.innerHTML = t.innerHTML;
t.innerHTML = '';
// 设置新DIV的背景色为目标元素的背景色,并目标元素为透明背景
Element.setStyle( d, { backgroundColor: c } );
Element.setStyle( t, { backgroundColor: 'transparent' } );
// 设置新DIV的高度为目标元素的高度
var h = t.style.height;
var nh = 0 ;
if (h) {
Element.setStyle( d, { height: h } );
nh = parseInt(h);
}
// 设置新DIV的缩进
var p = Element.getStyle(t, 'padding');
if (p) {
Element.setStyle( d, { padding: p } );
Element.setStyle( t, { padding: '0px 0px 0px 0px' } );
}
// 创建用于新DIV和圆角DIV的文档片段,这样避免每次设置元素样式或添加新元素时重绘页面,提高效率
var ds = document.createDocumentFragment();
var ls = null ;
// 创建顶部圆角DIV
if (f & (Corner.TOP_LEFT | Corner.TOP_RIGHT)) {
ls = Corner._createRoundFragment(r, f, b , false );
ds.appendChild(ls);
nh += r;
}
ds.appendChild(d);
// 创建底部圆角DIV
if (f & (Corner.BOTTOM_LEFT | Corner.BOTTOM_RIGHT)) {
ls = Corner._createRoundFragment(r, f, b, true );
ds.appendChild(ls);
nh += r;
}
if (h) {
Element.setStyle( t, { height: nh + 'px' } );
}
t.appendChild(ds);
} ,
_createRoundFragment: function (r, f, c, b) {
var ls = document.createDocumentFragment();
var l = null ;
var m = ml = mr = null ;
var j = 0 ;
for (i = 1 ; i <= r; i ++ ) {
l = document.createElement('div');
// 计算margin
j = b ? i : r - i + 1 ;
m = Math.sqrt(r * r - j * j);
m = Math.round(r - m) + 'px';
if (b) {
ml = f & Corner.BOTTOM_LEFT ? m : '0px';
mr = f & Corner.BOTTOM_RIGHT ? m : '0px';
} else {
ml = f & Corner.TOP_LEFT ? m : '0px';
mr = f & Corner.TOP_RIGHT ? m : '0px';
}
Element.setStyle( l, { backgroundColor: c,
fontSize: '1px',
height: '1px',
marginLeft: ml,
marginRight: mr,
overflowX: 'hidden',
overflowY: 'hidden' } );
ls.appendChild(l);
}
return ls;
}
}
清单3 实现代码
因为Javascript是没有方法重写的,所以当你调用Corner.round('div1')和调用Coner.round('div1', 20)是一样的,它们最终调用的都是Corner.round(target, radius, flags, backgroundColor),只过没有赋值的参数会为undefined。这里有一个小技巧,就var r = radius || 5,这里的“||”符号表示如果radius为undefined、null或0等值时,r的取值为5。
接着让我们看看运行的页面代码:
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head >
< title > RounderCorner Prototype </ title >
< script type ="text/javascript" src ="scripts/prototype-1.5.0.js" ></ script >
< script type ="text/javascript" src ="scripts/Corner.js" ></ script >
< script type ="text/javascript" >
// <![CDATA[
Event.observe(window, 'load', init, false );
function init() {
Corner.round('div1');
Corner.round('div2', 20 , Corner.TOP_LEFT | Corner.BOTTOM_RIGHT);
Corner.round('div3', 20 , Corner.ALL, 'Red');
}
// ]]>
</ script >
</ head >
< body >
< div id ="div1" style ="width: 318px; height: 103px; background-color: #ffcccc" >
Corner.round('div1'); </ div >
< br />
< div id ="div2" style ="width: 317px; height: 100px; background-color: #cccccc" >
Corner.round('div2', 20, Corner.TOP_LEFT | Corner.BOTTOM_RIGHT); </ div >
< br />
< div id ="div3" style ="width: 315px; height: 100px; background-color: #ccffcc" >
Corner.round('div3', 20, Corner.ALL, 'Red'); </ div >
</ body >
</ html >
清单4 测试代码
上述代码很简单明了,相信大家都明白。下面看一下运行截图吧。
清单5 运行截图
分享到:
相关推荐
4. **prototype.js**:这是Prototype JavaScript库的源文件,提供了基本的JavaScript扩展和工具。 5. **effects.js**:这是Scriptaculous库的一部分,Scriptaculous是基于Prototype的一个动画库,提供了丰富的视觉...
在给定的标题“编写基于Prototype的Javascript动画类”中,我们可以看到讨论的是如何利用Prototype库来创建自定义的动画类。Prototype是一个广泛使用的JavaScript库,它提供了许多便利的功能,包括DOM操作、事件处理...
在处理表格这类HTML元素时,Prototype提供了一系列实用的工具和方法。下面我们将深入探讨如何使用Prototype动态地增加表格的行和列。 1. **创建表格**: 在HTML中,表格由`<table>`、`<tr>`(行)和`<td>`(单元格)...
本项目“基于prototype制作的幻灯片”就是利用Prototype.js框架来创建一个动态的、交互式的幻灯片展示组件。 Prototype.js库的核心在于其强大的对象扩展机制和DOM操作功能。它引入了类的概念,让JavaScript具备了...
一款基于Prototype的Validation表单验证插件,实现Ajax风格的无刷新表单验证功能,当用户输入完表单,即时显示该项输入是否正确,不正确则会给出提示,适合那些比较喜欢简洁风格,又要求功能准确的用户,本款表单...
Prototype.js的`Position`类可以用来帮助计算和设置元素位置。 4. **背景遮罩**:为了突出模态窗口,通常会在其后面添加一个半透明的背景层,阻止用户与底层内容交互。同样,可以使用Prototype.js来创建和定位这个...
ASP基于Prototype的Ajax无刷新登录实例是一个非常适合初学者学习AJAX技术的应用案例。在这个实例中,我们将探讨如何在ASP(Active Server Pages)环境中利用Prototype JavaScript库实现无刷新的用户登录功能,同时...
本项目就是基于Prototype、Spring和Hibernate这三个组件实现的一个自动提示功能,这为我们提供了一个理解这些技术如何协同工作的实例。 Prototype是JavaScript的一个库,它为浏览器提供了许多实用的函数,如事件...
综合以上,这款基于Prototype 1.6的web布局管理器为开发者提供了一个强大的工具,帮助他们创建适应性强、响应快速的Web界面。通过源码学习,开发者可以提升自己的JavaScript技能,尤其是使用Prototype框架进行布局...
`validation.js`是一个专门用于前端表单验证的库,它基于Prototype JavaScript框架构建,提供了一种简单且灵活的方式来实现这一功能。 **Prototype框架** 是一个广泛使用的JavaScript库,它扩展了JavaScript语言的...
Prototype是一个古老的JavaScript库,它为JavaScript语言提供了许多类Ruby的语法特性,使得开发更加便利。本教程将详细介绍如何使用Prototype库实现一个带有进度条的异步文件上传功能,并涉及到后台代码的支持。 ...
【标题】"基于ASP的基于Prototype的Ajax无刷新登录实例"揭示了这个压缩包内容是关于使用经典ASP(Active Server Pages)技术与Prototype JavaScript库相结合,实现一个无刷新登录功能的示例。在这个实例中,重点是...
构建基于`prototype`的树结构,我们需要定义一个树节点(TreeNode)类,这个类可能包含以下属性和方法: 1. 数据属性:存储节点的值,比如`value`。 2. 子节点属性:存储子节点的数组,如`children`。 3. 方法:如`...
简洁,快速的验证语法 无需编写验证提示信息(当然也支持自定义提示信息) 错误消息在指定地方显示 支持组合验证 Ajax支持 基于prototype.js 支持国际化 易于扩展 基于标准的Html属性...
在JavaScript的世界里, Prototype 是一个非常著名的库,它为JavaScript提供了许多便利的工具和扩展,使得开发者能够更高效地编写动态网页应用。本资源“基于Prototype的手风琴菜单,层的展开与折叠代码”显然是一个...
对于压缩包子文件的文件名称列表“字符串工具类”,这可能是一份包含了各种字符串处理方法的源码文件集合,可能包括自定义的工具类或对已有工具类的扩展。通过研究这些源码,我们可以学习到如何根据项目需求定制自己...
《prototype 1.6的类图表》是一份详细介绍Prototype JavaScript框架1.6版本核心特性的文档,源自韩国的一篇博客。Prototype是一个强大的JavaScript库,它为JavaScript编程提供了许多便利的功能,如类系统、DOM操作、...
一个简单实用的javascript AJAX 工具类; 简单应用的时候, 你不需导入像prototype,jQuery那样大的类库