Javascript 动画SVG防止D3仅在iOS中转换单独div的“top”样式
我的代码在Mac(Mavericks)Chrome、Safari和Firefox上正常工作,但如果在iOS7 Chrome和Safari上失败 在桌面版本中,带有图像模式背景的SVG填充窗口并无限向下滚动,而D3将div添加到DOM中,并将其Javascript 动画SVG防止D3仅在iOS中转换单独div的“top”样式,javascript,css,animation,svg,d3.js,Javascript,Css,Animation,Svg,D3.js,我的代码在Mac(Mavericks)Chrome、Safari和Firefox上正常工作,但如果在iOS7 Chrome和Safari上失败 在桌面版本中,带有图像模式背景的SVG填充窗口并无限向下滚动,而D3将div添加到DOM中,并将其顶部位置在设置间隔上转换到窗口底部 在移动设备上,蓝色潜水器下落的动画无法出现 如果SVG的显示设置为无,或其可见性设置为隐藏,则在iOS上下降div将正确转换。 如果SVGrectanimateTransformrepeatCount设置为一个数字(而不是
顶部
位置在设置间隔
上转换到窗口底部
在移动设备上,蓝色潜水器下落的动画无法出现
如果SVG的显示
设置为无
,或其可见性
设置为隐藏
,则在iOS上下降div将正确转换。
如果SVGrect
animateTransform
repeatCount
设置为一个数字(而不是unfinite
),则在iOS中下降的divs将正确转换。
如果我从D3选择样式行中删除转换
,则下降的div将显示在iOS窗口的底部,而不是粘在顶部。
如果我将我的移动设备连接到Mac并运行Safari开发工具,我会看到当显示svg
时,我的div.single
元素上的top
属性的设置完全失败
app.parallaxField.style.display='none'时,top
被添加到每个div.single
:
每个div.single上都设置了top
“>
app.parallaxField.style.display='inline'时,不会将top
添加到每个div.single
:
top
未设置在任何div.single
“>
玩z-index
和alternatedisplay
或position
选项似乎没有帮助
关于为什么一个svg的动画会影响D3在不同div上的top
属性的转换,有什么想法吗?谢谢
JS:
HTML:
好吧,我解决了这个问题,从D3切换到jQuery,然后从设置前景div的top
值的动画切换到设置它们的margin top
值的动画
因此,与此相反(不适用于后面的两个动画模式SVG):
此代码将执行以下操作:
var single = document.createElement('div');
single.setAttribute('class', 'single');
single.style.left = positionX + 'px';
app.singles.appendChild(single);
$('.single').last().animate({ marginTop: endPositionY + 'px' }, app.msPerBeat / 2);
<div id="container">
<svg id="parallax-field" width="100%" height="100%">
<defs>
<pattern id="pattern1" patternUnits="userSpaceOnUse" height="200" width="200">
<image x="-40" y="-40" height="200" width="200" xlink:href="path/to/image"></image>
</pattern>
</defs>
<rect id="parallax1" width="100%" height="125%" fill="url(#pattern1)">
<animateTransform
attributeName="transform"
type="translate"
from="0 -100"
to="0 100"
dur="3750ms"
repeatCount="indefinite"
/>
<!-- Changing above `repeatCount` to a number fixes the dropping blue divs after a short delay. -->
</rect>
</svg>
<div id="singles"></div>
</div>
#container {
background-color: black;
bottom: 0;
left: 0;
position: absolute;
right: 0;
top: 0;
}
.single {
background-color: blue;
height: 156px;
position: absolute;
top: 0;
width: 128px;
}
var single = d3
.select('#singles')
.append('div')
.attr('class', 'single')
.style({ left: positionX + 'px' })
.transition()
.duration(app.msPerBeat / 2)
.style({ top: endPositionY + 'px' });
var single = document.createElement('div');
single.setAttribute('class', 'single');
single.style.left = positionX + 'px';
app.singles.appendChild(single);
$('.single').last().animate({ marginTop: endPositionY + 'px' }, app.msPerBeat / 2);