半径の輪郭を描く?


473

とにかく得ることのあるの丸みを帯びた角を上のアウトラインdiv elementと同様に、border-radius


2
さて、20pxボーダー半径の2pxグレーボーダーのDivボックスを取得しました。正方形ではなく、ボーダーに続く10px Outineをそのボーダーの周りに配置できるかどうか迷っていました
Marc Guerin

4
これは良い質問です。border: 5px redand outline: 5px blueとを使用した要素border-radius: 5px、境界は丸められていますが、アウトラインは正方形です。
マシュールディ

4
これまでのところ、我々は唯一のFirefoxでそれを使用することができます:-moz-outline-radius
ヴォイチェフBednarski

CSS3の一部である必要があります...考えて
みれ

17
すべての必要性のA君box-shadow、あなたの生活の中で...
ムハンマドUmer

回答:


538

今は古い質問ですが、これは同様の問題を抱えている人には関係があるかもしれません。丸みのある入力フィールドがborderあり、フォーカスアウトラインの色を変更したいと思っていました。恐ろしい四角outlineを入力コントロールに飼いならすことができませんでした。

代わりに、ボックスシャドウを使用しました。私は実際には影の滑らかな外観を好みましたが、丸みを帯びた輪郭をシミュレートするために影を強化することができます。

 /* Smooth outline with box-shadow: */
    .text1:focus {
        box-shadow: 0 0 3pt 2pt red;
    }

    /* Hard "outline" with box-shadow: */
    .text2:focus {
        box-shadow: 0 0 0 2pt red;
    }
<input type=text class="text1"> 
<br>
<br>
<br>
<br>
<input type=text class="text2">


24
IMO、これはあなたが探している答えです。私はこの方法を行ってきたが、0にあなたのアウトラインを回す見落とさないようにしてください
ジョン・モートン

2
これはまさに私が探していたものであり、輪郭の半径よりもうまくフィットします。
Zenexer 2013年

2
ハードアウトラインの例は機能しません。角の半径のない単なる長方形です。
Erik Aigner 2014

1
outline: 0Webアクセシビリティを破壊する。outlinenone.comを
ianstarz

4
@ianstarz、代替のスタイリングを提供しないとアクセシビリティが損なわれます。box-shadowは代替スタイルです(ここに示すように、実際の外観はと非常に似ていますoutline)。
ACJ

84

私は通常:after疑似要素を使用してこれを達成します:

もちろん、使用方法によって異なりますが、この方法では、ハードシャドウ方式を使用するのではなく、個々の境界線を制御できます。

また、-1pxのオフセットを設定し、バックグラウンドの線形グラデーション(境界線なし)を使用して、別の効果をもう一度設定することもできます。

body {
  margin: 20px;
}

a {
  background: #999;
  padding: 10px 20px;
  border-radius: 5px;
  text-decoration: none;
  color: #fff;
  position: relative;
  border: 2px solid #000;
}

a:after {
  content: '';
  display: block;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  border-radius: 5px;
  border: 2px solid #ccc;
}
<a href="#">Button</a>


3
変更された、もう少し素晴らしいバージョン:jsfiddle.net/rh6j3cdm
デヴィッド・Horvathの

2
入力フィールドに:: after擬似を作成することはできません
Simon Franzen

おかげで、これはreact-sortable-treeの検索クエリアウトラインと非常にうまく機能しました。
モナークワディア

このソリューションは、box-shadowバージョンよりもはるかに柔軟であるため、気に入っています。たとえば、「アウトライン」を要素から離して配置したい場合(つまり、をシミュレートする場合outline-offset)は、この手法で可能になります。
Kirk Woll

34

上記のLea Hayesに似ていますが、これが私がやった方法です:

div {
  background: #999;
  height: 100px;
  width: 200px;
  border: #999 solid 1px;
  border-radius: 10px;
  margin: 15px;
  box-shadow: 0px 0px 0px 1px #fff inset;
}
<div></div>

DIVまたはjQueryのネストは必要ありません。簡潔にするために、Althoは一部のCSSの-mozおよび-webkitバリアントを省略しています。上記の結果を見ることができます


6
彼は国境ではなく、アウトラインについて話している...「アウトライン」半径
android.nick

