2009-09-14 20 views
16

Tôi đã mã nguồn SVG sau đó tạo ra một số hộp với các văn bản:SVG: Về sử dụng <defs> và <use> với văn bản biến giá trị

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
     "http://www.w3.org/TR/2001/REC-SVG-20050904/DTD/svg11.dtd"> 
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="600" height="600"> 
    <defs> 
    </defs> 
    <title>Draw</title> 
    <g transform="translate(50,40)"> 
    <rect width="80" height="30" x="0" y="-20" style="stroke: black; stroke-opacity: 1; stroke-width: 1; fill: #9dc2de" /> 
    <text text-anchor="middle" x="40">Text</text> 
    </g> 
    <g transform="translate(150,40)"> 
    <rect width="80" height="30" x="0" y="-20" style="stroke: black; stroke-opacity: 1; stroke-width: 1; fill: #9dc2de" /> 
    <text text-anchor="middle" x="40">Text 2</text> 
    </g> 
    <g transform="translate(250,40)"> 
    <rect width="80" height="30" x="0" y="-20" style="stroke: black; stroke-opacity: 1; stroke-width: 1; fill: #9dc2de" /> 
    <text text-anchor="middle" x="40">Text 3</text> 
    </g> 
</svg> 

Như bạn thấy, tôi lặp đi lặp lại <g></g> ba lần để có được ba hộp như vậy, khi SVG có các phần tử <defs><use> cho phép sử dụng lại các phần tử bằng cách sử dụng tham chiếu id thay vì lặp lại định nghĩa của chúng. Một cái gì đó như:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
     "http://www.w3.org/TR/2001/REC-SVG-20050904/DTD/svg11.dtd"> 
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="600" height="600"> 
    <defs> 
    <marker style="overflow:visible;fill:inherit;stroke:inherit" 
      id="Arrow1Mend" refX="0.0" refY="0.0" orient="auto"> 
     <path transform="scale(0.4) rotate(180) translate(20,0)" 
      style="fill-rule:evenodd;stroke-width:2.0pt;marker-start:none;" 
      d="M 0.0,-15.0 L -20.5,0.0 L 0.0,15.0 "/> 
    </marker> 
     <line marker-end="url(#Arrow1Mend)" id="systemthread" x1="40" y1="10" x2="40" y2="410" style="stroke: black; stroke-dasharray: 5, 5; stroke-width: 1; "/> 
    </defs> 
    <title>Draw</title> 
    <use xlink:href="#systemthread" transform="translate(50,40)" /> 
    <use xlink:href="#systemthread" transform="translate(150,40)" /> 
    <use xlink:href="#systemthread" transform="translate(250,40)" /> 
</svg> 

Đáng tiếc là tôi không thể làm điều này với mã SVG đầu tiên kể từ khi tôi cần các văn bản là khác nhau cho mỗi hộp, trong khi thẻ <use> chỉ đơn giản là bản sao 100% những gì đang được định nghĩa trong <defs>.

Có cách nào để sử dụng <defs><use> với một số loại cơ chế tham số/đối số như cuộc gọi chức năng?

+0

tôi đặt một lớp trên , sau đó sử dụng javascript/jquery để truy cập mục đó bằng lớp và vận dụng thuộc tính của nó. Hoạt động tốt. –

Trả lời

5

Cách để đạt được điều này với đề xuất svg hiện tại không được tôi biết đến.

Nhưng có bản nháp làm việc cho mô-đun svg 2.0, xem: SVG Referenced Parameter Variables. Ví dụ với những bông hoa có chính xác những gì bạn đang tìm kiếm Tôi giả sử! Nhưng sau đó bạn có thể phải đợi cho đến tháng 6 năm 2010 hoặc thậm chí lâu hơn cho đến khi đây là một khuyến cáo của W3C và được hỗ trợ bởi các khách hàng mà tôi cho là.

Hiện tại, bạn có thể giải quyết nó bằng tập lệnh.

+0

aww quá tệ Tôi đang ở phía trước tiêu chuẩn: P .. tôi đoán tôi sẽ chỉ dính vào lặp lại các yếu tố bên trong các tài liệu svg vì tôi không muốn sử dụng kịch bản trong svg trừ khi nếu hoàn toàn cần thiết. Các tài liệu svg sẽ được tạo ra bởi php phụ trợ anyway ... – Lukman

13

Tôi đang tìm kiếm câu trả lời cho câu hỏi SVG của riêng mình. Câu hỏi của bạn đã giúp tôi giải quyết câu trả lời của tôi, vì vậy tôi trả lời câu hỏi của bạn.

.... Đọc câu hỏi của bạn chặt chẽ hơn. Bao gồm HAI mẫu mã

Mẫu số 1. Các hộp có văn bản

Mẫu # 2. Mũi tên với văn bản

Sample 1

<html> 
    <svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     width="600" height="900"> 
    <defs> 
     <g id="my_box" 
     desc="my rectangle template"> 
     <rect width="80" height="30" x="0" y="-20" style="stroke: black; stroke-opacity: 1; stroke-width: 1; fill: #9dc2de" /> 
     </g> 
    </defs> 

    <g transform="translate(50 40)"> 
     <text text-anchor="middle" x="40"> This little box went to market </text> 
     <use xlink:href="#my_box" /> 
    </g> 

    <g transform="translate(150 140)"> 
     <use xlink:href="#my_box" /> 
     <text text-anchor="middle" x="40"> This little box stayed home </text> 
    </g> 

    <g transform="translate(250 240)"> 
     <use xlink:href="#my_box" /> 
     <text text-anchor="middle" x="40"> This little box had roast beef </text> 
    </g> 
    </svg> 

</html> 

Lưu ý trong mẫu 1 rằng thứ tự của hộp văn bản và rất quan trọng.

Sample 2

<html> 
    <svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink" 
     width="600" height="900"> 
    <defs> 
     <g id="arrow" 
     desc="arrow with a long dashed tail"> 

     <marker style="overflow:visible;fill:inherit;stroke:inherit" 
       id="Arrow1Mend" refX="0.0" refY="0.0" orient="auto"> 
     <path transform="scale(0.4) rotate(180) translate(20,0)" 
       style="fill-rule:evenodd;stroke-width:2.0pt;marker-start:none;" 
       d="M 0.0,-15.0 L -20.5,0.0 L 0.0,15.0 " 
       desc="The actual commands to draw the arrow head" 
     /> 
     </marker> 

     <line transform="translate(0 -450)" 
       marker-end="url(#Arrow1Mend)" 
       x1="40" y1="10" x2="40" y2="410" 
       style="stroke: black; stroke-dasharray: 5, 5; stroke-width: 1; " 
       desc="This is the tail of the 'arrow'" 
     /> 
     </g> 
    </defs> 

    <g transform="translate(100 450)"> 
     <text> Text BEFORE xlink </text> 
     <use xlink:href="#arrow" /> 
    </g> 

    <g transform="translate(200 550)"> 
     <use xlink:href="#arrow" /> 
     <text> More to say </text> 
    </g> 

    <g transform="translate(300 650)"> 
     <use xlink:href="#arrow" /> 
     <text> The last word </text> 
    </g> 

    <g transform="translate(400 750)"> 
     <use xlink:href="#arrow" /> 
     <text> Text AFTER xlink </text> 
    </g> 

    </svg> 
</html> 
+0

+1, tôi không nghĩ rằng để sử dụng 'văn bản' và' sử dụng' không có params định vị. Nó không phải là giải pháp tối ưu, nhưng (vẫn) là tốt như SVG có thể làm mà không cần đến kịch bản. –

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