2014-04-07 10 views
5

Về cơ bản, tôi có một phần tử trên trang có thể được chèn ở nhiều vị trí khác nhau. Nó không có bộ màu nền nhưng tùy thuộc vào màu nền của vị trí mà nó được chèn vào Tôi có thể muốn thực hiện một vài thay đổi cho nó.Cách lấy màu nền hiệu dụng của phần tử trong suốt với javascript/jQuery

Câu hỏi của tôi là: làm thế nào để có được background-color hiệu quả đối với một yếu tố thậm chí nếu đó background-color có thể đã được thừa hưởng từ cha mẹ (có khả năng tất cả các cách để cơ thể).

Dưới đây là một ví dụ đơn giản mà tôi muốn tìm ra background-color của .color-me

<div class="cont"> 
    <div class="color-me">what's my background-color?</div> 
</div> 

Và một codepen: http://codepen.io/evanhobbs/pen/FbAnL/

+0

Tôi chắc chắn điều này là không thể. Hoặc nếu nó là nó sẽ vô cùng phức tạp để thực hiện. Tại sao bạn cần điều này? Tôi chắc chắn phải có một cách đơn giản hơn. –

+0

Cảm ơn. Tôi đang sử dụng spin.js (http://fgnass.github.io/spin.js/) được bao bọc trong khung nhìn Backbone và tôi cần chuyển màu spinner như một tùy chọn trên init. Nhưng quan điểm có thể được chèn vào cả nền sáng và tối nên cần phải có màu khác. Điều đó có ý nghĩa? –

+1

@EvanHobbs, sự phức tạp xuất hiện khi bạn cần bắt đầu tính đến hình ảnh nền, độ dốc, giá trị 'rgba' và độ mờ đục.Tương đối đơn giản để có được màu của bố mẹ gần nhất với màu nền không trong suốt, nó có thể không phải là màu thực tế đằng sau phần tử. – zzzzBov

Trả lời

5

Điều này có thể đưa ra một số (khá lớn) hãy cẩn thận. zzzzBov tổng hợp chúng trong một nhận xét về câu hỏi:

... sự phức tạp xuất hiện khi bạn cần bắt đầu tính đến hình nền tài khoản, độ dốc, giá trị rgba và độ mờ. Tương đối đơn giản để có được màu của bố mẹ gần nhất với màu nền không trong suốt, nó có thể không phải là màu thực tế đằng sau phần tử.

Với những cảnh báo đó, về cơ bản bạn phải lấy màu nền của phần tử và nếu trong suốt, hãy chuyển đến phần tử gốc, v.v.

các trình duyệt khác nhau có những quan điểm khác nhau về "minh bạch", đây là một ví dụ bao gồm hầu hết trong số họ: Updated Pen

$(function() { 
    var bc; 
    var $elm = $(".color-me"); 
    while (isTransparent(bc = $elm.css("background-color"))) { 
    if ($elm.is("body")) { 
     console.log("Gave up"); 
     return; 
    } 
    $elm = $elm.parent(); 
    } 
    console.log("Effective color: " + bc); 

    function isTransparent(color) { 
    switch ((color || "").replace(/\s+/g, '').toLowerCase()) { 
     case "transparent": 
     case "": 
     case "rgba(0,0,0,0)": 
     return true; 
     default: 
     return false; 
    } 
    } 
}); 

Tôi không hoàn toàn chắc chắn đây là có thể với tất cả các trình duyệt, đặc biệt là không những người mà trả lại một giá trị rgb (không phải rgba) cho màu đã tính.

+0

thực sự nó không hoạt động đối với nhiều mục có cùng một lớp trên trang, vì nó cho thấy cùng một kết quả. –

+0

@ Good.luck: Đây là mã mẫu và sẽ chỉ hoạt động đối với kết quả khớp đầu tiên của bộ chọn đã cho (có, sau khi tất cả, chỉ có một trong bút). Nếu bạn cần lặp qua các trận đấu, bạn lặp lại các trận đấu và thực hiện việc này cho từng trận đấu. –

+0

vâng, cái đó sẽ làm việc cho tất cả các yếu tố, xin lỗi, nghĩ rằng bạn đã đăng mã chính xác. –

1

Tôi rất thích jsfiddle nhưng ở đây là của bạn được cập nhật codepen .. http://codepen.io/anon/pen/nhDGC Thêm chức năng ẩn danh như vậy để sử dụng nó chỉ cần gọi $('.yourselector').getBg();

jQuery.fn.getBg = function() { 
return $(this).parents().filter(function() { 

    var color = $(this).css('background-color'); 

    if(color != 'transparent' && color != 'rgba(0, 0, 0, 0)' && color != undefined) 
    { return color; 
    } 
}).css('background-color'); 
}; 

$(function() { 
    //console.log($('.cont').css('background-color')); 
    console.log($('.color-me').getBg()) 
    $('.color-me').append($('.color-me').getBg()); 

    console.log($('.color-me2').getBg()) 
    $('.color-me2').append($('.color-me2').getBg()); 
}); 

Nó lọc cha mẹ + sẽ trở lại khi nó tìm thấy màu nền hiện có.

+0

Điều này hoạt động tốt, nhưng điều đáng nói là điều này sẽ không kiểm tra phần tử gốc, vì vậy nếu bạn muốn bạn có thể thay đổi dòng thứ 2 thành cái này: return $ (this) .parents(). addBack(). filter (function() { Mà sau đó thêm lại phần tử gốc vào trong chuỗi. –

0

Đây là một cách thanh lịch để giải quyết vấn đề này (xin lỗi, tôi thích CoffeeScript). Nó bắt đầu tìm kiếm từ bản thân, nhưng bạn luôn có thể sử dụng $el.parents().each ->.

findClosestBackgroundColor = ($el) -> 
    background = 'white' 
    $.merge($el, $el.parents()).each -> 
     bg = $(this).css('background-color') 
     if color isnt 'transparent' and !/rgba/.test(color) 
     background = bg 
     return false 
    background 

DEMO: Sử dụng coffeescript.org để biên dịch này để javascript và chạy này trong một giao diện điều khiển trên bất kỳ trang nào có jQuery bao gồm.

Các vấn đề liên quan