이 기사에서는 SVG를 이해하고 HTML5 SVG 요소의 특성을 이해하며 SVG를 사용하여 적응형 다이아몬드를 그리는 방법을 소개합니다. 모든 사람에게 도움이 되기를 바랍니다.
최근 어떤 생각에서 그런 문제를 보았습니다. 테두리가 있는 적응형 크기 마름모를 그려야 하는데, 이는 일반적으로 순서도에서 매우 일반적입니다. 효과는 다음과 같습니다.
없는 경우. 테두리, CSS 클립 경로를 사용하면 다이아몬드 모양을 쉽게 잘라낼 수 있지만 테두리를 처리하기가 쉽지 않습니다(일반적으로 레이어나 투영을 중첩하여 시뮬레이션하지만 효과는 그리 좋지 않습니다. 다음은 SVG 방법입니다.) , 이는 이러한 효과를 얻으려면 줌 기능을 완전히 사용하십시오
SVG는 일반적으로 손으로 작성한 코드가 필요하지 않으며 (몇 가지 기본 모양 제외) 일반적으로 디자인 소프트웨어 (SVG)로 생성할 수 있습니다. 처음에는 기계용으로 설계되었으므로 사람이 읽는 데 매우 적합하지 않습니다.) 예를 들어 여기 Figma로 그렸는데(다각형 하나면 충분합니다) 어떤 크기든 상관없습니다
그런 다음 이런 SVG를 얻었습니다
<svg width="167" height="90" viewBox="0 0 167 90" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M2.10786 45L83.5 1.13597L164.892 45L83.5 88.864L2.10786 45Z" fill="#FFECC7" fill-opacity="0.6" stroke="#FFB200" stroke-width="2"/> </svg>
브라우저에서 효과는 다음과 같습니다
이제 SVG에는 기본 크기가 있습니다. SVG의 기본 크기를 다음과 같이 수동으로 변경하면
object-fit:contain
효과와 다소 비슷할까요? 부위 전체를 덮고 억지로 펴고 싶다면 어떻게 해야 하나요? 여기서는 SVG preserveAspectRatioobject-fit:contain
的效果?如果想整个铺满,强制拉伸该怎么做呢?这里需要用到 SVG 的缩放属性preserveAspectRatio,表示当 SVG 的实际尺寸和viewBox
尺寸不一致时的缩放规则,有点类似于 object-fit
和 object-position
组合。这里的取值非常多,默认值是xMidYMid,表示强制等比缩放,并且居中对齐。
有兴趣的可以参考这篇文章:理解SVG viewport,viewBox,preserveAspectRatio缩放,案例非常详细
https://www.zhangxinxu.com/wordpress/2014/08/svg-viewport-viewbox-preserveaspectratio/
这里我们不需要等比缩放,可以直接设置为none
<svg preserveAspectRatio="none"> ... </svg>
效果如下
在设置不等比缩放后,其实描边还有一点小问题,不同尺寸下,描边的粗细不同,如下
有没有办法让描边不会跟随 SVG 尺寸缩放呢?当然也是有的!SVG 中有一个属性 vector-effect可以控制描边不缩放,永远保持默认设置的尺寸,有兴趣的可以参考这篇文章 CSS vector-effect与SVG stroke描边缩放,这里只需要在 path
添加属性vector-effect="non-scaling-stroke"
, SVG의 실제 크기가 viewBox
의 크기와 일치하지 않을 때 크기 조정 규칙을 나타냅니다. 이는 object-fit
과 다소 유사합니다. 및 객체 위치
조합. 여기에는 많은 값이 있습니다. 기본값은 xMidYMid로 강제 스케일링 및 중심 정렬을 의미합니다.
여기에서는 비례 배율이 필요하지 않으며 직접 없음으로 설정할 수 있습니다.관심이 있으시면 SVG 뷰포트, viewBox, PreserveAspectRatio 스케일링 이해 기사를 참조하세요. 사례가 매우 자세합니다.
https://www.zhangxinxu.com/ wordpress/2014/08 /svg-viewport-viewbox-preserveaspectratio/
<svg preserveAspectRatio="none"> <path vector-effect="non-scaling-stroke">...</path> </svg>
< h2 data-id="heading-2"> 3. SVG의 획 스케일링
부등 비율 스케일링을 설정한 후 실제로 획에 작은 문제가 있습니다. 크기가 다르면 획의 두께가 다음과 같이 달라집니다.
🎜🎜입니다 SVG 크기에 따라 획의 크기가 조정되는 것을 방지할 수 있는 방법이 있나요? 물론 있습니다! SVG 벡터 효과🎜는 크기 조정 없이 획을 제어하고 항상 기본 크기를 유지할 수 있습니다. 관심이 있는 경우 이 기사를 참조하세요CSS 벡터 효과 및 SVG 획 획 크기 조정🎜, 여기 있습니다경로
만 필요합니다. 벡터-효과="비스케일링-스트로크"
속성을 추가하면 됩니다. 이는 아래와 같이 획이 스케일링을 따르지 않음을 의미합니다. 🎜<svg width="100%" style="max-width:90%" preserveAspectRatio="none" viewBox="0 0 167 90" fill="none" xmlns="http://www.w3.org/2000/svg"> <path vector-effect="non-scaling-stroke" d="M2.10786 45L83.5 1.13597L164.892 45L83.5 88.864L2.10786 45Z" fill="#FFECC7" fill-opacity="0.6" stroke="#FFB200" stroke-width="2"/> </svg>
div{ background: url('data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB2aWV3Qm94PSIwIDAgMTY3IDkwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIgZD0iTTIuMTA4IDQ1TDgzLjUgMS4xMzYgMTY0Ljg5MiA0NSA4My41IDg4Ljg2NCAyLjEwOCA0NXoiIGZpbGw9IiNGRkVDQzciIGZpbGwtb3BhY2l0eT0iLjYiIHN0cm9rZT0iI0ZGQjIwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+PC9zdmc+') }
转换后,将这段 base64 直接用作背景就行
div{ background: url('data:image/svg+xml;base64,PHN2ZyBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIiB2aWV3Qm94PSIwIDAgMTY3IDkwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIHZlY3Rvci1lZmZlY3Q9Im5vbi1zY2FsaW5nLXN0cm9rZSIgZD0iTTIuMTA4IDQ1TDgzLjUgMS4xMzYgMTY0Ljg5MiA0NSA4My41IDg4Ljg2NCAyLjEwOCA0NXoiIGZpbGw9IiNGRkVDQzciIGZpbGwtb3BhY2l0eT0iLjYiIHN0cm9rZT0iI0ZGQjIwMCIgc3Ryb2tlLXdpZHRoPSIyIi8+PC9zdmc+') }
这样就得到了一个自适应的菱形背景了
当然,转换成 base64 后就不能实时修改颜色了,需要整体替换
完整代码可以访问 SVG diamond
https://codepen.io/xboxyan/pen/abVRwmz
从这个例子就可以看出 SVG 的天然优势了,特别是描边的缩放特性,如果用 CSS 来绘制估计要遇到不少麻烦。这里总结一下实现要点:
SVG 一般通过设计软件绘制导出就行,不需要手写
SVG 默认是保持原比例缩放的,可以通过 preserveAspectRatio 修改缩放规则
SVG 描边的粗细默认会跟随整体尺寸缩放,可以通过 vector-effect 设置保持原始大小
SVG 在转成 base64 后仍然具备以上特性,更适合用作背景图片
SVG 一直在图形绘制上更具优势,特别是这类几何图形,缩放、自适应更加灵活,如果 CSS 实现有困难,不妨考虑一下 SVG。最后,如果觉得还不错,对你有帮助的话,欢迎点赞、收藏、转发
(学习视频分享:web前端)
위 내용은 HTML5 SVG를 이해하고 적응형 다이아몬드를 그리는 방법을 알아보세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!