Bán kính phác thảo?


473

Có cách nào để có được các góc tròn trên phác thảo của một div element, tương tự như border-radius?


2
Chà, tôi đã có một hộp Div có viền xám 2px với bán kính đường viền 20px, tôi đã đi lang thang nếu sau đó tôi có thể có một Outine 10px xung quanh Border đó theo Border chứ không phải là hình vuông
Marc Guerin

4
Đây là một câu hỏi hay. Một phần tử có border: 5px redoutline: 5px blueborder-radius: 5px, đường viền được làm tròn, nhưng đường viền là hình vuông.
Matthew Rudy

4
Cho đến nay chúng ta chỉ có thể sử dụng nó trong Firefox:-moz-outline-radius
Wojciech Bednarski

Nó phải là một phần của CSS3 ... Nếu tôi nghĩ về nó - Tôi ghét W3C: D
m93a

17
tất cả các bạn cần một box-shadowtrong cuộc sống của bạn ..
Muhammad Umer

Câu trả lời:


538

Câu hỏi cũ bây giờ, nhưng điều này có thể phù hợp với ai đó có vấn đề tương tự. Tôi đã có một trường đầu vào với làm tròn bordervà muốn thay đổi màu của phác thảo tiêu điểm. Tôi không thể thuần hóa hình vuông khủng khiếp outlinecho điều khiển đầu vào.

