2013-06-28 44 views
10

Hàm ASAIK jquery animate chỉ chấp nhận thuộc tính kiểu. nhưng tôi muốn làm động các thuộc tính của một phần tử. xem xét một hình chữ nhật tố SVGjquery animate cho thuộc tính phần tử không phải kiểu

<svg> 
<rect id="rect1" x=10 y=20 width="100px" height="100px"> 
</svg> 

tôi muốn animate yếu tố thuộc tính hình chữ nhật "x" và một cái gì đó "y" như dưới đây

$("#rect1").animate({ 
    x: 30, 
    y: 40 
    }, 1500); 

nhưng nó không phải là cách chính xác bởi vì chức năng Animate ảnh hưởng đến phong cách không thuộc tính của một phần tử.

tôi biết rất nhiều plugin tùy chỉnh có ở đây như raphel.js.

http://raphaeljs.com/

nhưng tôi không muốn sử dụng plugin để làm việc này tùy chỉnh. tôi muốn làm điều này đơn giản trong hàm jquery.animate.

là điều này có thể?

Cảm ơn,

Siva

+1

là x và y vị trí của nguyên tố này? – caramba

+0

@caramba yes.it là vị trí của phần tử hình chữ nhật – SivaRajini

+1

có thể trùng lặp với [jquery animation của các thuộc tính cụ thể] (http://stackoverflow.com/questions/6670718/jquery-animation-of-specific-attributes) –

Trả lời

1

tôi sẽ cố gắng một cái gì đó như thế này

<svg> 
    <rect class="myElement" id="rect1" x="10" y="20" width="100px" height="100px"> 
</svg> 

trong kịch bản:

var myElemX = $('.myElement').attr('x'); 
var myElemY = $('.myElement').attr('y'); 
$("#rect1").animate({ 
    left: myElemX+'px', 
    top: myElemY+'px' 
}, 1500); 
+1

cảm ơn. nếu đang sử dụng trái và trên có nghĩa là vẫn còn thuộc tính x và y là có trong phần tử. thì phần tử vị trí nào mất? – SivaRajini

6

chỉ động theo cách cũ thời:

bạn có thể gọi animate theo kiểu jquery như thời trang.

http://jsfiddle.net/wVv9P/7/

function animate($el, attrs, speed) { 

    // duration in ms 
    speed = speed || 400; 

    var start = {}, // object to store initial state of attributes 
     timeout = 20, // interval between rendering loop in ms 
     steps = Math.floor(speed/timeout), // number of cycles required 
     cycles = steps; // counter for cycles left 

    // populate the object with the initial state 
    $.each(attrs, function(k,v) { 
     start[k] = $el.attr(k); 
    }); 

    (function loop() { 
     $.each(attrs, function(k,v) { // cycle each attribute 
      var pst = (v - start[k])/steps; // how much to add at each step 
      $el.attr(k, function(i, old) { 
       return +old + pst; // add value do the old one 
      }); 
     }); 

     if (--cycles) // call the loop if counter is not exhausted 
      setTimeout(loop, timeout); 
     else // otherwise set final state to avoid floating point values 
      $el.attr(attrs); 

    })(); // start the loop 
} 

$('button').on('click', function() {  
    animate(
     $('#rect1'), // target jQuery element 
     { x:100, y:300, width:50, height:100 }, // target attributes 
     2000 // optional duration in ms, defaults to 400 
    ); 
}); 
+0

bạn có thể vui lòng giải thích chi tiết hơn. các bước, tốc độ và chức năng timeout là gì? st ở đây là gì? bạn có thể vui lòng cụ thể hơn – SivaRajini

+0

@Ram chỉ cần thay đổi mã một chút tiền thưởng –

+1

: hoạt hình điên http://jsfiddle.net/EpMVN/4/ –

-1

này may phù hợp với bạn đơn giản

$("your div id").css("position", "absolute").animate({ 
    left: 159, 
    top: 430 
}); 
+1

Theo tôi biết cách "đầu" và "trái" sẽ là thuộc tính css. Câu hỏi rõ ràng nói «thuộc tính phần tử không kiểu». Nếu tôi sai, tôi sẽ xóa bỏ phiếu bầu số –

1

Được rồi tất cả những câu trả lời ở đây là một trong hai đặc trưng cho SVG hoặc reimplement các .animate() jQuery cuộc gọi, tôi tìm thấy một cách để sử dụng Cuộc gọi jQuery mà không gặp phải sự cố thuộc tính được đặt lại về 0 khi hoạt ảnh bắt đầu:

Cho phép nói rằng chúng tôi muốn tạo ảnh động widthheight thuộc tính của phần tử thẻ img có id image. Để animate nó từ giá trị hiện tại của nó đến 300 chúng ta có thể làm điều này:

var animationDiv= $("<div></div>"); //we don't add this div to the DOM 
var image= $("img#image"); 
//could use any property besides "top" and "left", but the value must be valid, that means concatenating a "px" to numerical attributes if they don't have it already (and removing them in the step callback if they do) 
animationDiv.css("left", image.attr("width")); 
animationDiv.css("top", image.attr("height")); 
animationDiv.animate(
    { 
     left: 300, 
     top: 300 
    }, 
    { 
     duration: 2500, 
     step: function(value, properties) { 
      if (properties.prop == "left") 
       image.attr("width", value + "px") 
      else 
       image.attr("height", value + "px") 
     } 
    } 
) 

Trong phương pháp này chúng tôi sử dụng một div đó không phải là bên trong DOM và animate giá trị trong nó, chúng ta sau đó sử dụng các giá trị div CSS để animate của chúng tôi thành phần. Không phải là rất đẹp nhưng được công việc làm, nếu bạn cần phải ngừng các hình ảnh động bạn có thể gọi .stop() trên animationDiv.

jsfiddle

+2

Sẽ không tốt hơn nếu bỏ phiếu để đóng câu hỏi dưới dạng bản sao của câu hỏi khác mà bạn vừa trả lời với câu trả lời này? –

0

Tôi thích cách tiếp cận Hoffmann, nhưng tôi nghĩ là tao nhã hơn mà không cần tạo một đối tượng dom ảo.

Đây là coffeescript tôi đoạn mã

$rects.each -> 
    that = @ 
    $({width: 0}).animate 
    width: parseInt($(@).attr('width')) 
    , 
    duration: 2000 
    easing: 'easeIn' 
    step: -> 
    $(that).attr 'width', Math.round(@.width) 
    done: -> 
    console.log 'Done' 

mà biên dịch vào

return $rects.each(function() { 
    var that; 
    that = this; 
    return $({ 
    width: 0 
    }).animate({ 
    width: parseInt($(this).attr('width')) 
    }, { 
    duration: 1000, 
    easing: 'easeIn', 
    step: function() { 
     return $(that).attr('width', Math.round(this.width)); 
    }, 
    done: function() { 
     return console.log('Done'); 
    } 
    }); 
});