响应式SVG填充形状 [英] Responsive SVG fill shape

查看:93
本文介绍了响应式SVG填充形状的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#fg {
  fill: url(#ship);
  stroke: #fff;
  stroke-width: 10px;
  stroke-dasharray: 1024px;
  -webkit-animation: dash 2s;
  animation: dash 2s;
}

@keyframes dash {
  from {
    stroke-dashoffset: 1024px;
  }
  to {
    stroke-dashoffset: 0px;
  }
}

@-webkit-keyframes dash {
  from {
    stroke-dashoffset: 1024px;
  }
  to {
    stroke-dashoffset: 0px;
  }
}

#bg {
  fill: white;
  stroke: none;
  transform-origin: 1270px 550px;
  -webkit-animation: bgfill 2s linear 2s forwards;
  animation: bgfill 2s linear 2s forwards;
}

@keyframes bgfill {
  from {
    transform: scale(1);
  }
  to {
    transform: scale(4);
  }
}

@-webkit-keyframes bgfill {
  from {
    transform: scale(1);
  }
  to {
    transform: scale(4);
  }
}
#home {
  height: 100vh;
  background-image: url("http://4.bp.blogspot.com/-yB6Tc3mleuE/T4NkAKeazYI/AAAAAAAACB0/tlichKzIu3Q/s1600/Simple+unique+odd+weird+wallpapers+minimalistic+%2330+battleship+titanic.jpg");
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;
  overflow: hidden;
}

    <div class="background">
        <svg viewBox="0 0 1376 764">
            <defs>
                <clipPath id="ship">
                    <use xlink:href="#shape" id="bg" />
                </clipPath>
                <path id="shape" d="M1034.5,770.5a125.59,125.59,0,0,0-17-32c-12.32-16.72-25.68-25.84-33-31-6-4.23-59.88-42.55-100-90-13.64-16.14-20.57-24.48-26-38-15-37.48-3.73-73.65,0-85,8.68-26.45,23-43.26,35-57,19-21.82,33.56-29.9,67-54,33.68-24.27,55.39-39.91,77-60,40.56-37.69,35.94-49.35,81-96,34.18-35.39,51.27-53.08,79-65,7.79-3.35,76-31.44,140,2a142.06,142.06,0,0,1,31,22l7.5,7.5  L 1376,770.5 Z" />
            </defs>
            <image xlink:href="http://4.bp.blogspot.com/-yB6Tc3mleuE/T4NkAKeazYI/AAAAAAAACB0/tlichKzIu3Q/s1600/Simple+unique+odd+weird+wallpapers+minimalistic+%2330+battleship+titanic.jpg"
                width="1376" height="764" preserveAspectRatio="xMidYMid slice" clip-path="url(#ship)" />
            <use xlink:href="#shape" id="fg" />
        </svg>
    </div>

我正在尝试创建页面加载动画,首先绘制白线,然后我想用白色SVG动画填充屏幕,我可以使用所有的东西,但是我不喜欢填充效果的锋利边缘,如何将角的形状更改为白线的形状?请观看动画,以更好地了解

I am trying to create a page load animation, first the white line gets drawn and afterwards I want to fill the screen with a white SVG animation, I got everything to work but I do not like the sharp edge for the fill effect, how can I change the shape of the corner to the shape of the white line? please see the animation in action to get a better understanding

推荐答案

只需使用您的原始路径形状并对其进行缩放即可.

Just use your original path shape and grow (scale) that.

对于以下示例,我删除了您正在使用的不必要的元素,并对主形状进行了少许修改,以使其具有右下角(而不只是线条),以便可以填充它.

For the following example, I removed the unnecessary elements you were using, and modified the main shape slightly so that it had a bottom right corner (instead of just being the line), so I could fill it.

我将一个副本放在前面(id ="fg"),并按照您在上一个问题中的要求使用破折号动画.在其后,我将路径的副本(id ="bg")填充为白色.然后,当破折号动画结束时,我开始第二个动画,将形状的白色版本放大4倍以填充SVG.

I put one copy in front (id="fg"), with a dash animation as you requested in a previous question. And behind it, I put a copy of the path (id="bg") with a white fill. Then when the dash animation finishes, I start a second animation that scales the white version of the shape up by 4x to fill the SVG.

