Màu đường viền tùy chỉnh tam giác CSS


114

Đang cố gắng sử dụng màu hex tùy chỉnh cho tam giác css (đường viền) của tôi. Tuy nhiên, vì nó sử dụng thuộc tính đường viền nên tôi không chắc làm thế nào để thực hiện việc này. Tôi muốn tránh xa javascript và css3 chỉ vì tính tương thích. Tôi đang cố gắng để hình tam giác có nền trắng với đường viền 1px (xung quanh các cạnh góc của hình tam giác) với màu # CAD5E0. Điều này có khả thi không? Đây là những gì tôi có cho đến nay:

.container {
    margin-left: 15px;
    width: 200px;
    background: #FFFFFF;
    border: 1px solid #CAD5E0;
    padding: 4px;
    position: relative;
    min-height: 200px;
}

.container:after {
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    left: 100%;
    width: 0;
    height: 0;
    border-color: transparent transparent transparent #CAD5E0;
    border-style: solid;
    border-width: 10px;
}​

Fiddle của tôi: http://jsfiddle.net/4ZeCz/

Câu trả lời:


185

Bạn thực sự phải giả nó với hai hình tam giác ...

.container {
    margin: 15px 30px;
    width: 200px;
    background: #fff;
    border: 1px solid #a00;
    position: relative;
    min-height: 200px;
    padding: 20px;
    text-align: center;
    color: #fff;
    font: bold 1.5em/180px Helvetica, sans-serif;
    text-shadow: 0 0 1px #000;
}

.container:after,
.container:before {
    content: '';
    display: block;
    position: absolute;
    left: 100%;
    width: 0;
    height: 0;
    border-style: solid;
}

.container:after {
    top: 10px;
    border-color: transparent transparent transparent #fdd;
    border-width: 10px;
}

.container:before {
    top: 9px;
    border-color: transparent transparent transparent #a00;
    border-width: 11px;
}

Cập nhật Fiddle tại đây

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


1
Thật hoàn hảo! chính xác những gì tôi cần. Cảm ơn bạn.
Ed R

1
hey, Tôi không hiểu làm thế nào tôi sẽ sửa đổi các tam giác xuất hiện ở phía bên kia của hộp (Tôi không hiểu làm thế nào tam giác css hoạt động)
Kevin

1
SMRT - Bạn thật thông minh!
Code Whisperer

5
Lưu ý, đối với những người có cùng câu hỏi với @ Kevin. Nhìn vào border-colorthuộc tính, tùy thuộc vào đường viền màu mà tam giác sẽ trỏ về hướng khác nhau. Để bật mũi tên để chỉ sự thay đổi trái border-colorđể transparent #e3f5ff transparent transparent;trong cả hai, .container:after.container:before
rmagnum2002

1
@Scott Cảm ơn vì điều này! JS Fiddle của bạn đã xuất hiện! Tuy nhiên, hãy cẩn thận về việc copypasta ra khỏi JSFiddle, nó đã thêm hai ký tự vô hình và không hợp lệ vào tệp CSS của tôi gây ra lỗi xác thực / phân tích cú pháp trong tệp css đó. Khi tôi xóa các ký tự ẩn (các ký tự có chiều rộng bằng 0, vì vậy con trỏ không hiển thị chúng, nhưng tôi có thể xóa lùi), nó hoạt động tuyệt vời. Vấn đề không phải do mã của bạn, tôi nghĩ JS Fiddle đã đưa một số ký tự bí ẩn vào mã hiển thị? Dunno, nhưng tôi chỉ muốn đề cập đến nó vì lợi ích của hậu thế, phòng trường hợp có ai gặp phải vấn đề tương tự.
hypervisor666

91

Tôi biết bạn chấp nhận điều đó nhưng hãy kiểm tra cái này với ít css hơn:

.container {
    margin-left: 15px;
    width: 200px;
    background: #FFFFFF;
    border: 1px solid #CAD5E0;
    padding: 4px;
    position: relative;
    min-height: 200px;
}

.container:after {
    content: '';
    display: block;
    position: absolute;
    top: 10px;
    right:-7px;
    width: 10px;
    height: 10px;
    background: #FFFFFF;
    border-right:1px solid #CAD5E0;
    border-bottom:1px solid #CAD5E0;
    -moz-transform:rotate(-45deg);
    -webkit-transform:rotate(-45deg);
}

http://jsfiddle.net/4ZeCz/3/


hey, Tôi không hiểu làm thế nào tôi sẽ sửa đổi các tam giác xuất hiện ở phía bên kia của hộp (Tôi không hiểu làm thế nào tam giác css hoạt động)
Kevin

2
@Kevin Tôi tạo cái này, vui lòng kiểm tra jsfiddle.net/4ZeCz/97 . Cố gắng để chơi với các thuộc tính tôi có sử dụng & nếu bạn có bất kỳ câu hỏi mà bạn có thể hỏi tôi :)
sandeep

3
Giải thích: điều này tạo ra một phần tử hình vuông bình thường có đường viền ở hai cạnh liền kề, tạo thành một hình tam giác nghiêng. Sau đó, hình vuông nghiêng 45 độ, do đó hình tam giác hướng lên (hoặc bất cứ nơi nào bạn muốn). Nhân tiện, bạn chỉ cần -webkit-tiền tố bây giờ (và -ms-cho IE9). Tất cả các trình duyệt khác đều hỗ trợ nó không cần cố định.
rvighne

