Với JavaScript, tôi có thể thay đổi chỉ mục / lớp Z của phần tử SVG <g> không?


85

Giả sử tôi có một vài hình dạng tổng hợp ( <g>). Tôi muốn có thể nhấp và kéo chúng, nhưng tôi muốn cái mà tôi đang kéo vào lúc này ở trên đầu cái kia theo thứ tự Z, để nếu tôi kéo nó qua cái KHÁC, cái kia một cái nên bị lu mờ.



Câu trả lời:


113

Chỉ mục Z trong SVG được xác định theo thứ tự các phần tử xuất hiện trong tài liệu. Bạn sẽ phải thay đổi thứ tự phần tử nếu bạn muốn đưa một hình dạng cụ thể lên trên cùng.


1
@theonlygusti Các phần tử ở cuối tài liệu nằm trên cùng. Nếu bạn đang sử dụng jQuery, bạn sẽ có thể sử dụng một cái gì đó như$('#thing-i-want-on-top').appendTo('#my-svg');
Adam Bradley

Vì vậy, về cơ bản, không có cách nào để đưa một hình dạng lên trên cùng (trục z) khi di chuột…?
chharvey

jQuery không hỗ trợ thay đổi thứ tự của đường dẫn SVG.
Senthe

4
@chharvey, bạn có thể đưa mọi thứ lên đầu bằng cách sắp xếp lại thứ tự - sắp xếp lại. Đây là một ví dụ thanh lịch: codepen.io/osublake/pen/YXoEQe
Frazer Kirkman

36

Một cách thay thế cho các phần tử di chuyển trong cây là sử dụng <use>các phần tử mà bạn thay đổi xlink:hrefthuộc tính để nó cung cấp cho bạn thứ tự z bạn muốn.

Đây là một chủ đề cũ trên danh sách gửi thư của nhà phát triển svg thảo luận về chủ đề này trong bối cảnh bạn muốn tạo hoạt ảnh cho một số hình dạng.

Cập nhật:

<svg xmlns="http://www.w3.org/2000/svg" 
     xmlns:xlink="http://www.w3.org/1999/xlink"
     style="width:100%; height: 100%">
    <circle id="c1" cx="50" cy="50" r="40" fill="lime" />
    <rect id="r1" x="4" y="20" width="200" height="50" fill="cyan" />
    <circle id="c2" cx="70" cy="70" r="50" fill="fuchsia" />
    <use id="use" xlink:href="#c1" />
</svg>

Trong ví dụ này, phần tử <use> là phần tử cuối cùng, khiến nó trở thành phần tử đứng đầu. Chúng tôi có thể chọn bất kỳ phần tử nào khác hoạt động như một phần tử quan trọng nhất chỉ bằng cách thay đổi xlink:hrefthuộc tính. Trong ví dụ trên, chúng tôi chọn vòng tròn với id="c1", làm cho nó xuất hiện như là phần tử trên cùng.

Xem fiddle .


1
Câu trả lời này sẽ được nhiều hơn hữu ích với một ví dụ, hoặc với các thông tin từ đó mailing list (được gated).
Kyeotic

3
Hoạt động, nhưng làm cho bạn thêm sử dụng một cách hợp lý. Nếu bạn sử dụng bản dịch, <sử dụng> không có ý tưởng về họ
Jochen Bedersdorfer

@JochenBedersdorfer không rõ ý bạn, các bản dịch liên quan đến thứ tự z như thế nào?
Erik Dahlström

Không rõ ràng lắm về điều đó. Nếu bạn sử dụng thẻ <g> -tags lồng nhau với các phép biến đổi, bạn cần chuyển đổi tọa độ bằng getTransformToElement (..); (xem tài liệu SVG)
Jochen Bedersdorfer

3
xlink:hrefkhông được dùng nữa, bây giờ chỉ làhref
osvein

22

Đây là câu hỏi cũ, nhưng ...

Trên FireFox (7+) và Chrome (14+), bạn có thể kéo svg_element lên đầu. Điều này không cung cấp cho bạn quyền tự do kiểm soát trục z hoàn toàn, nhưng tốt hơn là không có gì;)

Chỉ cần nối phần tử đó lại.

var svg = doc.createElemNS('svg');
var circle = doc.createElemNS('circle');
var line = doc.createElemNS('line');

svg.appendChild(circle); // appends it
svg.appendChild(line);   // appends it over circle
svg.appendChild(circle); // redraws it over line now

Tôi nghĩ rằng nó sẽ tạo ra một lỗi hay gì đó.

appendChild == tự thay thế == vẽ lại


3
Không một lỗi nào cả; appendChildđầu tiên xóa khỏi cha cũ, nếu có, ngay cả khi nó giống với cha mới, sau đó thêm nó vào danh sách con của cha mới.
Potatoswatter

5

Một giải pháp khác không được đề cập là đặt mỗi mục / bộ mục svg vào một div. Bạn có thể thay đổi chỉ số z của các div một cách dễ dàng.

Fiddle: Các phần tử SVG chu kỳ với chỉ số z cho vùng chứa

... Nhấn vào các nút để 'đẩy' phần tử đó lên phía trước. (so với việc sơn lại toàn bộ và đẩy 1 phần tử lên trước, nhưng vẫn giữ thứ tự ban đầu như trong giải pháp được chấp nhận)

Sẽ rất tốt nếu có các chỉ số z tương đối ...

stackOverflow muốn tôi đặt mã nếu đó là liên kết từ jsfiddle? ... ook




3

SVGsử dụng một "mô hình họa sĩ" để kết xuất. Sơn được áp dụng trong các hoạt động liên tiếp cho thiết bị đầu ra sao cho mỗi thao tác sơn trên một số khu vực của thiết bị đầu ra. Khi khu vực này chồng lên một khu vực đã sơn trước đó, sơn mới che khuất một phần hoặc hoàn toàn khu vực cũ. - liên kết đến điều này


3

Trong SVG, để có được chỉ số Z lớn hơn cao hơn, bạn nên di chuyển phần tử xuống trong cây DOM. Bạn có thể thực hiện việc này với jQuery, chọn phần tử SVG, xóa nó và nối lại ở vị trí bạn muốn:

$('g.element').remove().appendTo('svg');

2

Nhận xét của Adam Bradley đối với câu trả lời của Sam là chính xác. Nó sử dụng jQuery thay vì chỉ CSS, nhưng anh ấy đã nói thế này:

$('#thing-i-want-on-top').appendTo('#my-svg');

Tuy nhiên, đối với những gì tôi đang tạo, tôi cần Đường dẫn SVG của mình ở trên bất kỳ đường dẫn nào khác khi di chuột, nhưng vẫn ở dưới Văn bản SVG của tôi. Vì vậy, đây là những gì tôi đã nghĩ ra:

$('#thing-i-want-on-top').insertBefore('#id-for-svg-text');

Cả appendTo và insertBefore sẽ di chuyển phần tử của bạn đến vị trí mới cho phép bạn thay đổi độ sâu của phần tử SVG theo ý muốn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.