- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想使用 svg 作为 div 元素的容器,该元素应包含多个元素。目前它看起来像这样:
<body>
<svg width="100%" height="100%" viewBox="0 0 45 90" version="1.1" xmlns="http://www.w3.org/2000/svg" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;">
<path d="M45.02,17.449l0,-5.837l-0.324,0c0,-3.841 0,-6.21 0,-6.344c0,-0.786 0.105,-3.078 -2.657,-3.659c-5.996,-1.263 -19.539,-1.352 -19.539,-1.352c0,0 -13.543,0.089 -19.539,1.352c-2.762,0.58 -2.657,2.873 -2.657,3.659c0,0.192 0,4.987 0,12.133l-0.324,0l0,14.537l0.324,0c0,22.9 0,52.313 0,52.794c0,0.786 -0.105,3.079 2.656,3.66c5.997,1.262 19.54,1.351 19.54,1.351c0,0 13.542,-0.089 19.539,-1.351c2.762,-0.581 2.657,-2.874 2.657,-3.66c0,-0.594 0,-45.159 0,-67.283l0.324,0Zm-22.52,-13.778c0.535,0 0.969,0.434 0.969,0.969c0,0.536 -0.434,0.97 -0.969,0.97c-0.535,0 -0.969,-0.435 -0.969,-0.97c0,-0.536 0.434,-0.969 0.969,-0.969Zm20.262,75.595l-40.525,0l0,-71.234l40.524,0l0,71.234l0.001,0Z" style="fill-rule:nonzero;"></path>
<foreignObject x="2.238" y="8.019" width="40" height="71">
<div id="screen">
I'm a very long text. Why am I so big?
</div>
</foreignObject>
</svg>
</body>
CSS
html, body{
width: 100%;
height: 100%;
}
#screen{
background: green;
overflow: scroll;
width: 100%;
height: 100%;
font-size: 10px;
}
我的问题是 screen-div 内的所有元素都比预期的要大。例如查看滚动条或文本的大小。
我假设 foreignObject
的内容按与 svg 相同的比例缩放。有没有办法避免这种情况?我可以将 foreignObject
内的 div 规范化为不缩放或缩放吗?
最佳答案
我能想到的唯一解决方案是使用 JavaScript 动态调整和反缩放 foreignObject
基于 viewBox 尺寸与 offsetWidth
和 offsetHeight
外层 <svg>
.
例如,在这个演示中,我碰巧将 SVG 的大小硬编码为 viewBox 尺寸的四倍。为了解决这个问题,我做了 foreignObject
四倍大,但随后将其缩小到四分之一:
<foreignObject width="164" height="288" transform="translate(2,8) scale(0.25,0.25)">
一个好的通用解决方案是在任何 foreignObject
上的自定义命名空间中放置一个额外的属性。 ,然后加载一个 JavaScript 库,该库可以找到此类元素并动态调整它们(并随着 SVG 大小的变化而保持调整)。
注意比较offsetWidth
(和高度)vs viewBox
宽度(和高度)需要考虑 preserveAspectRatio
的值准确地说是 SVG 上的属性。
编辑:我创建了一个小型库来执行此操作
使用方法:
x
和 y
属性来放置你的 <foreignObject>
, 和 width
和 height
值来调整它的大小。使用以下之一:
fixedSizeForeignObject( someForeignObjectElement );
fixedSizeForeignObjects( arrayOfForeignObjectElements );
工作原理:
如果我的网站出现故障(不太可能),我会在此处复制/粘贴库:
(function(win){
const svgs, els=[];
win.fixedSizeForeignObjects = function fixedSizeForeignObjects(els) {
els.forEach( fixedSizeForeignObject );
}
win.fixedSizeForeignObject = function fixedSizeForeignObject(el) {
if (!svgs) { svgs = []; win.addEventListener('resize',resizeSVGs,false) }
let svg=el.ownerSVGElement, found=false;
for (let i=svgs.length;i--;) if (svgs[i]===svg) found=true;
if (!found) svgs.push(svg);
let info = {
el:el, svg:svg,
w:el.getAttribute('width')*1, h:el.getAttribute('height')*1,
x:el.getAttribute('x')*1, y:el.getAttribute('y')*1
};
els.push(info);
el.removeAttribute('x');
el.removeAttribute('y');
calculateSVGScale(svg);
fixScale(info);
}
function resizeSVGs(evt) {
svgs.forEach(calculateSVGScale);
els.forEach(fixScale);
}
function calculateSVGScale(svg) {
let w1=svg.viewBox.animVal.width, h1=svg.viewBox.animVal.height;
if (!w1 && !h1) svg.scaleRatios = [1,1]; // No viewBox
else {
let info = win.getComputedStyle(svg);
let w2=parseFloat(info.width), h2=parseFloat(info.height);
let par=svg.preserveAspectRatio.animVal;
if (par.align===SVGPreserveAspectRatio.SVG_PRESERVEASPECTRATIO_NONE) {
svg.scaleRatios = [w2/w1, h2/h1];
} else {
let meet = par.meetOrSlice === SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET;
let ratio = (w1/h1 > w2/h2) != meet ? h2/h1 : w2/w1;
svg.scaleRatios = [ratio, ratio];
}
}
}
function fixScale(info) {
let s = info.svg.scaleRatios;
info.el.setAttribute('width', info.w*s[0]);
info.el.setAttribute('height',info.h*s[1]);
info.el.setAttribute('transform','translate('+info.x+','+info.y+') scale('+1/s[0]+','+1/s[1]+')');
}
})(window);
关于html - 如何避免缩放 svgs 的 foreignObjects 中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45043777/
如何使用 d3 将多个带有 id 的 svgs 附加到正文? 这是我第一次尝试绘制 1 svg: // d
在fabricjs v1.5中,我加载了两个不同的svgs,颜色为红色,描边为黑色。现在选择任何 svg 并单击“克隆对象”按钮,它已正确克隆,但是当我选择两个 svg 并单击“克隆组”按钮
我正在尝试为网页创建按钮面板。我用 .svg 文件制作了按钮。使用边距和其他 css 属性,我将它们放到了代码中显示的位置。 我的问题:我不能让两个按钮都完全可点击,具体来说,我可以很好地使用橙色部分
这个问题在这里已经有了答案: clipPath in multiple SVG tags (1 个回答) 4年前关闭。 我在一页上有多个 svg,并已从 illustrator 中单独导出它们。我还通
我无法使用某个表格的内置编辑模式执行我想要的操作,但我将其用于应用程序中的其他表格,因此我想使用以下命令以自定义方式设置选定的单元格: Apple 使用相同的复选标记和空圆圈图标: 有谁知道如何获得以
我用 inkscape 画了一些矢量图。 现在我正在尝试将这些 svg 定位到垂直导航栏中。我想将每个插图定位到相应的位置(使用内联 SVG)。我读过css-tricks: scale-svg这对我很
我有以下应用程序结构: /webapp /lib /assets ic_add_black_24px.svg ic_clear_black_24px.svg
我目前正在做一个元素,我必须在其中构建一个加载屏幕,其中包括一个百分比和定制的 svgs 动画。我在整个互联网上都看过,但找不到任何似乎是我需要的东西?我似乎连一个简单的加载栏都无法工作! 我在下面包
我正在尝试加载与 Angular 7 内联的 svgs。 到目前为止我尝试过: import icon = require('./icon.svg'); 结果为icon.svg由于文件加载器 impo
我正在使用 chrome 中的 React 应用程序,其中涉及大量内联 svg。 如果文本靠近内联 svg,文本周围将随机出现黑色边框。当我突出显示文本时,它有时会消失或出现。 唯一一致的是在出现边框
我通过 api 调用获取 svg 数据并将其附加到 DOM 中的 div。我正在获取 13-14 个 svg 元素并将其附加到单个 div。我想连续显示所有这些 svg。如果我给 svg 元素 wid
我创建了一个点阵视觉效果,如下面的代码片段所示。彩色圆圈代表值,灰色圆圈代表空/未使用。例如,在我的例子中,三种颜色代表来自 3 个国家(美国、加拿大和墨西哥)的项目的百分比形式的资金。灰色代表尚未筹
抱歉,如果我的问题措辞不好。我是初学者,不知道事物的正确标签。 我正在使用 d3.js 制作日本 map ,并想为每个都道府县分配一种颜色。每个都道府县都有自己的 svg。我有一个要使用的颜色的十六进
我用自己的矢量图形创建了一个相当专业的 JavaScript 应用程序。我想托管我自己的可热链接 API 来补充此应用程序,并且认为如果我可以将矢量图形直接嵌入到 API 中,那将非常整洁。 我知道这
我正在使用fabric.js 并将许多SVG 文件加载到其中。使用此代码显示这些导入的文件之一没有问题; fabric.loadSVGFromURL('ico-svg/drink.svg', func
我读过 sweet tutorial关于在 CSS-Tricks 上对 svg-image 中的元素进行动画处理。作者在 svg 中添加了 CSS 类来处理不同的元素。我想使用该技术,但不幸的是在背景
我想使用 svg 作为 div 元素的容器,该元素应包含多个元素。目前它看起来像这样: I'm a very
我有一个非常简单的 Webpack + TypeScript 设置,我正在尝试导入 svgs。我正在使用 svg-sprite-loader 如果我 require() 我的 svgs 如下所示,它会
我一直在对组使用 group.scale.y = -1; 技巧以正确的方式在 three.js 中呈现我的 svg。 然而,这与 y 坐标的概念混淆了,显示从我的组中心向上的正值。通常路径上的正 y
我正在尝试使用 D3 更新 HTML 表格中的数据。我需要更改多列中的数据,更新行数,并根据每个新数据数组为每行中的 SVG 制作动画。我已经尝试了多次尝试、教程、文档,而且我确信这对于对图书馆更有经
我是一名优秀的程序员,十分优秀!