CSS画像のサイズ変更率は?


108

それ自体のパーセンテージでimgのサイズを変更しようとしています。たとえば、画像を50%にサイズ変更して、画像を半分に縮小したいとします。しかし、適用するwidth: 50%;と画像のサイズがコンテナ要素(親要素<body>など)の50%になるように変更されます。

問題は、JavaScriptまたはサーバー側を使用せずに、画像のサイズを自分自身の割合で変更できるかどうかです。(画像サイズの直接の情報はありません)

私はあなたがこれを行うことができないと確信していますが、インテリジェントなCSSのみのソリューションがあるかどうかを確認したいだけです。ありがとう!


を使用する場合は、含まれている要素の割合を占めますwidth: <number>%。それを行う方法はないと思います!
Aniket

回答:


110

私には2つの方法があります。

方法1. jsFiddleのデモ

このメソッドは、画像のサイズを視覚的にのみ変更し、DOMの実際のサイズではなく、サイズ変更後の視覚的な状態を元のサイズの中央に中央揃えします。

html:

<img class="fake" src="example.png" />

css:

img {
  -webkit-transform: scale(0.5); /* Saf3.1+, Chrome */
     -moz-transform: scale(0.5); /* FF3.5+ */
      -ms-transform: scale(0.5); /* IE9 */
       -o-transform: scale(0.5); /* Opera 10.5+ */
          transform: scale(0.5);
             /* IE6–IE9 */
             filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.9999619230641713, M12=-0.008726535498373935, M21=0.008726535498373935, M22=0.9999619230641713,SizingMethod='auto expand');
}​

ブラウザーサポートのメモ:ブラウザーの統計はインラインで表示されましたcss

方法2. jsFiddleのデモ

html:

<div id="wrap">
    <img class="fake" src="example.png" />
    <div id="img_wrap">
        <img class="normal" src="example.png" />
    </div>
</div>

css:

#wrap {
    overflow: hidden;
    position: relative;
    float: left;
}

#wrap img.fake {
    float: left;
    visibility: hidden;
    width: auto;
}

#img_wrap {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
}

#img_wrap img.normal {
    width: 50%;
}​

注: img.normalimg.fake同じ画像です。
ブラウザーサポートのメモ:すべてのブラウザーcssがメソッドで使用されるプロパティをサポートするため、このメソッドはすべてのブラウザーで機能します。

この方法は次のように機能します。

  1. #wrapそして#wrap img.fake流れがある
  2. #wrap有するoverflow: hidden(その寸法は、内側画像と同一であるようにimg.fake
  3. img.fake唯一の要素の内部はある#wrapなしでabsolute、それは第二段階を壊さないように配置します
  4. #img_wrapabsolute内部に配置#wrapされ、要素全体にサイズが拡張されます(#wrap
  5. 4番目のステップの結果は#img_wrap、イメージと同じサイズになります。
  6. width: 50%on img.normalに設定すると、そのサイズは50%になる#img_wrapため50%、元の画像サイズになります。

これは、それの元のサイズの50%に画像のサイズを変更しません、それは今img_wrapの親の50%だ...
ウェズリー

問題を解決するための試みについては、私の最新の回答を参照してください。どう思いますか?
ウェズリー

私のコードのように、可視性の代わりにdisplay:noneを使用することは可能だと思います。あなたの例では、偽の隠された画像のためのスペースはまだ「予約」されており、その周りにコンテンツを置くとフローが
Wesley

メイントリックは2つのネストされたフローティングタグにあるため、不可能です。
Vladimir Starkov、2012年

1
しかし、transform:scale()解決策には大きな問題があります。CSSボックスモデルとうまく相互作用しません。これによって、私はそれはそれと相互作用しないという意味では、すべてのあなたはすべて間違って見えるレイアウトを取得しますので、。参照:jsfiddle.net/kahen/sGEkt/8
kahen

46

HTML:

<span>
    <img src="example.png"/>
</span>

CSS:

span {
    display: inline-block;
}
img {
    width: 50%;
}

これは、コンテナ要素アプローチを使用する最も簡単なソリューションの1つである必要があります。

