CSSを使用して、divの高さを幅に比例してスケーリングできますか?


81

divの高さを常に幅の半分にしたいようにCSSで変数を設定できますか?divの画面サイズの幅がパーセントである場合にdivがスケーリングします

<div class="ss"></div>

CSS:

.ss {
    width:30%;
    height: half of the width;
}

この30%の幅は、画面の解像度に合わせて調整されます



回答:


124

相対的なパディング(高さ方向でも)は親要素の幅に基づいているため、親アイテムのパディングを使用してこれを行うことができます。

CSS:

.imageContainer {
    position: relative;
    width: 25%;
    padding-bottom: 25%;
    float: left;
    height: 0;
}

img {
    width: 100%;
    height: 100%;
    position: absolute;
    left: 0;
}

これはこの記事に基づいています: CSSだけを使用したレスポンシブボックスの比例スケーリング


1
このCSSには、あちこちにあらゆる種類の奇妙なものがあります。それにもかかわらず、それは機能します。
ガサン2016

1
記事のリンクがなくなりました!
Sanxofon

私はそれが何であれ、その神秘的な作品を使用することを拒否しなければなりません!
JacekDziurdzikowski20年

説明をいただければ幸いです。これは本当に魔法です。
パレック

相対位置により、.imageContainerは絶対位置にあるimgの座標原点になります。フロートは無関係のようです-タイルを形成するためにそのような.imageContainerの複数を隣り合わせに配置したいコンテキストでのみ意味があります。
パレック

15

これを実現するもう1つの優れた方法は、アスペクト比が設定された透明な画像を使用することです。次に、画像の幅を100%に設定し、高さを自動に設定します。残念ながら、それはコンテナの元の内容を押し下げます。したがって、元のコンテンツを別のdivでラップし、親divの一番上に絶対に配置する必要があります。

<div class="parent">
   <img class="aspect-ratio" src="images/aspect-ratio.png" />
   <div class="content">Content</div>
</div>

CSS

.parent {
  position: relative;
}
.aspect-ratio {
  width: 100%;
  height: auto;
}
.content {
  position: absolute;
  width: 100%;
  top: 0; left: 0;
}

1
これは、を設定height: 100%;することによってのみ機能しました.content。でもヒントをありがとう。私はこの方法がパディングよりも好きです。
natec 2016

質問は「CSSの使用」であり、HTMLに新しい要素を追加することを避けた方がよい
Diego Betto 2017年

9

「幅」にはビュー幅を使用し、「高さ」にはビュー幅の半分を使用できます。このようにして、ビューポートのサイズに関係なく、正しい比率が保証されます。

<div class="ss"></div>

.ss
{
    width: 30vw;
    height: 15vw;
}

フィドル


6

囲んでいるdivのピクセル単位で設定された幅に比例した垂直方向のサイズ設定が必要な場合は、次のような追加の要素が必要だと思います。

#html

<div class="ptest">
    <div class="ptest-wrap">
        <div class="ptest-inner">
            Put content here
        </div>
    </div>
</div>

#css
.ptest {
  width: 200px;
  position: relative;
}

.ptest-wrap {
    padding-top: 60%;
}
.ptest-inner {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background: #333;
}

これが機能しない2divソリューションです。60%の垂直パディングは、ウィンドウ幅に比例し、ウィンドウ幅には比例しないことに注意してください。div.ptest

http://jsfiddle.net/d85FM/

上記のコードの例を次に示します。これは機能します。

http://jsfiddle.net/mmq29/


3

この答えは、私が多くのクラス名を使用したくないことを除いて、他の答えとほとんど同じです。しかし、それは個人的な好みです。ネストされたdivの目的を前もって宣言しているため、各divでクラス名を使用する方が透過的であると主張できます。

<div id="MyDiv" class="proportional">
  <div>
    <div>
      <p>Content</p>
    </div>
  </div>
</div>

一般的なCSSは次のとおりです。

.proportional { position:relative; }
.proportional > div > div { position:absolute; top:0px; bottom:0px; left:0px; right:0px; }

次に、最初の内側のdivをターゲットにして、幅と高さを設定します(パディングトップ)。

#MyDiv > div { width:200px; padding-top:50%; }

3

スケーラブルなソリューションを探している人のために:私はSASSで小さなヘルパーユーティリティを作成して、さまざまなブレークポイントに対してレスポンシブな比例長方形を生成しました。SASSプロポーションご覧ください

それが誰かに役立つことを願っています!


3

ビューの幅を使用して高さを設定できます。100 vwは幅の100%です。 height: 60vw;高さは幅の60%になります。


あなたは最高のフィードバックを与えるために完全な答えを書くことができます。
アミロセイン

2

画像を操作するときに役立つ1つの方法ですが、それ以外の場合は回避策として使用できます。

<html>
<head>
</head>
<style>
    #someContainer {
        width:50%;
        position: relative;
    }
    #par {
        width: 100%;
        background-color:red;
    }
    #image {
        width: 100%;
        visibility: hidden;
    }
    #myContent {
        position:absolute;
    }
</style>
<div id="someContainer">
    <div id="par">
        <div id="myContent">
            <p>
            Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
            </p>    
        </div>
        <img src="yourImage" id="image"/>
    </div>
</div>
</html>

使用するには、yourImageを画像のURLに置き換えます。希望する幅/高さの比率の画像を使用します。

div id = "myContent"は、myContentが画像にオーバーレイする回避策の例としてここにあります。

これは次のように機能します。親divは画像の高さに採用され、画像の高さは親の幅に採用されます。ただし、画像は非表示になっています。


1

vwまたはを使用して、要素の幅と高さの両方を割り当てることができますvh。例えば:

#anyElement {
    width: 20vh;
    height: 20vh;
}

これにより、幅と高さの両方がブラウザの現在の高さの20%に設定され、アスペクト比が維持されます。ただし、これは、ビューポートの寸法に比例して拡大縮小する場合にのみ機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.