JavaScript. Подробное руководство, 6-е издание, стр. 354

<b>             &quot;&gt;</b>

<b>&lt;/body&gt;</b>

<b>&lt;/html&gt;</b>

В примере 21.3 демонстрируется создание еще одного SVG-изображения: в нем формат SVG используется для отображения аналоговых часов (рис. 21.4). Однако вместо создания дерева SVG-элементов с самого начала, в нем используется статическое SVG-изображение циферблата, встроенное в HTML-страницу. Это статическое изображение включает два SVG-элемента

<b>&lt;line&gt;,</b>
представляющих часовую и минутную стрелки. Обе линии направлены вверх, в результате чего статическое изображение часов показывает время 12:00. Чтобы превратить это изображение в действующие часы, в примере используется сценарий на языке JavaScript, устанавливающий атрибут
<b>transform</b>
каждого элемента
<b>&lt;liпе&gt;</b>
и поворачивающий их на углы, соответствующие текущему времени.

JavaScript. Подробное руководство, 6-е издание - i_055.jpg

Обратите внимание, что в примере 21.3 разметка SVG встроена непосредственно в файл HTML5 и в ней не используются пространства имен XML, как в XHTML-файле выше. Это означает, что данный пример будет работать только в броузерах, поддерживающих возможность непосредственного встраивания разметки SVG. Однако если преобразовать HTML-файл в XHTML, тот же самый прием будет работать и в старых броузерах с поддержкой SVG.

Пример 21.3. Отображение времени посредством манипулирования SVG-изображением

<b>&lt;! D0CTYPE НТМ1_&gt;</b>

<b>&lt;html&gt;</b>

<b>&lt;head&gt;</b>

<b>  &lt;title&gt;Analog Clock&lt;/title&gt;</b>

<b>  &lt;script&gt;</b>

<b>    function updateTime() { // Обновляет SVG-изображение часов</b>

<b>                            // в соответствии с текущим временем</b>

<b>      var now = new Date();       // Текущее время</b>

<b>      var min = now.getMinutes(); // Минуты</b>

<b>      var hour = (now.getHours() % 12) + min/60; // Часы с дробной частью</b>

<b>      var minangle = min*6;      // 6 градусов на минуту</b>

<b>      var hourangle = hour*30;   // 30 градусов на час</b>

<b>      // Получить SVG-элементы стрелок часов</b>

<b>      var minhand = document.getElementById(&quot;minutehand&quot;);</b>

<b>      var hourhand = document.getElementByldC'hourhand”);</b>

<b>      // Установить в них SVG-атрибут для перемещения по циферблату</b>

<b>      minhand.setAttribute(&quot;transform&quot;, &quot;rotate(&quot; + minangle + &quot;,50,50)&quot;); </b>

<b>      hourhand.setAttribute(&quot;transform&quot;, &quot;rotate(&quot; + hourangle + ”,50,50)&quot;);</b>

<b>      // Обновлять показания часов 1 раз в минуту setTimeout(updateTime, 60000);</b>

<b>    }</b>

<b>  &lt;/script&gt;</b>

<b>  &lt;style&gt;</b>

<b>    /* Все следующие CSS-стили применяются к SVG-элементам, объявленным ниже */</b>

<b>    #clock { /* общие стили для всех элементов часов */</b>

<b>      stroke: black; /* черные линии */</b>

<b>      stroke-linecap: round; /* с закругленными концами */</b>

<b>      fill: #ееf; /* на светлом, голубовато-сером фоне */</b>

<b>    }</b>

<b>    #numbers { /* стиль отображения цифр на циферблате */</b>

<b>      font-family: sans-serif;</b>

<b>      font-size: 7pt;</b>

<b>      font-weight: bold;</b>

<b>      text-anchor: middle;</b>

<b>      stroke: none; fill: black;</b>

<b>    }</b>

<b>  &lt;/style&gt;</b>

<b>&lt;/head&gt;</b>

<b>&lt;body onload=&quot;updateTime()&quot;&gt;</b>

<b>  &lt;!-- viewBox - система координат, width и height - экранные размеры --&gt;</b>

<b>  &lt;svg id=&quot;clock&quot; viewBox=&quot;0 0 100 100” width=&quot;500&quot; height=&quot;500&quot;&gt;</b>

<b>    &lt;defs&gt; &lt;!-- Определить фильтр для рисования теней --&gt;</b>

<b>      &lt;filter id=&quot;shadow&quot; x=&quot;-50%&quot; y=&quot;-50%&quot; width=&quot;200%&quot; height=&quot;200%&quot;&gt;</b>

<b>        &lt;feGaussianBlur in=&quot;SourceAlpha&quot; stdDeviation=&quot;1&quot; result=&quot;blur&quot; /&gt;</b>

<b>        &lt;fe0ffset in=&quot;blur&quot; dx=&quot;1&quot; dy=&quot;1&quot; result=&quot;shadow&quot; /&gt;</b>

<b>        &lt;feMerge&gt;</b>

<b>          &lt;feMergeNode in=&quot;SourceGraphic&quot;/xfeMergeNode in=&quot;shadow&quot;/&gt;</b>

<b>        &lt;/feMerge&gt;</b>

<b>      &lt;/filter&gt;</b>