Làm cách nào để tạo “đuôi chú giải công cụ” bằng CSS thuần túy?


89

Tôi vừa xem qua một thủ thuật CSS gọn gàng. Kiểm tra các fiddle ...

.tooltiptail {
  display: block;
  border-color: #ffffff #a0c7ff #ffffff #ffffff;
  border-style: solid;
  border-width: 20px;
  width: 0px;
  height: 0px;
}
.anothertail {
  background-image: url(http://static.jqueryfordesigners.com/demo/images/coda/bubble-tail2.png);
  display: block;
  height: 29px;
  width: 30px;
}
<div>Cool Trick:
  <br />
  <div class="tooltiptail"></div>
</div>
<br />

<div>How do I get this effect with only CSS?
  <br />
  <div class="anothertail"></div>
</div>

Điều này tạo ra một hiệu ứng giống như mũi tên / tam giác nhỏ, một "đuôi chú giải công cụ". Điều này làm tôi suy nghĩ! Tôi thực sự muốn biết nó hoạt động như thế nào ?!

Hơn nữa, có cách nào để mở rộng thủ thuật CSS này để tạo hiệu ứng như sau:

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

Đây là một vấn đề thú vị. Có thể thực hiện điều này chỉ bằng cách sử dụng CSS, bỏ qua bóng đổ ngay bây giờ không?


CẬP NHẬT 1

Tôi đã tìm ra giải pháp cho câu hỏi ban đầu của mình. Đây là trò chơi ...

http://jsfiddle.net/duZAx/7/

HTML

<div style="position: relative;">Cool Trick:<br />
    <div class="tooltiptail"></div>
    <div class="tooltiptail2"></div>
</div>

CSS

.tooltiptail {
    display: block;
    border-color: #ffffff #a0c7ff #ffffff #ffffff;
    border-style: solid;
    border-width: 20px;
    width: 0px;
    height: 0px;
}
.tooltiptail2 {
    display: block;
    border-color: transparent #ffffff transparent transparent;
    border-style: solid;
    border-width: 18px;
    width: 0px;
    height: 0px;
    position: relative;
    left: 4px;
    top: -38px;
}

Bây giờ, làm cách nào để bắt chước chính xác bức ảnh nhỏ ở trên bằng cách sử dụng CSS thuần túy, bao gồm cả bóng và để nó tương thích với nhiều trình duyệt?


CẬP NHẬT 2

Đây là giải pháp của tôi sau khi kết hợp các câu trả lời bên dưới. Tôi chưa thử nghiệm nó trên nhiều trình duyệt, nhưng nó trông rất tuyệt trong Chrome.

http://jsfiddle.net/UnsungHero97/MZXCj/688/

HTML

<div id="toolTip">
    <p>i can haz css tooltip</p>
    <div id="tailShadow"></div>
    <div id="tail1"></div>
    <div id="tail2"></div>
</div>

CSS

#toolTip {
    background-color: #ffffff;
    border: 1px solid #73a7f0;
    width: 200px;
    height: 100px;
    margin-left: 32px;
    position:relative;
    border-radius: 4px;
    -moz-border-radius: 4px;
    -webkit-border-radius: 4px;
    box-shadow: 0px 0px 8px -1px black;
    -moz-box-shadow: 0px 0px 8px -1px black;
    -webkit-box-shadow: 0px 0px 8px -1px black;
}

#toolTip p {
    padding:10px;
}

#tailShadow {
    background-color: transparent;
    width: 4px;
    height: 4px;
    position: absolute;
    top: 16px;
    left: -8px;
    z-index: -10;
    box-shadow: 0px 0px 8px 1px black;
    -moz-box-shadow: 0px 0px 8px 1px black;
    -webkit-box-shadow: 0px 0px 8px 1px black;
}

#tail1 {
    width: 0px;
    height: 0px;
    border: 10px solid;
    border-color: transparent #73a7f0 transparent transparent;
    position:absolute;
    top: 8px;
    left: -20px;
}

#tail2 {
    width: 0px;
    height: 0px;
    border: 10px solid;
    border-color: transparent #ffffff transparent transparent;
    position:absolute;
    left: -18px;
    top: 8px;
}


Nó phải hoạt động trên những trình duyệt nào?
ba mươi

1
tại thời điểm này tôi không thực sự quan tâm :) Tôi chỉ muốn xem liệu điều này có thể! thực tế, tôi sẽ sử dụng hình ảnh nhưng tôi quan tâm đến những thách thức
Hristo

Sẽ có thể thực hiện được nếu sử dụng các phần tử phân lớp và định vị pixel hoàn hảo cho đường viền. Có hay không có bóng?
Arc

@Archimedix ... hoàn toàn đồng ý, nhưng bạn có làm được không?
Hristo

