2010-06-08 37 views
5

Vì vậy, tôi có một tệp SVG được tạo trong Inkscape được nhúng trong một trang web và tôi muốn nó xoay chậm. Tôi đã thử sử dụng Javascript và chèn các lệnh hoạt hình trực tiếp vào SVG, nhưng không có gì hoạt động. Tôi không muốn tải toàn bộ thư viện JS cho nhiệm vụ này. Đây là những gì tôi có cho đến nay:Animate quay phần tử SVG trên trang web

<html> 
    <body bgcolor="#333333"> 
     <embed src="gear.svg" id="gear" width="1000" height="1000" style="position: absolute; top: -500px; left: -500px;" /> 
     <script type="text/javascript"> 
      var gear = document.getElementById("gear"); 
      window.setInterval(function() { 
       // Somehow animate the gear. 
      }, 10); 
     </script> 
    </body> 
</html> 

Trả lời

7

Chủ đề thú vị vì AFAIK hiện tại Firefox không hỗ trợ hoạt ảnh trong SVG.
Vì vậy, tôi đã thực hiện một cuộc điều tra nhỏ và tìm ra giải pháp làm việc. Thử nghiệm trong Firefox 3.6, IE7 với trình cắm Adobe, Opera 10.51, Safari 4.0.5, Chrome 5.0.
Nền của vùng SVG không có độ trong suốt trong IE7, Safari và Chrome ... Tôi có thể thử với đối tượng (không được IE hỗ trợ, có thể cần một số HTML có điều kiện ...).

[EDIT] OK, tôi đã thay đổi để sử dụng các tiêu chuẩn hơn đối tượng (nhúng chưa bao giờ được định nghĩa trong HTML ...) ngoại trừ IE, nơi nó được không cũng được hỗ trợ bởi Adobe SVG plugin. Sau này cho phép thêm thuộc tính để có độ trong suốt của đối tượng nhúng. Đối với trình duyệt dựa trên Webkit, không có độ trong suốt: xem object embedded in HTML: default background should be transparent lỗi.

Mã HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" 
         "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="en"> 
    <head> 
     <title>Animating SVG</title> 
    </head> 
    <body bgcolor="#CCAAFF" onload="RotateSVG()"> 
     <!--[if !IE]> --> 
     <object id="gear" data="gear.svg" type="image/svg+xml" 
       width="500" height="500" 
       style="position: absolute; top: -250px; left: -250px;"> 
     <!--<![endif]--> 
      <embed id="gear" src="gear.svg" type="image/svg+xml" 
        width="500" height="500" wmode="transparent" 
        style="position: absolute; top: -250px; left: -250px;"/> 
     <!--[if !IE]> --> 
     </object> 
     <!--<![endif]--> 

     <div onclick="RotateSVG()" 
       style="position: absolute; top: 250px; background-color: #ACF;">Start/Stop</p> 

     <script type="text/javascript"> 
var animator; 
var angle = 0; 
function RotateSVG() 
{ 
    if (animator != null) 
    { 
     // Just stop 
     clearInterval(animator); 
     animator = null; 
     return; 
    } 

    var svgTag = document.getElementById("gear"); 
    var svgDoc = null; 
    try 
    { 
     // Most modern browsers understand this 
     svgDoc = svgTag.getSVGDocument(); 
    } 
    catch (ex) {} // Ignore error 
    if (svgDoc == undefined) 
    { 
     svgDoc = svgTag.contentDocument; // For old Mozilla? 
     if (svgDoc == undefined) 
     { 
      alert("Cannot get SVG document"); 
      return; 
     } 
    } 

    var gear = svgDoc.getElementById("gearG"); 
    if (gear == null) 
    { 
     alert("Cannot find gearG group"); 
     return; 
    } 

    animator = setInterval(
     function() 
     { 
      angle += 5; 
      gear.setAttribute("transform", "rotate(" + angle + " 250 250)"); 
     }, 100); 
} 
     </script> 
    </body> 
</html> 

Mã SVG tôi đã sử dụng (chỉ có ID là quan trọng, SVG là từ Mozilla SVG Project):

<svg xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    version="1.1" 
    baseProfile="full"> 
<!-- http://www.mozilla.org/projects/svg/ --> 
    <g id="gearG" fill-opacity="0.7" stroke="black" stroke-width="0.1cm"> 
    <circle cx="6cm" cy="2cm" r="100" fill="red" 
        transform="translate(0,50)" /> 
    <circle cx="6cm" cy="2cm" r="100" fill="blue" 
        transform="translate(70,150)" /> 
    <circle cx="6cm" cy="2cm" r="100" fill="green" 
        transform="translate(-70,150)" /> 
    </g> 
</svg> 
8
  • Thêm một yếu tố <g> bên trong phần tử <svg> của bạn mà kết thúc tốt đẹp tất cả mọi thứ bên trong <svg>, và thêm <animateTransform type="rotate" attributeName="transform" values="0 cx cy;360 cx cy" dur="30s"/> như một đứa trẻ đó <g> yếu tố, và thay thế "cx" và " cy "với bất kỳ điểm tuyệt đối thực tế nào bạn muốn sử dụng làm trung tâm xoay vòng, ví dụ:" 100 300 ". Nên làm việc trong thế hệ mới nhất của trình duyệt web, ngoài IE9.
  • Tạo hiệu ứng xoay vòng bằng cách sử dụng các biến đổi CSS3 2d, lưu ý rằng bạn sẽ phải sử dụng ít nhất ba tiền tố của nhà cung cấp khác nhau trong quy trình (-webkit-transform, -moz-transform, -o-transform). Nên làm việc trong thế hệ mới nhất của trình duyệt web, không chắc chắn về IE9 mặc dù.
  • Thêm một yếu tố <g> bên trong phần tử <svg> của bạn mà kết thúc tốt đẹp tất cả mọi thứ bên trong <svg> và sau đó thêm một <script> bên trong nó mà không yourGelement.setAttribute("transform", "rotate(" + (newRotation++) + " cx cy)") từ một timer window.setInterval, như trước đây thay thế cx và cy với trung tâm của bạn quay. Giải pháp này phải nhỏ hơn 10 dòng mã và sẽ hoạt động tốt ngay cả trong các triển khai cũ hơn không hỗ trợ các hoạt ảnh có khai báo (SMIL) (ví dụ: IE9, Firefox2, Safari3).
+1

tốt, hoàn thành câu trả lời, bạn đã nhanh hơn tôi ! :-) FF3 có hỗ trợ hoạt ảnh Smil ngay bây giờ không? Tôi chưa thử. – PhiLho

+0

Firefox 3.7 alpha Tôi đã hỗ trợ ít nhất một phần của nó: http://blog.dholbert.org/2009/10/smil-enabled-by-default-on-nightly.html. Hãy tự mình thử nghiệm nó dựa trên testuite của sv3 w3c, http://dev.w3.org/SVG/profiles/1.1F2/test/harness/ –

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