有没有办法让 SVG 形状共享一个点数组/形状?可以在 CSS 中定义 SVG 形状吗?
Is there a way to make SVG shapes share a point array / shape? Can an SVG shape be defined in CSS?
我一直在四处寻找这个,但一无所获。是否可以通过在一个地方定义多个 SVG 形状来共享它们的形状?似乎只能从我见过的所有内容中内联定义 SVG 形状。
例如:
//shape
<svg class="star" width="12cm" height="4cm" viewBox="0 0 1200 400">
<polygon fill="lime" stroke="blue" stroke-width="10"
points="850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5" />
</svg>
<br>
//same shape
<svg class="star" width="12cm" height="4cm" viewBox="0 0 1200 400">
<polygon fill="lime" stroke="blue" stroke-width="10"
points="850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5" />
</svg>
...
像这样的内联定义有很多错误,我不需要一一列举。
我希望能够做到这一点:
HTML
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
...
然后在一处定义所有内容,就像这样。
CSS
.star {
width: 12cm;
height: 4cm;
viewBox: 0 0 1200 400;
}
.star polygon {
fill: lime;
stroke: blue;
stroke-width: 10px;
points: [850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5];
//I've tried quotes, no quotes, quotes around the numbers.
}
但到目前为止,没有任何效果,我也没有找到任何示例,甚至没有找到一个 link 比内联定义点更好的东西。
一定有更好的办法!或许我没有尝试过正确的语法。
编辑:这与我发现的一样接近:svg patterns
因此您可以在 CSS 中更改 SVG 容器的大小,并在 JS 或 JQuery 中将点添加到数组或对象中。您可以试用该演示,看看它是否适合您。
$(document).ready(function() {
var star = $('.star').find('polygon');
var blob = $('.blob').find('polygon');
var starObj = {
points: '850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5',
fill: 'lime',
stroke: 'blue',
strokeWidth: 10
};
var blobObj = {
points: '800,75 900,137.5 958,262.5 700,325 742,262.6 742,137.5',
fill: 'lime',
stroke: 'blue',
strokeWidth: 50
};
star.attr({
'points': starObj.points,
'fill': starObj.fill,
'stroke': starObj.stroke,
'stroke-width': starObj.strokeWidth
});
blob.attr({
'points': blobObj.points,
'fill': blobObj.fill,
'stroke': blobObj.stroke,
'stroke-width': blobObj.strokeWidth
});
});
.star {
width: 150px;
height: 100px;
}
.blob {
width: 100px;
height: 50px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg class="star" viewBox="0 0 1200 400">
<polygon fill="lime" stroke="blue" stroke-width="10" />
</svg>
<br>
<svg class="blob" viewBox="0 0 1200 400">
<polygon fill="lime" stroke="blue" stroke-width="10" />
</svg>
是的,可以让多个 SVG 共享项目,例如点甚至整个 svg 图像。在可用的多种技术中,最能像您所描述的那样执行此操作的技术是使用 svg "use" 语句。
在页面顶部正文中包含类似的内容
<svg class="star">
<defs>
<polygon id="poly1" fill="lime" stroke="blue" stroke-width="10"
points="850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5" />
</defs>
</svg>
然后在您希望它出现的地方使用此语句。
<svg class="star" viewBox="0 0 1200 400">
<use xlink:href="#poly1"></use>
</svg>
或者如果你想要两个
<svg class="star" viewBox="0 0 1200 400">
<use xlink:href="#poly1"></use>
</svg>
<svg class="star" viewBox="0 0 1200 400">
<use xlink:href="#poly1"></use>
</svg>
我一直在四处寻找这个,但一无所获。是否可以通过在一个地方定义多个 SVG 形状来共享它们的形状?似乎只能从我见过的所有内容中内联定义 SVG 形状。
例如:
//shape
<svg class="star" width="12cm" height="4cm" viewBox="0 0 1200 400">
<polygon fill="lime" stroke="blue" stroke-width="10"
points="850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5" />
</svg>
<br>
//same shape
<svg class="star" width="12cm" height="4cm" viewBox="0 0 1200 400">
<polygon fill="lime" stroke="blue" stroke-width="10"
points="850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5" />
</svg>
...
像这样的内联定义有很多错误,我不需要一一列举。
我希望能够做到这一点:
HTML
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
<svg class="star"><polygon /></svg><br>
...
然后在一处定义所有内容,就像这样。
CSS
.star {
width: 12cm;
height: 4cm;
viewBox: 0 0 1200 400;
}
.star polygon {
fill: lime;
stroke: blue;
stroke-width: 10px;
points: [850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5];
//I've tried quotes, no quotes, quotes around the numbers.
}
但到目前为止,没有任何效果,我也没有找到任何示例,甚至没有找到一个 link 比内联定义点更好的东西。
一定有更好的办法!或许我没有尝试过正确的语法。
编辑:这与我发现的一样接近:svg patterns
因此您可以在 CSS 中更改 SVG 容器的大小,并在 JS 或 JQuery 中将点添加到数组或对象中。您可以试用该演示,看看它是否适合您。
$(document).ready(function() {
var star = $('.star').find('polygon');
var blob = $('.blob').find('polygon');
var starObj = {
points: '850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5',
fill: 'lime',
stroke: 'blue',
strokeWidth: 10
};
var blobObj = {
points: '800,75 900,137.5 958,262.5 700,325 742,262.6 742,137.5',
fill: 'lime',
stroke: 'blue',
strokeWidth: 50
};
star.attr({
'points': starObj.points,
'fill': starObj.fill,
'stroke': starObj.stroke,
'stroke-width': starObj.strokeWidth
});
blob.attr({
'points': blobObj.points,
'fill': blobObj.fill,
'stroke': blobObj.stroke,
'stroke-width': blobObj.strokeWidth
});
});
.star {
width: 150px;
height: 100px;
}
.blob {
width: 100px;
height: 50px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<svg class="star" viewBox="0 0 1200 400">
<polygon fill="lime" stroke="blue" stroke-width="10" />
</svg>
<br>
<svg class="blob" viewBox="0 0 1200 400">
<polygon fill="lime" stroke="blue" stroke-width="10" />
</svg>
是的,可以让多个 SVG 共享项目,例如点甚至整个 svg 图像。在可用的多种技术中,最能像您所描述的那样执行此操作的技术是使用 svg "use" 语句。
在页面顶部正文中包含类似的内容
<svg class="star">
<defs>
<polygon id="poly1" fill="lime" stroke="blue" stroke-width="10"
points="850,75 958,137.5 958,262.5 850,325 742,262.6 742,137.5" />
</defs>
</svg>
然后在您希望它出现的地方使用此语句。
<svg class="star" viewBox="0 0 1200 400">
<use xlink:href="#poly1"></use>
</svg>
或者如果你想要两个
<svg class="star" viewBox="0 0 1200 400">
<use xlink:href="#poly1"></use>
</svg>
<svg class="star" viewBox="0 0 1200 400">
<use xlink:href="#poly1"></use>
</svg>