花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 9|回复: 4

SVG内部图像自适应宽高的实现

[复制链接]
  • TA的每日心情
    奋斗
    2026-6-12 14:02
  • 签到天数: 1843 天

    [LV.Master]伴坛终老

    3252

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2026-6-12 21:44 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    通常,SVG可视子元素使用像素为单位定义自己的尺寸或路径相关数据,不支持百分比或相对单位的表达方法。为此,在SVG中所绘制的图案,最终尺寸是固定的。实践中,在 SVG 标签宽高可变的情况下,如果希望其内部可视子元素宽高尺寸能跟随SVG宽高的变化而变化,最简单的实现方法是给 SVG 标签加上 viewBox 属性,这样,子元素图像仅参照 viewBox 属性值所规范的范围绘制图形,而 viewBox 属性则能顺应 SVG 的尺寸。试看以下示例:SVG 通过 CSS 设置会跟随浏览器窗口的变化而变化(使用了相对尺寸单位),其内的 circle(圆)以 SVG 的 viewBox 为绘制参照,因此它的尺寸也会因为浏览器窗口的尺寸变化而变化,预览效果时可手动改变浏览器窗口的尺寸查看变化效果——

    <style>
        svg {
            display: block;
            margin: 20px auto;
            width: 30vw;
            height: 30vw;
            border: 1px solid gray;
        }
    </style>
    
    <svg viewBox="0 0 400 400">
        <circle cx="200" cy="200" r="190" fill="pink">
    </svg>
    	

    核心原理是利用了 viewBox 属性,该属性用以定义绘图区域,其值的后两位数是绘图区域的宽与高,viewBox 属性按这个宽高比例去适配 SVG 的尺寸(因此要求 SVG 的宽高设置最好符合这个宽高比)。

    并非 SVG 标签自身才拥有 viewBox 属性,SVG内部,不可视子元素 symbol 也能设置此属性。symbol 标签如果设置了 viewBox 属性,则其内的图案均以之为绘图参照,然后通过 use 标签实例化得以渲染,实例化图案设置 width 和 height 属性的有效性依据于 symbol 的 viewBox 是否存在,换言之,symbol 如果设置了 viewBox 则 use 就可以设置宽高(基于 SVG 的尺寸或 SVG viewBox——如有),use 缺省宽高的话就是 use 所在 SVG 或其 ViewBox 的宽高尺寸。

    通过 symbol + use 方式同样可以可以灵活方便地设计和绘制图案。下例的 symbol 设置有 viewBox、内部绘制一个 polyline 图案,图案在实例化时设置了描边等属性,还加入了 stroke-dashoffset 动画。同样地,图案也可以跟随浏览器窗口的尺寸变化而动态变化——

    <style>
        svg {
            display: block;
            margin: auto;
            width: 80vw;
            height: 45vw;
            border: 1px dashed gray;
            use {
                fill: none;
                stroke: rgba(128, 0, 0, .25);
                stroke-width: 2;
                stroke-linecap: round;
                stroke-linejoin: round;
                stroke-dasharray: 4 2;
                stroke-dashoffset: 0;
            	animation: move 4s linear infinite;
            	&:nth-of-type(2) { stroke: rgba(128, 0, 0, .55); }
            	&:nth-of-type(3) { stroke: rgba(128, 0, 0, .75); }
            }
        }
        @keyframes move {
            to { stroke-dashoffset: -90; }
        }
    </style>
    
    <svg>
    	<symbol id="sb" viewBox="0 0 160 90">
    	    <polyline points="2 2,30 88,150 10" />
    	</symbol>
    	<use href="#sb" x="0" y="0"></use>
    	<use href="#sb" x="50" y="0"></use>
    	<use href="#sb" x="100" y="0"></use>
    </svg>
    	

    小结:实现SVG图案自适应窗口尺寸,核心原理是,其一, viewBox 属性,既可用于 SVG 自身也可以用于 symbol 子元素;其二,SVG 自身宽高应是可变的,可以考虑使用百分比或相对单位。

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 匠心独运,细节精致入微!

    查看全部评分

  • TA的每日心情
    奋斗
    2026-6-12 09:57
  • 签到天数: 563 天

    [LV.9]以坛为家II

    375

    主题

    4318

    回帖

    2万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2026-6-12 22:25 | 显示全部楼层
    实用的知识,震撼的演示,谢谢马老师经典讲授与精彩示范
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-6-12 14:02
  • 签到天数: 1843 天

    [LV.Master]伴坛终老

    3252

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-6-12 22:43 | 显示全部楼层
    杨帆 发表于 2026-6-12 22:25
    实用的知识,震撼的演示,谢谢马老师经典讲授与精彩示范

    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1898

    主题

    33万

    回帖

    40万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2026-6-12 22:55 | 显示全部楼层
    viewBox 之前就没怎么学清楚,好像可以等比例缩放来填充规定的空间,但好像还能裁剪,就被弄糊涂了,也许是因为显示区域的缘故而造成的裁剪效果吧。我是没学透彻
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1898

    主题

    33万

    回帖

    40万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2026-6-12 22:56 | 显示全部楼层
    第二个实例里的动态很惊艳,漂亮
     
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2026-6-13 00:32 , Processed in 0.073332 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表