1
Điều này thật đơn giản nhưng thật tuyệt vời, chúc bạn tìm thấy Hristo!
Wesley Murch

Câu trả lời:


60

Đây là một ví dụ với box-shadow, tất cả các trình duyệt phiên bản mới nhất sẽ hỗ trợ điều này

http://jsfiddle.net/MZXCj/1/

HTML:

<div id="toolTip">
    <p>i can haz css tooltip</p>
    <div id="tailShadow"></div>
    <div id="tail1"></div>
    <div id="tail2"></div>
</div>

CSS:

body {font-family:Helvetica,Arial,sans-serif;}

#toolTip {
    position:relative;
}

#toolTip p {
    padding:10px;
    background-color:#f9f9f9;
    border:solid 1px #a0c7ff;
    -moz-border-radius:5px;-ie-border-radius:5px;-webkit-border-radius:5px;-o-border-radius:5px;border-radius:5px;
}

#tailShadow {
    position:absolute;
    bottom:-8px;
    left:28px;
    width:0;height:0;
    border:solid 2px #fff;
    box-shadow:0 0 10px 1px #555;
}

#tail1 {
    position:absolute;
    bottom:-20px;
    left:20px;
    width:0;height:0;
    border-color:#a0c7ff transparent transparent transparent;
    border-width:10px;
    border-style:solid;
}

#tail2 {
    position:absolute;
    bottom:-18px;
    left:20px;
    width:0;height:0;
    border-color:#f9f9f9 transparent transparent transparent;
    border-width:10px;
    border-style:solid;
}


1
Tuyệt vời! Tôi đã có một giải pháp khá tương tự trong đầu nhưng lười tạo ra điều gì đó sau tất cả những gì giải thích tôi đã làm :) +1
BoltClock

@mdmullinax ... sử thi! khi tôi nhận lại được các đặc quyền ủng hộ của mình, tôi sẽ cho bạn +1
Hristo

woa thật tuyệt! Một lỗi nhỏ: cái bóng cũng là một chút có thể nhìn thấy ở phía trên của tooltip
Iulius Curt

@iuliux ... lỗi có thể dễ dàng cố định với z-index :)
Hristo

56

Đây là lời giải thích để trả lời câu hỏi đầu tiên của bạn (Tôi sẽ để lại CSS thực tế cho người khác vì tôi lười - vui lòng ủng hộ câu trả lời của họ mà bạn nghĩ xứng đáng với phiếu bầu!):

Điều này tạo ra một hiệu ứng giống như mũi tên / tam giác nhỏ, một "đuôi chú giải công cụ". Điều này làm tôi suy nghĩ! Tôi thực sự muốn biết nó hoạt động như thế nào ?!

  1. Khi vẽ một đường viền với các màu cạnh khác nhau nhưng cùng một kiểu (trong trường hợp của bạn, solid), đường nối chia từng cặp góc liền kề là một đường chéo. Nó khá giống với những gì các sơ đồ ở đây mô tả của groove, ridge, insetoutset kiểu viền.

    Lưu ý rằng mặc dù tất cả các trình duyệt đều hoạt động theo cùng một cách và đã làm như vậy trong khoảng thời gian tôi có thể nhớ, nhưng hành vi này không được xác định đầy đủ trong thông số kỹ thuật CSS2.1 hoặc mô-đun CSS Backgrounds and Borders. Phần sau có một phần mô tả chuyển đổi màu sắc và kiểu ở các góc và phần mô tả dường như ngụ ý rằng đối với các đường viền có bán kính góc bằng 0, đường được hiển thị trên thực tế là một đường nối góc của cạnh đệm với góc của cạnh viền (dẫn đến một đường góc 45 độ cho các đường viền có chiều rộng bằng nhau), nhưng thông số kỹ thuật vẫn cảnh báo rằng điều này có thể không phải lúc nào cũng như vậy (đặc biệt là vì nó thậm chí không tính đến các đường viền có bán kính góc bằng 0 một cách rõ ràng). 1

  2. Theo mô hình hộp nội dung (W3C gốc) , một vùng 40x40 được tạo ra ngoài đường viền 20 pixel, với kích thước nội dung được xác định là 0x0.

  3. Chia một hình vuông bằng các đường chéo nối bốn góc của nó sẽ tạo ra bốn tam giác vuông có các góc vuông gặp nhau tại trung điểm của hình vuông (xem bên dưới).

  4. Các đường viền trên, dưới và bên trái có màu trắng để phù hợp với nền của vùng .tooltiptailchứa phần tử, trong khi đường viền bên phải có màu xanh lam để phù hợp với màu nền của chú giải công cụ:

    border-color: #ffffff #a0c7ff #ffffff #ffffff;

