ฉันใช้ jQuery และ jQuery-ui และต้องการเคลื่อนไหวคุณลักษณะต่าง ๆ บนวัตถุต่าง ๆ
เพื่ออธิบายปัญหาที่นี่ฉันได้ทำให้มันง่ายขึ้นสำหรับ div หนึ่งที่เปลี่ยนจากสีน้ำเงินเป็นสีแดงเมื่อผู้ใช้เลื่อนเมาส์ไปที่มัน
ฉันสามารถรับพฤติกรรมที่ฉันต้องการได้เมื่อใช้animate()
อย่างไรก็ตามเมื่อทำเช่นนั้นสไตล์ที่ฉันเคลื่อนไหวต้องอยู่ในรหัสภาพเคลื่อนไหวและแยกจากสไตล์ชีตของฉัน (ดูตัวอย่างที่ 1 )
ทางเลือกที่จะใช้addClass()
และแต่ฉันไม่ได้รับสามารถที่จะสร้างใหม่อีกครั้งพฤติกรรมที่แน่นอนว่าผมจะได้รับกับremoveClass()
animate()
(ดูตัวอย่างที่ 2 )
ตัวอย่างที่ 1
ลองดูรหัสที่ฉันมีanimate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
มันแสดงพฤติกรรมทั้งหมดที่ฉันกำลังมองหา:
- เคลื่อนไหวได้อย่างราบรื่นระหว่างสีแดงและสีน้ำเงิน
- ไม่มีภาพเคลื่อนไหว 'overqueue-ing' เมื่อผู้ใช้เลื่อนเม้าส์เข้าและออกจาก div อย่างรวดเร็ว
- หากผู้ใช้เลื่อนเมาส์ออก / เข้าในขณะที่ภาพเคลื่อนไหวยังคงเล่นอยู่จะช่วยลดความถูกต้องระหว่างสถานะ 'ครึ่งทาง' ปัจจุบันและสถานะ 'เป้าหมาย' ใหม่
แต่เนื่องจากการเปลี่ยนแปลงสไตล์ถูกกำหนดไว้ในanimate()
ฉันต้องเปลี่ยนค่าสไตล์ที่นั่นและไม่สามารถชี้ไปที่สไตล์ชีทของฉันได้ 'การแตกแฟรกเมนต์' ซึ่งสไตล์ถูกกำหนดเป็นสิ่งที่รบกวนจิตใจฉันอย่างแท้จริง
ตัวอย่างที่ 2
นี่คือความพยายามที่ดีที่สุดในปัจจุบันของฉันในการใช้addClass()
และremoveClass
(โปรดทราบว่าเพื่อให้แอนิเมชั่นทำงานได้คุณต้อง 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});
});
สิ่งนี้แสดงทั้งคุณสมบัติ 1 และ 2 ของข้อกำหนดเดิมของฉันอย่างไรก็ตาม 3 ไม่ทำงาน
ฉันเข้าใจเหตุผลของสิ่งนี้:
เมื่อเคลื่อนไหวaddClass()
และremoveClass()
jQuery เพิ่มสไตล์ชั่วคราวให้กับองค์ประกอบแล้วเพิ่มค่าที่เหมาะสมจนกว่าจะถึงค่าของคลาสที่ระบุและจากนั้นจะเพิ่มหรือลบคลาสออกจริง
ด้วยเหตุนี้ฉันต้องลบแอตทริบิวต์ style ไม่เช่นนั้นถ้าภาพเคลื่อนไหวหยุดกลางคันแอตทริบิวต์ style จะยังคงอยู่และจะเขียนทับค่าคลาสใด ๆ อย่างถาวรเนื่องจากแอตทริบิวต์สไตล์ในแท็กมีความสำคัญสูงกว่าสไตล์คลาส
อย่างไรก็ตามเมื่อแอนิเมชันดำเนินไปครึ่งทางแล้วยังไม่ได้เพิ่มคลาสใหม่ดังนั้นด้วยวิธีนี้สีจะข้ามไปเป็นสีก่อนหน้าเมื่อผู้ใช้เลื่อนเม้าส์ของพวกเขาก่อนที่อนิเมชั่นจะเสร็จสมบูรณ์
สิ่งที่ฉันต้องการในอุดมคติคือสามารถทำสิ่งนี้:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
อยู่ที่ไหนgetClassContent
ก็จะส่งคืนเนื้อหาของชั้นมีให้บริการที่ จุดสำคัญคือวิธีนี้ฉันไม่จำเป็นต้องเก็บคำจำกัดความสไตล์ไว้ทุกที่ แต่สามารถเก็บไว้ในชั้นเรียนในสไตล์ชีทของฉันได้
getClassContent
คือรูปลักษณ์ที่ชอบ?