2014-02-20 5 views
2

Первоначально у меня был встроенный svg, который работает так, как я хотел.настройка фонового изображения на динамические данные svg?

<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"> 
    <defs> 
    <pattern id="smallGrid" width="10" height="10" patternUnits="userSpaceOnUse"> 
     <path d="M 10 0 L 0 0 0 10" fill="none" stroke="gray" stroke-width="0.5"/> 
    </pattern> 
    <pattern id="grid" width="100" height="100" patternUnits="userSpaceOnUse"> 
     <rect width="100" height="100" fill="url(#smallGrid)"/> 
     <path d="M 100 0 L 0 0 0 100" fill="none" stroke="gray" stroke-width="1"/> 
    </pattern> 
    </defs> 
    <rect width="100%" height="100%" fill="url(#grid)" /> 
</svg> 

и было приятно, потому что он был рядный, я мог бы сделать JQuery селекторы на его undate: ширина/высота и атрибуты path.d.

таким образом, это был наложенный div, который не делал то, что я хотел.

Следующий шаг я думал, чтобы сохранить его как файл SVG, а затем ссылаться на него:

<div style="background-image:url('images/grid.svg');"></div> 

, который идеально подходит для меня, потому что я взял что-то уже существующий и дал ему фон вместо имеющий весь новый div с данными.

вопрос, хотя с фоном маршрута изображения, является то, что я не могу динамически регулировать Высота/Ширина/path.d атрибуты

Есть ли способ, таким образом, что я могу получить лучшее из обоих миров?

background-image + being able to query and update the attributes? 

Вот код, который я имел первоначально для функции встроенного set_gridSize:

Form.set_gridSize = function (num) { 
    num = Number(num); 
    Form.gridSize = num; 

    var defs = $("div.grid-for-gridlock > svg > defs"); 
    defs.children("#smallGrid").attr({ Height: num, Width: num }); 
    var path = defs.children("#smallGrid").children().attr("d"); 
    var arr = path.split(" "); 
    arr[1] = num; 
    arr[arr.length - 1] = num; 
    path = arr.join(" "); 
    defs.children("#smallGrid").children("path").attr("d", path) 
    defs.children("#grid").attr({ Height: num * 10, Width: num * 10 }); 
    defs.children("#grid").children("rect").attr({ eight: num * 10, Width: num * 10 }); 
    var path = defs.children("#grid").children("path").attr("d"); 
    var arr = path.split(" "); 
    arr[1] = num*10; 
    arr[arr.length - 1] = num*10; 
    path = arr.join(" "); 
    defs.children("#grid").children("path").attr("d",path); 
} 

Спасибо! :)

Редактировать: Я использовал how to draw grid using html5 and (canvas or svg) как источник для вычисления SVG и html5 для сеток.

+0

Это может представлять интерес: http://blog.cloudfour.com/media-queries-in-svg-images /. Тем не менее, вы обнаружите, что поддержка медиа-запросов в SVGs в качестве фоновых изображений является пятнистой. – cimmanon

ответ

-1

Сначала я рассмотрел требования и что было необходимо. Это может быть не так эффективно, как другие варианты. Тем не менее, все еще жизнеспособное решение.

Мой базовый объект svg находится в переменной xml. Оттуда, я буду maniuplate его по мере необходимости с «num», а затем закодировать его. Это возвращает url (data: ..), поэтому я просто устанавливаю его на фоновое изображение того, что мне хотелось бы.

Учитывая, что это статично, вы можете улучшить это, просто добавив к строке при необходимости. Я просто хотел, чтобы он был достаточно общим, чтобы я мог просто заменить xml по мере необходимости любыми необходимыми svg-данными.

function set_gridSize (num) { 
    num = Number(num); 

    var xml = '<svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"><defs><pattern id="smallGrid" width="10" height="10" patternUnits="userSpaceOnUse"><path d="M 10 0 L 0 0 0 10" fill="none" stroke="gray" stroke-width="0.5"/> </pattern><pattern id="grid" width="100" height="100" patternUnits="userSpaceOnUse"><rect width="100" height="100" fill="url(#smallGrid)"/><path d="M 100 0 L 0 0 0 100" fill="none" stroke="gray" stroke-width="1"/></pattern></defs><rect width="100%" height="100%" fill="url(#grid)" /></svg>'; 
    var data = $($.parseXML(xml)); 

    var defs = data.children("svg").children("defs"); 
    defs.children("#smallGrid").attr({ height: num, width: num }); 
    var path = defs.children("#smallGrid").children().attr("d"); 
    var arr = path.split(" "); 
    arr[1] = num; 
    arr[arr.length - 1] = num; 
    path = arr.join(" "); 
    defs.children("#smallGrid").children("path").attr("d", path) 
    defs.children("#grid").attr({ height: num * 10, width: num * 10 }); 
    defs.children("#grid").children("rect").attr({ height: num * 10, width: num * 10 }); 
    var path = defs.children("#grid").children("path").attr("d"); 
    var arr = path.split(" "); 
    arr[1] = num*10; 
    arr[arr.length - 1] = num*10; 
    path = arr.join(" "); 
    defs.children("#grid").children("path").attr("d", path); 

    return "url(data:image/svg+xml;base64," + Base64.encode(new XMLSerializer().serializeToString(defs.parent()[0]))+")"; 
} 
4

Не могу понять, почему вы не смогли разместить thl inline svg в абсолютном положении DIV следующим образом. Он будет функционировать в качестве фона и доступен через jQuery/Javacript.

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<body style='overflow:hidden'> 
<div id="svgDiv" style='position:absolute;top:0px;left:0px;width:100%;height:100%'> 
<svg id="mySVG" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg"> 
    <defs> 
    <pattern id="smallGrid" width="10" height="10" patternUnits="userSpaceOnUse"> 
     <path d="M 10 0 L 0 0 0 10" fill="none" stroke="gray" stroke-width="0.5"/> 
    </pattern> 
    <pattern id="grid" width="100" height="100" patternUnits="userSpaceOnUse"> 
     <rect width="100" height="100" fill="url(#smallGrid)"/> 
     <path d="M 100 0 L 0 0 0 100" fill="none" stroke="gray" stroke-width="1"/> 
    </pattern> 
    </defs> 
    <rect width="100%" height="100%" fill="url(#grid)" /> 
</svg> 
</div> 
</body> 
</html> 
+0

Это почти то, что я на самом деле сделал – Fallenreaper

2

Более простой метод:

var green = '3CB54A'; 
var red = 'ED1F24'; 
var svg = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="320px" height="100px" viewBox="0 0 320 100" enable-background="new 0 0 320 100" xml:space="preserve"> <polygon class="mystar" fill="#'+green+'" points="134.973,14.204 143.295,31.066 161.903,33.77 148.438,46.896 151.617,65.43 134.973,56.679 118.329,65.43 121.507,46.896 108.042,33.77 126.65,31.066 "/><circle class="mycircle" fill="#'+red+'" cx="202.028" cy="58.342" r="12.26"/></svg>';  
var encoded = window.btoa(svg); 
document.body.style.background = "url(data:image/svg+xml;base64,"+encoded+")"; 

Fiddle Here

+1

"url (data: image/svg + xml; utf8," + encodeURI (svg) + ")"; – Maxmaxmaximus

1
var svg = document.querySelector('#svg'); 
var svgCode = encodeURI(svg.outerHTML); 

element.style.backgroundImage = "url(data:image/svg+xml;utf8," + svgCode + ")"; 
Смежные вопросы