5
正解ですが、outline-radiusが使用できないため、このメソッドは境界線とアウトラインの外観を提供します。これは視覚的な効果であるため、Marcのデザインがピクセル単位で指定されていない限り、実際にoutlineプロパティを使用しないという事実は違いがありません。そして、それは実用的な解決策なので、投票に感謝します
ヘラルドモンキー

2
これはうまくいきました。insetしかし、私はを使用せず、欲しいものを手に入れました。
ポールシュライバー

18

Bootstrap navbarのドロップダウンメニューにフォーカスのアクセシビリティを提供したかったので、これにかなり満足しました。

     a.dropdown-toggle:focus {
         display: inline-block;
         box-shadow: 0 0 0 2px #88b8ff;
         border-radius: 2px;
     }
<a href="https://stackoverflow.com" class="dropdown-toggle">Visit Stackoverflow</a>


16

あなたはこのようなものを探していると思います。

div {
    -webkit-border-radius: 10px;
    -moz-border-radius: 10px;
    border-radius: 10px;
    border: 1px solid black;
    background-color: #CCC;
    height: 100px;
    width: 160px;
}

編集する

Firefoxのみが-moz-outline-radius適切にありますが、IE / Chrome / Safari / Opera / etc では機能しません。したがって、境界線の周りで曲線を取得する最もブラウザーに互換性のある方法のように見えます*ラッパーdivを使用することです:

div.inner {
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: 1px solid black;
  background-color: #CCC;
  height: 100px;
  width: 160px;
}

div.outer {
  display: inline-block;
  -webkit-border-radius: 10px;
  -moz-border-radius: 10px;
  border-radius: 10px;
  border: 1px solid red;
}
<div class="outer">
  <div class="inner"></div>
</div>


*画像の使用は別として


20
いいえ、私はあなたがアウトライン半径を得ることができればボーダー半径私が徘徊して取得する方法を知っている
マルク・ゲラン

正確にはどういう意味ですか?このように太いアウトラインですか?jsfiddle.net/mattball/NXZFv/1
マットボール

10
@マット:明らかに、境界ではなく曲線の輪郭w3.org/TR/CSS21/ui.html#dynamic-outlines
Joey

20pxボーダー半径の2pxグレーボーダーのDivボックスがあります。正方形ではなく、ボーダーに続く10px Outineをそのボーダーの周りに配置できるかどうか迷っていました。
Marc Guerin

1
コードマットに1つ追加するだけです。内側のボックスの境界線の半径を数px落とすと、角が非常に狭くなります。助けてくれてありがとう
Marc Guerin

7

私はこれに対する素晴らしい解決策を見つけたばかりで、これまでのすべての回答を見てみたが、まだ投稿されていないのを目にした。だから、これが私がしたことです:

クラスのCSSルールを作成し、そのルールに:focusの疑似クラスを使用しました。私はoutline: none、Chromeがデフォルトで使用するデフォルトの水色でボーダー半径のない「アウトライン」を削除するように設定しました。次に、:focusそのアウトラインが存在しない同じ疑似クラスで、radiusプロパティとborderプロパティを追加しました。以下につながる

outline: none;
border-radius: 5px;
border: 2px solid maroon;

要素がユーザーによってタブ選択されたときに表示される、ボーダー半径を持つ栗色のアウトラインを作成します。


「outline:0」または「outline:none」を使用することは悪い習慣と見なされ、ユーザーのアクセシビリティを台無しにします。現時点では修正方法はありませんが、アウトラインを可能な限り削除しない方がよい理由と、どうしても必要な場合の対処方法についての記事を次に示します。CSSアウトラインを削除しないでください
AndrewBrntt

5

outline-style: autoIt's on WebKitsレーダーを設定することで、私たちの願いがすぐにわかるかもしれません:http ://trac.webkit.org/changeset/198062/webkit

2030年のyaを参照してください。


5

エンボスのような外観にしたい場合は、次のようにします。

.embossed {
  background: #e5e5e5;
  height: 100px;
  width: 200px;
  border: #FFFFFF solid 1px;
  outline: #d0d0d0 solid 1px;
  margin: 15px;
}

.border-radius {
  border-radius: 20px 20px 20px 20px;
  -webkit-border-radius: 20px;
  -moz-border-radius: 20px;
  -khtml-border-radius: 20px;
}