#fg {
  fill: pink;
  stroke: #fff;
  stroke-width: 10px;
  stroke-dasharray: 1024px;
  -webkit-animation: dash 2s;
          animation: dash 2s;
}

@keyframes dash {
  from { stroke-dashoffset: 1024px; }
  to   { stroke-dashoffset: 0px; }
}

@-webkit-keyframes dash {
  from { stroke-dashoffset: 1024px; }
  to   { stroke-dashoffset: 0px; }
}


#bg {
  fill: white;
  stroke: none;
  transform-origin: 1270px 550px;
  -webkit-animation: bgfill 2s linear 2s forwards;
          animation: bgfill 2s linear 2s forwards;
}

@keyframes bgfill {
  from { transform: scale(1); }
  to   { transform: scale(4); }
}

@-webkit-keyframes bgfill {
  from { transform: scale(1); }
  to   { transform: scale(4); }
}

<div id="home" class="section" style="height:100vh;background:pink;">
    <div class="background">
        <svg viewBox="0 0 1376 764">
            <defs>
                <path id="shape" d="M1034.5,770.5a125.59,125.59,0,0,0-17-32c-12.32-16.72-25.68-25.84-33-31-6-4.23-59.88-42.55-100-90-13.64-16.14-20.57-24.48-26-38-15-37.48-3.73-73.65,0-85,8.68-26.45,23-43.26,35-57,19-21.82,33.56-29.9,67-54,33.68-24.27,55.39-39.91,77-60,40.56-37.69,35.94-49.35,81-96,34.18-35.39,51.27-53.08,79-65,7.79-3.35,76-31.44,140,2a142.06,142.06,0,0,1,31,22l7.5,7.5  L 1376,770.5 Z"/>
            </defs>
            <use xlink:href="#shape" id="bg"/>
            <use xlink:href="#shape" id="fg"/>
        </svg>
    </div>
</div>

更新

要用图像填充背景,最简单的方法可能是使用剪切路径.

To have the background fill with an image, the simplest approach is probably by using a clip path.

#fg {
  fill: pink;
  stroke: #fff;
  stroke-width: 10px;
  stroke-dasharray: 1028px;
  -webkit-animation: dash 2s;
          animation: dash 2s;
}

@keyframes dash {
  from { stroke-dashoffset: 1028px; }
  to   { stroke-dashoffset: 0px; }
}

@-webkit-keyframes dash {
  from { stroke-dashoffset: 1028px; }
  to   { stroke-dashoffset: 0px; }
}


#bg {
  fill: url(#kitten);
  stroke: none;
  transform-origin: 1270px 550px;
  -webkit-animation: bgfill 2s linear 2s forwards;
          animation: bgfill 2s linear 2s forwards;
}

@keyframes bgfill {
  from { transform: scale(1); }
  to   { transform: scale(4); }
}

@-webkit-keyframes bgfill {
  from { transform: scale(1); }
  to   { transform: scale(4); }
}

<div id="home" class="section" style="height:100vh;background:pink;">
    <div class="background">
        <svg viewBox="0 0 1376 764">
            <defs>
                <path id="shape" d="M1034.5,770.5a125.59,125.59,0,0,0-17-32c-12.32-16.72-25.68-25.84-33-31-6-4.23-59.88-42.55-100-90-13.64-16.14-20.57-24.48-26-38-15-37.48-3.73-73.65,0-85,8.68-26.45,23-43.26,35-57,19-21.82,33.56-29.9,67-54,33.68-24.27,55.39-39.91,77-60,40.56-37.69,35.94-49.35,81-96,34.18-35.39,51.27-53.08,79-65,7.79-3.35,76-31.44,140,2a142.06,142.06,0,0,1,31,22l7.5,7.5  L 1376,770.5 Z"/>
                <clipPath id="kitten">
                  <use xlink:href="#shape" id="bg"/>
                </clipPath>
            </defs>
            <image xlink:href="https://placekitten.com/700/350" width="1376" height="764" preserveAspectRatio="xMidYMid slice" clip-path="url(#kitten)"/>
            <use xlink:href="#shape" id="fg"/>
        </svg>
    </div>
</div>

这篇关于响应式SVG填充形状的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