Tôi đang cố gắng ra SVG stacking technique để cho phép nhiều biểu tượng xếp chồng lên nhau trong một tập tin duy nhất, chỉ cần một yêu cầu HTTP đơn từ trình duyệt. Kỹ thuật này được mô tả khá kỹ lưỡng here. Về cơ bản, ý tưởng là bạn đặt nhiều phần tử SVG vào một tệp SVG duy nhất và sử dụng kiểu dáng CSS để ẩn tất cả các biểu tượng, ngoại trừ biểu tượng bạn hiện muốn hiển thị. Bạn chọn biểu tượng bạn muốn hiển thị bằng cách sử dụng bộ chọn CSS :target
.SVG xếp chồng gây ra biến dạng
Kỹ thuật này hoạt động đối với tôi, ngoại trừ xếp chồng nhiều biểu tượng gây méo mó lạ trong biểu tượng được hiển thị, mặc dù tất cả các biểu tượng khác đều bị ẩn.
Trong ví dụ tôi đang làm việc, tôi đơn giản hóa việc này để chỉ xếp hai biểu tượng: biểu tượng cờ Mỹ và biểu tượng lá cờ Vương quốc Anh.
Các tập tin (đơn giản) SVG là:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg id="svg153" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="480" width="640" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<svg:style
xmlns:svg="http://www.w3.org/2000/svg" type="text/css">
.i { display: none; }
.i:target { display: block; }
</svg:style>
<svg:svg id="uk" xmlns:svg="http://www.w3.org/2000/svg" class = "i" height="480" width="640" version="1.1">
<!-- SVG elements to draw UK flag -->
</svg:svg>
<svg:svg id="us" xmlns:svg="http://www.w3.org/2000/svg" class = "i" height="480" width="640" version="1.1">
<!-- SVG elements to draw US flag -->
</svg:svg>
</svg>
Lưu ý rằng CSS được nhúng trong tập tin SVG, trong một phần tử <svg::style>
. CSS đơn giản là:
.i { display: none; }
.i:target { display: block; }
Bằng cách này, bất kỳ yếu tố svg::svg
với class="i"
là tự động vô hình, trừ khi chúng ta nhắm tới nó trong url SVG. Vì vậy, theo cách này, để hiển thị một biểu tượng lá cờ Mỹ, tôi sẽ sử dụng đoạn mã HTML sau:
<img
src="flags.svg#us"
width="80"
height="60"
alt="SVG Stacked Image"
/>
Và tất nhiên, để hiển thị cờ Anh tôi sẽ thay đổi nó để src="flags.svg#uk"
Dù sao, tất cả điều này hoạt động tuyệt vời ... ngoại trừ một biến dạng hình ảnh lạ xảy ra trong cả Firefox và Chrome khi tôi xếp chồng hình ảnh.
Dưới đây là một ảnh chụp màn hình của lá cờ Mỹ khi tôi tháo (ẩn) Anh cờ từ tập tin SVG:
Như bạn thấy, có vẻ tốt.
Nhưng khi tôi ngăn xếp nó ở phía trước của lá cờ Anh, nó trông giống như:
Như bạn thấy, hình ảnh trở nên méo mó lạ - nó gần như trông giống như những gì xảy ra với một thu nhập thấp chất lượng JPEG khi bạn nhận được rất nhiều "hiện vật" trong hình ảnh nén.
Vậy tại sao chính xác điều này xảy ra? Các hình ảnh khác xếp chồng lên nhau với biểu tượng lá cờ Mỹ đều vô hình, vậy tại sao chúng lại ảnh hưởng đến biểu tượng nhìn thấy được?
Tôi Googled xung quanh rất nhiều tìm kiếm câu trả lời, và mặc dù chắc chắn có nhiều vấn đề và "gotchas" với kỹ thuật xếp chồng SVG, tất cả đều liên quan đến khả năng tương thích giữa các trình duyệt. Tuy nhiên, kỹ thuật này hoạt động tốt trên hầu hết các trình duyệt mới hơn và bao gồm IE9. Ngoài ra, sự biến dạng xảy ra trong cả Firefox và Chrome, vì vậy đây không phải là một số vấn đề liên quan đến trình duyệt, mà là điều tôi đang làm sai.
Vì vậy, điều gì gây ra sự biến dạng kỳ lạ này khi tôi áp dụng kỹ thuật xếp chồng SVG?
Bạn có thể cung cấp [Fiddle] (http://jsfiddle.net/) không? – user2570380
Bạn có nhận được hiệu ứng tương tự khi sử dụng độ mờ so với hiển thị không? –
Thật tuyệt khi có mã hoàn chỉnh để chơi với nó (có thể xem bạn có thể nhận được hiệu ứng tương tự với một biểu tượng sọc rất cơ bản) hay không. Tuy nhiên, nhìn vào ảnh chụp màn hình của bạn có vẻ như liên quan đến chống răng cưa: trình duyệt kết hợp màu sắc của các pixel chống răng cưa và không vẽ lại chính xác chúng khi nền được xóa. Đối với mục đích của bạn, một số gợi ý: vẽ các sọc trắng thành màu trắng đục (hoặc vẽ nền trắng lên cờ) hoặc đặt 'vẽ hình dạng: cripsEdges'. Nhưng đây là hành vi lỗi, và tôi ngạc nhiên đó là một vấn đề trong cả Chrome và Firefox. – AmeliaBR