Ngược lại với: hover (khi di chuột) là gì?


115

Có cách nào để làm ngược lại với :hover việc chỉ sử dụng CSS không? Như trong: nếu :hoveron Mouse Enter, có CSS ​​tương đương với on Mouse Leave?

Thí dụ:

Tôi có một menu HTML sử dụng các mục danh sách. Khi tôi di chuột qua một trong các mục, có một hoạt ảnh màu CSS từ #999đến black. Làm cách nào để tạo hiệu ứng ngược lại khi chuột rời khỏi khu vực mục, với hoạt ảnh từ blackđến #999?

jsFiddle

(Hãy nhớ rằng tôi không muốn chỉ trả lời ví dụ này mà là toàn bộ :hovervấn đề "ngược lại với ".)


Chính xác những gì bạn đang cố gắng để làm? Có thể có một thay thế khác?
Moin Zaman

14
Ngược lại với :hoverlà khá đơn giản :not(:hover); Tuy nhiên, :hoverkhông đồng nghĩa với onmouseentercũng không phải là :not(:hover)giống như onmouseleave. CSS không có bất kỳ khái niệm nào về sự kiện DOM.
BoltClock

1
@Cthulhu: :hoverđơn giản có nghĩa là "một phần tử có con trỏ chuột qua nó". Nó không cho biết liệu con trỏ chuột có chuyển từ phần tử khác sang phần tử này hay không. Nó chỉ có nghĩa là con trỏ chuột hiện đang ở trên phần tử.
BoltClock

1
@BoltClock sẽ: không (: hover) thực sự làm bất cứ điều gì được kích hoạt?
Moin Zaman

5
@Moin Zaman: Đúng vậy. Miễn là chuột của bạn không qua một phần tử nhất định, thì :not(:hover)sẽ áp dụng. Đây là bản demo: jsfiddle.net/BoltClock/rghBX
BoltClock

Câu trả lời:


93

Nếu tôi hiểu chính xác, bạn có thể làm điều tương tự bằng cách chuyển các chuyển tiếp của bạn đến liên kết thay vì trạng thái di chuột:

ul li a {
    color:#999;       
    transition: color 0.5s linear; /* vendorless fallback */
    -o-transition: color 0.5s linear; /* opera */
    -ms-transition: color 0.5s linear; /* IE 10 */
    -moz-transition: color 0.5s linear; /* Firefox */
    -webkit-transition: color 0.5s linear; /*safari and chrome */
}

ul li a:hover {
    color:black;
    cursor: pointer;
}

http://jsfiddle.net/spacebeers/sELKu/3/

Định nghĩa của hover là:

Bộ chọn: hover được sử dụng để chọn các phần tử khi bạn di chuột qua chúng.

Theo định nghĩa đó, ngược lại với di chuột là bất kỳ điểm nào mà chuột không ở trên đó. Ai đó thông minh hơn tôi đã thực hiện bài viết này, đặt các chuyển đổi khác nhau trên cả hai trạng thái - http://css-tricks.com/dierence-transitions-for-hover-on-hover-off/

#thing {
   padding: 10px;
   border-radius: 5px;

  /* HOVER OFF */
   -webkit-transition: padding 2s;
}

#thing:hover {
   padding: 20px;
   border-radius: 15px;

  /* HOVER ON */
   -webkit-transition: border-radius 2s;
}

1
"(Hãy nhớ rằng tôi không muốn chỉ trả lời ví dụ này, mà là toàn bộ vấn đề" đối lập với: di chuột ".)"
Cthulhu

1
@Cthulhu - Tôi đã chỉnh sửa câu trả lời của mình bây giờ. Điều đó có thể giúp ích nhiều hơn một chút. Tôi nghĩ đó là một câu trả lời quá rõ ràng.
SpaceBeers

+1 để chỉ tôi đi đúng hướng. Tôi đã gặp phải sự khác biệt về hoạt ảnh giữa các trình duyệt. Chrome đang hiển thị mọi thứ mượt mà hơn nhưng tôi có .1s khác nhau trong quá trình chuyển đổi và Mozilla và IE đều hiển thị lỗi. Tôi đã có thể sửa nó bằng cách khớp các số chuyển tiếp của mình.
Termato

Ặc. 'Định nghĩa' :hovermà bạn đã trích dẫn là từ W3Schools, không phải là nguồn có thẩm quyền. Bạn có thể tìm thấy thông số thực tế tại w3.org/TR/CSS21/selector.html#dynamic-pseudo-classes , mặc dù đây không phải là lời giải thích dễ tiếp cận nhất.
Mark Amery

22

Chỉ cần sử dụng chuyển tiếp CSS thay vì hoạt ảnh.

A {
    color: #999;
    transition: color 1s ease-in-out;
}

A:hover {
    color: #000;
}

Bản thử trực tiếp


Giống như tôi đã nói trong ví dụ, vấn đề của tôi không phải với hoạt ảnh, mà là với phần "khi di chuột".
Cthulhu

5
Chuyển đổi hoạt động cả khi di chuột qua và di chuyển chuột. Nó đủ để chỉ định kiểu cho trạng thái và trạng thái bình thường :hover.
Marat Tanalin

5

Không, không có thuộc tính rõ ràng nào cho chuột để lại trong CSS.

Bạn có thể sử dụng: di chuột trên tất cả các phần tử khác ngoại trừ mục được đề cập để đạt được hiệu ứng này. Nhưng tôi không chắc điều đó sẽ thực tế như thế nào.

Tôi nghĩ bạn phải xem xét giải pháp JS / jQuery.


JS không cần thiết trong trường hợp này và bây giờ tôi sẽ không khuyến khích nó, mặc dù một sự biện minh về hiệu suất.
Alex Chamberlain