Vì vậy, thay vào đó, tôi đã sử dụng bóng hộp. Tôi thực sự thích cái nhìn mượt mà của bóng tối, nhưng bóng có thể được làm cứng để mô phỏng đường viền tròn:

 /* 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, đây là câu trả lời bạn đang tìm kiếm. Tôi đã thực hiện phương pháp này nhưng đừng bỏ qua việc chuyển phác thảo của bạn thành 0.
John Morton

2
Đây chính xác là những gì tôi đang tìm kiếm, và thậm chí còn phù hợp hơn cả bán kính phác thảo.
Zenexer

2
Ví dụ phác thảo cứng không hoạt động. Nó chỉ là một hình chữ nhật không có bán kính góc.
Erik Aigner

1
outline: 0phá vỡ khả năng truy cập web; đọc outlinenone.com
ianstarz

4
@ianstarz, nó phá vỡ khả năng truy cập khi bạn không cung cấp kiểu dáng thay thế. box-shadowlà kiểu dáng thay thế (mà, như được trình bày ở đây, thực sự rất giống nhau về ngoại hình như outline).
ACJ

84

Tôi thường thực hiện điều này bằng cách sử dụng: sau phần tử giả:

tất nhiên nó phụ thuộc vào cách sử dụng, phương pháp này cho phép kiểm soát các đường viền riêng lẻ, thay vì sử dụng phương thức bóng cứng.

bạn cũng có thể đặt offset -1px và sử dụng gradient tuyến tính nền (không có viền) cho hiệu ứng khác một lần nữa.

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
Một phiên bản sửa đổi và ngoạn mục hơn một chút: jsfiddle.net/rh6j3cdm .
Dávid Horváth

2
Không thể tạo :: sau giả cho một trường đầu vào
Simon Franzen

cảm ơn, điều này đã làm việc RẤT tốt với các phác thảo truy vấn tìm kiếm của cây phản ứng sắp xếp!
Monarch Wadia

Tôi thích giải pháp này vì nó linh hoạt hơn nhiều so với box-shadowphiên bản. Ví dụ, nếu bạn muốn "phác thảo" được đặt cách xa phần tử (tức là mô phỏng outline-offset), điều này trở nên khả thi với kỹ thuật này.
Kirk Woll

34

Tương tự như Lea Hayes ở trên, nhưng đây là cách tôi đã là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>

Không cần lồng ghép DIV hoặc jQuery, Altho để đơn giản hóa tôi đã bỏ qua các biến thể -moz và -webkit của một số CSS. Bạn có thể thấy kết quả ở trên


6
Anh ấy đang nói về OUTLINE, không phải bán kính ... "phác thảo"
android.nick

5
đúng, nhưng vì bán kính phác thảo không có sẵn, phương pháp của tôi cho sự xuất hiện của đường viền cũng như đường viền. Đây là một hiệu ứng hình ảnh, vì vậy trừ khi thiết kế của Marc được chỉ định từ xuống pixel, thì thực tế là nó không thực sự sử dụng thuộc tính phác thảo không tạo ra sự khác biệt. Và vì đó là một giải pháp thiết thực, tôi đánh giá cao sự bình chọn trở lại
Heraldmonkey

2
Điều này đã làm việc tuyệt vời. Tôi đã không sử dụng inset, mặc dù, và có những gì tôi muốn.
Paul Schreiber

18

Tôi muốn một số khả năng truy cập tập trung tốt đẹp cho các menu thả xuống trong thanh điều hướng Bootstrap và khá hài lòng với điều này:

     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

Bạn đang tìm kiếm một cái gì đó như thế này , tôi nghĩ.

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

Biên tập

Có một Firefox chỉ -moz-outline-radiusđúng, nhưng nó sẽ không hoạt động trên IE / Chrome / Safari / Opera / vv. Vì vậy, có vẻ như cách tương thích với nhiều trình duyệt nhất * để có được một đường cong quanh đường viền là sử dụng div trình bao bọc:

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>


* ngoài việc sử dụng hình ảnh


20
Không, tôi biết làm thế nào để có được Border Radius mà tôi đã đi lang thang nếu bạn có thể có được Outline-Radius
Marc Guerin

Ý nghĩa chính xác là gì? Một phác thảo dày hơn, như thế này? jsfiddle.net/mattball/NXZFv/1
Bóng Matt

10
@Matt: một đường viền cong thay vì đường viền , rõ ràng. Xem w3.org/TR/CSS21/ui.html#dynamic-outlines
Joey

Chà, tôi đã có một hộp Div với Đường viền màu xám 2px với bán kính đường viền 20px, tôi đã đi lang thang nếu sau đó tôi có thể có một Outine 10px xung quanh Đường viền đó đi theo Đường viền chứ không phải là hình vuông.
Marc Guerin

1
Chỉ cần một bổ sung cho mã của bạn, nếu bạn giảm bán kính đường viền một vài px vào hộp bên trong thì góc sẽ trở nên chặt chẽ hơn nhiều, nhờ sự giúp đỡ của bạn
Marc Guerin

7

Tôi chỉ tìm thấy một giải pháp tuyệt vời cho việc này và sau khi xem tất cả các phản hồi cho đến nay, tôi vẫn chưa thấy nó được đăng. Vì vậy, đây là những gì tôi đã làm:

Tôi đã tạo một Quy tắc CSS cho lớp và sử dụng lớp giả: tập trung cho quy tắc đó. Tôi đã thiết lập outline: noneđể loại bỏ 'phác thảo' có thể bán kính không viền màu xanh lam mặc định mà Chrome sử dụng theo mặc định. Sau đó, trong cùng một :focuslớp giả, nơi mà phác thảo đó không còn tồn tại, tôi đã thêm các thuộc tính bán kính và đường viền của mình. Dẫn đến sau

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

để có một phác thảo màu maroon với bán kính đường viền hiện xuất hiện khi phần tử được người dùng chọn tab.


Sử dụng "phác thảo: 0" hoặc "phác thảo: không" được coi là thực tiễn xấu và làm rối loạn khả năng truy cập của người dùng. Tại thời điểm này, tôi không có cách khắc phục, nhưng đây là một bài viết về lý do tại sao bạn không nên xóa phác thảo nếu có thể và phải làm gì nếu bạn thực sự phải làm. Không bao giờ xóa các phác thảo CSS
AndrewBrntt


5

Nếu bạn muốn có được một cái nhìn nổi, bạn có thể làm một cái gì đó như sau:

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

Tôi đã không tìm thấy một công việc xung quanh để có công việc này trong các trình duyệt khác.

EDIT: Cách khác duy nhất bạn có thể làm là sử dụng bóng hộp, nhưng sau đó nó sẽ không hoạt động nếu bạn đã có bóng hộp trên thành phần đó.


1
Bạn có thể sử dụng nhiều bóng trên cùng một phần tử, phân tách chúng bằng dấu phẩy.
Bangash

2

Có giải pháp nếu bạn chỉ cần phác thảo mà không có đường viền. Nó không phải của tôi. Tôi đã nhận nếu từ tập tin css Bootstrap. Nếu bạn chỉ định outline: 1px auto certain_color, bạn sẽ có được đường viền ngoài mỏng xung quanh div của một số màu nhất định. Trong trường hợp này, chiều rộng được chỉ định không có vấn đề gì, ngay cả khi bạn chỉ định chiều rộng 10 px, dù sao nó cũng sẽ là đường mỏng. Từ khóa trong quy tắc được đề cập là "tự động".
Nếu bạn cần phác thảo với các góc tròn và chiều rộng nhất định, bạn có thể thêm quy tắc css trên đường viền với chiều rộng cần thiết và cùng màu. Nó làm cho phác thảo dày hơn.


2

Theo tôi biết, Outline radiuschỉ được hỗ trợ bởi Firefox và Firefox cho Android.

-moz-outline-radius: 1em;

nhập mô tả hình ảnh ở đây


1

Không. Biên giới nằm ở bên ngoài của phần tử và bên trong khu vực lề mô hình hộp. Các phác thảo ngồi ở bên trong của phần tử và khu vực đệm mô hình hộp bỏ qua nó. Nó không dành cho thẩm mỹ. Nó chỉ để cho nhà thiết kế phác thảo các yếu tố. Trong giai đoạn đầu phát triển một tài liệu html chẳng hạn, nhà phát triển có thể cần nhanh chóng nhận ra nếu họ đã đặt tất cả các div của bộ xương vào đúng vị trí. Sau này, họ có thể cần kiểm tra xem các nút và biểu mẫu khác nhau có đúng số pixel không với nhau không.

Biên giới là thẩm mỹ trong tự nhiên. Không giống như các phác thảo, chúng thực sự nằm ngoài mô hình hộp, điều đó có nghĩa là chúng không chồng chéo văn bản thành lề: 0; và mỗi bên của đường viền có thể được tạo kiểu riêng.

Nếu bạn đang cố gắng áp dụng bán kính góc để phác thảo, tôi giả sử bạn đang sử dụng nó theo cách mà hầu hết mọi người sử dụng đường viền. Vì vậy, nếu bạn không phiền tôi hỏi, tính chất nào của phác thảo làm cho nó mong muốn qua biên giới?


10
Mục đích của phác thảo là để điều hướng / khả năng truy cập bàn phím, không hiển thị cho nhà phát triển nơi có các yếu tố
danwellman

Vâng, đó là những gì trình duyệt sử dụng chúng cho, theo mặc định. Nhưng tôi đã luôn sử dụng chúng để xem divs của tôi ở đâu, có hiệu quả tuyệt vời.
Musixauce3000

+1 để đề cập rằng "Biên giới nằm ở bên ngoài của phần tử và bên trong khu vực lề mô hình hộp. Các đường viền nằm ở bên trong của phần tử và vùng đệm mô hình hộp bỏ qua nó."
Jacques

1

KẾT HỢP HỘP SHADOW VÀ TRỰC TUYẾN.

Tôi thấy một sự thay đổi nhỏ về câu trả lời của Lea Hayes

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

có được một kết thúc thực sự tốt đẹp. Không nhảy kích thước mà bạn có được khi sử dụng bán kính đường viền


1

Như những người khác đã nói, chỉ có firefox hỗ trợ này. Đây là một công việc xung quanh làm điều tương tự, và thậm chí hoạt động với các phác thảo nét đứt.

thí dụ

.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

Hãy thử sử dụng phần đệm và màu nền cho đường viền, sau đó là đường viền cho đường viền:

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

Làm việc trong trường hợp của tôi.


0

Tôi chỉ đặt phác thảo minh bạch.

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

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

0

Tôi thích cách này.

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

Nó sẽ tạo ra vòng tròn màu xám với đường viền dí dỏm xung quanh nó và lại 1px xung quanh đường viền!


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

Điều này thực sự sẽ làm cho vòng tròn chỉ có thể nhấp, trong khi bán kính đường viền vẫn tạo thành hình vuông, nhưng trông giống như hình tròn.


0

Câu trả lời đơn giản cho câu hỏi cơ bản là không. Tùy chọn trình duyệt chéo duy nhất là tạo ra một bản hack hoàn thành những gì bạn muốn. Cách tiếp cận này mang theo một số vấn đề tiềm năng nhất định khi nói đến kiểu dáng nội dung có sẵn , nhưng nó cung cấp nhiều tùy chỉnh hơn cho phác thảo (bù, chiều rộng, kiểu đường kẻ) so với nhiều giải pháp khác.

Ở mức cơ bản, hãy xem xét ví dụ tĩnh sau (chạy đoạn trích cho bản 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>

Bây giờ, ở cấp độ nâng cao hơn, có thể sử dụng JavaScript để khởi động các phần tử của một loại hoặc lớp nhất định để chúng được bọc bên trong một div mô phỏng phác thảo khi tải trang. Hơn nữa, các ràng buộc sự kiện có thể được thiết lập để hiển thị hoặc ẩn phác thảo về các tương tác của người dùng như thế này (chạy đoạn trích bên dưới hoặc mở trong 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>

Để kết thúc, hãy để tôi nhắc lại, rằng việc thực hiện phương pháp này có thể đòi hỏi nhiều kiểu dáng hơn những gì tôi đã đưa vào bản demo của mình, đặc biệt nếu bạn đã tạo kiểu cho phần tử bạn muốn phác thảo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.