コンテナ要素のアプローチを使用している場合、この質問はのバリエーションであるこの質問。秘訣は、コンテナ要素に子画像をシュリンクラップさせることです。これにより、サイズがサイズ変更されていない画像と同じになります。したがって、widthイメージのプロパティをパーセンテージ値として設定すると、イメージは元のスケールを基準にしてスケーリングされます。

:他のshrinkwrapping有効化プロパティとプロパティ値のいくつかはfloat: left/rightposition: fixedおよびmin/max-widthリンク質問で述べたように、。それぞれに独自の副作用display: inline-blockがありますが、より安全な選択です。マットはfloat: left/right彼の答えで言及したが、彼はそれを誤ってに帰したoverflow: hidden

jsfiddleのデモ


編集: trojan述べたように、新しく導入されたCSS3の組み込みおよび外部のサイジングモジュールを利用することもできます

HTML:

<figure>
    <img src="example.png"/>
</figure>

CSS:

figure {
    width: intrinsic;
}
img {
    width: 50%;
}

ただし、執筆時点では、すべての一般的なブラウザバージョンでサポートされているわけではありません


@誰でも、スパンの境界線が崩れないように修正する方法は? フィドル
CoR、2015

これは私が必要とするものでした...素早く簡単なもの、ありがとう。HTML: <img src="https://www.google.com/images/srpr/logo11w.png"/> CSS: img { display: inline-block; width: 15%; }
Chnikki

将来の読者のために:に設定するための正しい値がfigureありwidth: fit-content;、今のよう。ブラウザのサポートも、今日ははるかに優れています。
ダニエル・Kiをナジ

12

zoomプロパティを試す

<img src="..." style="zoom: 0.5" />

編集:どうやら、FireFoxはzoomプロパティをサポートしていません。使用する必要があります。

-moz-transform: scale(0.5);

FireFox用。


4
「ズーム」などのCSSプロパティはなく、IE以外ではサポートされていません。これはMicrosoft独自のものであり、非標準です。
Rob

9
残念ながら、この情報は古くなっています。現在、ズームはInternet Explorer、Chrome、およびSafariブラウザーでサポートされています。FireFoxとOperaはまだサポートしていません。だから編集部を追加しました。IEはそれをサポートする最初のものですが、唯一のものではありません。
EmirAkaydın11年

このリンクによると、Operaもズームをサポートしているようです。FireFoxはサポートしていない唯一のものです。fix-css.com/2011/05/css-zoom
EmirAkaydınDec

2
そのため、IEは過去8年間で市場シェアの半分を失っています。何かをサポートするためにブラウザーを信頼して頼ることができない場合、共通の根拠はありません。仕様はブラウザベンダー自身によって作成されています。彼らがそこに入れない場合は、それに頼らないでください。そうしないと、あなたがしたように複数行のマークアップを書くことになります。これは、1998年ではありません。
Rob

1
気づいたかどうかはわかりませんが、「ズーム」はInternet Explorer、Chrome、Safari、Operaでサポートされています。これは、「ズーム」がベンダー固有ではないことの証明です。FireFoxのみが異なります。だから私は私の質問を繰り返します。互換性のあるCSSプロパティを持つクリーンなソリューションは何ですか?私の答えは、誰かが適切な標準ソリューションを見つけるまでの最良の答えです。
EmirAkaydın12年

5

別の解決策は、使用することです:

<img srcset="example.png 2x">

src属性が必須であるため検証されませんが、機能します(srcsetサポートされていないIEのすべてのバージョンを除く)。


2

これは実際に可能であり、私が最初の大規模なレスポンシブデザインサイトを設計しているときに、偶然にかなりの偶然を発見しました。

<div class="wrapper">
  <div class="box">
    <img src="/logo.png" alt="">
  </div>
</div>

.wrapper { position:relative; overflow:hidden; }

.box { float:left; } //Note: 'float:right' would work too

.box > img { width:50%; }

overflow:hiddenは、clearfixハックを使用せずに、フローティングコンテンツにもかかわらず、ラッパーの高さと幅を提供します。その後、マージンを使用してコンテンツを配置できます。ラッパーdivをインラインブロックにすることもできます。