Giải pháp rất thông minh! Cảm ơn bạn.
Solhan,

3

Tôi nghĩ đây là cách đơn giản hơn bằng cách sử dụng clip-path :

.container {
  width: 150px;
  min-height: 150px;
  background: #ccc;
  padding: 8px;
  padding-right: 6%;
  display: inline-block;
  clip-path: polygon(0% 0%,0% 100%,90% 100%,90% 5%,100% 10%,90% 15%,90% 0%);
}
<div class="container">
test content
</div>


1

Một cách khác để thực hiện điều này, đặc biệt đối với những người cần điều này để làm việc với các tam giác đều hoặc thậm chí là vô hướng như tôi đã làm, là sử dụng filter: drop-shadow(...)với nhiều giá trị và không có bán kính mờ. Điều này có lợi ích bổ sung là không cần nhiều phần tử hoặc truy cập vào cả hai : before và: after (Tôi đang cố gắng thực hiện điều này với: after nội dung nằm trong dòng, vì vậy tôi cũng muốn tránh vị trí tuyệt đối).

Đối với trường hợp trên, CSS: after's có thể trông như thế này ( fiddle ):

.container {
  margin-left: 15px;
  width: 200px;
  background: #FFFFFF;
  border: 1px solid #CAD5E0;
  padding: 4px;
  position: relative;
  min-height: 200px;
}
.container:after {
  content: '';
  display: block;
  position: absolute;
  top: 10px;
  left: 100%;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 20px 0 40px 15px; /* skewed to show support for non-right-angle triangles */
  border-color: transparent transparent transparent #fff;
  filter: drop-shadow(1px 0 0 #CAD5E0) drop-shadow(0 .5px 0 #CAD5E0);
}
<div class="container">
  Test Container
</div>

Tôi nghĩ rằng có một số hạn chế hoặc weirdness, mặc dù:

  • Không hỗ trợ IE11 (mặc dù có vẻ ổn trong FF, Chrome và Edge)
  • Tôi không chắc tại sao .5px cho <offset-y>giá trị trong bóng đổ thứ hai () ở trên xuất hiện giống 1px hơn 1px, mặc dù tôi tưởng tượng nó liên quan đến lượng giác (mặc dù ít nhất trên màn hình của tôi, tôi không thấy sự khác biệt nào giữa giá trị thực tế dựa trên trig hoặc .5px hoặc thậm chí .1px cho vấn đề đó).
  • Các đường viền lớn hơn 1px (tốt, giao diện của chúng theo cách đó) dường như không hoạt động tốt. Hoặc ít nhất là tôi chưa tìm ra giải pháp, mặc dù hãy xem bên dưới để biết một cách ít tối ưu hơn để phát triển lớn hơn một chút. (Tôi nghĩ rằng thông số thứ 4 ( <spread-radius>) được ghi lại bằng tài liệu nhưng không được hỗ trợ của drop-shadow () có thể là thứ tôi thực sự đang tìm kiếm thay vì nhiều giá trị bộ lọc, nhưng việc thêm nó vào chỉ phá vỡ mọi thứ hoàn toàn.) Ở đây bạn có thể thấy những gì bắt đầu xảy ra khi vượt ra ngoài 1px ( fiddle ):

.container {
  background-color: #eee;
  padding: 1em;
}
.container:after {
  content: "";
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 20.4px 10px 0 10px;
  border-color: yellow transparent transparent transparent;
  margin-left: .25em;
  display: inline-block;
  filter: drop-shadow(-6px -4px 0 green) drop-shadow(6px -4px 0 red) drop-shadow(0 6px 0 blue);
}
<div class="container">
  Test Container
</div>

Lưu ý sự hài hước mà hình đầu tiên (xanh lá cây) được áp dụng một lần, nhưng hình thứ hai (màu đỏ) được áp dụng cho cả hình tam giác màu vàng được tạo qua đường viền cũng như bóng đổ màu xanh lá cây () và hình cuối cùng (màu xanh lam) được áp dụng cho tất cả những điều trên. (Có lẽ điều đó cũng liên quan đến thứ xuất hiện .5px).

Nhưng tôi đoán bạn có thể tận dụng lợi thế của những bóng đổ này xây dựng lên nhau nếu bạn cần thứ gì đó trông rộng hơn 1px, bằng cách thay đổi chúng thành một cái gì đó như sau ( fiddle ):

filter: drop-shadow(0 0 2.5px red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red) drop-shadow(0 0 0 red);

trong đó cái đầu tiên có bán kính mờ (2,5px trong trường hợp này, mặc dù kết quả xuất hiện nhân) và tất cả phần còn lại có độ mờ bằng 0. Nhưng điều này sẽ chỉ hoạt động với cùng một màu ở tất cả các bên và kết quả là ở một số góc trông tròn cũng như các cạnh khá thô khi bạn càng lớn.


0
.triangle{
    position: absolute;
    width:0px;
    height:0px;
    border-left: 45px solid transparent;
    border-right: 45px solid transparent;
    border-bottom: 72px solid #DB5248;
}

.triangle:after{
    position: relative;
    content:"!";
    top:8px;
    left:-8px;
    color:#DB5248;
    font-size:40px;
}

.triangle:before{
    content:".";
    color: #DB5248;
    position: relative;
    top:-14px;
    left:-43px;
    border-left: 41px solid transparent;
    border-right: 41px solid transparent;
    border-bottom: 67px solid white;
}
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.