2011-12-20 47 views
7

Tôi có cấu trúc DOM chứa một số div. Một cách trực quan, một số Divs này là con của những người khác, nhưng trong cấu trúc DOM chúng đều là anh chị em ruột.Trạng thái di chuột của phần tử khi di chuột qua các phần tử chồng chéo với CSS

Tôi cần tạo kiểu trạng thái di chuột của div "cha mẹ" ngay cả khi di chuột qua các div "con" của nó.

Có cách nào để thực hiện điều này mà không có Javscript không? Có lẽ bằng cách sử dụng vị trí hiện tại của các div để biết họ đang ở trong div khác?


Cập nhật


Vấn đề là các bậc phụ huynh thực sự anh chị em. Chỉ có một thùng chứa và giả sử 8 con divs. 2 là div lớn hơn và sáu khác được hiển thị 3 bên trong mỗi div lớn hơn. Một cái gì đó như:

http://jsfiddle.net/XazKw/12/

Chỉ phụ huynh xung quanh trẻ em dao động nên thay đổi màu sắc.

Tôi không thể thay đổi cấu trúc DOM BTW.

+0

Bạn có thể đăng một số mẫu lên và hiển thị những gì bạn muốn xảy ra không? Dường như bạn muốn tạo kiểu div cha, khi bạn di chuột qua một trong các phần tử con của nó? –

+0

Tính toán như vậy chỉ có thể được thực hiện bằng JavaScript. – BoltClock

+2

Ở đó có một bộ chọn anh chị em trong CSS3: http://stackoverflow.com/questions/1817792/css-previous-sibling-selector Điều này có nghĩa là bạn đang phát triển cho các phiên bản trình duyệt hiện đại. –

Trả lời

0

Làm thế nào về xung quanh tất cả các yếu tố với một container duy nhất, và sau đó làm một cái gì đó như:

#container:hover .parent { /* Hover styles applied */ } 

Giống như: http://jsfiddle.net/Wexcode/XazKw/

0

Nếu phong cách có hiệu lực khi di chuột của một anh chị em DOM, bạn nên chỉ có thể sử dụng công cụ chọn anh chị em:

.parent:hover ~ .child { /* styling */ } 
+0

Điều này sẽ tạo kiểu cho phần tử con, không phải là phần tử cha mẹ – Wex

+1

Tôi nghĩ rằng OP muốn chuột trên phần tử "cha mẹ". góc, ví dụ: – ThinkingStiff

+0

Chính xác Và có thể có nhiều hơn 1 phụ huynh – markitusss

3

Tôi không thể nghĩ ra cách làm sạch (hoặc thậm chí là hacky) bằng CSS. Đây là một phương pháp Javascript nếu bạn không tìm ra bất cứ thứ gì khác. Chỉ cần bẫy mousemove trên body.

function isOver(element, e) { 

    var left = element.offsetLeft, 
     top = element.offsetTop, 
     right = left + element.clientWidth, 
     bottom = top + element.clientHeight; 

    return (e.pageX > left && e.pageX < right && e.pageY > top && e.pageY < bottom); 

}; 

Demo: http://jsfiddle.net/ThinkingStiff/UhE2C/

HTML:

<div id="parent"></div> 
<div id="overlap"></div> 

CSS:

#parent { 
    border: 1px solid red; 
    height: 100px; 
    left: 50px; 
    position: relative; 
    top: 50px; 
    width: 100px; 
} 

#overlap { 
    background-color: blue; 
    border: 1px solid blue; 
    height: 100px; 
    left: 115px; 
    position: absolute; 
    top: 130px; 
    width: 100px; 
    z-index: 1; 
} 

Script:

document.body.addEventListener('mousemove', function (event) { 

    if(isOver(document.getElementById('parent'), event)) { 
     document.getElementById('parent').innerHTML = 'is over!';   
    } else { 
     document.getElementById('parent').innerHTML = ''; 
    }; 

}, false);   

function isOver(element, e) { 

    var left = element.offsetLeft, 
     top = element.offsetTop, 
     right = left + element.clientWidth, 
     bottom = top + element.clientHeight; 

    return (e.pageX > left && e.pageX < right && e.pageY > top && e.pageY < bottom); 

}; 
+0

Cảm ơn. Có, điều này sẽ hoạt động nếu không có giải pháp CSS nào khả dụng. – markitusss

2

Không, bạn không thể ảnh hưởng đến cha mẹ hoặc anh chị em trước đây thông qua CSS một mình. Chỉ theo anh chị em, điều này không giúp bạn ở đây.

Bất kỳ ai khác muốn có một lớp học giả :parent?

+0

Chọn một lớp học giả: 'cha mẹ'? Điều tương tự như ': không (: trống)'? – BoltClock

+0

'div p: parent' sẽ chọn các phần tử div chứa phần tử p, ví dụ. Nó sẽ giống như một lệnh Linux: 'cd/files/images /../' sẽ kết thúc trong thư mục '/ files'. – DanMan

0

Điều không thể thực hiện (thường) được giả mạo. Trong khi giải pháp đơn giản nhất sẽ là sắp xếp lại DOM và sử dụng bộ chọn anh chị em liền kề có cách khác, đó là a) phức tạp hơn b) yêu cầu trình duyệt hiện đại.

Bạn có thể sử dụng các phần tử giả để tạo hiệu ứng di chuột giả trên gốc.Phần tử giả cho biết sẽ chỉ hiển thị khi di chuột qua bố cục - .child trong trường hợp này :) và được đặt hoàn toàn để bù đắp .childs bù trừ từ .parent bao gồm .parent do đó trông giống như trạng thái gốc đã thay đổi.

Fiddle here.

+0

Tôi biết anh ấy không thể thay đổi DOM. Chỉ muốn chia sẻ suy nghĩ của tôi trước khi cung cấp giải pháp không thay đổi DOM. – Litek

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