Các tham số SVG như 'xmlns' và 'phiên bản' có cần thiết không?


203

Trong khoảng một nửa số ví dụ về Svg tôi thấy trên internet, mã được gói trong <svg></svg>các thẻ đơn giản .

Trong nửa còn lại, các thẻ svg có rất nhiều thuộc tính phức tạp như thế này:

<svg 
  xmlns="http://www.w3.org/2000/svg" 
  version="1.1" 
  xmlns:xlink="http://www.w3.org/1999/xlink"> 

Câu hỏi của tôi là: sử dụng các thẻ svg đơn giản? Tôi đã thử chơi xung quanh với những cái phức tạp và mọi thứ đều hoạt động tốt nếu tôi không bao gồm chúng.

Câu trả lời:


206

Tất cả các tác nhân người dùng (trình duyệt) bỏ qua thuộc tính phiên bản, vì vậy bạn luôn có thể loại bỏ thuộc tính đó.

Nếu bạn nhúng dòng SVG của bạn vào một trang HTML và phục vụ trang text/htmlđó thì các thuộc tính xmlns là không bắt buộc . Nhúng nội tuyến SVG trong các tài liệu HTML là một sự đổi mới khá gần đây xuất hiện như một phần của HTML5.

Tuy nhiên, nếu bạn phục vụ trang của mình dưới dạng hình ảnh / svg + xml hoặc application / xhtml + xml hoặc bất kỳ loại MIME nào khác khiến tác nhân người dùng sử dụng trình phân tích cú pháp XML thì các thuộc tính xmlns bắt buộc . Đây là cách duy nhất để làm mọi thứ cho đến gần đây vì vậy có rất nhiều nội dung được phục vụ như thế này.


5
"Tất cả các UAs đều bỏ qua thuộc tính phiên bản, vì vậy bạn luôn có thể loại bỏ thuộc tính đó." - nhưng thông số kỹ thuật nói gì về vấn đề này? "Các trình duyệt sẽ cho phép bạn thoát khỏi nó" là (hoặc tại một thời điểm nào đó) đúng với nhiều thực tiễn (hoặc đã) rõ ràng không chính xác.
Đánh dấu Amery

Trong IE11, nếu tôi đặt <!DOCTYPE svg xmlns="www.w3.org/2000/svg">nó hoạt động, nhưng nếu tôi lấy đi xmlns hoặc thay đổi nó thành <!DOCTYPE svg xmlns="www.example.com">không hoạt động. Tại sao vậy?
Vịt Donald

8
Một nguồn có thể được trích dẫn cho câu trả lời này, xin vui lòng?
2540625

69
Tôi đã viết một phần đáng kể của mã SVG trong Firefox và tôi nói như vậy. Điều đó không đủ tốt? Nếu không, tôi đã thêm một số liên kết.
Robert Longson

1
@Marcel không phải nếu những dữ liệu đó là hình ảnh / svg + xml, thường là trường hợp, thì phần cuối cùng của câu trả lời giữ.
Robert Longson

228

Các xmlns="http://www.w3.org/2000/svg"thuộc tính là:

  • Cần thiết cho các tập tin hình ảnh / svg + xml . 1
  • Tùy chọn cho nội tuyến <svg> . 2

Các xmlns:xlink="http://www.w3.org/1999/xlink"thuộc tính là:

  • Cần thiết cho các tệp hình ảnh / svg + xml với các thuộc tính xlink : . 1
  • Tùy chọn để nội tuyến <svg> với các thuộc tính xlink : . 2

Các version="1.1"thuộc tính là:

  • Khuyến nghị tuân thủ các tiêu chuẩn tệp hình ảnh / svg + xml . 3
  • Rõ ràng bị bỏ qua bởi mọi tác nhân người dùng. 4
  • Đã xóa trong SVG 2. 5

