主题:  DHTML 系列教程9 - 层的修剪

QQlan

职务:版主
等级:1
金币:1.0
发贴:158
注册:2000/9/19 10:35:21
#12001/3/21 3:38:38
剪切层
翻译: QQLan

剪切主要指层的哪些部分可见. 你需要理解修剪值(clip values) , width 和height的区别. Width和Height只是告诉browser如何把HTML元素包裹在里面. 但是, 它是窗口穿透层来浏览--
它不具有层的属性和效果(定位于左边或者上面, 宽度, 高度, 是否可见, 等等)

Clipping的区域被定义为由4条边组成的矩形(top, right, bottom, left). 每一条边都可以剪切掉部分的可见层, 或者增加可视空间. 所有的剪切值依赖于层本身-- 依赖层的top-left位置.
[img]http://www.dansteinman.com/dynduo/images/diagram-clip.gif [/img]

clipping在CSS中的语法是:
clip:rect(top,right,bottom,left)
其中top, right, bottom, left的值基于pixels. 别忘记按照他们的顺序进行-- 不然它会使你的操作非常混乱.

这是一个使用clipping定义可视区域的DIV tag:




本例中, 创建了10像素的边框围绕在层的边缘.因为clip top 是 -10, clip left 是 -10. 这个clip right是110 (比层的宽度多10 pixels) , clip bottom是60 (比层的高度多10 pixels).

我使用了一些CSS属性在里面. background-color (for ie4) 和[layer-background-color](for NS) 来给你的层着色(任何你喜欢的颜色). 这样做能使我们非常清楚的看到剪切/增加前后的效果. 通常我们定义层的时候不必使用height,但是, 如果我们要用到clipping, 就应该给层定义高度, 不然, IE不会给使用clip多出来部分着色.

同时你也可以在你的层上使用背景图. CSS中, 在IE中显示层的背景: background-image: URL (filename.gif) ; 在NS中显示背景: layer-background-image: URL (filename.gif). 为了使背景图在NS中正常显示, 我们还要增加一个CSS属性 : repeat:no , 下面就是完整的使用CSS定义层的背景.

javascript 和 Clipping

一旦clip了层, 我们就能使用javascript获得或者改变clip值 - 就象我们已经学过的得到元素的精确定位一样.

Clipping in Netscape

在NS中, 你可以获得或者改变任何一个clip的值.

document.divName.clip.top
document.divName.clip.right
document.divName.clip.bottom
document.divName.clip.left

弹出一个message,显示你所写的clip值.
alert(document.divName.clip.top)
然后把原来的top clip的值改为50 pixels.
document.divName.clip.top = 50

Clipping in Internet Explorer

IE里, 你可以在同一时间获得全部的剪切值. 例如, 你可以弹出一个对话框显示clip值.
<#336699>alert(divName.style.clip)

他将返回已定义的clip值的string. 以下是返回值示例:
"rect(0px 50px 100px 0px)"

IE里, 不能象在Netscape那样仅仅改变一条边的值实现-- 你必须一次性重新定义所有的clip值:

divName.style.clip = "rect(0px 100px 50px 0px)"

IE 4在clip方面显得有一点笨拙. 你可以使用我写的 generic function 在两个browser里检测clip值.

The Clip values() Function
该 clip values() function 能够获得每一条边的剪切值.


function clipvalues(obj,which) {
    if (ns4) {
        if (which=="t") return obj.clip.top
        if (which=="r") return obj.clip.right
        if (which=="b") return obj.clip.bottom
        if (which=="l") return obj.clip.left
    }
    else if (ie4) {
        var clipv = obj.clip.split("rect(")[1].split(")")[0].split("px")
        if (which=="t") return Number(clipv[0])
        if (which=="r") return Number(clipv[1])
        if (which=="b") return Number(clipv[2])
        if (which=="l") return Number(clipv[3])
    }
}


所要做的, 只是确定你需要哪个层(被定义为指针变量), 和哪条边的剪切值. 例如:
一旦我们定义指针变量为"blockDiv"层, 将得到包含top clip值的对话框.
alert(clipvalues(block,"t"))
只要写你所需要的边的首字母 - "t" (top), "r" (right), "b" (bottom), "l" (left).

范例: www.dansteinman.com/dynduo/examples/clipping1.html

改变修剪值

我写了2个generic functions非常容易的改变clip值.

The clip To() Function

clip To() 允许你定制层.


function clipTo(obj,t,r,b,l) {
    if (ns4) {
        obj.clip.top = t
        obj.clip.right = r
        obj.clip.bottom = b
        obj.clip.left = l
    }
    else if (ie4) obj.clip = "rect("+t+"px "+r+"px "+b+"px "+l+"px)"
}


指出你需要使用的layer/object, 和需要修剪的各条边的值.

clipTo(block,0,100,100,0)

The clipBy() Function:

clip By() 允许你根据给定的象素值移动层. 从当前的clip值增加或者减小各边的值.


function clipBy(obj,t,r,b,l) {
    if (ns4) {
        obj.clip.top = clipvalues(obj,'t') + t
        obj.clip.right = clipvalues(obj,'r') + r
        obj.clip.bottom = clipvalues(obj,'b') + b
        obj.clip.left = clipvalues(obj,'l') + l
    }
    else if (ie4) obj.clip = "rect("+(this.clipvalues(obj,'t')+t)+"px "+(this.clipvalues(obj,'r')+r)+"px "+Number(this.clipvalues(obj,'b')+b)+"px "+Number(this.clipvalues(obj,'l')+l)+"px)"
}


和clipTo() 相似, 你只要指出你想剪切的各边的值.:
clipBy(block,0,10,5,0)
上面的例子向右增加了10 Pixels, 向下增加了5 pixels.

使用Netscape 浏览效果更好, 是因为他对于layer 的 background color的定义方法 -- 无论是否被剪切他总是显示该层的颜色. 但是IE中如果你clip超出该层的边界(扩展一条边), 你将看不到该层的边缘.


动态剪切 (Wipping)

循环clipBy() 命令, 你将会看到你从没见过的, 灵巧的Wiping效果. 我想说的是, 创建你自己的wipe() function 将使一切更容易. 用和写slides相同的风格来做, 创建一个循环function来re-clips该层.


function wipe1() {
    clipBy(block,0,5,0,0)
    setTimeout("wipe1()",30)
}


为了停止wipe, 我们只需要校验该层的边时候达到了理想值.


function wipe1() {
    if (clipvalues(block,'r')<200) {
        clipBy(block,0,5,0,0)
        setTimeout("wipe1()",30)
    }
}


范例: www.dansteinman.com/dynduo/examples/clipping3.html (使用 wipes)



------------------------------------------------------------------
5DMedia 版权所有, 转载请注明出处!

编辑历史:[这消息被QQlan编辑过(编辑时间2001-03-21 03:46:42)]