Radius garis besar?

473

Apakah ada pula untuk mendapatkan sudut dibulatkan pada garis dari div element, mirip dengan border-radius?

Marc Guerin
sumber
2
Yah saya sudah mendapatkan kotak Div ​​dengan Perbatasan Abu-abu 2px dengan radius batas 20px, saya berkeliaran jika saya dapat memiliki Outp 10px di sekitar Perbatasan yang mengikuti Perbatasan daripada persegi
Marc Guerin
4
Ini pertanyaan yang bagus. Elemen dengan border: 5px reddan outline: 5px bluedan border-radius: 5px, batasnya bulat, tetapi garis besarnya persegi.
Matthew Rudy
4
Sejauh ini kami hanya dapat menggunakannya di Firefox:-moz-outline-radius
Wojciech Bednarski
Itu harus menjadi bagian dari CSS3 ... Jika saya memikirkannya - Saya benci W3C: D
m93a
17
Anda semua membutuhkan box-shadowdalam hidup Anda ..
Muhammad Umer

Jawaban:

539

Pertanyaan lama sekarang, tetapi ini mungkin relevan untuk seseorang dengan masalah serupa. Saya memiliki bidang input dengan bulat borderdan ingin mengubah warna garis fokus. Saya tidak bisa menjinakkan kotak yang mengerikan outlineke kontrol input.

