とにかく得ることのあるの丸みを帯びた角を上のアウトラインのdiv element
と同様に、border-radius
?
border: 5px red
and outline: 5px blue
とを使用した要素border-radius: 5px
、境界は丸められていますが、アウトラインは正方形です。
-moz-outline-radius
box-shadow
、あなたの生活の中で...
とにかく得ることのあるの丸みを帯びた角を上のアウトラインのdiv element
と同様に、border-radius
?
border: 5px red
and outline: 5px blue
とを使用した要素border-radius: 5px
、境界は丸められていますが、アウトラインは正方形です。
-moz-outline-radius
box-shadow
、あなたの生活の中で...
回答:
今は古い質問ですが、これは同様の問題を抱えている人には関係があるかもしれません。丸みのある入力フィールドが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">
outline: 0
Webアクセシビリティを破壊する。outlinenone.comを
box-shadow
は代替スタイルです(ここに示すように、実際の外観はと非常に似ていますoutline
)。
私は通常: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>
box-shadow
バージョンよりもはるかに柔軟であるため、気に入っています。たとえば、「アウトライン」を要素から離して配置したい場合(つまり、をシミュレートする場合outline-offset
)は、この手法で可能になります。
上記の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バリアントを省略しています。上記の結果を見ることができます
inset
しかし、私はを使用せず、欲しいものを手に入れました。
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>
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>
*画像の使用は別として
私はこれに対する素晴らしい解決策を見つけたばかりで、これまでのすべての回答を見てみたが、まだ投稿されていないのを目にした。だから、これが私がしたことです:
クラスのCSSルールを作成し、そのルールに:focusの疑似クラスを使用しました。私はoutline: none
、Chromeがデフォルトで使用するデフォルトの水色でボーダー半径のない「アウトライン」を削除するように設定しました。次に、:focus
そのアウトラインが存在しない同じ疑似クラスで、radiusプロパティとborderプロパティを追加しました。以下につながる
outline: none;
border-radius: 5px;
border: 2px solid maroon;
要素がユーザーによってタブ選択されたときに表示される、ボーダー半径を持つ栗色のアウトラインを作成します。
エンボスのような外観にしたい場合は、次のようにします。
.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>
他のブラウザでこの機能を使用するための回避策は見つかりませんでした。
編集:これを行うことができる他の唯一の方法は、ボックスシャドウを使用することですが、その要素に既にボックスシャドウがある場合、これは機能しません。
いいえ。境界線は要素の外側とボックスモデルのマージン領域の内側にあります。アウトラインは要素の内側にあり、ボックスモデルのパディング領域はそれを無視します。美学を目的としたものではありません。要素の概要をデザイナーに示すだけです。たとえば、htmlドキュメントの開発の初期段階では、開発者はすべての骨格divを正しい場所に配置したかどうかを迅速に識別する必要があるかもしれません。後で、さまざまなボタンやフォームが互いに離れた正しいピクセル数であるかどうかを確認する必要があります。
ボーダーは本質的に美的です。アウトラインとは異なり、それらは実際にはボックスモデルの一部です。つまり、マージンに設定されたテキストと重なりません:0; 境界線の両側を個別にスタイルできます。
コーナー半径をアウトラインに適用しようとしている場合は、ほとんどの人がボーダーを使用する方法で使用していると思います。それで、私に尋ねても構わないとしたら、輪郭のどの特性が国境より望ましいのですか?
見つけたLea Hayesの回答を少しひねります
input[type=text]:focus {
box-shadow: 0 0 0 1pt red;
outline-width: 1px;
outline-color: red;
}
本当にきれいな仕上がりになります。border-radiusを使用するときに取得するサイズのジャンプはありません
他の人が言ったように、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>
アウトラインを透明に設定するだけです。
input[type=text] {
outline: rgba(0, 0, 0, 0);
border-radius: 10px;
}
input[type=text]:focus {
border-color: #0079ff;
}
clip-path: circle(100px at center);
これは実際にはクリック可能な円のみを作成しますが、border-radiusは正方形を作成しますが、円のように見えます。
基本的な質問に対する単純な答えはノーです。クロスブラウザの唯一のオプションは、あなたが望むものを達成するハックを作成することです。このアプローチは、既存のコンテンツのスタイル設定に関して特定の潜在的な問題を伴いますが、他の多くのソリューションよりもアウトライン(オフセット、幅、線のスタイル)をよりカスタマイズできます。
基本的なレベルでは、次の静的な例を考えます(デモの抜粋を実行します)。
.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>
最後に、繰り返しになりますが、このアプローチを実装するには、デモに含めたスタイルよりも多くのスタイルが必要になる可能性があります。特に、概説したい要素のスタイルを既に設定している場合はそうです。