Làm cách nào để thay đổi kiểu của thuộc tính title trong thẻ neo?


243

Thí dụ:

<a href="example.com" title="My site"> Link </a>

Làm cách nào để thay đổi cách trình bày thuộc tính "title" trong trình duyệt?. Theo mặc định, nó chỉ có nền màu vàng và phông chữ nhỏ. Tôi muốn làm cho nó lớn hơn và thay đổi màu nền.

Có cách CSS nào để định kiểu thuộc tính title không?


Câu trả lời:


133

Đây là một ví dụ về cách làm điều đó:

a.tip {
    border-bottom: 1px dashed;
    text-decoration: none
}
a.tip:hover {
    cursor: help;
    position: relative
}
a.tip span {
    display: none
}
a.tip:hover span {
    border: #c0c0c0 1px dotted;
    padding: 5px 20px 5px 5px;
    display: block;
    z-index: 100;
    background: url(../images/status-info.png) #f0f0f0 no-repeat 100% 5%;
    left: 0px;
    margin: 10px;
    width: 250px;
    position: absolute;
    top: 10px;
    text-decoration: none
}
<a href="#" class="tip">Link<span>This is the CSS tooltip showing up when you mouse over the link</span></a>


không hoạt động đúng trong FF nếu thay vì thẻ một sử dụng thẻ, ví dụ, td
dnim

6
Xem sixrevutions.com/css/css-only-tooltips để biết ví dụ về kỹ thuật trên, với lời giải thích chi tiết.
George

1
Khi tôi làm điều này, tôi thấy một mẹo công cụ đôi. Cái được tạo kiểu, và sau đó không lâu, cái chưa được bật lên trên cái này. Đây là trên fiddle của bạn. Tôi đang sử dụng chrome. Đây có phải là một bất thường?

8
Một câu trả lời không có thuộc tính tiêu đề trong mã có hơn 100 upvote ở đây ...?
Ben Racicot

1
Thậm chí không giải quyết câu hỏi thực sự ... boo!
Matt

126

Trên thực tế, có vẻ như có một giải pháp CSS thuần túy, chỉ yêu cầu attrbiểu thức css , các bộ chọn thuộc tính và nội dung được tạo ra (điều này cho thấy rằng nó hoạt động xa như IE8):

a[title]:hover:after {
  content: attr(title);
  position: absolute;
}

Nguồn: https://jsfiddle.net/z42r2vv0/2/

cập nhật w / input từ @ViROscar: xin lưu ý rằng không cần thiết phải sử dụng bất kỳ thuộc tính cụ thể nào, mặc dù tôi đã sử dụng thuộc tính "title" trong ví dụ trên; thực sự khuyến nghị của tôi sẽ là sử dụng thuộc tính "alt", vì có khả năng nội dung sẽ có thể truy cập được đối với người dùng không thể hưởng lợi từ CSS.

cập nhật lại Tôi không thay đổi mã vì thuộc tính "title" về cơ bản có nghĩa là thuộc tính "tooltip" và có lẽ không nên ẩn văn bản quan trọng bên trong một trường chỉ có thể truy cập trên di chuột, nhưng nếu bạn quan tâm đến việc làm cho văn bản này có thể truy cập được thuộc tính "aria-nhãn" có vẻ như là nơi tốt nhất cho nó: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_aria-label_attribution


11
Và nếu bạn không muốn cho tooltip bản địa cuối cùng cũng hiển thị, bạn luôn có thể sử dụng thẻ "alt" ..
Jon z

1
@Jonz Tôi đã thử với thuộc tính tùy chỉnh "data-alt = 'alt'" và mọi thứ đều ổn. không cần thiết để sử dụng tài sản alt hoặc tiêu đề.
ViROscar

7
Các CSS Tooltips thuần túy có sự thu thập nghiêm trọng - chúng được liên kết với phần tử, do đó được liên kết với nó stacking context. Tất cả các yếu tố positionkhác ngoài việc statictạo bối cảnh xếp chồng mới và các chú giải công cụ CSS thuần túy không thể nhìn thấy bên ngoài và cũng không thể vượt ra ngoài bối cảnh xếp chồng như vậy , vì vậy nếu bạn có phần tử chặt chẽ với vị trí relative, chú giải công cụ CSS của bạn sẽ không hiển thị. Giải pháp duy nhất là gắn tooltip vào bối cảnh xếp chồng hàng đầu (ví dụ <body>) cần JavaScript.
Vaclav Novotny

