Thay đổi CSS của phần tử con khi cha mẹ được di chuột


159

Trước hết, tôi cho rằng điều này quá phức tạp đối với CSS3, nhưng nếu có một giải pháp ở đó ở đâu đó, tôi rất muốn đi với điều đó thay vào đó.

HTML khá đơn giản.

<div class="parent">
    <div class="child">
        Text Block 1
    </div>
</div>

<div class="parent">
    <div class="child">
        Text Block 2
    </div>
</div>

Div con được đặt để hiển thị: none; theo mặc định, nhưng sau đó thay đổi để hiển thị: block; khi chuột được di chuột qua div cha. Vấn đề là đánh dấu này xuất hiện ở một số nơi trên trang web của tôi và tôi chỉ muốn con được hiển thị nếu chuột vượt qua nó là cha mẹ chứ không phải nếu chuột vượt qua bất kỳ cha mẹ nào khác (tất cả chúng đều có cùng một lớp tên và không có ID).

Tôi đã thử sử dụng $(this).children()vô ích.

$('.parent').hover(function(){
            $(this).children('.child').css("display","block");
        }, function() {
            $(this).children('.child').css("display","none");
        });

Câu trả lời:


260

Tại sao không sử dụng CSS?

.parent:hover .child, .parent.hover .child { display: block; }

và sau đó thêm JS cho IE6 (ví dụ bên trong một nhận xét có điều kiện) không hỗ trợ: di chuột đúng cách:

jQuery('.parent').hover(function () {
    jQuery(this).addClass('hover');
}, function () {
    jQuery(this).removeClass('hover');
});

Đây là một ví dụ nhanh: Fiddle


mã đó không làm việc cho tôi. có nghĩa là nói ".parent.hover" chứ không phải ".parent: hover" ?? trường hợp tôi chưa bao giờ thấy những gì bạn có trước đây. và không có dấu phẩy cho biết nhiều bộ chọn có cùng kiểu? tôi không thấy làm thế nào mà giúp ở đây. thêm một chút thông tin về CSS đó, por ủng hộ 0 =]
Hartley Brody

6
:hoverlà một trong những "lớp giả động" được định nghĩa bởi CSS2 ( đây là thông số kỹ thuật ). Dưới đây là một ví dụ nhanh: http://jsfiddle.net/5FLr4/ . nó làm việc cho tôi
Lee

cảm ơn rất nhiều tôi thực sự đã có một số định vị tương đối đã đẩy văn bản con ra khỏi tầm nhìn ... doh! >. <Tôi đánh giá cao sự giúp đỡ!
Hartley Brody

Rõ ràng điều này sẽ không hoạt động đối với .child :: - webkit-scrollbar-thumb nếu bạn muốn thay đổi phần tô sáng của thanh cuộn bên trong phần tử con.
thdoan

1
.parent:not(:hover) .child { display: none; }dường như hoạt động tốt với tôi, mặc dù tôi chắc chắn không lo lắng về IE6. Nhưng theo cách này tôi có thể sử dụng nó cho các yếu tố mà tôi không muốn có một displaytài sản thống nhất .
Blair Connolly

147

Không cần sử dụng JavaScript hoặc jquery, CSS là đủ:

.child{ display:none; }
.parent:hover .child{ display:block; }

XEM DEMO


9

Sử dụng toggleClass().

$('.parent').hover(function(){
$(this).find('.child').toggleClass('color')
});

nơi colorlà lớp. Bạn có thể tạo kiểu cho lớp theo ý muốn để đạt được hành vi bạn muốn. Ví dụ minh họa cách lớp được thêm và xóa khi chuột vào và ra.

Kiểm tra ví dụ làm việc ở đây .



3

Câu trả lời của Stephen là đúng nhưng đây là câu trả lời của tôi về câu trả lời của anh ấy:

HTML

<div class="parent">
    <p> parent 1 </p>
    <div class="child">
        Text Block 1
    </div>
</div>

<div class="parent">
    <p> parent 2 </p>
    <div class="child">
        Text Block 2
    </div>
</div>

CSS

.parent { width: 100px; min-height: 100px; color: red; }
.child { width: 50px; min-height: 20px; color: blue; display: none; }
.parent:hover .child, .parent.hover .child { display: block; }