Kết quả là như vậy, với các đường viền được gắn nhãn và các đường viền được thêm vào bằng Công cụ Đường kẻ đáng tin cậy của tôi:

Định hướng lại đuôi chú giải công cụ chỉ đơn giản là chuyển đổi màu chú giải công cụ xung quanh. Ví dụ: điều này sẽ mang lại một cái đuôi được gắn vào dưới cùng của một đầu mút:

border-color: #a0c7ff #ffffff #ffffff #ffffff;

jsFiddle xem trước


1 Nếu bạn là người thích tuân thủ các tiêu chuẩn, bạn cũng có thể coi tất cả đây là một vụ hack.


Chết tiệt gõ nhanh, sắp sửa nói cùng ... 1
easwee

Vâng, tôi rõ ràng là rất tệ khi đọc các câu hỏi. Nó thậm chí còn nói "I'm not worried about the shadow yet".
ba mươi

1
@BoltClock ... khi tôi lấy lại được các đặc quyền ủng hộ, tôi sẽ cho bạn +1
Hristo

@BoltClock, Các hành vi có nhất quán trên các trình duyệt không? Và hành vi này theo w3c như thế nào là chuẩn ?
Pacerier

@Pacerier: Hành vi cụ thể của việc hiển thị đường nối góc dưới dạng đường chéo không được xác định trong bất kỳ thông số kỹ thuật nào. Tuy nhiên, hành vi nhất quán trên các trình duyệt và không thay đổi trong một thời gian dài. Tôi sẽ làm rõ điều này trong câu trả lời của tôi.
BoltClock

19

Tôi thực hiện chú giải công cụ này chỉ với một divphần tử.

HTML:

<div class="tooltip">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent augue justo, venenatis non tincidunt sit amet, suscipit eget ligula.</div>

CSS:

.tooltip{
    position: relative;
    border: 1px solid #73a7f0;
    width: 200px;
    margin-left: 20px;
    padding: 5px 14px;
    border-radius: 4px;
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    box-shadow: 0px 0px 6px rgba(0, 0, 0, .7);
    -webkit-box-shadow: -0px 0px 6px rgba(0, 0, 0, .7);
    -moz-box-shadow: 0px 0px 6px rgba(0, 0, 0, .7);
}
.tooltip:before{
    content: ' ';
    display: block;
    position: absolute;
    left: -8px;
    top: 15px;
    width: 14px;
    height: 14px;
    border-color: #73a7f0;
    border-width: 1px;
    border-style: none none solid solid;
    background-color: #fff;
    box-shadow: -2px 2px 3.5px rgba(0, 0, 0, .5);
    -webkit-box-shadow: -2px 2px 3.5px rgba(0, 0, 0, .5);
    -moz-box-shadow: -2px 2px 3.5px rgba(0, 0, 0, .5);
    transform: rotate(45deg);
    -webkit-transform: rotate(45deg);
    -moz-transform: rotate(45deg);
}

Bản giới thiệu

Giải trình:

Tôi có div bình thường với đường viền giống như ví dụ khác. Phần đuôi là sự kết hợp đơn giản của CSS:

  • Tôi sử dụng bộ chọn giả: trước (: sau khi hoạt động cũng tốt)
  • Tôi buộc nội dung bằng một khoảng trắng để làm cho phần đuôi có thể nhìn thấy được.
  • Tôi xoay hộp của mình từ 45deg để sửa góc ở bên cạnh chú giải công cụ
  • Không có gì ngạc nhiên về kích thước và vị trí.
  • Tôi thêm một đường viền ở 2 bên mà tôi muốn.
  • Và cuối cùng tôi thêm bóng đổ vào đường viền bên ngoài.

@Hristo Đối với IE, tôi thực sự không biết phải làm thế nào, nhưng có thể xem một số bài báo: samuli.hakoniemi.net/… Nhưng trông nó thật khó hiểu ... "Hãy can đảm!"
Yoann

@DoubleYo: Liên quan đến IE ... nếu tôi cần làm cho IE này tương thích, tôi sẽ chỉ sử dụng hình ảnh và biểu định kiểu có điều kiện :)
Hristo

11

Chú giải công cụ không có bóng

Fiddle Demo


Với Shadow (trông hơi lạ trong WebKit ... tôi đoán phải tối ưu hóa nó):

Demo 1 , Demo 2


@Archimedix ... cool :) bây giờ tôi biết 2 cách để làm điều này, tốt 3 nếu bạn tính bằng cách sử dụng hình ảnh. quan tâm đến hiệu ứng đổ bóng?
Hristo

@Archimedix ... trông rất tuyệt! khi tôi nhận lại được các đặc quyền ủng hộ, tôi sẽ +1 cho bạn
Hristo

