Skip to content

SVG样式

SVG默认样式

SVG 最早的定位是:

  • 可以嵌在一段文本中
  • 和文字一起排版
  • 类似数学公式、图标、装饰符号
css
display: inline;
vertical-align: baseline;

span 一样是 行内元素

  • 和文字在同一行
  • 底部有一小段空隙(baseline 对齐)

width / height 是生效的(这点和普通 inline 不同)

css
svg {
  width: 100px;
  height: 100px;
}

原因:SVG 是“可替换元素(replaced element)”

iconfont svg

在iconfont中下载的svg格式存在额外的信息:

  • t:非SVG标准,iconfont时间戳
  • p-id:非SVG标准,iconfont唯一标识
css
<svg t="1768966171952" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7637" width="200" height="200"><path d="M372.3264 228.010667a27.306667 27.306667 0 0 1-26.350933-34.679467 89.2928 89.2928 0 0 1 24.302933-40.96 100.078933 100.078933 0 0 1 73.864533-24.849067 27.306667 27.306667 0 1 1-1.6384 54.613334 46.6944 46.6944 0 0 0-34.679466 9.966933 34.952533 34.952533 0 0 0-9.284267 16.520533 27.306667 27.306667 0 0 1-26.2144 19.387734zM791.893333 671.197867a27.306667 27.306667 0 0 1-6.007466-54.613334 34.952533 34.952533 0 0 0 16.930133-8.465066c30.993067-29.4912 1.2288-136.533333-92.706133-247.944534a27.306667 27.306667 0 1 1 41.7792-35.089066C864.392533 459.025067 901.12 591.735467 840.9088 648.533333a89.156267 89.156267 0 0 1-42.461867 22.1184 27.306667 27.306667 0 0 1-6.5536 0.546134z" fill="#0073FF" p-id="7638"></path><path d="M771.959467 673.245867c-77.0048 0-185.9584-62.2592-281.8048-163.84C382.293333 395.946667 324.676267 269.243733 346.112 193.3312a27.306667 27.306667 0 0 1 52.565333 14.7456c-13.653333 46.967467 28.2624 155.511467 131.072 264.055467S738.9184 628.053333 786.432 617.2672a27.306667 27.306667 0 0 1 12.014933 53.248 120.695467 120.695467 0 0 1-26.487466 2.730667z" fill="#0073FF" p-id="7639"></path><path d="M88.610133 917.640533a27.306667 27.306667 0 0 1-25.258666-37.6832l283.716266-689.629866a27.306667 27.306667 0 1 1 50.517334 20.753066L136.533333 844.458667l646.894934-226.372267A27.306667 27.306667 0 1 1 801.450667 669.013333L97.621333 916.138667a27.306667 27.306667 0 0 1-9.0112 1.501866z" fill="#0073FF" p-id="7640"></path><path d="M532.48 762.402133a27.306667 27.306667 0 0 1-17.066667-6.007466 1424.725333 1424.725333 0 0 1-144.861866-132.983467A1423.36 1423.36 0 0 1 245.76 471.722667a27.306667 27.306667 0 0 1 44.509867-31.675734A1369.2928 1369.2928 0 0 0 409.6 585.864533a1369.7024 1369.7024 0 0 0 139.264 127.7952 27.306667 27.306667 0 0 1-16.384 48.7424zM325.768533 834.628267a27.306667 27.306667 0 0 1-18.432-7.099734c-25.941333-23.620267-51.2-48.3328-74.9568-73.454933s-47.104-51.6096-69.358933-78.779733A27.306667 27.306667 0 1 1 204.8 640.750933c21.435733 26.2144 43.8272 51.6096 66.628267 75.776s47.104 47.9232 72.0896 70.587734a27.306667 27.306667 0 0 1-18.432 47.5136z" fill="#0073FF" p-id="7641"></path><path d="M680.139633 471.275431m-32.500528 30.809524a44.782933 44.782933 0 1 0 65.001056-61.619048 44.782933 44.782933 0 1 0-65.001056 61.619048Z" fill="#0073FF" p-id="7642"></path><path d="M591.735467 324.949333h-3.003734a109.226667 109.226667 0 1 1 3.003734 0z m0-163.84a54.613333 54.613333 0 1 0 39.594666 16.384 54.613333 54.613333 0 0 0-39.7312-16.520533zM850.466133 311.7056a27.306667 27.306667 0 0 1-18.978133-46.830933l84.7872-81.92a27.306667 27.306667 0 0 1 38.0928 39.185066l-84.7872 81.92a27.306667 27.306667 0 0 1-19.114667 7.645867z" fill="#0073FF" p-id="7643"></path><path d="M934.161067 312.9344a27.306667 27.306667 0 0 1-19.387734-8.328533l-81.92-84.7872a27.306667 27.306667 0 1 1 39.185067-38.0928l81.92 84.7872a27.306667 27.306667 0 0 1-19.524267 46.2848z" fill="#0073FF" p-id="7644"></path></svg>

CSS

属性描述类似 CSS
fill填充颜色background-color
stroke描边颜色border-color
stroke-width描边宽度border-width
css
svg {
    width: 100px;
    height: 100px;
}

svg path {
    fill: green;
    stroke: black;
    stroke-width: 5px;
    fill: none;
}

Examples

描边特效

html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../css/reset.css">
    <style>
        svg {
            width: 400px;
            height: 400px;

        }

        svg path {
            fill: none;
            stroke: green;
            stroke-width: 10px;
        }


        svg:hover path {
            animation: move 1s;
        }

        @keyframes move {
            0% {
                stroke-dasharray: 0 500;
            }

            100% {
                stroke-dasharray: 500 0;
            }
        }
    </style>
</head>

<body>
    <svg t="1768974109523" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
        p-id="7807" width="200" height="200">
        <path
            d="M554.666667 712.533333V106.666667h-85.333334v601.6l-132.266666-132.266667L277.333333 640l234.666667 234.666667 234.666667-234.666667-59.733334-59.733333-132.266666 132.266666z"
            fill="#444444" p-id="7808"></path>
    </svg>

</body>

</html>

简单画笔动画

对于简单的svg(只有一个子元素)可以添加路径绘制动画(一笔画)。

css
const path = document.querySelector('path')
const length = path.getTotalLength()

path.style.strokeDasharray = length
path.style.strokeDashoffset = length
html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../css/reset.css">
    <style>
        @keyframes move {
            0% {
                stroke-dashoffset: 2502;
            }

            100% {
                stroke-dashoffset: 0;
            }
        }

        svg {
            width: 400px;
            height: 400px;
            stroke: green;
            stroke-width: 10px;
            stroke-dasharray: 2502;
            stroke-dashoffset: 2502;
            animation: move 3s linear infinite;
        }


        svg path {
            fill: none;
        }
    </style>
</head>

<body>
    <svg t="1768974109523" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
        p-id="7807" width="200" height="200">
        <path id="arrow"
            d="M554.666667 712.533333V106.666667h-85.333334v601.6l-132.266666-132.266667L277.333333 640l234.666667 234.666667 234.666667-234.666667-59.733334-59.733333-132.266666 132.266666z"
            fill="#444444" p-id="7808"></path>
    </svg>
</body>

</html>