0

我正在尝试裁剪(非背景)图像,然后将裁剪后的图像按身体的百分比进行缩放。我的想法是将我网站上的所有徽标和基本图形组合成一个图像,以便浏览器可以缓存图像(第一次下载后更快)。然后,我想相对于正文宽度进行缩放,这样无论用户的显示器尺寸如何,我的网站都会看起来与页面宽度的比例相同。

如果我给出 html & css 然后在之后解释它,这可能会更容易:

<html>
<head>
    <style>
    body
    {
        padding: 0px;
        margin: 0px;
        width: 100%
    }
    #crop1
    {
        float: left;
        overflow: hidden;
        border: 1px solid red;
        clear: both;
    }
    #crop1 img
    {
        vertical-align: middle;
        margin: -28px 0px -88px -189px; /*top right bottom left*/
    }
    #scale1
    {
        width: 10%;
        border: 1px solid blue;
    }
    #scale1 img
    {
        vertical-align: middle;
        width: 100%;
    }
    #crop2
    {
        float: left;
        overflow: hidden;
        border: 1px solid green;
        width: 100%;
    }
    #crop2 img
    {
        vertical-align: middle;
        margin: -28px 0px -88px -189px; /*top right bottom left*/
    }
    #scale2
    {
        width: 10%;
        border: 1px solid orange;
        clear: both;
    }
    </style>
</head>
<body>
    <img src="http://www.mathleague.com/help/geometry/IMG00088.gif">
    <div id="scale1"><img src="http://www.mathleague.com/help/geometry/IMG00088.gif"></div>
    <div id="crop1"><img src="http://www.mathleague.com/help/geometry/IMG00088.gif"></div>
    <div id="scale2"><div id="crop2"><img src="http://www.mathleague.com/help/geometry/IMG00088.gif"></div></div>
</body>
</html>

http://www.mathleague.com/help/geometry/IMG00088.gif在这个例子中使用了图像。我不会在我的网站上使用这张图片,但原理是一样的。

所以首先我只是把原始图像,不变的,在调试时给出大小参考:

<img src="http://www.mathleague.com/help/geometry/IMG00088.gif">

将单独的图像缩小到页面宽度的 10% 可以正常工作:

<div id="scale1">
    <img src="http://www.mathleague.com/help/geometry/IMG00088.gif">
</div>

并且裁剪图像以仅显示椭圆形也可以正常工作:

<div id="crop1">
    <img src="http://www.mathleague.com/help/geometry/IMG00088.gif">
</div>

但我不能只将椭圆缩小到页面宽度的 10%:

<div id="scale2">
    <div id="crop2">
        <img src="http://www.mathleague.com/help/geometry/IMG00088.gif">
    </div>
</div>

(这会将椭圆缩小到 10% 的宽度,而不是缩放它)。也许我在最后一行缺少一些简单的 css 属性,或者我需要添加更多div的 s. 我被困住了。

这是示例图像:
示例图片

注意:解决方案必须是跨浏览器兼容的

4

4 回答 4

1

更新了工作示例(边距需要是百分比)

以你的方式去做会比你意识到的要复杂一些。对于您的最终尺寸,您需要img根据整体所占百分比的倒数重新调整尺寸。然后你必须把它和缩放相乘,然后乘以你的边距的偏移量。

编辑下面的代码要准确得多,因为我能够检查和纠正我的数学,并根据您更简单的图像进行计算(知道大小和偏移量至关重要)。新示例更接近于正确的尺寸计算。我在下面进行了调整以显示数学。来发现,计算比我想象的“更容易”,但我部分未能解释的是,即使是顶部和底部的偏移量也应该偏离图像的原始宽度,因为宽度是缩放整体的图片。

#scale1
{
    width: 10%;
    padding: 0;
    margin: 0;
}

#crop1
{
    overflow: hidden;
    border: 1px solid green;
    width: 100%;
    padding: 0;
    margin: 0;
}

/*Image: 300 W x 209 H
  Offsets: oT = 8, oR = 56, oB = 75, oL = 204
  Icon: 40 w x 126 h */

#crop1 img
{
    width: 750% /* 1 / (40 / 300) [inverse of icon width / image width] */;
    vertical-align: middle;
    /*using the offsets, each has a percentage calculated based solely off 
      the image width, then adjusted based off the width % of the img as 
      calculated above */
    margin: -20%    /* (8 / 300) x 7.5 [the 750%] = 100 x 8 / 40*/
            0       /* right margin seems unnecessary, but if found otherwise, the
                 calculation would be (56 /300) x 7.5 = 100 x 56 / 40*/
            -187.5% /* (75 /300) x 7.5  = 100 x 75 / 40*/
            -510%;  /* (204 / 300)  x 7.5  = 100 x 204 / 40*/
    padding: 0;
    border: 0;
}
于 2012-04-19T23:59:43.503 回答
1