Tốt đẹp giống như giải pháp thứ hai của tôi - tôi cũng đã cố gắng sửa một số độ trong suốt của đường viền trong IE6 - vẫn cần một giải pháp để phần bao bọc của mũi tên hiển thị đường viền trong ie6.
easwee

6

Cách tiếp cận trình duyệt chéo:

Cái này hoạt động từ IE7 + (cũng hoạt động trong IE6 bằng cách sử dụng ( filter: chroma(color=white);) nhưng sẽ không hiển thị viền đen xung quanh mũi tên).

Sửa lỗi IE6:

* html .arrow {
        border-bottom-color:white;
        border-left-color:white;
        border-right-color:white;
        filter: chroma(color=white);

}
* html .arrow i
        {
        border-bottom-color:white;
        border-left-color:white;
        border-right-color:white;
        filter: chroma(color=white);
        }

Điều này sẽ làm cho độ trong suốt màu đen xấu xí được IE6 hiển thị thành màu bạn đã chỉ định trong bộ lọc sắc độ (tôi đã làm màu trắng để nó biến mất trong nền).


Cách tiếp cận CSS 3:

Bạn có thể làm điều đó với xoay vòng CSS3, nhưng sẽ không thành công trong các trình duyệt không tuân thủ CSS3:

.tooltip {
    position:relative;
    padding:10px;
    background:#ccc;
    border-bottom:1px solid #000;
}
.tooltip:before {
    content:"";
    display:block;
    width:10px;
    height:10px;
    position:absolute;
    bottom:-6px;
    border-left:1px solid #000;
    border-bottom:1px solid #000;
    background:#ccc;
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    transform: rotate(-45deg);
}
<div class="tooltip"> 
    Tooltip text that wants to be your friend.
</div>

@easwee ... ngầu !!! Bạn có thể cung cấp thêm một số thông tin về xoay vòng css3, liên kết đến hướng dẫn và các tài nguyên khác không?
Hristo

@hristo - có một bộ lọc dx để xoay vòng trong IE - nhưng vấn đề là nó chỉ nhận 4 giá trị - msdn.microsoft.com/en-us/library/ms532918%28v=vs.85%29.aspx
exewee

@easwee ... Tôi không quá lo lắng về IE, đặc biệt là IE 6. Cảm ơn bạn đã chỉ ra điều đó. Bất kỳ lỗi IE có thể dễ dàng được khắc phục với một :) có điều kiện
Hristo

@hristo css3 xoay chỉ được hỗ trợ trong IE9 - vì vậy bạn vẫn phải quan tâm đến ie7-8 vẫn là một tiêu chuẩn để viết mã. Nhưng đó là một sự khởi đầu.
easwee

@easwee ... tuyệt vời. Nếu tôi cần làm điều này và làm cho nó tương thích với IE, tôi sẽ sử dụng hình ảnh và biểu định kiểu có điều kiện :) Bạn có thể cung cấp thêm một số thông tin về xoay vòng css3, liên kết đến hướng dẫn và các tài nguyên khác không?
Hristo

3

Bạn có thể sử dụng các phần tử giả: before và: after của CSS. Ví dụ FOr,: before có thể được sử dụng để chèn hình tam giác và: after để chèn hình chữ nhật. Sự kết hợp của hai điều này tạo ra một mẹo công cụ bong bóng

Ví dụ :

a[bubbletooltip]:before
{
    content: "";
    position: absolute;
    border-bottom: 21px solid #e0afe0;
    border-left: 21px solid transparent;
    border-right: 21px solid transparent;
    visibility: hidden;
    bottom: -20px;
    left: -12px;
}

a[bubbletooltip]:after
{
    position: absolute;
    content: attr(bubbletooltip);
    color: #FFF;
    font-weight:bold;
    bottom: -35px;
    left: -26px;
    white-space: nowrap;
    background: #e0afe0;
    padding: 5px 10px;
    -moz-border-radius: 6px;
    -webkit-border-radius:6px;
    -khtml-border-radius:6px;
    border-radius: 6px;
    visibility: hidden;
}

Một công cụ trực tuyến có sẵn tại http://www.careerbless.com/services/css/csstooltipcreator.php


Tại sao lại là thuộc tính tùy chỉnh chứ không phải thuộc tính title?
BoltClock

1
Tôi muốn nói rằng đó aria-labellà thuộc tính tùy chỉnh thích hợp hơn cho chú giải công cụ. Với title, bạn cũng nhận được kết xuất chú giải công cụ mặc định của trình duyệt (đối với người dùng có thị giác).
rink.attendant.

Cảm ơn. Tôi cũng đã cố gắng sử dụng span:beforespan:aftertạo hình tam giác và được điều chỉnh theo nhu cầu từ webblogsforyou.com/… .
Immayankmodi
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.