2014-01-31 1 views
0

Я пытаюсь создать график так:создать жидкость (масштабирование) концентрические дуги с помощью CSS, холста или SVG

http://bl.ocks.org/cmdoptesc/6228457

или как этот

http://raphaeljs.com/polar-clock.html

Но я хотите, чтобы он мог масштабироваться (желательно без javascript) в соответствии с шириной браузера. Я хотел бы иметь возможность делать это только с помощью CSS, а если не с CSS, желательно без библиотеки, например, raphael или d3 (хотя я возьму то, что смогу получить). Кто-нибудь знает, как добиться этого таким образом, чтобы он уменьшался/уменьшался?

UPDATE

Я сделал JS скрипку - это именно граф Я хочу:

http://jsfiddle.net/Q9hb5/

Но мне нужно, чтобы изменить размер. Я использую Рафаэль, и я прочитал о SVG изменение размера здесь:

http://bertanguven.com/?tag=raphael-js

и здесь:

, но я не хочу, чтобы изменить размер с JS - Я бы действительно нравится иметь возможность делать это с помощью svg-свойств, таких как viewBox and preserveAspectRatio, но я до сих пор не видел примера, который выполняет это.

Любые идеи?

ответ

3

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

(Если вы хотите динамически создавать график с помощью Javascript, но не использовать библиотеку, то жесткая часть будет рисовать график, а не изменять его размер. Как отмечает @Lars Kotthoff, с Javascript легко узнать размер окна и масштабировать все соответственно.)

Чтобы увеличить масштаб SVG, необходимо добавить атрибут viewBox на свой элемент SVG, и он автоматически масштабируется. Однако предупреждение о том, что калибровка изображения динамически при сохранении пропорций может немного расстраивать. Атрибут preserveAspectRatio предотвращает искажение, но только пустым пространством, а не уменьшением. В Firefox использование height:auto; приведет к уменьшению масштаба SVG в соответствии с шириной и отношением к формату viewBox, но не в браузерах webkit.

Пример здесь:
http://fiddle.jshell.net/9dSbL/

Несколько косвенным решением является + Установить высоту SVG до незначительного (но не равно нулю) суммы, например, 1px; + Комплект overflow:visible; на svg; + Используйте опцию slice для preserveAspectRatio, чтобы изображение масштабировалось до большего размера по высоте или ширине; + Жесткий код нижнего стиля прокладки на элементе svg, который соответствует соотношению сторон viewBox; + Оберните весь svg в <div> со стилем overflow:hidden;.

Пример здесь:
http://fiddle.jshell.net/9dSbL/1/

+0

И в ответ на редактирование @mheavers. Да, вы можете использовать атрибут viewBox для динамически созданного SVG, чтобы он реагировал, не прослушивая события окна. Первый пример в [этом ответе] (http://stackoverflow.com/a/21418197/3128209) позволяет отрегулировать график, добавив атрибут viewBox с d3; вы могли бы так же легко сделать это с Рафаэлем. Мои другие комментарии о правильности масштабирования и соотношения сторон сохраняются, вам просто нужно добавить все правильные атрибуты в SVG в свой код. – AmeliaBR

+0

Это потрясающе, спасибо. Я думаю, что единственное, что я смутил в вашем примере, - это то, как вы вывели окно просмотра. Мне кажется, что номера в виде окна кажутся мне настолько произвольными (-3 -1 16 16) – mheavers

+0

Извините, что * * путано и они * являются * произвольными; Я снова использовал рисунок из чего-то другого, и было легче изменить viewBox, чем изменить все координаты кривой, когда края формы были отрезаны. Вот [тот же пример с более стандартным viewBox] (http://fiddle.jshell.net/9dSbL/2/). При динамическом создании viewBox просто помните, что первые два числа будут координатами верхнего левого угла, а последние два числа будут шириной и высотой для всех команд рисования и компоновки. – AmeliaBR