css3でインセットボーダー半径を作成する方法はありますか? (画像なし)
次のような境界半径が必要です。
すべての CSS と HTML (画像などなし) でこれを達成するために私が見つけた最良の方法は、Lea Verou によるとCSS3 グラデーションを使用することです。彼女の解決策から:
div.round {
background:
-moz-radial-gradient(0 100%, circle, rgba(204,0,0,0) 14px, #c00 15px),
-moz-radial-gradient(100% 100%, circle, rgba(204,0,0,0) 14px, #c00 15px),
-moz-radial-gradient(100% 0, circle, rgba(204,0,0,0) 14px, #c00 15px),
-moz-radial-gradient(0 0, circle, rgba(204,0,0,0) 14px, #c00 15px);
background:
-o-radial-gradient(0 100%, circle, rgba(204,0,0,0) 14px, #c00 15px),
-o-radial-gradient(100% 100%, circle, rgba(204,0,0,0) 14px, #c00 15px),
-o-radial-gradient(100% 0, circle, rgba(204,0,0,0) 14px, #c00 15px),
-o-radial-gradient(0 0, circle, rgba(204,0,0,0) 14px, #c00 15px);
background:
-webkit-radial-gradient(0 100%, circle, rgba(204,0,0,0) 14px, #c00 15px),
-webkit-radial-gradient(100% 100%, circle, rgba(204,0,0,0) 14px, #c00 15px),
-webkit-radial-gradient(100% 0, circle, rgba(204,0,0,0) 14px, #c00 15px),
-webkit-radial-gradient(0 0, circle, rgba(204,0,0,0) 14px, #c00 15px);
background-position: bottom left, bottom right, top right, top left;
-moz-background-size: 50% 50%;
-webkit-background-size: 50% 50%;
background-size: 50% 50%;
background-repeat: no-repeat;
}
最終的な結果は、曲線を持つ透明なグラデーションのセットです。デモについては完全なJSFiddleを参照し、その外観を試してみてください。
rgba
明らかに、これはおよびのサポートに依存するため、プログレッシブ エンハンスメントとして扱う必要があります。または、設計に不可欠な場合は、古いブラウザー (特に、 IE9 までgradient
サポートしていない IE) 用の画像ベースのフォールバックを提供する必要があります。gradient
)。
これは、透明な円要素をボックス シャドウで隅に絶対配置することで実現できます。div
スパン、ボックス シャドウ、境界線、および疑似セレクターを含む非表示のオーバーフロー s の組み合わせを使用しました。
私の例をチェックしてください。
これは、開始するために必要な基本的な HTML と CSS です。
a {
display: inline-block;
width: 250px;
height: 100px;
background: #ccc;
border: 2px solid #000;
position: relative;
margin: 10px;
}
a div {
position: absolute;
top: 0;
overflow: hidden;
width: 15px;
height: 100%;
}
a div:after {
content: '';
background: #000;
width: 2px;
height: 75px;
position: absolute;
top: 12.5px;
}
a div:first-of-type {
left: -14px;
}
a div:first-of-type:after {
left: 0;
}
a div:last-of-type {
right: -14px;
}
a div:last-of-type:after {
right: 0;
}
a span {
display: block;
width: 30px;
height: 30px;
background: transparent;
position: absolute;
bottom: -20px;
right: -20px;
border: 2px solid #000;
border-radius: 25px;
box-shadow: 0 0 0 60px #ccc;
}
a div:first-of-type span {
left: -20px;
}
a div:first-of-type span:first-child {
top: -20px;
}
a div:first-of-type span:last-child {
bottom: -20px;
}
a div:last-of-type span {
right: -20px;
}
a div:last-of-type span:first-child {
top: -20px;
}
a div:last-of-type span:last-child {
bottom: -20px;
}
<a href="">
<div>
<span></span>
<span></span>
</div>
<div>
<span></span>
<span></span>
</div>
</a>
コーナーを透明にする必要があるとは思えませんが、背景がわかっている場合は、各コーナーに丸い境界線で div を作成できます。これらの div にページの背景と同じ背景色を指定すると、効果が機能します。
ここで私の例を参照してくださいhttp://jsfiddle.net/TdDtX/
#box {
position: relative;
margin: 30px;
width: 200px;
height: 100px;
background: #ccc;
border: 1px solid #333;
}
.corner {
position: absolute;
height: 10px;
width: 10px;
border: 1px solid #333;
background-color: #fff;
}
.top-left {
top: -1px;
left: -1px;
border-radius: 0 0 100% 0;
border-width: 0 1px 1px 0;
}
.top-right {
top: -1px;
left: 190px;
border-radius: 0 0 0 100%;
border-width: 0 0 1px 1px;
}
.bottom-left {
top: 90px;
left: -1px;
border-radius: 0 100% 0 0;
border-width: 1px 1px 0 0;
}
.bottom-right {
top: 90px;
left: 190px;
border-radius: 100% 0 0 0;
border-width: 1px 0 0 1px;
}
<div id="box">
<div class="corner top-left"></div>
<div class="corner top-right"></div>
<div class="corner bottom-left"></div>
<div class="corner bottom-right"></div>
</div>
body {
background: #fff;
}
.div{
position:relative;
}
.box {
background: #f7f7f7;
height: 178px;
width: 409px;
margin: 25px;
/*padding: 20px;*/
position: relative;
overflow: hidden;
border: 1px solid #ccc;
border-left: 0px;
}
.box:before {
content: "";
display: block;
background: #fff;
position: absolute;
top: -33px;
left: -263px;
width: 300px;
height: 242px;
border-radius: 300px;
border: 1px solid #ccc;
}
<div class="div">
<div class="box"></div>
</div>
</body>
</html>
それは可能ではないようです。何が起こるかを確認するために、負の値で境界半径を試しましたが、効果はありませんでした。
編集:
ボックスを小さなパーツに分割したとしても、ある時点で透明なはめ込みコーナーを作成する必要があります。透過性は、画像なしではこれが不可能になるかもしれないトリッキーな部分です。基本的に、周囲の背景が透明でない透明な円をレンダリングできる必要があります(CSSでそれが可能であれば、その方法を知りたいです:)
透明性が必要ない場合は、それを行う方法があります。
うーん、ここでこの小さなトリックを利用して、 Inset Border Radiusを作成できます
次に、透明性をサポートするには、間に他のブロックを追加する必要があります。多かれ少なかれ、古い丸みを帯びた画像が行われていた方法に似ています。透明な画像で隅々までスパンがあります。側面と上部にまたがり、空のスペースを埋めます。画像を使用する代わりに、このトリックを使用して CSS で行うことができます。
body {
background: #fff;
}
.div{
position:relative;
}
.box {
background: #f7f7f7;
height: 178px;
width: 409px;
margin: 25px;
/*padding: 20px;*/
position: relative;
overflow: hidden;
border: 1px solid #ccc;
border-left: 0px;
}
.box:before {
content: "";
display: block;
background: #fff;
position: absolute;
top: -33px;
left: -263px;
width: 300px;
height: 242px;
border-radius: 300px;
border: 1px solid #ccc;
}
<div class="div">
<div class="box"></div>
</div>
</body>
</html>