.outline-radius {
  -moz-outline-radius: 21px;
}
<div class="embossed"></div>
<div class="embossed border-radius"></div>
<div class="embossed border-radius outline-radius">-MOZ ONLY</div>

他のブラウザでこの機能を使用するための回避策は見つかりませんでした。

編集:これを行うことができる他の唯一の方法は、ボックスシャドウを使用することですが、その要素に既にボックスシャドウがある場合、これは機能しません。


1
同じ要素に複数のシャドウを使用して、それらをコンマで区切ることができます。
Bangash 2014

2

枠なしのアウトラインのみが必要な場合の解決策があります。私のものではありません。Bootstrap cssファイルから取得した場合。を指定するとoutline: 1px auto certain_color、特定の色のdivの周りに細い外側の線が表示されます。この場合、指定した幅は関係ありません。10pxの幅を指定しても、とにかく細い線になります。上記のルールのキーワードは「自動」です。
角が丸く、特定の幅のアウトラインが必要な場合は、必要な幅と同じ色のボーダーにCSSルールを追加できます。輪郭を太くします。


2

私の知る限り、これOutline radiusはFirefoxとAndroid版Firefoxでのみサポートされています。

-moz-outline-radius: 1em;

ここに画像の説明を入力してください


1

いいえ。境界線は要素の外側とボックスモデルのマージン領域の内側にあります。アウトラインは要素の内側にあり、ボックスモデルのパディング領域はそれを無視します。美学を目的としたものではありません。要素の概要をデザイナーに示すだけです。たとえば、htmlドキュメントの開発の初期段階では、開発者はすべての骨格divを正しい場所に配置したかどうかを迅速に識別する必要があるかもしれません。後で、さまざまなボタンやフォームが互いに離れた正しいピクセル数であるかどうかを確認する必要があります。

ボーダーは本質的に美的です。アウトラインとは異なり、それらは実際にはボックスモデルの一部です。つまり、マージンに設定されたテキストと重なりません:0; 境界線の両側を個別にスタイルできます。

コーナー半径をアウトラインに適用しようとしている場合は、ほとんどの人がボーダーを使用する方法で使用していると思います。それで、私に尋ねても構わないとしたら、輪郭のどの特性が国境より望ましいのですか?


10
アウトラインの目的は、キーボードナビゲーション/アクセシビリティのためであり、要素がどこにあるかを開発者に示すことではありません
danwellman

まあ、それはブラウザがデフォルトでそれらを使用するものです。しかし、私は常にそれらを使用して、私のdivがどこにあるかを確認し、大きな効果を上げてきました。
Musixauce3000 2016年

「ボーダーは要素の外側とボックスモデルのマージン領域の内側にあります。アウトラインは要素の内側にあり、ボックスモデルのパディング領域はそれを無視します。」
ジャック

1

ボックスシャドウとアウトラインの組み合わせ。

見つけたLea Hayesの回答を少しひねります

input[type=text]:focus {
    box-shadow: 0 0 0 1pt red;
    outline-width: 1px;
    outline-color: red;
}

本当にきれいな仕上がりになります。border-radiusを使用するときに取得するサイズのジャンプはありません


1

他の人が言ったように、Firefoxだけがこれをサポートします。これは同じことを行う回避策であり、破線のアウトラインでも機能します。

例

.has-outline {
    display: inline-block;
    background: #51ab9f;
    border-radius: 10px;
    padding: 5px;
    position: relative;
}
.has-outline:after {
  border-radius: 10px;
  padding: 5px;
  border: 2px dashed #9dd5cf;
  position: absolute;
  content: '';
  top: -2px;
  left: -2px;
  bottom: -2px;
  right: -2px;
}
<div class="has-outline">
  I can haz outline
</div>


0

ボーダーにパディングと背景色を使用してから、アウトラインにボーダーを使用してみてください。

.round_outline {
  padding: 8px;
  background-color: white;
  border-radius: 50%;
  border: 1px solid black;
}

私の場合は働いた。


0

アウトラインを透明に設定するだけです。

input[type=text] {
  outline: rgba(0, 0, 0, 0);
  border-radius: 10px;
}

input[type=text]:focus {    
  border-color: #0079ff;
}

0

私はこのように好きです。

