2011-07-29 72 views
40

Tôi muốn nó được đơn giản như này, nhưng tôi biết nó không phải là:Có cách nào để di chuột qua một phần tử và ảnh hưởng đến một phần tử khác không?

img { 
    opacity: 0.4; 
    filter: alpha(opacity=40); 
} 

img:hover { 
    #thisElement { 
    opacity: 0.3; 
    filter: alpha(opacity=30); 
    } 
    opacity:1; 
    filter:alpha(opacity=100); 
} 

Vì vậy, khi bạn di chuột qua img, nó thay đổi độ mờ đục của #thisElement tới 30% và thay đổi opacity của hình ảnh đến 100%. Có cách nào để thực sự làm điều này bằng cách sử dụng chỉ css?

Vì vậy, đây là HTML

<!DOCTYPE html> 
<html> 
<head> 
<script type="text/javascript" src="C:\Users\Shikamaru\Documents\Contwined Coding\LearningToCode\Learning jQuery\js\jquery-1.6.2.min.js"></script> 
<script type="text/javascript" src="briefcase.js"></script> 
<link rel="stylesheet" type="text/css" href="taskbar.css"/> 
<link rel="stylesheet" type="text/css" href="briefcase.css" /> 
<title>Briefcase</title> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
</head> 

<body> 

<div class="mask"></div> 
<div class="float"> 
    <div id="album1">Album Title</div> 
    <img class="left" src="bradBeachHeart.JPG" alt="Brad at the Lake" /> 

    <img class="left" src="mariaNavi.jpg" alt="Making Maria Na'vi" /> 

    <img class="left" src="mattWaterRun.jpg" alt="Photoshopped Matt" /> 
</div> 

<div class="gradientTop"></div> 
<div class="gradientBottom"></div> 


</body> 
</html> 

Và đây là CSS:

body { 
    font: normal small/3em helvetica, sans-serif; 
    text-align: left; 
    letter-spacing: 2px; 
    font-size: 16px; 
    margin: 0; 
    padding: 0; 
} 

div.gradientTop { 
    position: absolute; 
    margin-top: 5px; 
    z-index: 2; 
    width: 206px; 
    height: 30px; 
    float: left; 
    background: -webkit-linear-gradient(rgba(255, 255, 255, 2), rgba(255, 255, 255, 0)) 
} 

div.gradientBottom { 
    position: absolute; 
    margin-bottom: 5px; 
    z-index: 2; 
    width: 206px; 
    height: 120px; 
    float: left; 
    bottom: -210px; 
    background: -webkit-linear-gradient(rgba(255, 255, 255, 0), rgba(255, 255, 255, 1)) 
} 

div.float { 
    border-right: 1px solid orange; 
    position: absolute; 
    z-index: 2; 
    margin-left: 5px; 
    margin-top: 5px; 
    float: left; 
    width: 200px; 
} 

div.mask { 
    position: relative; 
    z-index: 1; 
    margin-top: 5px; 
    float: left; 
    width: 206px; 
    height: 805px; 
    background-color: white; 
} 

img.left { 
    z-index: inherit; 
    margin-bottom: 3px; 
    float: left; 
    width: 200px; 
    min-height: 200px; 
    /* for modern browsers */ 
    height: auto !important; 
    /* for modern browsers */ 
    height: 200px; 
    /* for IE5.x and IE6 */ 
    opacity: 0.4; 
    filter: alpha(opacity=40) 
} 

img.left:hover + #album1 { 
    opacity: .4; 
} 

img.left:hover { 
    opacity: 1.0; 
} 

#album1 { 
    z-index: 2; 
    width: 200px; 
    color: white; 
    text-align: center; 
    position: absolute; 
    background: orange; 
    top: 70px; 
} 
+0

liên quan: http://stackoverflow.com/questions/1462360/css-hover-one-element-effect-for-multiple-elements –

Trả lời

55

Cách duy nhất để làm điều này với CSS là nếu các yếu tố ảnh hưởng đến hoặc là một hậu duệ hoặc liền kề anh chị em.

Trong trường hợp của một hậu duệ:

#parent_element:hover #child_element, /* or */ 
#parent_element:hover > #child_element { 
    opacity: 0.3; 
} 

nào sẽ áp dụng đối với các yếu tố như:

<div id="parent_element"> 
    <div id="child_element">Content</div> 
</div> 

Đối với anh chị em liền kề:

#first_sibling:hover + #second_sibling { 
    opacity: 0.3; 
} 

nào làm việc cho mark-up chẳng hạn như:

<div id="first_sibling">Some content in the first sibling</div> <div id="second_sibling">and now in the second</div> 

Trong cả hai trường hợp, phần tử sau trong bộ chọn là phần tử được chọn.

Với ví dụ pseudo-code của bạn, có thể bạn muốn một cái gì đó như:

img:hover + img { 
    opacity: 0.3; 
    color: red; 
} 

JS Fiddle demo.

+0

Xin cảm ơn! Tôi sẽ thử một lần! – Marlon

+0

Tôi đã thử nó như vậy: img.left: hover + # album1 { độ mờ đục:.4; } img.left: di chuột { độ mờ: 1.0; } Trong khi # album1 là phần tử div được hiển thị phía trên phần tử img. Nó không có hiệu ứng mong muốn và tiếp tục hoạt động như trước. Bạn đề xuất món gì? – Marlon

+1

Tôi thực sự khuyên bạn nên chỉnh sửa câu hỏi của mình (nhấn vào liên kết 'chỉnh sửa') và thêm đánh dấu html của các phần có liên quan của trang vào câu hỏi của bạn. Bằng cách đó tôi có thể thấy những vấn đề có thể là gì. Cần lưu ý rằng '+' (bộ chọn anh chị em bên cạnh) chỉ có thể làm việc để chọn một phần tử ('# second_sibling') xuất hiện trong dấu đánh dấu *** sau khi ***' first_s_sling'. –

5

Tôi biết bạn có thể đang tìm kiếm một cách thuần túy để làm những gì bạn muốn, nhưng tôi khuyên bạn nên sử dụng HTML + CSS + JS làm cấu trúc MVC tuyệt vời mà họ đang có.

  • HTML là mẫu của bạn, chứa dữ liệu của bạn
  • CSS Chế độ xem của bạn, xác định cách trang nên nhìn
  • JS là điều khiển của bạn, kiểm soát như thế nào mô hình và xem tương tác với nhau.

Đó là khía cạnh kiểm soát cần được tận dụng ở đây. Bạn muốn kiểm soát chế độ xem của một mục trên tương tác của người dùng. Đó là chính xác ý nghĩa của JS.

Với JavaScript rất nhỏ, bạn có thể bật và tắt lớp học #thisElement khi di chuột qua img. Nó chắc chắn nhịp đập chơi trò chơi chọn CSS, mặc dù tôi muốn hiểu nếu bạn chỉ sẵn sàng chấp nhận một câu trả lời tinh khiết-css.

+0

Không, tôi đồng ý với bạn rằng js có lẽ sẽ tốt hơn trong trường hợp này, nhưng vấn đề duy nhất ... Tôi không biết js. Tôi hiện đang học jquery, và tôi muốn một trang làm việc để chứng minh trong vài ngày tới một số nhà đầu tư. – Marlon

+6

Cấu trúc MVC cho điều này là quá mức cần thiết và loại bỏ chủ đề :) –

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