Nó không cần thiết cho ví dụ trên, nhưng nó dường như là giải pháp tốt nhất cho toàn bộ vấn đề "chuột rời".
Cthulhu


1

Mặc dù câu trả lời ở đây là đủ, tôi thực sự nghĩ rằng ví dụ của W3Schools về vấn đề này rất đơn giản (nó giải tỏa sự nhầm lẫn (đối với tôi) ngay lập tức).

Sử dụng :hoverbộ chọn để thay đổi kiểu của nút khi bạn di chuyển chuột qua nút đó.

Mẹo: Sử dụng thuộc tính thời lượng chuyển tiếp để xác định tốc độ của hiệu ứng "di chuột":

Thí dụ

.button {
    -webkit-transition-duration: 0.4s; /* Safari & Chrome */
    transition-duration: 0.4s;
}

.button:hover {
    background-color: #4CAF50; /* Green */
    color: white;
}

Tóm lại, đối với các chuyển tiếp mà bạn muốn hoạt ảnh "nhập" và "thoát" giống nhau, bạn cần sử dụng chuyển tiếp trên bộ chọn chính .buttonthay vì bộ chọn di chuột .button:hover. Đối với các chuyển tiếp mà bạn muốn hoạt ảnh "nhập" và "thoát" khác nhau, bạn sẽ cần chỉ định các chuyển đổi bộ chọn chính và bộ chọn di chuột khác nhau.


1

Đặt thời lượng của bạn trong lựa chọn không di chuột:

li a {
  background-color: #111;
  transition:1s;
}

li a:hover {
  padding:19px;
}

1

Chỉ cần thêm hiệu ứng chuyển tiếp vào phần tử mà bạn đang làm rối. Lưu ý rằng có thể có một số ảnh hưởng khi tải trang. Giống như nếu bạn thực hiện thay đổi bán kính đường viền, bạn sẽ thấy nó khi dom tải.

.element {
  width: 100px;
  transition: all ease-in-out 0.5s;
}
 
 .element:hover {
  width: 200px;
    transition: all ease-in-out 0.5s;
}


0

Bạn đã hiểu sai :hover; nó cho biết con chuột đang ở trên một mục, chứ không phải là con chuột vừa vào mục đó.

Bạn có thể thêm hoạt ảnh vào bộ chọn mà không :hoverđạt được hiệu ứng bạn muốn.

Chuyển tiếp là một lựa chọn tốt hơn: http://jsfiddle.net/Cvx96/


1
Việc làm của bạn không mang lại kết quả như mong muốn.
Govind Rai

0

Điều ngược lại với :hoverdường như là :link.

(chỉnh sửa: không về mặt kỹ thuật đối kháng vì có 4 selectors :link, :visited, :hover:activeFive nếu bạn bao gồm. :focus.)

Ví dụ: khi xác định quy tắc .button:hover{ text-decoration:none }để loại bỏ gạch dưới trên một nút, gạch dưới sẽ hiển thị khi bạn tắt nút trong một số trình duyệt. Tôi đã sửa điều này với.button:hover, .button:link{ text-decoration:none }

Tất nhiên điều này chỉ hoạt động đối với các phần tử thực sự là liên kết (có thuộc tính href)


Thông tin của bạn không chính xác. :linkchỉ cần chọn các liên kết, đơn giản như vậy. Hãy xem định nghĩa của :link: developer.mozilla.org/en-US/docs/Web/CSS/%3Alink
Cthulhu vào

@ Phấn đấu55 Ahhh, cảm ơn, điều đó có ý nghĩa. Liên kết bạn đã cung cấp cho biết rằng "Để định kiểu các liên kết một cách thích hợp, bạn cần đặt quy tắc: liên kết trước các liên kết khác, như được xác định theo thứ tự LVHA:: liên kết -: đã thăm -: hover -: hoạt động." Nếu tôi hiểu nó một cách chính xác, điều đó có nghĩa là nếu không có bộ chọn nào khác áp dụng (: đã thăm,: di chuột, hoặc: đang hoạt động) thì: liên kết là một liên kết áp dụng. Về mặt kỹ thuật thì không ngược lại, bởi vì có 4, nhưng nó vẫn hoạt động
scripter

0

Chỉ cần thêm một chuyển đổi và tên của hoạt ảnh trên biểu tượng lớp, trong trường hợp của bạn, ul li a, chỉ cần thêm thuộc tính "chuyển tiếp" và đó là tất cả những gì bạn cần

ul li {
    display: inline;
    margin-left: 20px;
}

ul li a {
    color: #999;
    transition: 1s;
    -webkit-animation: item-hover-off 1s;
    -moz-animation: item-hover-off 1s;
    animation: item-hover-off 1s;
}

ul li a:hover {
    color: black;
    cursor: pointer;
    -webkit-animation: item-hover 1s;
    -moz-animation: item-hover 1s;
    animation: item-hover 1s;
}

@keyframes item-hover {
    from {
      color: #999;
      }
    to {
      color: black;
      }
}
    
@-moz-keyframes item-hover {
    from {
        color: #999;
      }
    to {
        color: black;
      }
}
    
@-webkit-keyframes item-hover {
    from {
        color: #999;
      }
    to {
        color: black;
      }
}

@keyframes item-hover-off {
    from {
      color: black;
      }
    to {
      color: #999;
      }
}
    
@-moz-keyframes item-hover-off {
    from {
        color: black;
      }
    to {
        color: #999;
      }
}
    
@-webkit-keyframes item-hover-off {
    from {
        color: black;
      }
    to {
        color: #999;
      }
}
<ul>
    <li><a>Home</a></li>
    <li><a>About</a></li>
    <li><a>Contacts</a></li>
</ul>

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.