.circle:before {
   content: "";
   width: 14px;
   height: 14px;
   border: 3px solid #fff;
   background-color: #ced4da;
   border-radius: 7px;
   display: inline-block;
   margin-bottom: -2px;
   margin-right: 7px;
   box-shadow: 0px 0px 0px 1px #ced4da;
}

周囲にウィットの境界線があり、境界線の周りが1pxの灰色の円が作成されます。


0
clip-path: circle(100px at center);

これは実際にはクリック可能な円のみを作成しますが、border-radiusは正方形を作成しますが、円のように見えます。


0

基本的な質問に対する単純な答えはノーです。クロスブラウザの唯一のオプションは、あなたが望むものを達成するハックを作成することです。このアプローチは既存のコンテンツのスタイル設定に関して特定の潜在的な問題を伴いますが、他の多くのソリューションよりもアウトライン(オフセット、幅、線のスタイル)をよりカスタマイズできます。

基本的なレベルでは、次の静的な例を考えます(デモの抜粋を実行します)。

.outline {
    border: 2px dotted transparent;
    border-radius: 5px;
    display: inline-block;
    padding: 2px;
    margin: -4px;
}

/* :focus-within does not work in Edge or IE */
.outline:focus-within, .outline.edge {
    border-color: blue;
}

br {
    margin-bottom: 0.75rem;
}
<h3>Javascript-Free Demo</h3>
<div class="outline edge"><input type="text" placeholder="I always have an outline"/></div><br><div class="outline"><input type="text" placeholder="I have an outline when focused"/></div> *<i>Doesn't work in Edge or IE</i><br><input type="text" placeholder="I have never have an outline" />
<p>Note that the outline does not increase the spacing between the outlined input and other elements around it. The margin (-4px) compensates for the space that the outlines padding (-2px) and width (2px) take up, a total of 4px.</p>

これで、より高度なレベルでは、JavaScriptを使用して特定のタイプまたはクラスの要素をブートストラップし、ページの読み込み時にアウトラインをシミュレートするdiv内にラップすることが可能になります。さらに、イベントバインディングを確立して、次のようなユーザー操作のアウトラインを表示または非表示にすることができます(以下のスニペットを実行するか、JSFiddleで開きます)。

h3 {
  margin: 0;
}

div {
  box-sizing: border-box;
}

.flex {
  display: flex;
}

.clickable {
  cursor: pointer;
}

.box {
  background: red;
  border: 1px solid black;
  border-radius: 10px;
  height: 5rem;
  display: flex;
  align-items: center;
  text-align: center;
  color: white;
  font-weight: bold;
  padding: 0.5rem;
  margin: 1rem;
}
<h3>Javascript-Enabled Demo</h3>
<div class="flex">
  <div class="box outline-me">I'm outlined because I contain<br>the "outline-me" class</div>
  <div class="box clickable">Click me to toggle outline</div>
</div>
<hr>
<input type="text" placeholder="I'm outlined when focused" />

