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:003pt2pt red;}/* Hard "outline" with box-shadow: */.text2:focus {box-shadow:0002pt red;}
@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:10px20px;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;}
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:0px0px0px1px#fff inset;}
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
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:
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:
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
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
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.
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.
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?
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."
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.
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><divclass="outline edge"><inputtype="text"placeholder="I always have an outline"/></div><br><divclass="outline"><inputtype="text"placeholder="I have an outline when focused"/></div> *<i>Doesn't work in Edge or IE</i><br><inputtype="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>Javascript-Enabled Demo</h3><divclass="flex"><divclass="box outline-me">I'm outlined because I contain<br>the "outline-me" class</div><divclass="box clickable">Click me to toggle outline</div></div><hr><inputtype="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 outlinevar outline = document.createElement('div');// initialize css formattingvar css ='display:inline-block;';// transfer any element margin to the outline divvar 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 divvar 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 divvar parent = element.parentElement;
parent.insertBefore(outline, element);
outline.appendChild(element);// determine whether outline should be hidden by default or notif(hideOutline) element.hideOutline();}Element.prototype.showOutline =function(){var element =this;// get a reference to the outline element that wraps this elementvar outline = element.getOutline();// show the outline if one existsif(outline) outline.classList.remove('hide-outline');}Element.prototype.hideOutline =function(){var element =this;// get a reference to the outline element that wraps this elementvar outline = element.getOutline();// hide the outline if one existsif(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){returnnull;}else{return!outline.classList.contains('hide-outline');}}// this embeds a style element in the document head for handling outline visibilityvar 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" classvar 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 outlinesvar 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.
border: 5px red
danoutline: 5px blue
danborder-radius: 5px
, batasnya bulat, tetapi garis besarnya persegi.-moz-outline-radius
box-shadow
dalam hidup Anda ..Jawaban:
Pertanyaan lama sekarang, tetapi ini mungkin relevan untuk seseorang dengan masalah serupa. Saya memiliki bidang input dengan bulat
border
dan ingin mengubah warna garis fokus. Saya tidak bisa menjinakkan kotak yang mengerikanoutline
ke 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:
sumber
outline: 0
memutus aksesibilitas web; baca outlinenone.combox-shadow
adalah gaya alternatif (yang, seperti yang disajikan di sini, sebenarnya sangat mirip dalam penampilanoutline
).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.
sumber
box-shadow
versi. Misalnya, jika Anda ingin "garis besar" ditempatkan jauh dari elemen (yaitu mensimulasikanoutline-offset
) menjadi mungkin dengan teknik ini.Mirip dengan Lea Hayes di atas, tapi beginilah cara saya melakukannya:
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
sumber
inset
, dan mendapatkan apa yang saya inginkan.Saya ingin aksesibilitas fokus yang bagus untuk menu dropdown di navbar Bootstrap, dan cukup senang dengan ini:
sumber
Anda sedang mencari sesuatu seperti ini , saya pikir.
Edit
Ada Firefox-only
-moz-outline-radius
dengan 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:* Selain menggunakan gambar
sumber
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: none
untuk menyingkirkan 'garis besar' biru-biru-radius-bawaan default yang digunakan Chrome secara default. Kemudian, dalam:focus
pseudo-class yang sama , di mana garis itu tidak ada lagi, saya menambahkan radius dan properti perbatasan saya. Mengarah ke berikut iniuntuk memiliki garis merah marun dengan jari-jari perbatasan yang sekarang muncul ketika elemen dipilih oleh pengguna.
sumber
Kita dapat melihat keinginan kita segera dengan menetapkannya
outline-style: auto
di radar WebKits: http://trac.webkit.org/changeset/198062/webkitSampai jumpa di 2030.
sumber
Jika Anda ingin mendapatkan tampilan timbul Anda dapat melakukan sesuatu seperti berikut:
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.
sumber
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.
sumber
Sejauh yang saya tahu,
Outline radius
itu hanya didukung oleh Firefox dan Firefox untuk android.sumber
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?
sumber
MENGGABUNGKAN KOTAK SHADOW DAN GARIS.
Sedikit twist pada jawaban Lea Hayes saya temukan
mendapat hasil bersih yang sangat bagus. Tidak ada ukuran melompat yang Anda dapatkan saat menggunakan garis batas
sumber
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.
sumber
Coba gunakan padding dan warna latar belakang untuk perbatasan, lalu perbatasan untuk garis besar:
Bekerja dalam kasus saya.
sumber
Saya baru saja menetapkan garis transparan.
sumber
Saya suka cara ini.
Ini akan membuat lingkaran abu-abu dengan batas kecerdasan di sekitarnya dan lagi 1px di sekitar perbatasan!
sumber
Ini sebenarnya akan membuat lingkaran hanya dapat diklik, sementara jari-jari batas masih membuat persegi, tetapi terlihat seperti lingkaran.
sumber
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):
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 ):
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.
sumber