Tôi đang sử dụng jQuery và jQuery-ui và muốn làm động các thuộc tính khác nhau trên các đối tượng khác nhau.
Để giải thích vấn đề ở đây, tôi đã đơn giản hóa nó thành một div chuyển từ màu xanh sang màu đỏ khi người dùng chuyển qua nó.
Tôi có thể có được hành vi tôi muốn khi sử dụng animate()
, tuy nhiên khi thực hiện các kiểu tôi đang tạo hoạt hình phải nằm trong mã hoạt hình và do đó tách biệt với biểu định kiểu của tôi. (xem ví dụ 1 )
Một cách khác là sử dụng addClass()
và removeClass()
tôi không thể tạo lại hành vi chính xác mà tôi có thể có animate()
. (xem ví dụ 2 )
ví dụ 1
Chúng ta hãy xem mã tôi có animate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
nó hiển thị tất cả các hành vi tôi đang tìm kiếm:
- Hoạt hình mượt mà giữa màu đỏ và màu xanh.
- Không có hình ảnh động 'overqueue-ing' khi người dùng di chuyển chuột nhanh chóng vào và ra khỏi div.
- Nếu người dùng di chuyển chuột ra / vào trong khi hoạt hình vẫn đang phát, nó sẽ giảm chính xác giữa trạng thái 'nửa chừng' hiện tại và trạng thái 'mục tiêu' mới.
Nhưng vì các thay đổi kiểu được xác định trong animate()
tôi phải thay đổi các giá trị kiểu ở đó và không thể chỉ nó vào biểu định kiểu của tôi. 'Sự phân mảnh' này trong đó các kiểu được định nghĩa là thứ thực sự làm phiền tôi.
Ví dụ 2
Đây là nỗ lực tốt nhất hiện tại của tôi bằng cách sử dụng addClass()
và removeClass
(lưu ý rằng để hoạt hình hoạt động, bạn cần jQuery-ui):
//assume classes 'red' and 'blue' are defined
$('#someDiv')
.addClass('blue')
.mouseover(function(){
$(this).stop(true,false).removeAttr('style').addClass('red', {duration:500});
})
.mouseout(function(){
$(this).stop(true,false).removeAttr('style').removeClass('red', {duration:500});
});
Điều này thể hiện cả tài sản 1. và 2. yêu cầu ban đầu của tôi, tuy nhiên 3 không hoạt động.
Tôi hiểu lý do cho việc này:
Khi hoạt hình addClass()
vàremoveClass()
jQuery thêm một kiểu tạm thời cho phần tử, sau đó tăng các giá trị thích hợp cho đến khi chúng đạt đến các giá trị của lớp được cung cấp và chỉ sau đó nó mới thực sự thêm / xóa lớp.
Do đó, tôi phải xóa thuộc tính style, nếu không, nếu hoạt ảnh bị dừng giữa chừng thì thuộc tính style sẽ vẫn ghi đè vĩnh viễn bất kỳ giá trị lớp nào, vì các thuộc tính style trong thẻ có tầm quan trọng cao hơn kiểu lớp.
Tuy nhiên, khi hoạt hình được thực hiện được một nửa, nó vẫn chưa thêm lớp mới, và vì vậy với giải pháp này, màu sẽ chuyển sang màu trước đó khi người dùng di chuyển chuột trước khi hoạt ảnh hoàn tất.
Điều tôi muốn lý tưởng là có thể làm một cái gì đó như thế này:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
Trường hợp getClassContent
sẽ trả lại nội dung của lớp được cung cấp. Điểm mấu chốt là theo cách này tôi không phải giữ các định nghĩa phong cách của mình ở mọi nơi, nhưng có thể giữ chúng trong các lớp trong biểu định kiểu của tôi.
getClassContent
là vẻ bề ngoài như thế nào?