<script>
// Called on an element to wrap with an outline and passed a styleObject
// the styleObject can contain the following outline properties:
// 		style, width, color, offset, radius, bottomLeftRadius,
//		bottomRightRadius, topLeftRadius, topRightRadius
// It then creates a new div with the properties specified and 
// moves the calling element into the div
// The newly created wrapper div receives the class "simulated-outline"
Element.prototype.addOutline = function (styleObject, hideOutline = true) {
    var element = this;

    // create a div for simulating an outline
    var outline = document.createElement('div');

    // initialize css formatting
    var css = 'display:inline-block;';

    // transfer any element margin to the outline div
    var margins = ['marginTop', 'marginBottom', 'marginLeft', 'marginRight'];
    var marginPropertyNames = { 
        marginTop: 'margin-top',
        marginBottom: 'margin-bottom',
        marginLeft: 'margin-left',
        marginRight: 'margin-right'
    }
    var outlineWidth = Number.parseInt(styleObject.width);
    var outlineOffset = Number.parseInt(styleObject.offset);
    for (var i = 0; i < margins.length; ++i) {
        var computedMargin = Number.parseInt(getComputedStyle(element)[margins[i]]);
        var margin = computedMargin - outlineWidth - outlineOffset;
        css += marginPropertyNames[margins[i]] + ":" + margin + "px;";
    }
    element.style.cssText += 'margin:0px !important;';
    
    // compute css border style for the outline div
    var keys = Object.keys(styleObject);
    for (var i = 0; i < keys.length; ++i) {
        var key = keys[i];
        var value = styleObject[key];
        switch (key) {
            case 'style':
                var property = 'border-style';
                break;
            case 'width':
                var property = 'border-width';
                break;
            case 'color':
                var property = 'border-color';
                break;
            case 'offset':
                var property = 'padding';
                break;
            case 'radius':
                var property = 'border-radius';
                break;
            case 'bottomLeftRadius':
                var property = 'border-bottom-left-radius';
                break;
            case 'bottomRightRadius':
                var property = 'border-bottom-right-radius';
                break;
            case 'topLeftRadius':
                var property = 'border-top-left-radius-style';
                break;
            case 'topRightRadius':
                var property = 'border-top-right-radius';
                break;
        }
        css += property + ":" + value + ';';
    }
    
    // apply the computed css to the outline div
    outline.style.cssText = css;
    
    // add a class in case we want to do something with elements
    // receiving a simulated outline
    outline.classList.add('simulated-outline');
    
    // place the element inside the outline div
    var parent = element.parentElement;
    parent.insertBefore(outline, element);
    outline.appendChild(element);

    // determine whether outline should be hidden by default or not
    if (hideOutline) element.hideOutline();
}

Element.prototype.showOutline = function () {
    var element = this;
    // get a reference to the outline element that wraps this element
    var outline = element.getOutline();
    // show the outline if one exists
    if (outline) outline.classList.remove('hide-outline');
}


Element.prototype.hideOutline = function () {
    var element = this;
    // get a reference to the outline element that wraps this element
    var outline = element.getOutline();
    // hide the outline if one exists
    if (outline) outline.classList.add('hide-outline');
}

// Determines if this element has an outline. If it does, it returns the outline
// element. If it doesn't have one, return null.
Element.prototype.getOutline = function() {
    var element = this;
    var parent = element.parentElement;
    return (parent.classList.contains('simulated-outline')) ? parent : null;
}

// Determines the visiblity status of the outline, returning true if the outline is
// visible and false if it is not. If the element has no outline, null is returned.
Element.prototype.outlineStatus = function() {
    var element = this;
    var outline = element.getOutline();
    if (outline === null) {
        return null;
    } else {
        return !outline.classList.contains('hide-outline');
    }
}

// this embeds a style element in the document head for handling outline visibility
var embeddedStyle = document.querySelector('#outline-styles');
if (!embeddedStyle) {
    var style = document.createElement('style');
    style.innerText = `
        .simulated-outline.hide-outline {
            border-color: transparent !important;
        }
    `;
    document.head.append(style);
}


/*########################## example usage ##########################*/

// add outline to all elements with "outline-me" class
var outlineMeStyle = {
    style: 'dashed',
    width: '3px',
    color: 'blue',
    offset: '2px',
    radius: '5px'
};
document.querySelectorAll('.outline-me').forEach((element)=>{
  element.addOutline(outlineMeStyle, false);
});


// make clickable divs get outlines
var outlineStyle = {
    style: 'double',
    width: '4px',
    offset: '3px',
    color: 'red',
    radius: '10px'
};
document.querySelectorAll('.clickable').forEach((element)=>{
    element.addOutline(outlineStyle);
    element.addEventListener('click', (evt)=>{
        var element = evt.target;
        (element.outlineStatus()) ? element.hideOutline() : element.showOutline();
    });
});


// configure inputs to only have outline on focus
document.querySelectorAll('input').forEach((input)=>{
    var outlineStyle = {
        width: '2px',
        offset: '2px',
        color: 'black',
        style: 'dotted',
        radius: '10px'
    }
    input.addOutline(outlineStyle);
    input.addEventListener('focus', (evt)=>{
        var input = evt.target;
        input.showOutline();
    });
    input.addEventListener('blur', (evt)=>{
        var input = evt.target;
        input.hideOutline();
    });
});
</script>

最後に、繰り返しになりますが、このアプローチを実装するには、デモに含めたスタイルよりも多くのスタイルが必要になる可能性があります。特に、概説したい要素のスタイルを既に設定している場合はそうです。

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