2

これは非常に古いスレッドですが、標準解像度のディスプレイに網膜(高解像度)のスクリーンキャプチャを表示するための簡単な解決策を探しているときに見つかりました。

したがって、最新のブラウザにはHTMLのみのソリューションがあります。

<img srcset="image.jpg 100w" sizes="50px" src="image.jpg"/>

これは、画像が意図した表示サイズの2倍であることをブラウザに伝えています。値は比例しており、画像の実際のサイズを反映する必要はありません。2w 1pxを使用しても同じ効果が得られます。src属性は、レガシーブラウザでのみ使用されます。

それの素晴らしい効果は、網膜または標準ディスプレイで同じサイズを表示し、後者で縮小することです。


0
function shrinkImage(idOrClass, className, percentShrinkage){
'use strict';
    $(idOrClass+className).each(function(){
        var shrunkenWidth=this.naturalWidth;
        var shrunkenHeight=this.naturalHeight;
        $(this).height(shrunkenWidth*percentShrinkage);
        $(this).height(shrunkenHeight*percentShrinkage);
    });
};

$(document).ready(function(){
    'use strict';
     shrinkImage(".","anyClass",.5);  //CHANGE THE VALUES HERE ONLY. 
});

このソリューションでは、jsとjqueryを使用し、親ではなく画像のプロパティのみに基づいてサイズを変更します。クラスとidパラメーターを使用して、単一の画像またはグループのサイズを変更できます。

詳細については、https//gist.github.com/jennyvallon/eca68dc78c3f257c5df5をご覧ください。


0

これは難しいアプローチではありません。

<div>
    <img src="sample.jpg" />
</div>

then in css:
div {
    position: absolute;
}

img, div {
   width: ##%;
   height: ##%;
}

0

実際、ここでの答えのほとんどは、画像をそれ自体の幅に実際に拡大縮小するものではありません。

img元のサイズから開始できるように、要素自体の幅と高さをautoにする必要があります。

その後、コンテナー要素は画像を拡大縮小します。

簡単なHTMLの例:

<figure>
    <img src="your-image@2x.png" />
</figure>

そしてここにCSSルールがあります。この場合、絶対コンテナーを使用します。

figure {
    position: absolute;
    left: 0;
    top: 0;
    -webkit-transform: scale(0.5); 
    -moz-transform: scale(0.5);
    -ms-transform: scale(0.5); 
    -o-transform: scale(0.5);
    transform: scale(0.5);
    transform-origin: left;
} 

figure img {
    width: auto;
    height: auto;
}

のようなルールで画像の配置を微調整することができますtransform: translate(0%, -50%);


-1

私が知っている限り、それは純粋なCSSでは不可能です(つまり、クロスブラウザではありません)。

編集:

OK答えがあまり好きではなかったので、少し戸惑いました。私は助けることができる興味深いアイデアを見つけたかもしれません。

編集:テスト済みで、Chrome、FF、IE 8&9で動作します。。IE7では動作しません。

ここにjsFiddleの例

html:

<div id="img_wrap">
    <img id="original_img" src="http://upload.wikimedia.org/wikipedia/en/8/81/Mdna-standard-edition-cover.jpg"/>
    <div id="rescaled_img_wrap">
        <img id="rescaled_img" src="http://upload.wikimedia.org/wikipedia/en/8/81/Mdna-standard-edition-cover.jpg"/>
    </div>
</div>

css:

#img_wrap {
    display: inline-block;       
    position:relative;    
}

#rescaled_img_wrap {
    width: 50%;
}
#original_img {
    display: none;
}
#rescaled_img {
    width: 100%;
    height: 100%;
}

あなたの例は、比例していない画像のサイズを変更します
ウラジミールスターコフ'25年

あなたの方法は、ウィンドウのサイズ変更によって画像を減らすことを可能にします
ウラジミールスターコフ'25年

これは、を使用しているためですinline-block。そのため、幅#img_wrapは内部のHTMLの幅だけでなく、コンテキストコンテナーの幅にも依存します。
Vladimir Starkov

私の知る限り、display:none画像は何もせず、削除できます。それとも何か不足していますか?
2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.