2015-06-08 3 views
1

Я пытаюсь сделать этот массивный svg отзывчивым. Однако это не работает, и я не знаю, почему.Как сделать svg отзывчивым

Я попробовал следующее: - установочная ширина: 100% высота: авто (диаграмма исчезла, как только я удалил заданную ширину/высоту в пикселе, независимо от того, что я положил обратно) - используя атрибут viewbox, как предложено https://css-tricks.com/scale-svg/

Вот код (да, я знаю, что это огромная, почему мне нужно, чтобы подогнать его к 100% ширины.): http://www.cssdesk.com/bsakG

Может кто-нибудь дать мне подсказку относительно того, что я делаю неправильно? Я пробовал много вещей, предложенных другими статьями, но, похоже, я сталкиваюсь с той же проблемой, когда, если я избавлюсь от фиксированной высоты/ширины, все исчезнет.

(и да, я знаю, этот вопрос, возможно, было предложено раньше, но ни один из ответов не решить мою проблему)

+0

ли не SVG уже реагирует? Разве это не природа SVG (** Scale-able ** Vector Graphics)? – zgood

+0

Да, он масштабируемый, поэтому я спрашиваю, как его масштабировать, потому что по умолчанию номера присваиваются каждому пути. Различные сайты предполагают, что есть разные способы манипулировать им через разные атрибуты в теге , но я не был успешным. – CleverNode

+1

Вы пытались добавить это к наружному самому '': ''? – zgood

ответ

4

Вопреки предположениям в комментариях, отлично использовать значения длины, указанные в процентах. Спецификация охватывает details в разделе основных типов данных.

Объединяя эти знания с подсказками из статьи вы связаны в вашем вопросе вы могли бы в конечном итоге с чем-то вроде следующего за отзывчивым макета:

<svg viewbox="0 0 3840 7000" width="100%" height="100%" preserveAspectRatio="xMinYMin meet"> 
+1

- это не значения «0 0 3840 7000 "жестко закодированы? – zgood

+1

Да, но он не устанавливает ширину и высоту документа. Он только сообщает рендереру, какие размеры содержимого SVG таковы, чтобы он мог рассчитать правильную шкалу для использования. Предполагая, что вы знаете, каков размер вашего документа SVG, тогда это самый простой подход. –

+0

ОК. Я понимаю, что знаю. Хотя svg будет сгенерирован пользователем, svg-тег фактически определяет высоту и widht, однако, в формате . Поэтому мне нужно запустить некоторый jquery, чтобы заставить его форматировать viewbox = «0 0 ... ...», что достаточно легко сделать. Спасибо за ваши ответы! Я очень благодарен за помощь! – CleverNode

0

Я не смог найти что-нибудь родное для SVG, которые могли бы помочь вам (я пробовал возиться с viewBox и preserveAspectRatio, но не имели большого успеха). Я уверен, что должен быть какой-то способ, но я мог бы что-то посмотреть. Если у кого-то есть лучшее решение, отправьте его!

У меня был подход JavaScript, поэтому я решил поделиться им. В этой демонстрации я буду использовать jQuery, но все это можно сделать с помощью ванильного JavaScript, если вы не можете использовать jQuery.

JavaScript:

$(function(){ 
    scaleSVG(); 
}); 

function scaleSVG(){ 
    var window_width = $(window).width(), 
     $svg = $('svg'), 
     ratio = window_width/$svg.width(); 

    $svg.css('min-width', window_width); 
    $('g:first-child', $svg).attr('transform', 'scale(' + ratio + ')'); 
}; 

Я сделал скрипку этот подход записи демо here (это может занять второе, чтобы загрузить из-за размера SVG).

Вы могли бы, вероятно, также прилагается эта scaleSVG() функция окна размер события, как это:

$(function(){ 
    $(window).on('resize', scaleSVG); 
}); 

я не смог получить эту работу в скрипке, но я имею в виду его потому, что из среда скрипки может быть ???

+0

Спасибо за ваши усилия. Фактически мне удалось заставить его работать без javascript прошлой ночью, используя абсолютную позицию и контейнер. Один из сайтов, которые я читал, предложил это, но я не мог заставить его работать в первый раз - возможно, потому, что я не совсем понял, что такое viewBox. Это гораздо более простое решение https://jsfiddle.net/ Однако я все еще не совсем понимаю, как это будет работать. Я понимаю, как абсолютное положение работает очень хорошо, но я не думал, что абсолютное позиционирование действительно делает размер также ... – CleverNode

+1

@Novina Да, если вы можете избежать использования javascript, тогда это было бы лучше;) – zgood

Смежные вопросы