目前图像没有继承父级的宽度,您可以通过声明'width:inherit;'来明确并强制这样做 图片上:

#crop2 img
{
    vertical-align: middle;
    margin: -28px 0px -88px -189px; /*top right bottom left*/
    width: inherit;
}

忘了提一下,您需要重新调整边距以适应新大小的图像。

于 2012-04-19T23:47:25.413 回答
0

改为使用background-positionbackground-size属性。

给你的例子:

<!DOCTYPE html>

<style type="text/css">
.pentagon, .pentagon_large {
    background: url(IMG00088.GIF);
}
.pentagon {
    width: 110px;
    height: 110px;
    background-position: 0px 0px;
    background-repeat: no-repeat;
}
.pentagon_large {
    width: 220px;
    height: 220px;
    background-position: 0px 0px;
    background-repeat: no-repeat;
    background-size: 300%;
}
</style>

<body>

<div class="pentagon">&nbsp;</div>
<div class="pentagon_large">&nbsp;</div>

输出:

使用此代码输出

注意:使用 IE9 中的 F12 开发人员工具,您可以编辑值(见图)以快速找到合适的大小。

于 2012-04-19T23:23:46.157 回答
0

最后我选择了以下方法:

<!DOCTYPE html>
<html>
<head>
    <style>
    body
    {
        padding: 0px;
        margin: 0px;
        width: 100%
    }
    #d2
    {
        top: 0;
        bottom: 0;
        left: 0;
        right: 0;
        position: absolute;
        overflow: hidden;
    }
    #d1
    {
        bottom: 0;
        right: 0;
        width: 251.59%; /*B*/
        height: 152.31%; /*C*/
        position: absolute;
    }
    #d0
    {
        top: 0;
        left: 0;
        width: 100%; /*A*/
        position: absolute;
    }
    #d0 img
    {
        width: 100%;
        float: left;
    }
    #container
    {
        top: 100px; /*final position of the copped section from the page top (in px)*/
        left: 40%; /*final left position of the copped section relative to page width*/
        display: inline-block;
        position: relative;
        width: 30%; /*final width of the copped selection relative to the page width*/
    }
    #dummy
    {
        margin-top: 51.587%; /*R*/
    }
    </style>
</head>
<body>
    <div id="container"><div id="dummy"></div>
        <div id="d2"><div id="d1"><div id="d0"><img src="http://i.stack.imgur.com/MLWNd.gif"></div></div></div>
    </div>
</body>
</html>

所需的输入是:selection_width、selection_height、selection_top、selection_left 和 image_width,如下所示:

要裁剪和缩放的图像

(image_width 是此处显示的整个图像的宽度)。所以:

selection_top:    34 (just inside the boundary so that we do not show the border)
selection_left:   191 (also just inside the boundary so that we do not show the border)
selection_width:  126 (=317-191 where 317 is also just inside the right-side boundary)
selection_height: 65 (=99-34 where 99 is also just inside the bottom boundary)
image_width:      318

并且所需的输出是 A、B、C、R(来自上面代码中的注释)。计算数字给出:

A: 100.32%
B: 251.59%
C: 152.31%
R: 51.587%

现在浏览器窗口可以取消最大化和调整大小,椭圆将保持其原始形状,同时始终是页面宽度的百分比,并且从左侧定位页面宽度的百分比。换句话说,浏览器在任何屏幕上看起来总是相同的宽度。请注意,由于渲染不准确,椭圆周围的边框确实显得微弱,即使 selection_* 指定最终图像将刚好在显示的选择边框内。出于这个原因,最好在最终的单个图像中的裁剪选择之间留下几个像素。

现在您可以将整个网站的所有主题图像放在一个图像上,并使用此技术提取各种组件并根据需要定位和缩放它们。这解决了有限并行下载的问题(存在于大多数浏览器中)。我已经做了一个来自这个单一图像的所有形状的例子,对齐以适合页面的宽度:http: //jsfiddle.net/KsNku/(如果有人遇到不呈现此代码的浏览器,如下所示:http://i.stack.imgur.com/O50vX.png请让我知道,我将编辑 css 以解决问题)。尝试调整 jsfiddle 浏览器窗口的大小,看看一切看起来如何保持静止,没有任何 javascript!

当然,完全由这种布局组成的网站需要精心设计——用户无法放大任何东西,除非他们可以进一步最大化屏幕。这意味着移动设备将显示页面非常小。如果这是一个问题,那么该技术可以在有限的区域中使用(例如,用于弹出窗口中的图像)。如果您知道您的所有用户都不会使用移动设备访问此站点(可能是因为您有一个单独的移动电话用户子域),那么这种技术应该没问题。

于 2012-04-23T15:32:52.140 回答