1 Số nhận dạng tài nguyên được quốc tế hóa (RFC3987)
2 Kể từ HTML5
3 Ngôn ngữ đánh dấu mở rộng (XML) 1.0
4 Có thể cho đến khi phát hành các phiên bản chính tiếp theo.
5 Khuyến nghị của ứng viên SVG 2, W3C, ngày 07 tháng 8 năm 2018


2
Có cần phải là http hoặc cũng có thể là https không?
JulianB

2
@JohannesB cả hai giao thức đều tương thích: D
máy tính

1
@JohannesB có ở đây bạn có một inlined dụ HTTP HTTPShình ảnh / svg + xml file với inlined svg với XLink thuộc tính ví dụ HTTP HTTPS
ncomputers

1
Cảm ơn, đoán Nick Craver cũng mắc lỗi sau đó;)
JohannesB

2
Đừng nhầm versionthuộc tính của khai báo xml ( <?xml version...) cho versionthuộc tính của <svg>phần tử. Cái đầu tiên là về phiên bản của ngôn ngữ đánh dấu XML, trong khi cái thứ hai chỉ định phiên bản của SVG. Tác giả của câu trả lời này đã mắc lỗi đó bằng cách tham chiếu đến XML, chứ không phải đặc tả SVG trong. Tôi đã cố gắng sửa nó, nhưng một số thành ngữ đã từ chối chỉnh sửa.
Bachsau 14/12/18

7

Tôi muốn thêm vào cả hai câu trả lời, nhưng tôi không có điểm nào, tôi đang thêm một câu trả lời mới. Trong các thử nghiệm gần đây trên Chrome (Phiên bản 63.0.3239.132 (Bản dựng chính thức) (Windows 64 bit)), tôi đã thấy rằng:

  1. Đối với SVG nội tuyến được nhập trực tiếp vào tệp HTML, thông qua trình soạn thảo văn bản hoặc javascript và elm.innerHTML, các thuộc tính xmlns là không cần thiết, như đã nêu trong hai câu trả lời khác.
  2. Nhưng đối với SVG nội tuyến được tải thông qua javascript và AJAX, có hai tùy chọn:
    • Sử dụng xhr.responseTextelm.innerHTML. Điều này không yêu cầu xmlns.
    • Sử dụng xhr.responseXML.documentElementelm.appendChild()hoặc elm.insertBefore(). Phương pháp tạo SVG nội tuyến này tạo ra kết quả nửa vời mà không cần khai báo không gian tên SVG cơ bản, như trong xmlns="http://www.w3.org/2000/svg". <Svg> tải vào HTML, nhưng các hàm ở cấp độ tài liệu, chẳng hạn như getElementById()không được nhận dạng trên phần tử <svg>. Tôi giả sử rằng điều này là do nó sử dụng trình phân tích cú pháp XML XMLHttpRequest bên ngoài HTML.

0

Về thuộc tính phiên bản SVG, MDN WebDoc nói

Không dùng nữa kể từ SVG 2
Tính năng này không còn được khuyến nghị. Mặc dù một số trình duyệt vẫn có thể hỗ trợ nó, nhưng nó có thể đã bị xóa khỏi các tiêu chuẩn web có liên quan, có thể đang trong quá trình bị loại bỏ hoặc chỉ có thể được giữ cho mục đích tương thích. Tránh sử dụng nó và cập nhật mã hiện có nếu có thể; xem bảng tương thích ở dưới cùng của trang này để hướng dẫn quyết định của bạn. Hãy lưu ý rằng tính năng này có thể ngừng hoạt động bất cứ lúc nào.

Thuộc tính phiên bản được sử dụng để chỉ ra thông số kỹ thuật mà tài liệu SVG tuân thủ. Nó chỉ được phép trên phần tử gốc. Nó hoàn toàn là tư vấn và không có ảnh hưởng đến kết xuất hoặc xử lý.

PS: SVG 2 còn lâu mới trở thành một tiêu chuẩ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.