Thật không may, nó không biến mất khi nhấp chuột.
user2705463

72

Bạn không thể tạo kiểu cho một titlethuộc tính thực tế

Cách văn bản trong titlethuộc tính được hiển thị được xác định bởi trình duyệt và thay đổi tùy theo trình duyệt. Trang web không thể áp dụng bất kỳ kiểu nào cho chú giải công cụ mà trình duyệt hiển thị dựa trên titlethuộc tính.

Tuy nhiên, bạn có thể tạo một cái gì đó rất giống nhau bằng cách sử dụng các thuộc tính khác.

Bạn có thể tạo một công cụ giả bằng CSS và thuộc tính tùy chỉnh (ví dụ data-title)

Đối với điều này, tôi sẽ sử dụng một data-titlethuộc tính. data-*các thuộc tính là một phương thức để lưu trữ dữ liệu tùy chỉnh trong các thành phần DOM / HTML. Có nhiều cách để truy cập chúng . Điều quan trọng, chúng có thể được chọn bằng CSS.

Cho rằng bạn có thể sử dụng CSS để chọn các thành phần có data-titlethuộc tính, sau đó bạn có thể sử dụng CSS để tạo :after(hoặc :before) contentcó chứa giá trị của thuộc tính bằng cách sử dụng attr().

Ví dụ về tooltip

Lớn hơn và với màu nền khác nhau (theo yêu cầu của câu hỏi):

[data-title]:hover:after {
    opacity: 1;
    transition: all 0.1s ease 0.5s;
    visibility: visible;
}
[data-title]:after {
    content: attr(data-title);
    background-color: #00FF00;
    color: #111;
    font-size: 150%;
    position: absolute;
    padding: 1px 5px 2px 5px;
    bottom: -1.6em;
    left: 100%;
    white-space: nowrap;
    box-shadow: 1px 1px 3px #222222;
    opacity: 0;
    border: 1px solid #111111;
    z-index: 99999;
    visibility: hidden;
}
[data-title] {
    position: relative;
}
<a href="example.com" data-title="My site"> Link </a> with styled tooltip (bigger and with a different background color, as requested in the question)<br/>
<a href="example.com" title="My site"> Link </a> with normal tooltip

Kiểu dáng phức tạp hơn (chuyển thể từ bài đăng trên blog này ):

