Ana hat yarıçapı?


473

Neyse alma var mı yuvarlatılmış köşeler üzerinde anahat a div elementbenzer, border-radius?


2
Peki 20px kenarlık yarıçaplı 2px Gri Kenarlıklı bir Div kutum var, o zaman o Kenarlığın etrafında kare olmaktan ziyade Sınırı takip eden 10px Outine'im varsa dolaşıyordum
Marc Guerin

4
Bu iyi bir soru. border: 5px redVe outline: 5px blueve öğelerine sahip bir öğe border-radius: 5pxyuvarlanır, ancak anahat kare şeklindedir.
Matthew Rudy

4
Şimdiye kadar sadece Firefox'ta kullanabiliriz:-moz-outline-radius
Wojciech Bednarski


17
Eğer tüm ihtiyacı box-shadowhayatında ..
Muhammed Umer

Yanıtlar:


538

Eski soru şimdi, ama bu benzer bir sorunu olan biri için geçerli olabilir. Yuvarlak bir giriş alanım vardı borderve odak çerçevesinin rengini değiştirmek istedim. Korkunç kareyi outlinegiriş kontrolüne evcilleştiremedim .

Bunun yerine kutu gölgesi kullandım. Aslında gölgenin pürüzsüz görünümünü tercih ettim, ancak gölge yuvarlak bir anahattı simüle etmek için sertleştirilebilir:

 /* 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, aradığınız cevap bu. Bu yöntemi yaptım ancak taslağınızı 0'a çevirmeyi göz ardı etmeyin
John Morton

2
Bu tam da aradığım şeydi ve anahat yarıçapından bile daha iyi uyuyor.
Zenexer

2
Zor anahat örneği çalışmaz. Köşe yarıçapı olmayan bir dikdörtgen.
Erik Aigner

1
outline: 0web erişilebilirliğini bozar; outlinenone.com
ianstarz

4
@ianstarz, alternatif bir stil sunmadığınızda erişilebilirliği bozar. box-shadowalternatif stildir (burada sunulduğu gibi görünüşte aslında çok benzerdir outline).
ACJ

84

Genellikle: after pseudo-element:

Tabii ki kullanıma bağlıdır, bu yöntem sabit gölge yöntemini kullanmak yerine bireysel sınırlar üzerinde kontrol sağlar.

Ayrıca -1px ofsetleri ayarlayabilir ve farklı bir efekt için bir arka plan doğrusal degrade (kenarlık yok) kullanabilirsiniz.

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
Değiştirilmiş ve biraz daha muhteşem bir sürüm: jsfiddle.net/rh6j3cdm .
Dávid Horváth

2
Bir giriş alanı için bir :: sonrası sözde yapmak mümkün değildir
Simon Franzen

teşekkürler, bu tepki-sortable-tree'ın arama sorgusu ana hatları ile ÇOK iyi çalıştı!
Monarch Wadia

Bu çözümü seviyorum çünkü box-shadowversiyondan çok daha esnek . Örneğin, "taslağın" elemandan uzağa (yani simüle outline-offset) ayrılmasını istiyorsanız, bu teknikle mümkün olur.
Kirk Woll

34

Yukarıdaki Lea Hayes'e benzer, ancak işte böyle yaptım:

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'lerin veya jQuery'nin yuvalanması gerekmez, kısalık için Altho, bazı CSS'nin -moz ve -webkit varyantlarını dışarıda bıraktım. Yukarıdaki sonucu görebilirsiniz


6
O sınırdan değil, ana hattan bahsediyor ... "anahat" yarıçapı
android.nick

5
doğru, ancak anahat yarıçapı kullanılamadığından, yöntemim bir kenarlığın yanı sıra bir anahat görünümü de veriyor. Bu görsel bir efekttir, bu yüzden Marc'ın tasarımı pikselin altında belirtilmedikçe, aslında anahat özelliğini kullanmadığı gerçeği hiçbir fark yaratmaz. Pratik bir çözüm olduğundan, oylamayı takdir ediyorum
Heraldmonkey

2
Bu harika çalıştı. insetYine de kullanmadım ve istediğimi aldım.
Paul Schreiber

18

Bir Bootstrap gezinme çubuğundaki açılır menüler için bazı güzel odak erişilebilirliği istedim ve bundan oldukça memnun kaldım:

     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

Bence böyle bir şey arıyorsun .

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

Düzenle

Sadece bir Firefox var -moz-outline-radius, ancak bu IE / Chrome / Safari / Opera / vb. Yani, bir kenarlık çevresinde kavisli bir çizgi elde etmek için en çapraz tarayıcı uyumlu yol * gibi görünüyor bir sarmalayıcı div kullanmaktır:

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>


* resimleri kullanmanın yanı sıra


20
Hayır, eğer bir Anahat Yarıçapı alabiliyorsanız, dolaştığım Sınır Yarıçapını nasıl alacağımı biliyorum
Marc Guerin

Tam olarak ne demek istiyorsun? Daha kalın bir taslak, böyle mi? jsfiddle.net/mattball/NXZFv/1
Matt Ball

10
@Matt: sınır yerine kavisli bir anahat . Bkz. W3.org/TR/CSS21/ui.html#dynamic-outlines
Joey

Peki 20px kenar yarıçaplı 2px Gri Kenarlıklı bir Div kutum var, o zaman o Kenarlığın etrafında kare olmak yerine onu takip eden 10px'lik bir Outine alabilirsem dolaşıyordum.
Marc Guerin

1
Mat kodunuza sadece bir ek, sınır yarıçapını iç kutuya birkaç piksel düşürürseniz, köşe çok daha sıkı hale gelir, yardımınız için teşekkürler
Marc Guerin

7

Bunun için harika bir çözüm buldum ve şu ana kadar verilen tüm yanıtlara baktıktan sonra henüz yayınlanmadığını gördüm. İşte yaptığım şey:

Sınıf için bir CSS Kuralı oluşturdum ve sözde kural için: sözde sınıfı kullanılır. outline: noneChrome'un varsayılan olarak kullandığı varsayılan açık mavi sınırsız yarıçapa sahip 'anahattan' kurtulmak için ayarladım . Sonra, :focusbu anahatların artık olmadığı aynı sözde sınıfta, yarıçap ve kenarlık özelliklerimi ekledim. Aşağıdakilere öncülük etmek

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

öğe kullanıcı tarafından sekme seçildiğinde görüntülenen kenarlık yarıçapına sahip bordo renkli bir taslağa sahip olmak için.


"Anahat: 0" veya "ana hat: hiçbiri" kullanmak kötü uygulama olarak kabul edilir ve kullanıcının erişilebilirliğini bozar. Bu noktada, bir düzeltmem yok, ancak burada mümkünse anahattı neden kaldırmamanız ve kesinlikle yapmanız gerekiyorsa ne yapmanız gerektiği hakkında bir makale var. Asla CSS anahatlarını kaldır
AndrewBrntt


5

Kabartmalı bir görünüm elde etmek istiyorsanız, aşağıdakine benzer bir şey yapabilirsiniz:

.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>

Bu tarayıcıyı başka tarayıcılarda kullanmak için bir çözüm bulamadım.

DÜZENLEME: Bunu yapmanın diğer tek yolu kutu-gölge kullanmaktır, ancak bu öğe üzerinde zaten bir kutu gölgeye sahipseniz bu çalışmaz.


1
Aynı öğede virgülle ayırarak birden fazla gölge kullanabilirsiniz.
Bangash

2

Sadece kenarlıksız taslağa ihtiyacınız varsa çözüm var. Benim değil. Bootstrap css dosyasından aldım. Eğer belirtirseniz outline: 1px auto certain_color, belirli rengin div etrafında ince dış hat almak gerekir. Bu durumda, belirtilen genişlik önemli değildir, 10 piksel genişlik belirtseniz bile, yine de ince çizgi olacaktır. Bahsedilen kuraldaki anahtar kelime "otomatik" tir.
Yuvarlatılmış köşeleri ve belirli genişliği olan bir taslağa ihtiyacınız varsa, gerekli genişliğe ve aynı renge sahip kenarlığa css kuralı ekleyebilirsiniz. Anahatları kalınlaştırır.


2

Bildiğim kadarıyla Outline radius, sadece Android için Firefox ve Firefox tarafından destekleniyor.

-moz-outline-radius: 1em;

resim açıklamasını buraya girin


1

Hayır. Kenarlıklar öğenin dışına ve kutu modeli kenar boşluğu alanının içine oturur. Anahatlar öğenin içine oturur ve kutu modeli dolgu alanı onu yok sayar. Estetik amaçlı değildir. Sadece tasarımcıya elementlerin ana hatlarını göstermek. Örneğin, bir html belgesi geliştirmenin ilk aşamalarında, bir geliştiricinin tüm iskelet div'larını doğru yere yerleştirdiyse hızlı bir şekilde ayırt etmesi gerekebilir. Daha sonra, çeşitli düğmelerin ve formların birbirinden doğru piksel sayısının doğru olup olmadığını kontrol etmeleri gerekebilir.

Sınırlar doğada estetiktir. Ana hatların aksine, aslında kutu modelinden ayrıdırlar, yani kenar boşluğuna ayarlanmış metinleri örtüşmezler: 0; ve kenarlığın her tarafı ayrı ayrı şekillendirilebilir.

Anahatta bir köşe yarıçapı uygulamaya çalışıyorsanız, çoğu insanın kenarlığı kullanma şeklini kullandığınızı varsayıyorum. Peki, sormamın bir sakıncası yoksa, taslağın hangi özelliği sınırda istenir?


10
Ana hatların amacı, geliştiricilere öğelerin nerede olduğunu göstermemek için klavye navigasyonu / erişilebilirliği içindir
danwellman

Tarayıcılar bunları varsayılan olarak kullanır. Ama onları her zaman divlerimin nerede olduğunu görmek için kullandım, büyük bir etki yarattı.
Musixauce3000

+1, "Kenarlar öğenin dışına ve kutu modeli kenar boşluğu alanının içine oturur. Anahatlar öğenin içine oturur ve kutu modeli dolgu alanı onu yok sayar."
Jacques

1

KUTU GÖLGESİ VE ÇİZGİ BİRLEŞTİRME.

Lea Hayes cevabında hafif bir bükülme buldum

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

gerçekten güzel ve temiz bir yüzey elde ediyor. Kenarlık yarıçapı kullanırken elde ettiğiniz boyutta atlama yok


1

Diğerlerinin söylediği gibi, sadece firefox bunu desteklemektedir. İşte aynı şeyi yapan bir çalışma ve kesik anahatlarla bile çalışıyor.

misal

.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

Kenarlık için dolgu ve arka plan rengi, ardından anahat için bir kenarlık kullanmayı deneyin:

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

Benim durumumda çalıştı.


0

Sadece anahatları şeffaflaştırdım.

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

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

0

Bu yolu seviyorum.

.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;
}

Etrafında zekâ kenarlığı olan gri bir daire oluşturacak ve yine sınır etrafında 1 piksel olacak!


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

Kenarlık yarıçapı hala bir kare oluştururken, daire gibi görünüyorsa, bu aslında yalnızca tıklanabilir daire yapar.


0

Temel sorunun basit cevabı hayır. Tek çapraz tarayıcı seçeneği, istediğinizi gerçekleştiren bir kesmek oluşturmaktır. Bu yaklaşım, önceden var olan içeriği şekillendirme konusunda bazı potansiyel sorunları beraberinde getirir, ancak anahattın (ofset, genişlik, çizgi stili) diğer çözümlerin çoğundan daha fazla özelleştirilmesini sağlar.

Temel düzeyde, aşağıdaki statik örneği göz önünde bulundurun (demo için snipent'i çalıştırın):

.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>

Şimdi, daha gelişmiş bir düzeyde, belirli bir tür veya sınıftaki öğeleri önyüklemek için JavaScript kullanmak mümkün olacak, böylece sayfa yüklemesinde anahattı simüle eden bir div içine sarılacaklar. Ayrıca, bunun gibi kullanıcı etkileşimlerindeki ana hatları göstermek veya gizlemek için olay bağlamaları oluşturulabilir (aşağıdaki snippet'i çalıştırın veya JSFiddle'da açın ):

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>

Kapanışta, bu yaklaşımı uygulamanın demolarıma eklediğimden daha fazla stil gerektirebileceğini, özellikle de özetlemek istediğiniz öğeyi zaten şekillendirdiyseniz tekrarlayayım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.