2012-07-13 10 views
26

Như tiêu đề, tôi đang thêm biểu tượng sử dụng .icon-*. Khi thêm một biểu tượng để một siêu liên kết:: di chuột: trước khi trang trí văn bản không có hiệu ứng nào?

<a href="#" class="icon-email icon-large">Email me!</a> 

Nội dung chèn vào bởi content bất động sản cho thấy gạch dưới text-decoration trên di chuột. Tôi muốn vô hiệu hóa các text-decoration chỉ dành cho các nội dung trước:

[class^="icon-"]:before, [class*=" icon-"]:before { 
    font-family: 'IcoMoon'; 
    font-style: normal; 
    speak: none; 
} 
.icon-mail:before { 
    content: "\37"; 
} 
[class^="icon-large-"]:before, [class*=" icon-large"]:before { 
    font-size: 48px; 
    line-height: 48px; 
} 
a[class^="icon-"]:before, a[class*=" icon-"]:before { 
    margin-right: 5px; 
    vertical-align: middle; 
} 

Tôi đã thử điều này, nhưng nó không làm việc (trang trí vẫn còn hiển thị):

a[class^="icon-"]:hover:before, a[class*=" icon-"]:hover:before { 
    text-decoration: none; 
    color: white; 
} 
+0

Bạn không thể làm điều đó với pseudoelements. Bạn sẽ phải sử dụng JS. – Bojangles

+0

Yea bạn không thể tăng gấp đôi pseusoelements và pseudoclasses như thế mà không có js. Tôi sẽ đề nghị sử dụng javascript để xử lý: trước khi thay vì để xử lý: hover. Đó là bởi vì: trước đây không được hỗ trợ bởi tất cả các trình duyệt. Nhưng đó chỉ là 2 xu của tôi .. – BumbleB2na

+0

@ BumbleB2na ít nhất là IE8 +, FF10.0.2 +, Opera 11.61+, Safari 5.1.2+, Chrome 17 http://www.quirksmode.org/css/contents.html – gremo

Trả lời

28

Như the :before pseudo-element is rendered as a descendant box (cụ thể hơn, ngay trước khi là người đầu tiên hộp nội dung trẻ em) của nguyên tố tạo của nó, nó tuân theo the same rules its normal descendant boxes do with respect to text-decoration:

Các 'giáo khoa trang trí 'tài sản trên các yếu tố hậu duệ không thể có bất kỳ tác dụng trên trang trí của tổ tiên.

Xem những câu trả lời để biết thêm chi tiết:

Không có cách nào tốt xung quanh này ... sự lựa chọn duy nhất mà đến ngay lập tức để tâm trí là:

  • Quấn văn bản theo phần tử span riêng của nó, sau đó áp dụng text-decoration cho rằng span, as shown by skip405. Bất lợi là, tất nhiên, đánh dấu thêm.

  • Sử dụng một hình ảnh inline khối nền thay vì văn bản nội tuyến trong một phông chữ biểu tượng với pseudo-yếu tố :before của bạn (Tôi cũng khắc phục những mâu thuẫn với bộ chọn lớp học của bạn):

    [class^="icon-"]:before, [class*=" icon-"]:before { 
        display: inline-block; 
        width: 1em; 
        height: 1em; 
        background-size: contain; 
        content: ""; 
    } 
    .icon-email:before { 
        background-image: url(icon-mail.svg); 
        background-repeat: no-repeat; 
    } 
    .icon-large:before { 
        width: 48px; 
        height: 48px; 
    } 
    a[class^="icon-"]:before, a[class*=" icon-"]:before { 
        margin-right: 5px; 
        vertical-align: middle; 
    } 
    

    Ưu điểm này có qua giải pháp của skip405 là bạn không phải sửa đổi HTML, nhưng cho rằng nó sử dụng SVG vector background imagesbackground-size, nó sẽ không hoạt động trong IE8.

    Nếu bạn cần hỗ trợ IE8, sau đó bạn phải rơi trở lại hình ảnh bitmap:

    .icon-email:before { 
        background-image: url(icon-mail.png); 
    } 
    .icon-email.icon-large:before { 
        background-image: url(icon-mail-large.png); 
    } 
    
+0

Thực sự cảm ơn thời gian của bạn và lời giải thích tuyệt vời của bạn. Tôi sẽ đi cho các giải pháp đánh dấu thêm. – gremo

2

Một selector pseudoelement phải là mục cuối cùng trong một chuỗi lựa chọn.

Bạn có thể áp dụng kiểu cho element:hover:before nhưng không được element:before:hover.

+0

Nó thực sự ... tiêu đề là sai, câu hỏi là chính xác. Sẽ sửa nó. – gremo

1

Đã thử một số việc chỉ sử dụng thẻ a làm đánh dấu, nhưng than ôi. Một giải pháp có thể có cho bạn có thể là bọc bên trong liên kết trong một phần tử khác, ví dụ: span. Vì vậy, bạn có thể có gạch dưới trên phần tử này (thay vì một giả) - được kiểm soát hoàn toàn bởi css.

Một ví dụ sống là ở đây: http://jsfiddle.net/skip405/fQHUH/

4

Bạn có thể thiết lập chiều cao & overflow: hidden cho: trước phần tử, và text-decoration sẽ không hiển thị :)

28

Chèn màn hình: inline-block; trong css của bạn. Một cái gì đó như hình dưới đây:

.icon-mail:before { 
    content: "\37"; 
    display:inline-block; 
    text-decoration:none; 
} 

Đây là JS Fiddle:

http://jsfiddle.net/73p2k/18/

+6

Không hoạt động trong IE. – acme

+0

Cảm ơn bạn rất nhiều vì mẹo này. Không bao giờ nghĩ đến việc thêm nó. –

+4

@acme, vui lòng xem jsfiddler mới nhất để được hỗ trợ về IE. Thử nghiệm trong IE9 http://jsfiddle.net/73p2k/18/ – Pinoy2015