jQuery

//this is only necessary for IE and should be in a conditional comment

jQuery('.parent').hover(function () {
    jQuery(this).addClass('hover');
}, function () {
    jQuery(this).removeClass('hover');
});

Bạn có thể thấy ví dụ này làm việc tại jsFiddle .


3

Tôi có những gì tôi nghĩ là một giải pháp tốt hơn, vì nó có thể mở rộng đến nhiều cấp độ hơn, nhiều như mong muốn, không chỉ hai hoặc ba.

Tôi sử dụng các đường viền, nhưng nó cũng có thể được thực hiện với bất kỳ kiểu nào muốn, như màu nền.

Với biên giới, ý tưởng là:

  • Có một màu viền khác nhau chỉ có một div, div trên vị trí của chuột, không phải trên bất kỳ cha mẹ nào, không phải trên bất kỳ đứa trẻ nào, vì vậy chỉ có thể thấy đường viền div đó có màu khác trong khi phần còn lại giữ màu trắng.

Bạn có thể kiểm tra tại: http://jsbin.com/ubiyo3/13

Và đây là mã:

<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>Hierarchie Borders MarkUp</title>
<style>

  .parent { display: block; position: relative; z-index: 0;
            height: auto; width: auto; padding: 25px;
          }

  .parent-bg { display: block; height: 100%; width: 100%; 
               position: absolute; top: 0px; left: 0px; 
               border: 1px solid white; z-index: 0; 
             }
  .parent-bg:hover { border: 1px solid red; }

  .child { display: block; position: relative; z-index: 1; 
           height: auto; width: auto; padding: 25px;
         }

  .child-bg { display: block; height: 100%; width: 100%; 
              position: absolute; top: 0px; left: 0px; 
              border: 1px solid white; z-index: 0; 
            }
  .child-bg:hover { border: 1px solid red; }

  .grandson { display: block; position: relative; z-index: 2; 
              height: auto; width: auto; padding: 25px;
            }

  .grandson-bg { display: block; height: 100%; width: 100%; 
                 position: absolute; top: 0px; left: 0px; 
                 border: 1px solid white; z-index: 0; 
               }
  .grandson-bg:hover { border: 1px solid red; }

</style>
</head>
<body>
  <div class="parent">
    Parent
    <div class="child">
      Child
      <div class="grandson">
        Grandson
        <div class="grandson-bg"></div>
      </div>
      <div class="child-bg"></div>
    </div>
    <div class="parent-bg"></div>
  </div>
</body>
</html>

Điều này không làm những gì câu hỏi yêu cầu. Nó thay đổi đường viền xung quanh thành phần được di chuột qua. Không phải biên giới xung quanh một yếu tố con.
jenniwren

2

Nếu bạn đang sử dụng Twitter Bootstrap style và cơ sở JS cho menu thả xuống:

.child{ display:none; }
.parent:hover .child{ display:block; }

Đây là phần còn thiếu để tạo ra các phần thả xuống dính (không gây khó chịu)

  • Hành vi là:
    1. Luôn mở khi nhấp, đóng khi nhấp lại vào bất kỳ nơi nào khác trên trang
    2. Đóng tự động khi chuột cuộn ra khỏi các thành phần của menu.

2

Không chắc có lý do khủng khiếp nào để làm điều này hay không, nhưng có vẻ như nó hoạt động với tôi trên phiên bản Chrome / Firefox mới nhất mà không có bất kỳ vấn đề hiệu suất rõ ràng nào với khá nhiều yếu tố trên trang.

*:not(:hover)>.parent-hover-show{
    display:none;
}

Nhưng theo cách này, tất cả những gì bạn cần là áp dụng parent-hover-showcho một phần tử và phần còn lại sẽ được chăm sóc và bạn có thể giữ bất kỳ loại hiển thị mặc định nào bạn muốn mà không phải luôn bị "chặn" hoặc tạo nhiều lớp cho mỗi loại.


0

Để thay đổi nó từ css, bạn thậm chí không cần thiết lập lớp con

.parent > div:nth-child(1) { display:none; }
.parent:hover > div:nth-child(1) { display: block; }
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.