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
とgradient
のサポートに依存するため、プログレッシブエンハンスメントとして扱う必要があります。または、デザインに不可欠な場合は、古いブラウザーに画像ベースのフォールバックを提供する必要があります(特にIEでは、gradient
をIE9までサポートしていません)。
これは、ボックスの影のある隅に透明な円要素を絶対的に配置することで実現できます。スパン、ボックスシャドウ、境界線、および擬似セレクターを含む、オーバーフローした非表示のdivの組み合わせを使用しました。
example をチェックしてください。
これは、始めるために必要な基本的な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>
それは可能だとは思えません。何が起こるかを確認するためだけに負の値の境界半径を試しましたが、効果はありませんでした。
編集:
ボックスを小さなパーツに分割しても、ある時点で透明なインセットコーナーを作成する必要があります。透明度は、画像なしではこれが不可能になる可能性があるトリッキーな部分です。基本的に、非透明な周囲のbgで透明な円をレンダリングできる必要があります(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>
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>
うーん、ここでこの小さなトリックを使用して Inset Border Radius を作成できます。
次に、透明性をサポートするには、おそらく他のブロックを間に追加する必要があります。多かれ少なかれ、古い丸い画像が行われていた方法に似ています。透明な画像のあるすべての角にスパンがあります。そして、空のスペースを埋めるために、側面と上部にまたがります。画像を使用する代わりに、このトリックを使用してCSSで実行できます。