用SVG实现Hero Slider

有一天,我在网上寻找灵感,无意间打开了本田HR-V漂亮的网站。在这个网站里,从一个区块导航到另一个区块的动画效果,是使用 元素创建的动画形状实现的。

我们想做个类似的站点,但不使用画布,而是使用 SVG。同样,也不采用必须垂直滚动才能触发动画的思路,而是把所有资源整合成一个 Hero Slider。 使用如下资源:

  • Snap.svg:用于动画SVG元素
  • Icons:来自我们的Nucleo library
  • Images:来自Unsplash

HTML结构

HTML包含3个主元素:一个包含幻灯片的无序列表(ul.cd-slider)、一个包含幻灯片导航的有序列表( ol.cd-slider-navigation),还有一个div.cd-svg-cover,用于在切换幻灯片时显示可见的动画形状。

<section>
    <ul>
        <li>
            <div>
                <h2>Animated SVG Slider</h2>
                <p>
                    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Animi, explicabo.
                </p>
                <a href="#0">Article & Download</a>
            </div>
        </li>
        <li>
            <!-- slide content here -->
        </li>
        <!- additional slides here -->
    </ul>
    <!- .cd-slider -->
    <ol>
        <li>
            <a href="#0"><em>Item 1</em></a>
        </li>
        <li>
            <a href="#0"><em>Item 2</em></a>
        </li>
        <li>
            <a href="#0"><em>Item 3</em></a>
        </li>
        <li>
            <a href="#0"><em>Item 4</em>http://www.0771ybyy.com/news/1799.html</a>
        </li>
    </ol>
    <!- .cd-slider-navigation ><-->
    <div data-step1="M1402,800h-2V0.6c0-0.3,0-0.3,0-0.6h2v294V800z" data-step2="M1400,800H383L770.7,0.6c0.2-0.3,0.5-0.6,0.9-0.6H1400v294V800z"
    data-step3="M1400,800H0V0.6C0,0.4,0,0.3,0,0h1400v294V800z" data-step4="M615,800H0V0.6C0,0.4,0,0.3,0,0h615L393,312L615,800z"
    data-step5="M0,800h-2V0.6C-2,0.4-2>http://www.0771ybyy.com/news/1796.html<,0.3-2,0h2v312V800z" data-step6="M-2,800h2L0,0.6C0,0.3,0,0.3,0,0l-2,0v294V800z"
    data-step7="M0,800h1017L629.3,0.6c-0.2-0.3-0.5-0.6-0.9-0.6L0,0l0,294L0,800z"
    data-step8="M0,800h1400V0.6c0-0.2,>http://www.0771ybyy.com/case/zhichuangjibing/1776.html<0-0.3,0-0.6L0,0l0,294L0,800z" data-step9="M785,800h615V0.6c0-0.2,0-0.3,0-0.6L785,0l222,312L785,800z"
    data-step10="M1400,800h2V0.6c0-0.2,0-0.3,0-0.6l-2,0v312V800z">
        <svg height='100%' width="100%" preserveAspectRatio="none" viewBox="0 0 1400 800">
            <title>SVG cover layer</title>
            <desc>an animated layer to switch from one slide to the next one</desc>
            <path id="cd-changing-path" >http://www.0771ybyy.com/news/1798.html<d="M1402,800h-2V0.6c0-0.3,0-0.3,0-0.6h2v294V800z"/>
        </svg>
    </div>
    <!- .cd-svg-cover -->
</section>
<!-- .cd-slider-wrapper -->

添加样式

默认情况下,所有幻灯片的不透明度为0(opacity:0),且绝对定位,相互重叠(top: 0left:0)。通过给选中的幻灯片添加 .visible 类,令其可见( opacity: 1 )。

.cd-slider-wrapper {
  position: relative;
}

.cd-slider > li {
  position: absolute;
  top: 0;
  left: 0;
  opacity: 0;
}
.cd-slider > li.>http://www.0771ybyy.com/news/1797.html<visible {
  /* selected slide */
  position: relative;
  z-index: 2;
  opacity: 1;
}

处理事件

让SVG产生动画效果,可以改变.cd-svg-container中路径元素的d属性。

首先,要定义动画的各个步骤(我们计划用5步从一个幻灯片切换到下一个幻灯片,反之也是5步)。换句话说,一个往返需要创建10个不同的SVG path元素(为保证动画正确,锚点数相同),效果如下面Illustrator文件的截图所示(虽然有些步骤中看似空的,实际上也包含了路径)。

http://0bf196087c14ed19d1f11cf1-ambercreativelab.netdna-ssl.com/wp-content/uploads/2015/08/illustrator-close-up.png

定义好路径后,给.cd-svg-cover添加data-stepn属性(每步一个),使其等于定义路径的d属性(以方便JavaScript读取)。

然后使用Snap.svg提供的animate()方法,实现不同路径的切换:

var svgCoverLayer = $('.cd-slider-wrapper').find('div.cd-svg-cover'), svgPath = Snap('#cd-changing-path'), path1 = svgCoverLayer.data('step1');

svgPath.animate(

{'d': path2}

, 300, customMinaAnimation, function(){ //...
});

缓动函数是一个自定义的贝塞尔曲线函数,可惜Snap.svg中默认不包含,不过我们可以为自定义的贝塞尔曲线函数创建一个自定义的调速函数(参见StackOverflow中相关的内容)。

Illustrator小技巧:为了实现预期效果,需要<path>元素。在Illustrator中,如果只使用直线,会创建<polygon>元素。可以为其中一个锚点添加border-radius,将其转换为<path>

http://0bf196087c14ed19d1f11cf1-ambercreativelab.netdna-ssl.com/wp-content/uploads/2015/08/border-radius-trick.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要用SVG实现弯曲的虚线,可以使用`path`标签来绘制曲线,并通过设置`stroke-dasharray`属性来实现虚线效果。下面是一个示例代码: ```html <svg width="500" height="500"> <path d="M100,100 Q200,200 300,100" stroke="black" fill="none" stroke-dasharray="5 5" /> </svg> ``` 在上面的代码中,`d`属性定义了曲线的路径。`M100,100`表示起始点的坐标,`Q200,200 300,100`表示曲线的控制点和终点的坐标。`stroke`属性设置曲线的颜色,`fill`属性设置填充颜色(这里设置为`none`表示不填充),`stroke-dasharray`属性设置虚线的样式,其中的`5 5`表示虚线由5个像素的实线和5个像素的空白交替组成。 你可以根据需要调整起始点、控制点和终点的坐标,以及`stroke-dasharray`属性的值来实现不同形状和样式的弯曲虚线。 #### 引用[.reference_title] - *1* *2* [使用svg画虚线](https://blog.csdn.net/qq_42727641/article/details/109749320)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [svg通过虚线画形状](https://blog.csdn.net/feinifi/article/details/126652087)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值