Jadi sebagai gantinya, saya menggunakan bayangan kotak. Sebenarnya saya lebih suka tampilan yang halus dari bayangan, tetapi bayangan dapat diperkeras untuk mensimulasikan garis bulat:

 /* 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">

Lea Hayes
sumber
24
IMO, ini jawaban yang Anda cari. Saya telah melakukan metode ini tetapi jangan mengabaikan mengubah kerangka Anda menjadi 0.
John Morton
2
Ini adalah persis apa yang saya cari, dan bahkan lebih cocok daripada radius garis besar.
Zenexer
2
Contoh garis keras tidak berfungsi. Itu hanya persegi panjang tanpa jari-jari sudut.
Erik Aigner
1
outline: 0memutus aksesibilitas web; baca outlinenone.com
ianstarz
4
@ianstarz, ini merusak aksesibilitas saat Anda tidak memberikan gaya alternatif. box-shadowadalah gaya alternatif (yang, seperti yang disajikan di sini, sebenarnya sangat mirip dalam penampilan outline).
ACJ
84

Saya biasanya melakukan ini menggunakan: after pseudo-element:

tentu saja itu tergantung pada penggunaan, metode ini memungkinkan kontrol atas batas individu, daripada menggunakan metode bayangan keras.

Anda juga dapat mengatur offset -1px dan menggunakan gradien linier latar belakang (tanpa batas) untuk efek yang berbeda sekali lagi.

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>

mononim
sumber
3
Versi yang dimodifikasi dan sedikit lebih spektakuler: jsfiddle.net/rh6j3cdm .
Dávid Horváth
2
Tidak mungkin membuat :: setelah pseudo untuk bidang input
Simon Franzen
terima kasih, ini SANGAT berfungsi dengan baik dengan menguraikan kueri penelusuran pohon yang dapat diurutkan!
Monarch Wadia
Saya suka solusi ini karena jauh lebih fleksibel daripada box-shadowversi. Misalnya, jika Anda ingin "garis besar" ditempatkan jauh dari elemen (yaitu mensimulasikan outline-offset) menjadi mungkin dengan teknik ini.
Kirk Woll
34

Mirip dengan Lea Hayes di atas, tapi beginilah cara saya melakukannya:

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>

Tidak perlu bersarang DIV atau jQuery, Altho untuk singkatnya saya telah meninggalkan varian -moz dan -webkit dari beberapa CSS. Anda dapat melihat hasilnya di atas

Heraldmonkey
sumber
6
Dia berbicara tentang GARIS BESAR, bukan garis batas ... "garis besar"
android.nick
5
benar, tetapi karena garis-jari-jari tidak tersedia, metode saya memberikan tampilan batas serta garis besar. Ini adalah efek visual, jadi kecuali desain Marc ditentukan-turun-ke-pixel, fakta bahwa itu tidak benar-benar menggunakan properti garis besar tidak ada bedanya. Dan karena ini solusi praktis, saya akan menghargai suara kembali
Heraldmonkey
2
Ini bekerja dengan baik. Saya tidak menggunakan inset, dan mendapatkan apa yang saya inginkan.
Paul Schreiber
18

Saya ingin aksesibilitas fokus yang bagus untuk menu dropdown di navbar Bootstrap, dan cukup senang dengan ini:

     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>

StackOverflowUser
sumber
16

Anda sedang mencari sesuatu seperti ini , saya pikir.

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

Edit

Ada Firefox-only -moz-outline-radiusdengan benar, tetapi itu tidak akan berfungsi pada IE / Chrome / Safari / Opera / dll. Jadi, sepertinya cara paling kompatibel lintas-browser * untuk mendapatkan garis melengkung di sekitar perbatasan adalah dengan menggunakan pembungkus 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>


* Selain menggunakan gambar

Matt Ball
sumber
20
Tidak, saya tahu cara mendapatkan Border Radius yang saya jalani jika Anda bisa mendapatkan Outline-Radius
Marc Guerin
Berarti apa, tepatnya? Garis yang lebih tebal, seperti ini? jsfiddle.net/mattball/NXZFv/1
Matt Ball
10
@ Mat: garis lengkung bukannya perbatasan , jelas. Lihat w3.org/TR/CSS21/ui.html#dynamic-outlines
Joey
Yah saya sudah mendapatkan kotak Div ​​dengan Perbatasan Abu-abu 2px dengan radius batas 20px, saya berkeliaran jika saya dapat memiliki Outp 10px di sekitar Perbatasan yang mengikuti Perbatasan daripada persegi.
Marc Guerin
1
Hanya satu tambahan untuk kode Anda matt, jika Anda menjatuhkan jari-jari perbatasan beberapa px pada kotak bagian dalam sudut kemudian menjadi jauh lebih ketat, terima kasih atas bantuan Anda
Marc Guerin
7

Saya baru saja menemukan solusi yang bagus untuk ini, dan setelah melihat semua tanggapan sejauh ini, saya belum melihatnya diposting. Jadi, inilah yang saya lakukan:

Saya membuat Aturan CSS untuk kelas dan menggunakan pseudo-class: fokus untuk aturan itu. Saya menetapkan outline: noneuntuk menyingkirkan 'garis besar' biru-biru-radius-bawaan default yang digunakan Chrome secara default. Kemudian, dalam :focuspseudo-class yang sama , di mana garis itu tidak ada lagi, saya menambahkan radius dan properti perbatasan saya. Mengarah ke berikut ini

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

untuk memiliki garis merah marun dengan jari-jari perbatasan yang sekarang muncul ketika elemen dipilih oleh pengguna.

Branden Pinney
sumber
Menggunakan "garis besar: 0", atau "garis besar: tidak ada" dianggap praktik buruk dan mengacaukan aksesibilitas pengguna. Pada titik ini, saya tidak memiliki perbaikan, tetapi di sini ada artikel tentang mengapa Anda tidak harus menghapus garis besar jika mungkin dan apa yang harus dilakukan jika Anda benar-benar harus. Jangan pernah menghapus garis besar CSS
AndrewBrntt
5

Jika Anda ingin mendapatkan tampilan timbul Anda dapat melakukan sesuatu seperti berikut:

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

Saya belum menemukan cara lain untuk melakukan ini di browser lain.

EDIT: Satu-satunya cara Anda bisa melakukan ini adalah dengan menggunakan bayangan kotak, tapi kemudian ini tidak akan berfungsi jika Anda sudah memiliki bayangan kotak pada elemen itu.

James Kyle
sumber
1
Anda dapat menggunakan beberapa bayangan pada elemen yang sama, memisahkannya dengan koma.
Bangash
2

Ada solusinya jika Anda hanya perlu garis besar tanpa batas. Itu bukan milikku. Saya dapatkan jika dari file Bootstrap css. Jika Anda menentukan outline: 1px auto certain_color, Anda akan mendapatkan garis luar tipis di sekitar div warna tertentu. Dalam hal ini lebar yang ditentukan tidak masalah, bahkan jika Anda menentukan lebar 10 px, toh itu akan menjadi garis tipis. Kata kunci dalam aturan yang disebutkan adalah "otomatis".
Jika Anda membutuhkan garis dengan sudut bulat dan lebar tertentu, Anda dapat menambahkan aturan css pada batas dengan lebar yang dibutuhkan dan warna yang sama. Itu membuat garis tebal.

Aleks Sid
sumber
2

Sejauh yang saya tahu, Outline radiusitu hanya didukung oleh Firefox dan Firefox untuk android.

-moz-outline-radius: 1em;

masukkan deskripsi gambar di sini

ucMedia
sumber
1

Tidak. Perbatasan terletak di bagian luar elemen dan di dalam area margin model kotak. Garis besar duduk di bagian dalam elemen dan area padding model kotak mengabaikannya. Itu tidak dimaksudkan untuk estetika. Hanya untuk menunjukkan kepada desainer garis-garis elemen. Sebagai contoh, pada tahap awal pengembangan dokumen html, pengembang mungkin perlu dengan cepat melihat apakah mereka telah meletakkan semua skeletal divs di tempat yang benar. Kemudian mereka mungkin perlu memeriksa apakah berbagai tombol dan bentuk adalah jumlah piksel yang benar terpisah satu sama lain.

Perbatasan adalah estetika di alam. Tidak seperti garis besar, mereka sebenarnya terpisah dari model kotak, yang berarti mereka tidak tumpang tindih dengan teks yang diatur ke margin: 0; dan setiap sisi perbatasan dapat ditata secara individual.

Jika Anda mencoba menerapkan radius sudut untuk menguraikan, saya asumsikan Anda menggunakannya seperti kebanyakan orang menggunakan perbatasan. Jadi, jika Anda tidak keberatan saya bertanya, properti garis besar apa yang diinginkan di perbatasan?

Musixauce3000
sumber
10
Tujuan garis besar adalah untuk navigasi / aksesibilitas keyboard, bukan untuk menunjukkan kepada pengembang di mana elemen berada
danwellman
Nah untuk itulah browser menggunakannya, secara default. Tetapi saya selalu menggunakannya untuk melihat di mana div saya berada, untuk efek yang besar.
Musixauce3000
+1 untuk menyebutkan bahwa "Perbatasan duduk di bagian luar elemen dan di bagian dalam area margin model-kotak. Garis besar duduk di bagian dalam elemen dan area padding model kotak mengabaikannya."
Jacques
1

MENGGABUNGKAN KOTAK SHADOW DAN GARIS.

Sedikit twist pada jawaban Lea Hayes saya temukan

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

mendapat hasil bersih yang sangat bagus. Tidak ada ukuran melompat yang Anda dapatkan saat menggunakan garis batas

fidev
sumber
1

Seperti yang dikatakan orang lain, hanya firefox yang mendukung ini. Berikut ini adalah pekerjaan di sekitar yang melakukan hal yang sama, dan bahkan bekerja dengan garis putus-putus.

contoh

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

RobKohr
sumber
0

Coba gunakan padding dan warna latar belakang untuk perbatasan, lalu perbatasan untuk garis besar:

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

Bekerja dalam kasus saya.

Eric
sumber
0

Saya baru saja menetapkan garis transparan.

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

input[type=text]:focus {    
  border-color: #0079ff;
}
Ireneml.fr
sumber
0

Saya suka cara ini.

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

Ini akan membuat lingkaran abu-abu dengan batas kecerdasan di sekitarnya dan lagi 1px di sekitar perbatasan!

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

Ini sebenarnya akan membuat lingkaran hanya dapat diklik, sementara jari-jari batas masih membuat persegi, tetapi terlihat seperti lingkaran.

Martin Zvarík
sumber
0

Jawaban sederhana untuk pertanyaan dasar adalah tidak. Satu-satunya opsi lintas browser adalah membuat peretasan yang memenuhi apa yang Anda inginkan. Pendekatan ini memang membawa serta masalah potensial tertentu ketika datang untuk menata konten yang sudah ada , tetapi menyediakan lebih banyak penyesuaian garis (offset, lebar, gaya garis) daripada banyak solusi lainnya.

Pada tingkat dasar, pertimbangkan contoh statis berikut (jalankan snippent untuk demo):

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

Sekarang, pada level yang lebih lanjut, dimungkinkan untuk menggunakan JavaScript untuk mem-bootstrap elemen dari tipe atau kelas tertentu sehingga mereka dibungkus di dalam div yang mensimulasikan garis besar pada pemuatan halaman. Selanjutnya, binding acara dapat dibuat untuk menunjukkan atau menyembunyikan garis besar pada interaksi pengguna seperti ini (jalankan cuplikan di bawah ini atau buka di 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>

Sebagai penutup, izinkan saya mengulangi, bahwa menerapkan pendekatan ini mungkin memerlukan lebih banyak gaya daripada apa yang telah saya sertakan dalam demo saya, terutama jika Anda sudah menata elemen yang ingin Anda uraikan.

b_laoshi
sumber