だから私はサイトに取り組んでいて、純粋にHTML5、CSS3(および必要に応じてJavaScript)を使用して、湾曲した底を持つdivを作成することが可能かどうか疑問に思っていたので、実際には次のようになります:
または、これは背景画像を使用してのみ実行できますか?
<body>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<ul class="nav">
<li><a href="#">Home</a></li>
</ul>
</div>
</div>
</body>
CSS:
div{
background-color:black;
width:500px;
height:50px;
border-bottom-left-radius:50%;
border-bottom-right-radius:50%;
}
これは大丈夫です: [〜#〜] demo [〜#〜]
この形状を作成するために採用できるさまざまなアプローチがあります。以下は、可能性の詳細な説明です。
SVG
は、このような形状を作成するための推奨される方法です。シンプルさと拡張性を提供します。以下にいくつかの可能な方法を示します。
1-パス要素の使用:
SVG
のpath
要素を使用してこの形状を作成し、単色、グラデーション、またはパターンで塗りつぶすことができます。
d
要素の形状を定義するために使用される属性はpath
のみです。この属性自体には、多数の短いコマンドと、それらのコマンドが機能するために必要ないくつかのパラメーターが含まれています。
以下は、この形状を作成するために必要なコードです。
_<path d="M 0,0
L 0,40
Q 250,80 500,40
L 500,0
Z" />
_
上記のコードで使用されるpath
コマンドの簡単な説明を以下に示します。
M
コマンドを使用して、開始点を定義します。最初に表示され、描画を開始するポイントを指定します。L
コマンドは、直線を描くために使用されます。Q
コマンドは、曲線を描くために使用されます。Z
コマンドは、現在のパスを閉じるために使用されます。出力画像:
作業デモ:
_svg {
width: 100%;
}
_
_<svg width="500" height="80" viewBox="0 0 500 80" preserveAspectRatio="none">
<path d="M0,0 L0,40 Q250,80 500,40 L500,0 Z" fill="black" />
</svg>
_
2-クリッピング:
クリッピングとは、要素の一部を削除または非表示にすることです。
このアプローチでは、SVGのclipPath
要素を使用してクリッピング領域を定義し、これを長方形要素に適用します。クリッピング領域の外側にあるエリアはすべて非表示になります。
必要なコードは次のとおりです。
_<defs>
<clipPath id="shape">
<path d="M0,0 L0,40 Q250,80 500,40 L500,0 Z" />
</clipPath>
</defs>
<rect x="0" y="0" width="500" height="80" fill="#000" clip-path="url(#shape)" />
_
以下は、上記のコードで使用される要素の簡単な説明です。
defs
要素は、後でSVGドキュメントで使用するための要素/オブジェクトを定義するために使用されます。clipPath
要素は、クリッピング領域を定義するために使用されます。rect
要素は、長方形を作成するために使用されます。clip-path
_属性は、以前に作成されたクリッピングパスをリンクするために使用されます。作業デモ:
_svg {
width: 100%;
}
_
_<svg width="500" height="80" viewBox="0 0 500 80" preserveAspectRatio="none">
<defs>
<clipPath id="shape">
<path d="M0,0 L0,40 Q250,80 500,40 L500,0 Z" />
</clipPath>
</defs>
<rect x="0" y="0" width="500" height="80" fill="#000" clip-path="url(#shape)" />
</svg>
_
1-擬似要素の使用:
_::before
_または_::after
_疑似要素を使用して、この形状を作成できます。これを作成する手順は次のとおりです。
::before
_ OR _::after
_)擬似要素でレイヤーを作成します。border-radius
_を追加して、丸みを帯びた形状を作成します。overflow: hidden
_を追加して、不要な部分を非表示にします。必要なHTML:
必要なのは、おそらくdiv
のようなクラスを持つ単一のshape
要素です。
_<div class="shape"></div>
_
作業デモ:
_.shape {
position: relative;
overflow: hidden;
height: 80px;
}
.shape::before {
border-radius: 100%;
position: absolute;
background: black;
right: -200px;
left: -200px;
top: -200px;
content: '';
bottom: 0;
}
_
_<div class="shape"></div>
_
2-放射状勾配:
このアプローチでは、CSS3のradial-gradient()
関数を使用して、この形状を要素として背景として描画します。ただし、この方法ではあまり鮮明な画像が生成されず、角がギザギザになる場合があります。
必要なHTML:
何らかのクラスを持つ単一のdiv
要素のみが必要です。
_<div class="shape"></div>
_
必要なCSS:
_.shape {
background-image: radial-gradient(120% 120px at 50% -30px, #000 75%, transparent 75%);
}
_
作業デモ:
_.shape {
background: radial-gradient(120% 120px at 50% -30px, #000 75%, transparent 75%) no-repeat;
height: 80px;
}
_
_<div class="shape"></div>
_
この場合は必須ではありませんが、完全を期すために、このアプローチも追加しています。これはいくつかの場合にも役立ちます:
HTML5 Canvas:
パス関数を使用して、HTML5 Canvas要素にこの形状を描画できます。
_var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(0, 40);
ctx.quadraticCurveTo(311, 80, 622, 40);
ctx.lineTo(622, 0);
ctx.fill();
_
_<canvas id="canvas" width="622" height="80"></canvas>
_
以下は、上記のコードで使用されるメソッドの簡単な説明です。
beginPath()
は、新しいパスを作成するために使用されます。新しいパスが作成されると、将来の描画コマンドがパスに送られます。moveTo(x, y)
は、x
およびy
で指定された座標にペンを移動します。lineTo(x, y)
は、現在のペン位置からx
およびy
で指定されたポイントまで直線を描画します。quadraticCurveTo(cp1x, cp1y, x, y)
は、_cp1x
_および_cp1y
_で指定された制御点を使用して、現在のペン位置からx
およびy
で指定された点に曲線を描きます。fill()
は、非ゼロまたは偶数/奇数のワインディング規則を使用して現在のパスを埋めます。有用なリソース:
これはあなたが望むものです:
div{
background-color: black;
width: 500px;
height: 300px;
border-radius: 0 0 50% 50% / 50px;
}
受け入れられている答えとは異なり、これはdivの高さが増加した場合でも機能します。
デモ: jsFiddle
はい、CSSでこれを行うことができます-基本的にdivをページよりも広くして、丸みを帯びたエッジを修正し、xとyの両方の値を使用する下の境界半径、および補正するための負の下マージンを使用して補正しますギャップ:
border-bottom-left-radius: 50% 200px; // across half & up 200px at left Edge
border-bottom-right-radius: 50% 200px; // across half & up 200px at right Edge
width: 160%; overflow: hidden; // make larger, hide side bits
margin-bottom: -50px; // apply negative margin to compensate for bottom gap
position: relative; left:-30%; // re-position whole element so extra is on each side (you may need to add display:block;)
これを試して
.navbar{
border-radius:50% 50% 0 0;
-webkit-border-radius:50% 50% 0 0;
background:#000;
min-height:100px;
}