- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
别笑,我对 SVG 的了解几乎零。这是我第一次尝试动画 svg 阴影。我想要的只是动态访问过滤器 feOffset 的 dx 和 dy 属性,以便在时钟指针围绕表盘移动时提供逼真的阴影位置。我能做到的唯一方法是拆开 svg 并用 JavaScript 重新组装它。它工作正常,在我的机器上以大约 1.5% 到 4% 的 cpu 运行,setTimeout 周期约为 30mls(需要平稳的二手)。我丢弃了 requestanimationframe,因为长时间没有页面焦点,时间会花掉。就目前而言,脚本在每个新周期中创建/替换(我认为!)新 svg。无论如何,我的问题是有更好/正确的方法来访问和操作 dx 和 dy 吗?Ps:我只使用 svg,因为我想要的形状显然不能用 css 生成,而且时钟是完全可调整大小的,图像 png 等是 Not Acceptable 。感谢您的帮助。
(function () {
/* German Station Style Clock */
/* ^^^^^^^^^^^^ Config below ^^^^^^^^^^^^ */
var clockSize = 500;
var casecol = 'rgba(40,40,40,1.0)';
var dialcol = 'rgba(255,255,255,1.0)';
var numcol = 'rgba(40,40,40,1.0)';
var seccol = 'rgba(200,0,0,1.0)';
var handcol = 'rgba(40,40,40,1.0)';
var shadowOpacity = 0.3;
var shadowBlur = 0.2;
var shadowAngle = 0.6;
var clockShape = 50;
/* (max) 50 = round (min) 0 = square */
var numoutline = 'no';
/* 'yes' or 'no' */
var numfill = 'rgba(255,0,0,1.0)';
var numshad = 'rgba(0,0,0,0.1)';
/* ^^^^^^^^^^^^^ End config ^^^^^^^^^^^^^ */
var d = document;
var dgts = [];
var e = 360/12;
var degr = 0;
var nums = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'];
var tmr;
var mls = 1000 / 30;
var radi = Math.PI / 180;
var offs = 60 * radi;
var canstroke = ('webkitTextStroke' in d.body.style);
var str = '-webkit-text-fill-color: '+numfill+';'
+'-webkit-text-stroke-width: '+xy(0.4)+'px;'
+'-webkit-text-stroke-color: '+numcol+';';
var wks = (canstroke && numoutline == "yes")?str:'';
var broff = (clockShape < 20)?2:0;
var presec;
var premin;
var prehou;
var rnd = 'id'+Math.random() * 1;
var idx = d.getElementsByTagName('div').length;
d.write('<div id = "'+rnd+'" style="display:inline-block;line-height:0px;"></div>');
function xy (a) {
return (a * clockSize / 100);
}
/* Clock dial */
var dial = d.createElement('div');
dial.setAttribute('style', 'display:inline-block;'
+'position: relative;'
+'height: '+clockSize+'px;'
+'width: '+clockSize+'px;'
+'background-color: '+dialcol+';'
+'border: '+xy(2)+'px solid '+casecol+';'
+'border-radius: '+clockShape+'%;');
d.getElementById(rnd).appendChild(dial);
/* Clock markers */
for (var i = 0; i < 12; i++) {
dgts[i] = d.createElement('div');
dgts[i].setAttribute('style', 'display: block;'
+'position: absolute;'
+'width: '+xy(16)+'px;'
+'height: '+xy(14)+'px;'
+'margin: auto;top: 0;bottom: 0; left: 0;right: 0;'
+'font: bold '+xy(13)+'px Arial;'
+'line-height: '+xy(13)+'px;'
+'text-align: center !important;'
+'color: '+numcol+';'+wks+';');
dgts[i].innerHTML = nums[i];
dial.appendChild(dgts[i]);
degr += 30;
dgts[i].style.top = xy(0) + xy(84) * Math.sin(-offs + e * i * radi) + 'px';
dgts[i].style.left= xy(0) + xy(84) * Math.cos(-offs + e * i * radi) + 'px';
dgts[i].style.transform = 'rotate(' + (degr) + 'deg)';
dgts[i].style.transformOrigin = 'center center';
}
/* Generic container div for all hands */
var handContainers = 'display: block;'
+'position: absolute;'
+'height: '+xy(100)+'px;'
+'width: '+xy(20)+'px;'
+'font-size: 0px; line-height: 0px; padding: 0;'
+'margin: auto; top: 0;bottom: 0; left: 0; right: 0;'
+'transform-origin: center center;'
/* Hour hand */
var houHand = d.createElement('div');
houHand.setAttribute('style', handContainers + 'transition: .5s cubic-bezier(0.666, 1.91, 0.333, 0);');
dial.appendChild(houHand);
var houC = d.createElement('div');
var housvg = '<polygon points="94,46 100,40 106,46 106,118 94,118" style="fill:'+handcol+'; stroke:none"/>';
/* Minute hand */
var minHand = d.createElement('div');
minHand.setAttribute('style',handContainers + 'transition: .4s cubic-bezier(0.666, 1.91, 0.333, 0);');
dial.appendChild(minHand);
var minC = d.createElement('div');
var minsvg = '<polygon points="95.5,11.5 100,7 104.5,11.5 104.5,122 95.5,122" style="fill:'+handcol+'; stroke:none"/>';
/* Seconds hand */
var secHand = d.createElement('div');
secHand.setAttribute('style',handContainers);
dial.appendChild(secHand);
var secC = d.createElement('div');
var secsvg = '<polygon points="98.8,11 100,9.8 101.2,11 101.6,42 98.4,42" style="fill:'+seccol+'; stroke:none"/>'+
'<polygon points="98.1,58 101.9,58 102.5,122 97.5,122" style="fill:'+seccol+'; stroke:none"/>'+
'<circle cx="100" cy="50" r="8.5" style="fill:none; stroke:'+seccol+'; stroke-width:6.5"/>';
function dropShadow(s, h) {
var depth = xy(h);
var angle = s * radi - shadowAngle;
var vsa = depth * Math.cos(angle);
var hsa = depth * Math.sin(angle);
return {vsa:vsa, hsa:hsa}
}
var str1 = '<svg height="'+xy(100)+'" width="'+xy(20)+'" viewBox="90.25 -4 20 200" ><defs>';
var str3 = '<feGaussianBlur in="SourceAlpha" stdDeviation="'+shadowBlur+'"/>';
var str5 = '<feFlood flood-color="#000000" flood-opacity="'+shadowOpacity+'"/>'+
'<feComposite in2="offsetblur" operator="in"/>'+
'<feMerge>'+
'<feMergeNode/>'+
'<feMergeNode in="SourceGraphic"/>'+
'</feMerge>'+
'</filter>'+
'</defs>';
var str8 = '</g></svg>';
function dynShad (str2, str4, str6, str7) {
var create = str1 + str2 + str3 + str4 + str5 + str6 + str7 + str8;
return create;
}
function clock() {
var x = new Date();
var time = Math.min(60000, 1.025 * (1000 * x.getSeconds() + x.getMilliseconds()));
var seconds = Math.floor(time / 1000);
var millis = time % 1000;
var germanSec = (6 * seconds + 3 * (1 + Math.cos(Math.PI + Math.PI * (0.001 * millis))));
var minutes = x.getMinutes();
var hours = (x.getHours() * 30) + (minutes / 2);
if (germanSec !== presec) {
var ssy = dropShadow(germanSec, 0.7).vsa;
var ssx = dropShadow(germanSec, 0.7).hsa;
var sf = '<filter id="sf'+idx+'" x="-50%" y="-50%" width="200%" height="200%">';
var se = '<g filter="url(#sf'+idx+')">';
var ss = '<feOffset id="soffset'+idx+'" dx="'+ssx+'" dy="'+ssy+'" result="offsetblur"/>';
secC.innerHTML = dynShad (sf, ss,se, secsvg);
secHand.appendChild(secC);
}
if (minutes !== premin) {
var msy = dropShadow(minutes * 6, 0.5).vsa;
var msx = dropShadow(minutes * 6, 0.5).hsa;
var mf = '<filter id="mf'+idx+'" x="-50%" y="-50%" width="200%" height="200%">';
var me ='<g filter="url(#mf'+idx+')">';
var ms = '<feOffset id="moffset'+idx+'" dx="'+msx+'" dy="'+msy+'" result="offsetblur"/>';
minC.innerHTML = dynShad (mf, ms,me, minsvg);
minHand.appendChild(minC);
}
if (hours !== prehou) {
var hsy = dropShadow(hours, 0.4).vsa;
var hsx = dropShadow(hours, 0.4).hsa;
var hf = '<filter id="hf'+idx+'" x="-50%" y="-50%" width="200%" height="200%">';
var he ='<g filter="url(#hf'+idx+')">';
var hs = '<feOffset id="hoffset'+idx+'" dx="'+hsx+'" dy="'+hsy+'" result="offsetblur"/>';
houC.innerHTML = dynShad (hf, hs,he, housvg);
houHand.appendChild(houC);
}
secHand.style.transform = 'rotate(' + germanSec + 'deg) translateZ(0)';
minHand.style.transform = 'rotate(' + (minutes * 6) + 'deg) translateZ(0)';
houHand.style.transform = 'rotate(' + hours + 'deg) translateZ(0)';
presec = germanSec;
premin = minutes;
prehou = hours;
tmr = setTimeout(clock, mls);
}
window.addEventListener('load', clock, false);
})();
最佳答案
All I wanted was to dynamically access the filter feOffset's dx and dy attributes to give the clock hands realistic shadow positions as they move around the dial.
实际上,您不必为了逼真的阴影而触及 dx 和 dy 属性。您所要做的就是将手放在 g 元素上并将阴影应用于组(不旋转)。在这种情况下,阴影不会旋转,因此偏移量保持不变。
看这个例子,矩形在旋转,但是阴影被应用到组中:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="200" height="200">
<defs>
<filter id="gb" filterUnits="userSpaceOnUse" x="-50" y="-50" width="100" height="100">
<feGaussianBlur in="SourceAlpha" stdDeviation="1" />
<feOffset dx="2" dy="2" />
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<g transform="translate(50 50)" filter="url(#gb)">
<rect x="-0.5" y="-45" width="1" height="45" fill="red">
<animateTransform attributeName="transform" type="rotate" from="0" to="360" dur="10s" repeatCount="indefinite"/>
</rect>
</g>
</svg>
var r=document.getElementById("rect")
setInterval(function(){
var d = new Date();
var a = d.getSeconds()*6; // 360/60 so every second equals 6 deg
r.setAttribute("transform","rotate("+a+")");
},500);
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="200" height="200">
<defs>
<filter id="gb" filterUnits="userSpaceOnUse" x="-50" y="-50" width="100" height="100">
<feGaussianBlur in="SourceAlpha" stdDeviation="1" />
<feOffset dx="2" dy="2" />
<feMerge>
<feMergeNode />
<feMergeNode in="SourceGraphic" />
</feMerge>
</filter>
</defs>
<g transform="translate(50 50)" filter="url(#gb)">
<rect id="rect" x="-0.5" y="-45" width="1" height="45" fill="red"/>
</g>
</svg>
关于javascript - 德国风格的铁路时钟。 SVG 的可怕使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32810205/
我的代码如下所示: #include #include #include int main(void) { time_t loop_begin, loop_end, scanf_begi
我正在尝试制作一个游戏时钟,其中每个游戏小时都是 3 个实时分钟。但是由于某种原因,我很难将头环绕在它周围。 我想出了这个半工作位,每小时循环 3 分钟,所以它只显示完整的“游戏时间”,我在 23 以
很难找到解决方法的地方。我希望制作一个时钟,它是一个幻想时区,并且是根据系统时间计算的(因为当您不在网页上时,它需要继续运行)。 白天持续从早上7:00到晚上9:59,这是实时200分钟。 13秒(实
Template.display_time.time = function() { var date = new Date(); var hour = date.getHours();
我想做一个小测试,以测试我在远离 javascript 太久之后的技能。试图成为真正的cwleaver并创建一个时钟对象,听起来很简单。我成功地创建了时钟等,没有遇到任何问题,但在大约 20 分钟后运
我正在学习 Javascript30.com 类(class),我们必须做一个带有秒、分和小时的 JS 时钟。这是代码: 还有 J
我有一个 Android 应用程序,用户按下开始按钮并启动一些收集数据的功能。我有一个自定义的 EditText,它显示所有这些过程所花费的时间,并且每秒更新一次,直到用户按下停止键。我使用如下所示的
我正在尝试模拟实时数据流,以测试不断过滤和计算数据点的程序。主要是我需要确保它能满足时间要求。 每 50 毫秒就会有一个新的数据点需要计算。 所以我想创建一个 java 时钟,它独立于当前在 jvm
我正在抓狂:我的 Javascript 时钟不工作。我正在使用 Firebug 来查找错误,但没有得到任何输出。 图像文件位于子文件夹 Dual_Months 和 Dual_Numbers 中。我在我
我计划构建多个计时器。我首先使用以下代码构建一个简单的时钟。 问题是,时钟将运行几分钟,网站就会崩溃,我认为这是由于内存不足。 当我console.log输出时。该命令似乎每秒运行多次。 consol
我是新来的,所以如果您对我的问题或“礼仪”有任何不妥之处,请告诉我! 我正在尝试在 Google Chrome 中创建个性化的新标签扩展程序,但出现了 JavaScript 时间码问题。虽然它在我使用
我需要编写一个带有倒计时器的 JavaScript 时钟,当到达特定时间时,该计时器开始倒计时 5 分钟。所以我有我的时钟和它的工作,但我不知道从这里到哪里去,当谈到 JavaScript 时,我真的
我开发了一个用于多线程计算的类,一个线程只使用这个类的一个实例。我还想通过从另一个线程迭代此类的容器来测量计算的持续时间。该应用程序是win32。问题是我读过 QueryPerformanceCoun
我有一个像这样的时钟: const timeContainer = document.querySelector('.timeContainer'); var showTime = (timeZone
我在 Canvas 上做了一个时钟,我实际上是在 Canvas 上从中心画线,每一秒我从中心画一条线在一个圆圈里,我最终在时钟上画了秒线。我如何清除之前绘制的线,使其看起来像一个真正的时钟。 非常感谢
我正在尝试编写一个倒计时时钟脚本。我想在未来使用一个设定的日期,并以一种易于阅读的格式倒计时。小时,分钟,秒。我要打印到 16x2 液晶显示器。我遇到的问题是试图将日期之间的差异的输出转换为一种很好的
我在计算进程的 CPU 时间的各种机制上研究了 stackoverflow 线程。 clock() 内部是如何实现的?它是否使用 rdtsc()(如果是这样,那么它对核心之间的迁移很敏感)。 此外,g
我需要在时钟上显示服务器时间。以下是我目前拥有的代码。我通过 Ajax 调用获得服务器时间。问题是,如果用户更改它的本地/计算机时钟,它也会更新脚本的时钟,这是不对的——它应该继续而不改变,我被卡住了
当我运行下面的代码时,我得到了一个值 0,有几次我确实得到了 intAddition 的值。我已经尝试了很多我在网上找到的建议,但还没有成功。我的同学向我展示了他是如何做的,这与我的非常相似。他从他的
我正在尝试使用 asm 和 rdtsc 实现我自己的 clock() 版本。但是我很不确定它的返回值。是循环吗?奥德是微秒吗? 我也对 CLOCKS_PER_SEC 感到困惑。这怎么可能是恒定的? 是
我是一名优秀的程序员,十分优秀!