[data-title]:hover:after {
    opacity: 1;
    transition: all 0.1s ease 0.5s;
    visibility: visible;
}
[data-title]:after {
    content: attr(data-title);
    position: absolute;
    bottom: -1.6em;
    left: 100%;
    padding: 4px 4px 4px 8px;
    color: #222;
    white-space: nowrap; 
    -moz-border-radius: 5px; 
    -webkit-border-radius: 5px;  
    border-radius: 5px;  
    -moz-box-shadow: 0px 0px 4px #222;  
    -webkit-box-shadow: 0px 0px 4px #222;  
    box-shadow: 0px 0px 4px #222;  
    background-image: -moz-linear-gradient(top, #f8f8f8, #cccccc);  
    background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #f8f8f8),color-stop(1, #cccccc));
    background-image: -webkit-linear-gradient(top, #f8f8f8, #cccccc);  
    background-image: -moz-linear-gradient(top, #f8f8f8, #cccccc);  
    background-image: -ms-linear-gradient(top, #f8f8f8, #cccccc);  
    background-image: -o-linear-gradient(top, #f8f8f8, #cccccc);
    opacity: 0;
    z-index: 99999;
    visibility: hidden;
}
[data-title] {
    position: relative;
}
<a href="example.com" data-title="My site"> Link </a> with styled tooltip<br/>
<a href="example.com" title="My site"> Link </a> with normal tooltip

Vấn đề đã biết

Không giống như một titlechú giải công cụ thực sự , chú giải công cụ được tạo bởi CSS ở trên không nhất thiết phải được đảm bảo hiển thị trên trang (tức là nó có thể nằm ngoài vùng nhìn thấy). Mặt khác, nó được đảm bảo nằm trong cửa sổ hiện tại, đây không phải là trường hợp của một tooltip thực tế.

Ngoài ra, pseudo-tooltip được định vị tương đối với phần tử có pseudo-tooltip chứ không liên quan đến vị trí của chuột trên phần tử đó. Bạn có thể muốn tinh chỉnh nơi hiển thị pseudo-tooltip. Có nó xuất hiện ở một vị trí đã biết liên quan đến yếu tố có thể là một lợi ích hoặc nhược điểm, tùy thuộc vào tình huống.

Bạn không thể sử dụng :beforehoặc :aftertrên các yếu tố không phải là container

Có một lời giải thích tốt trong câu trả lời này cho "Tôi có thể sử dụng: trước hoặc: sau phần tử giả trên trường đầu vào không?"

Một cách hiệu quả, phương tiện này mà bạn không thể sử dụng phương pháp này trực tiếp trên các yếu tố như <input type="text"/>, <textarea/>, <img>vv Các giải pháp dễ dàng là để bọc các yếu tố đó không phải là một thùng chứa trong một <span>hoặc <div>và có pseudo-tooltip trên thùng sơn.

Ví dụ về việc sử dụng một tooltip giả trên một <span>gói phần tử không chứa:

[data-title]:hover:after {
    opacity: 1;
    transition: all 0.1s ease 0.5s;
    visibility: visible;
}
[data-title]:after {
    content: attr(data-title);
    background-color: #00FF00;
    color: #111;
    font-size: 150%;
    position: absolute;
    padding: 1px 5px 2px 5px;
    bottom: -1.6em;
    left: 100%;
    white-space: nowrap;
    box-shadow: 1px 1px 3px #222222;
    opacity: 0;
    border: 1px solid #111111;
    z-index: 99999;
    visibility: hidden;
}
[data-title] {
    position: relative;
}

.pseudo-tooltip-wrapper {
    /*This causes the wrapping element to be the same size as what it contains.*/
    display: inline-block;
}
Text input with a pseudo-tooltip:<br/>
<span class="pseudo-tooltip-wrapper" data-title="input type=&quot;text&quot;"><input type='text'></span><br/><br/><br/>
Textarea with a pseudo-tooltip:<br/>
<span class="pseudo-tooltip-wrapper" data-title="this is a textarea"><textarea data-title="this is a textarea"></textarea></span><br/>


Từ mã trên bài đăng blog được liên kết ở trên (mà lần đầu tiên tôi thấy trong một câu trả lời ở đây đã đạo văn nó), tôi thấy rõ ràng là sử dụng một data-*thuộc tính thay vì titlethuộc tính. Làm như vậy cũng được đề xuất trong một bình luận bằng cách snostorm về câu trả lời (hiện đã bị xóa).


1
Đây có thể không phải là câu trả lời cho câu hỏi, nhưng đây là giải pháp tốt nhất cho đến nay. Cảm ơn.
JJ Labajo

@JJLabajo Cảm ơn sự bổ sung về việc đây là giải pháp tốt nhất cho đến nay. Tuy nhiên, tôi không chắc làm thế nào điều này không trả lời câu hỏi. Câu hỏi là yêu cầu một cái gì đó không thể. Câu trả lời này nói rằng điều đó là không thể, nhưng đưa ra một giải pháp thay thế hoàn thành một cái gì đó tương tự như những gì OP mong muốn.
Makyen

Tôi nghĩ giải pháp này không áp dụng cho các yếu tố như input[type='text']hoặc textarea, nhưng tôi không biết tại sao. Bất cứ ai có thể giải thích?
Cheeso

@Cheeso Bạn đã đúng, các phần tử giả :before:afterkhông hoạt động trên các phần tử không chứa. Có một lời giải thích tốt trong câu trả lời: Tôi có thể sử dụng phần tử: trước hoặc: sau phần tử giả trên trường nhập không? Để sử dụng phương pháp này, có thể dễ dàng nhất để bọc các phần tử không chứa trong một <span>hoặc <div>trên đó bạn đặt data-titlethuộc tính. Có lẽ bạn cũng muốn cung cấp cho họ display: inline-block;, vì điều đó sẽ làm cho chúng có cùng kích thước với <input>hoặc <textarea>. Tôi đã cập nhật câu trả lời này với một ví dụ.
Makyen

Câu trả lời này thực sự dạy chúng ta những gì đang diễn ra và cung cấp tất cả các loại thông tin cơ bản có cấu trúc tốt.
Ideogram

26

CSS không thể thay đổi giao diện tooltip. Nó phụ thuộc vào trình duyệt / HĐH. Nếu bạn muốn một cái gì đó khác biệt, bạn sẽ phải sử dụng Javascript để tạo đánh dấu khi bạn di chuột qua phần tử thay vì chú giải công cụ mặc định.


22
Người ta không phải sử dụng JS để làm điều đó.
ANeves

9
Rủi ro với câu trả lời 'bạn không thể' là chúng có thể trở nên lỗi thời. (Rủi ro khác là bạn có thể không biết làm thế nào.)
Michael Scheper

12

Tôi nghĩ rằng tôi sẽ đăng giải pháp JavaScript 20 dòng của tôi ở đây. Nó không hoàn hảo, nhưng có thể hữu ích cho một số người tùy thuộc vào những gì bạn cần từ chú giải công cụ của bạn.

Khi nào sử dụng nó

  • Tự động định kiểu cho chú giải công cụ cho tất cả các phần tử HTML với một TITLEthuộc tính được xác định (phần này bao gồm các phần tử được thêm động vào tài liệu trong tương lai)
  • Không yêu cầu thay đổi hoặc hack Javascript / HTML cho mọi tooltip (chỉ TITLEthuộc tính, rõ ràng về mặt ngữ nghĩa)
  • Rất nhẹ (thêm khoảng 300 byte được nén và rút gọn)
  • Bạn chỉ muốn một tooltip có thể tạo kiểu rất cơ bản

Khi KHÔNG sử dụng

  • Yêu cầu jQuery, vì vậy không sử dụng nếu bạn không sử dụng jQuery
  • Hỗ trợ không tốt cho các phần tử lồng nhau mà cả hai đều có chú giải công cụ
  • Bạn cần nhiều hơn một tooltip trên màn hình cùng một lúc
  • Bạn cần tooltip biến mất sau một thời gian

Mật mã

// Use a closure to keep vars out of global scope
(function () {
    var ID = "tooltip", CLS_ON = "tooltip_ON", FOLLOW = true,
    DATA = "_tooltip", OFFSET_X = 20, OFFSET_Y = 10,
    showAt = function (e) {
        var ntop = e.pageY + OFFSET_Y, nleft = e.pageX + OFFSET_X;
        $("#" + ID).html($(e.target).data(DATA)).css({
            position: "absolute", top: ntop, left: nleft
        }).show();
    };
    $(document).on("mouseenter", "*[title]", function (e) {
        $(this).data(DATA, $(this).attr("title"));
        $(this).removeAttr("title").addClass(CLS_ON);
        $("<div id='" + ID + "' />").appendTo("body");
        showAt(e);
    });
    $(document).on("mouseleave", "." + CLS_ON, function (e) {
        $(this).attr("title", $(this).data(DATA)).removeClass(CLS_ON);
        $("#" + ID).remove();
    });
    if (FOLLOW) { $(document).on("mousemove", "." + CLS_ON, showAt); }
}());

Dán nó ở bất cứ đâu, nó sẽ hoạt động ngay cả khi bạn chạy mã này trước khi DOM sẵn sàng (nó sẽ không hiển thị các chú giải công cụ của bạn cho đến khi DOM sẵn sàng).

Tùy chỉnh

Bạn có thể thay đổi varkhai báo trên dòng thứ hai để tùy chỉnh nó một chút.

var ID = "tooltip"; // The ID of the styleable tooltip
var CLS_ON = "tooltip_ON"; // Does not matter, make it somewhat unique
var FOLLOW = true; // TRUE to enable mouse following, FALSE to have static tooltips
var DATA = "_tooltip"; // Does not matter, make it somewhat unique
var OFFSET_X = 20, OFFSET_Y = 10; // Tooltip's distance to the cursor

Phong cách

Bây giờ bạn có thể định kiểu các chú giải công cụ của mình bằng CSS sau:

#tooltip {
    background: #fff;
    border: 1px solid red;
    padding: 3px 10px;
}

2
Hoạt động tuyệt vời! Có thể tìm thấy một lỗi nhỏ (nếu tiêu đề trống) tại đây: stackoverflow.com/questions/26702472/
mẹo

Nếu bạn di chuyển nhanh qua một phần tử tôi sẽ nhận được một tooltip trống, ngay cả với bản sửa lỗi được đề cập ở trên. Điều này là thất thường và dừng lại nếu tôi gỡ bỏ $ (this) .removeAttr ("title"). Nhưng tất nhiên sau đó tôi nhận được sự giúp đỡ tiêu chuẩn hiển thị sau một thời gian.
Cuộc chinh phục của Allen

10

Tôi đã tìm thấy câu trả lời ở đây: http://www.webdesignerdepot.com/2012/11/how-to-create-a-simple-css3-tooltip/

Mã riêng của tôi diễn ra như vậy, tôi đã thay đổi tên thuộc tính, nếu bạn duy trì tên tiêu đề cho thuộc tính bạn sẽ có hai cửa sổ bật lên cho cùng một văn bản, một thay đổi khác là văn bản của tôi khi di chuột hiển thị bên dưới văn bản được hiển thị.

.tags {
  display: inline;
  position: relative;
}

.tags:hover:after {
  background: #333;
  background: rgba(0, 0, 0, .8);
  border-radius: 5px;
  bottom: -34px;
  color: #fff;
  content: attr(glose);
  left: 20%;
  padding: 5px 15px;
  position: absolute;
  z-index: 98;
  width: 350px;
}

.tags:hover:before {
  border: solid;
  border-color: #333 transparent;
  border-width: 0 6px 6px 6px;
  bottom: -4px;
  content: "";
  left: 50%;
  position: absolute;
  z-index: 99;
}
<a class="tags" glose="Text shown on hovering">Exposed text</a>


7

Một jsfiddle cho mẫu tooltip tùy chỉnh ở đây

Nó dựa trên bộ định vị CSS và bộ chọn lớp pseduo

Kiểm tra tài liệu MDN để được hỗ trợ trình duyệt chéo của các lớp giả

    <!-- HTML -->
<p>
    <a href="http://www.google.com/" class="tooltip">
    I am a 
        <span> (This website rocks) </span></a>&nbsp; a developer.
</p>

    /*CSS*/
a.tooltip {
    position: relative;
}

a.tooltip span {
    display: none;    
}

a.tooltip:hover span, a.tooltip:focus span {
    display:block;
    position:absolute;
    top:1em;
    left:1.5em;
    padding: 0.2em 0.6em;
    border:1px solid #996633;
    background-color:#FFFF66;
    color:#000;
}

5

Tooltip bản địa không thể được tạo kiểu.

Điều đó đang được nói, bạn có thể sử dụng một số thư viện sẽ hiển thị các lớp nổi khi các phần tử đang được di chuột (thay vì các chú giải công cụ gốc và loại bỏ chúng) yêu cầu ít hoặc không sửa đổi mã ...


Tôi không nghĩ bạn có thể triệt tiêu các chú giải công cụ gốc nếu một phần tử có titlethuộc tính. Vì vậy, nếu bạn thiết lập triển khai chú giải công cụ của riêng mình, tốt hơn là sử dụng một số thuộc tính khác (giả sử data-tip) thay vì title.
Jukka K. Korpela

1
bạn có thể, nếu sau khi bạn đính kèm vào sự kiện bạn xóa thuộc tính tiêu đề
poncha

1
Tôi thấy quan điểm của bạn, nhưng đó không phải là về kiểu dáng công cụ bản địa; đó là về việc tránh chúng (bằng cách sửa đổi DOM).
Jukka K. Korpela

@ JukkaK.Korpela yep, và tôi đã nói trong câu đầu tiên của mình rằng điều đó là không thể;)
poncha

Lợi ích của việc sử dụng thuộc tính title và xóa nó sau này là tooltip vẫn khả dụng nếu người dùng đã tắt JavaScript.
JJJ

2

Bạn không thể tạo kiểu cho tooltip trình duyệt mặc định. Nhưng bạn có thể sử dụng javascript để tạo các chú giải công cụ HTML tùy chỉnh của riêng bạn.


-1
a[title="My site"] {
    color: red;
}

Điều này cũng hoạt động với bất kỳ thuộc tính nào bạn muốn thêm vào chẳng hạn:

HTML

<div class="my_class" anything="whatever">My Stuff</div>

CSS

.my_class[anything="whatever"] {
    color: red;
}

Xem nó hoạt động tại: http://jsfiddle.net/vpYwe/1/


14
Đó là phong cách một yếu tố với tiêu đề được chỉ định; không phải tiêu đề chú giải công cụ mà trình duyệt hiển thị
Rowland Shaw

1
Ngoài ra, anythingkhông phải là một thuộc tính HTML hợp lệ. Đối với thuộc tính tùy chỉnh sử dụng data-thuộc tính.
dùng4642212
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.