0

(背景以外の)画像をトリミングしてから、トリミングした画像を体のパーセンテージでスケーリングしようとしています。私が持っているアイデアは、ブラウザが画像をキャッシュできるように、Webサイト上のすべてのロゴと基本的なグラフィックを1つの画像に結合することです(最初のダウンロード後はより速く)。次に、ユーザーのモニターサイズに関係なく、Webサイトがページ幅と同じ比率で表示されるように、本文の幅に対してスケーリングします。

これは、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この例では画像を使用しました。この画像を自分のWebサイトで使用するつもりはありませんが、原則は同じです。

したがって、最初に、デバッグ中にサイズの参照を提供するために、元の画像を変更せずに配置します。

<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%の幅に切り取られます)。divこの最後の行にいくつかの単純なcssプロパティがないか、さらに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-position使用してください。background-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_ *で最終的な画像が表示されている選択範囲の境界線のすぐ内側になるように指定されていても、楕円の周囲の境界線はかすかに表示されることに注意してください。このため、最終的な単一画像のトリミング選択の間に数ピクセルを残すのが最善です。

これで、Webサイト全体のすべてのテーマ画像を1つの画像に配置し、この手法を使用してさまざまなコンポーネントを抽出し、必要に応じて配置および拡大縮小できます。これにより、並列ダウンロードが制限されるという問題が回避されます(ほとんどのブラウザーに存在します)。http://jsfiddle.net/KsNku/(このコードをこのようにレンダリングしないブラウザに出くわした場合:http://i.stack.imgur.com/O50vX.pngお知らせください。cssを編集して問題を修正します)。jsfiddleブラウザウィンドウのサイズを変更して、JavaScriptを使用せずにすべてが静止しているように見えることを確認してください。

もちろん、完全にこのタイプのレイアウトで構成されているWebサイトでは、注意深い設計が必要になります。画面をさらに最大化できない限り、ユーザーは何にもズームインできません。これは、モバイルデバイスがページを絶対に小さいものとして表示することを意味します。これが問題になる場合は、この手法を限られた領域で使用できます(ポップアップの画像など)。すべてのユーザーがモバイルデバイスでこのサイトにアクセスするわけではないことがわかっている場合(おそらく携帯電話ユーザー用に別のサブドメインがあるため)、この手法で問題ありません。

于 2012-04-23T15:32:52.140 に答える