如何将矩形转换为TRBL CSS rect值?

时间:2010-05-17 18:31:54

标签: javascript css

我不太清楚怎么说这个,但是这里......

css clip属性的定义如下:rect(top,right,bottom,left)。但是,我正在探索使用自定义Rectangle'类'来封装一些操作。矩形类具有属性height,width和x,y。

x和y值封装在Point对象中,高度和宽度封装在Dimension对象中,矩形是一个点(它的左上角位置)和一个尺寸(宽度和高度)的复合体。

到目前为止一切顺利。我可以很简单,根据矩形x,y,宽度和高度值来定义css rect属性的顶部,右侧,底部,左侧,但是我已经变得无可救药地混淆了 - 我已经谷歌搜索了一段时间,我似乎无法找到任何关于TRBL值实际是什么或它们代表什么的文档。例如,我应该考虑坐标,在这种情况下,我肯定可以使用矩形x位置为顶部,x位置+宽度为右,矩形高度+ y为底部将矩形描述为css rect和它的左侧位置......但那肯定是BS的负荷?

另外,当然,rect实际上是一个插图,或者我只是颠倒了对剪辑的理解?我很感激一些建议。我想要做的是

(i)使用x,y,width和height定义矩形 (ii)以TRBL形式表示矩形,以便我可以操纵divs剪辑行为 (iii)改变x,y,宽度或高度,并根据TRBL和goto(ii)重新计算

我很欣赏这里有一些其他因素,并且有些中间变换要完成,但我很困惑 -

任何人都可以给我一些指示吗?

1 个答案:

答案 0 :(得分:2)

“解决方案”基本上只是在协调空间方面更好地理解css rect属性。

我对如何确定css clip rect的出现位置感到困惑。答案实际上很简单,一旦你意识到在css rect方面,'坐标空间'是被剪裁元素的尺寸(E),并且你总是可以设想E的左上角有坐标x = 0,y = 0。

所以我们假设我们有一个元素E,它的高度为200,宽度为300.我们可以像这样描述

E= {x:0, y:0, width:300, height:200}

它的x和y坐标,就我们所关注的情况而言,当绘制剪切矩形的TRBL值为0,0时,我们考虑剪切矩形,这样定义的示例

C= {x:30, y:30, width:150, height:150}

由于C.x和C.y指的是E的坐标空间,而E.x和E.y总是0,我们可以完全忽略E.x和E.y,在所有情况下。实际上,除非我们关注将C(剪切矩形)约束为E,否则我们可以完全消除所有E的知识,并使用如下方法将C转换为css rect声明。

function toCssRect(rectangle)
{
    var left=   parseInt(rectangle.x)
    ,   right=  parseInt(left + rectangle.width)
    ,   top=    parseInt(rectangle.y)
    ,   bottom= parseInt(top + rectangle.height);

    return 'rect(' + top + 'px ' + right + 'px ' + bottom + 'px ' + left +'px)';
}

因此,使用以下HTML标记(将img元素视为E)

<div class='.clipComponent'>
    <div id="contentClipper" class=".clipContent'>
        <img src="whatever.jpg"/>
    </div>
</div>

...和CSS

.clipComponent {position:relative}
.clipContent {position:absolute; clip:rect(auto);}

...我们将有一个未剪辑的图像(因为.clipContent将容纳img的大小,因为我们使用auto定义它)。现在为了剪辑它,我们可以将C(上面定义)传递给toCssRect函数并将其应用于.clipContent div,如此

var clipDiv= document.getElementById('contentClipper')
,   clipRect= {x:10, y:10, width:100, height:20};

clipDiv.style.clip= toCssRect(clipRect);

我们有。这样做的好处是您可以通过添加值来移动矩形 它的x和y属性,或通过修改其宽度和高度属性来增大和缩小矩形。每次修改后,将矩形转换为css rect声明,并设置为clip的值。这非常适合制作动画。

如果要实现自己的矩形类,请注意至少使用Safari和Chrome,如果实现toString以返回toCssRect方法的结果,则可以将矩形指定给元素样式对象的clip属性 - 为了便于说明,请考虑下面的对象文字:

var clipRect= 
{
    x:30, 
    y:40, 
    width:10, 
    height:30, 
    toString: function () 
    {
        return toCssRect(this);
    },
    translate: function (dx, dy)
    {
        this.x+= dx || 0;
        this.y+= dy || 0;
        return this;
    }
  }

现在你可以非常清楚地动画和编码(假设上面定义的对象和函数)

setInterval(function () 
{
    // translate will add 1px to the value of the rectangles x position, 
    // (moving it down) and then return a reference to the clipRect object.
    // When you assign the clipRect object to the divs style object
    // JavaScript will attempt to convert the clipRect object to a primitive, 
    // which will invoke toString and return the css string- nice and clean
    clipDiv.style.clip= clipRect.translate(1, 0);
}, 500);

希望所有这些都有意义!