侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

css+svg实现b站充电效果的示例代码

前端  /  管理员 发布于 7年前   508

 

难点

svg图形的两块蒙版制作

先上代码

这是左边粉色框框的内容

这个没啥好说的

<div id="con">    <div id="TA-con">      <div id="text-con">        <div id="linght"></div>        <div id="TA">为TA充电</div>      </div>    </div>
body {      margin: 0;      padding: 0;      background-color: #eee;    }    /* 设置白色容器 */    #con {      width: 350px;      height: 85px;      background-color: #fff;      position: relative;      border-radius: 4px;      margin:50px auto;    }#TA-con {      width: 157px;      height: 50px;      background-color: #f25d8e;      box-shadow: 0 4px 4px rgba(255, 112, 159, .3);      position: absolute;      top: 50%;      left: 5%;      transform: translateY(-50%);      border-radius: 4px;      cursor: pointer;    }    /* 设置文本居中容器 */    #text-con {      width: 100px;      height: 100%;      margin: 0 auto;      position: relative;    }    /* 做一个小闪电 */    #linght {      width: 0;      height: 0;      position: absolute;      top: 36%;      left: 4px;      border-color: transparent;      border-style: solid;      border-width: 10px;      border-top: 10px solid #fff;      border-radius: 4px;      transform: rotate(-55deg);    }    #linght::after {      position: absolute;      top: -13px;      left: -11px;      content: "";      width: 0;      height: 0;      border-color: transparent;      border-style: solid;      border-width: 10px;      border-top: 10px solid #fff;      transform: rotate(180deg);      border-radius: 4px;    }    /* 文字 */    #TA {      float: right;      line-height: 50px;      font-size: 15px;      color: #fff;    }    #TA-con:hover {      background-color: #ff6b9a;    }

这里做的就是创建一个svg的图形,背景色是灰色,看着是不是很多很复杂,没事,这也不是我写的

 <div id="tube-con">      <svg viewBox="0 0 1028 385" fill="none" xmlns="http://www.w3.org/2000/svg">        <path d="M1 77H234.226L307.006 24H790" stroke="#e5e9ef" stroke-width="20" />        <path d="M0 140H233.035L329.72 71H1028" stroke="#e5e9ef" stroke-width="20" />        <path d="M1 255H234.226L307.006 307H790" stroke="#e5e9ef" stroke-width="20" />        <path d="M0 305H233.035L329.72 375H1028" stroke="#e5e9ef" stroke-width="20" />        <rect y="186" width="236" height="24" fill="#e5e9ef" />        <ellipse cx="790" cy="25.5" rx="25" ry="25.5" fill="#e5e9ef" />        <circle r="14" transform="matrix(1 0 0 -1 790 25)" fill="white" />        <ellipse cx="790" cy="307.5" rx="25" ry="25.5" fill="#e5e9ef" />        <circle r="14" transform="matrix(1 0 0 -1 790 308)" fill="white" />      </svg>

用的是这玩意,网页版在线的,画好后就可以右击复制代码了,是不是很简单! www.figma.com/

 

既然svg图画好了,就要想怎么完成了

需要的东西:
1:svg底色为灰色的图;
2:一个粉色的svg图,当我鼠标hover到左边粉色框时,粉色svg图完全展开,初始为0;
3:快速移动的黄色小方块;

底色灰色做好了,还差粉色和黄色的svg图

mask是用来做粉色svg的蒙版的
 

<div id="mask">

跟灰色svg没有任何的区别,就是改改颜色
 

<svg viewBox="0 0 1028 385" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 77H234.226L307.006 24H790" stroke="#f25d8e" stroke-width="20" /><path d="M0 140H233.035L329.72 71H1028" stroke="#f25d8e" stroke-width="20" /><path d="M1 255H234.226L307.006 307H790" stroke="#f25d8e" stroke-width="20" /><path d="M0 305H233.035L329.72 375H1028" stroke="#f25d8e" stroke-width="20" /><rect y="186" width="236" height="24" fill="#f25d8e" /><ellipse cx="790" cy="25.5" rx="25" ry="25.5" fill="#f25d8e" /><circle r="14" transform="matrix(1 0 0 -1 790 25)" fill="white" /><ellipse cx="790" cy="307.5" rx="25" ry="25.5" fill="#f25d8e" /><circle r="14" transform="matrix(1 0 0 -1 790 308)" fill="white" /></svg></div>

orange-mask是用来做黄色svg的蒙版
 

<div id="orange-mask" >

跟灰色svg没有任何的区别,就是改改颜色
 

<svg viewBox="0 0 1028 385" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M1 77H234.226L307.006 24H790" stroke="#ffd52b" stroke-width="20" /><path d="M0 140H233.035L329.72 71H1028" stroke="#ffd52b" stroke-width="20" /><path d="M1 255H234.226L307.006 307H790" stroke="#ffd52b" stroke-width="20" /><path d="M0 305H233.035L329.72 375H1028" stroke="#ffd52b" stroke-width="20" /><rect y="186" width="236" height="24" fill="#ffd52b" /><ellipse cx="790" cy="25.5" rx="25" ry="25.5" fill="#ffd52b" /><circle r="14" transform="matrix(1 0 0 -1 790 25)" fill="white" /><ellipse cx="790" cy="307.5" rx="25" ry="25.5" fill="#ffd52b" /><circle r="14" transform="matrix(1 0 0 -1 790 308)" fill="white" /></svg></div><p id="people">共 <b>0</b> 人</p></div></div>

css的代码

/* 创建图形容器 */    #tube-con {      width: 157px;      height: 55px;      position: absolute;      right: -5px;      top: 15px;    }    /* 对svg图形设置宽高 */    svg {      width: 100%;      height: 100%;    }    /* 创建一个蒙版 宽度为0,当我hover充电框的时候,宽度展开 */    #mask {      width: 0px;      height: 100%;      overflow: hidden;      position: absolute;      top: 0;      left: 0;      transition:all 0.5s;    }    /* 对蒙版的sbg单独设置宽高,保证宽度高低有一个固定值而不是百分比 */    #mask svg {      width: 157px;      height: 55px;    }    /* 对充电框hover的时候开始动画,将粉色线条铺开 */    #TA-con:hover+#tube-con>#mask{      width:157px;    }    /* 对充电框hover的时候开始动画,添加黄色快速移动的动画 */    #TA-con:hover+#tube-con>#orange-mask{      animation: move1 0.5s linear 0.2s infinite;    }    #TA-con:hover+#tube-con>#orange-mask svg{      animation: movetwo 0.5s linear 0.2s infinite;    }    /* 创建黄色移动的蒙版 */    #orange-mask{      width: 18px;      height: 100%;      overflow: hidden;      position:absolute;      left:-15px;      top:0px;    }    /* 创建黄色移动的内容 */    #orange-mask svg {      position: absolute;;      top:0;      left:15px;      width: 157px;      height: 55px;    }    @keyframes move1 {      0%{        left:-15px;      }      100%{        left:140px;      }    }    @keyframes movetwo {      0%{        left:15px;      }      100%{        left:-140px;      }    }    #people{      position:absolute;      right:10px;      top:8px;      font-size:12px;      font-family:"雅黑";      color:#aaa;    }    #people>b{      color:#777;    }

其中css处理最难的地方在于黄色svg和黄色svg蒙版的地方

因为既要保证黄色svg的蒙版从左向右移动,又要保证黄色svg位置保证不变;
蒙版为父元素,黄色svg为子元素,
父元素添加定位后,父元素移动,子元素一定会跟着移动,
如果子元素添加定位,父元素不添加定位 或者 父元素正常定位,子元素定位为fixed,
这有会导致父元素蒙版不能对子元素溢出的部分进行隐藏,在这我纠结了好久
!!!然后我就突然发现
父元素无论以多块的速度移动多远的距离,子元素只要以相同的速度移动相反的距离,
子元素就能保证一直以一个位置保持不变!!!子元素就相对body是静止的!!

move1是父元素蒙版的,movetwo是黄色svg图形的,请不要吐槽起名。。。。

move1移动多远,movetwo就移动相反的距离

 @keyframes move1 {      0%{        left:-15px;      }      100%{        left:140px;      }    }    @keyframes movetwo {      0%{        left:15px;      }      100%{        left:-140px;      }    }

全部的代码

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1.0">  <title>Document</title>  <style>    body {      margin: 0;      padding: 0;      background-color: #eee;    }    /* 设置白色容器 */    #con {      width: 350px;      height: 85px;      background-color: #fff;      position: relative;      border-radius: 4px;      margin:50px auto;    }    /* 设置文本内容容器 */    #TA-con {      width: 157px;      height: 50px;      background-color: #f25d8e;      box-shadow: 0 4px 4px rgba(255, 112, 159, .3);      position: absolute;      top: 50%;      left: 5%;      transform: translateY(-50%);      border-radius: 4px;      cursor: pointer;    }    /* 设置文本居中容器 */    #text-con {      width: 100px;      height: 100%;      margin: 0 auto;      position: relative;    }    /* 做一个小闪电 */    #linght {      width: 0;      height: 0;      position: absolute;      top: 36%;      left: 4px;      border-color: transparent;      border-style: solid;      border-width: 10px;      border-top: 10px solid #fff;      border-radius: 4px;      transform: rotate(-55deg);    }    #linght::after {      position: absolute;      top: -13px;      left: -11px;      content: "";      width: 0;      height: 0;      border-color: transparent;      border-style: solid;      border-width: 10px;      border-top: 10px solid #fff;      transform: rotate(180deg);      border-radius: 4px;    }    /* 文字 */    #TA {      float: right;      line-height: 50px;      font-size: 15px;      color: #fff;    }    #TA-con:hover {      background-color: #ff6b9a;    }    /* 创建图形容器 */    #tube-con {      width: 157px;      height: 55px;      position: absolute;      right: -5px;      top: 15px;    }    /* 对svg图形设置宽高 */    svg {      width: 100%;      height: 100%;    }    /* 创建一个蒙版 宽度为0,当我hover充电框的时候,宽度展开 */    #mask {      width: 0px;      height: 100%;      overflow: hidden;      position: absolute;      top: 0;      left: 0;      transition:all 0.5s;    }    /* 对蒙版的sbg单独设置宽高,保证宽度高低有一个固定值而不是百分比 */    #mask svg {      width: 157px;      height: 55px;    }    /* 对充电框hover的时候开始动画,将粉色线条铺开 */    #TA-con:hover+#tube-con>#mask{      width:157px;    }    /* 对充电框hover的时候开始动画,添加黄色快速移动的动画 */    #TA-con:hover+#tube-con>#orange-mask{      animation: move1 0.5s linear 0.2s infinite;    }    #TA-con:hover+#tube-con>#orange-mask svg{      animation: movetwo 0.5s linear 0.2s infinite;    }    /* 创建黄色移动的蒙版 */    #orange-mask{      width: 18px;      height: 100%;      overflow: hidden;      position:absolute;      left:-15px;      top:0px;    }    /* 创建黄色移动的内容 */    #orange-mask svg {      position: absolute;;      top:0;      left:15px;      width: 157px;      height: 55px;    }    @keyframes move1 {      0%{        left:-15px;      }      100%{        left:140px;      }    }    @keyframes movetwo {      0%{        left:15px;      }      100%{        left:-140px;      }    }    #people{      position:absolute;      right:10px;      top:8px;      font-size:12px;      font-family:"雅黑";      color:#aaa;    }    #people>b{      color:#777;    }  </style></head><body>  <div id="con">    <div id="TA-con">      <div id="text-con">        <div id="linght"></div>        <div id="TA">为TA充电</div>      </div>    </div>    <div id="tube-con">      <svg viewBox="0 0 1028 385" fill="none" xmlns="http://www.w3.org/2000/svg">        <path d="M1 77H234.226L307.006 24H790" stroke="#e5e9ef" stroke-width="20" />        <path d="M0 140H233.035L329.72 71H1028" stroke="#e5e9ef" stroke-width="20" />        <path d="M1 255H234.226L307.006 307H790" stroke="#e5e9ef" stroke-width="20" />        <path d="M0 305H233.035L329.72 375H1028" stroke="#e5e9ef" stroke-width="20" />        <rect y="186" width="236" height="24" fill="#e5e9ef" />        <ellipse cx="790" cy="25.5" rx="25" ry="25.5" fill="#e5e9ef" />        <circle r="14" transform="matrix(1 0 0 -1 790 25)" fill="white" />        <ellipse cx="790" cy="307.5" rx="25" ry="25.5" fill="#e5e9ef" />        <circle r="14" transform="matrix(1 0 0 -1 790 308)" fill="white" />      </svg>      <div id="mask">        <svg viewBox="0 0 1028 385" fill="none" xmlns="http://www.w3.org/2000/svg">          <path d="M1 77H234.226L307.006 24H790" stroke="#f25d8e" stroke-width="20" />          <path d="M0 140H233.035L329.72 71H1028" stroke="#f25d8e" stroke-width="20" />          <path d="M1 255H234.226L307.006 307H790" stroke="#f25d8e" stroke-width="20" />          <path d="M0 305H233.035L329.72 375H1028" stroke="#f25d8e" stroke-width="20" />          <rect y="186" width="236" height="24" fill="#f25d8e" />          <ellipse cx="790" cy="25.5" rx="25" ry="25.5" fill="#f25d8e" />          <circle r="14" transform="matrix(1 0 0 -1 790 25)" fill="white" />          <ellipse cx="790" cy="307.5" rx="25" ry="25.5" fill="#f25d8e" />          <circle r="14" transform="matrix(1 0 0 -1 790 308)" fill="white" />        </svg>      </div>      <div id="orange-mask" >        <svg viewBox="0 0 1028 385" fill="none" xmlns="http://www.w3.org/2000/svg">          <path d="M1 77H234.226L307.006 24H790" stroke="#ffd52b" stroke-width="20" />          <path d="M0 140H233.035L329.72 71H1028" stroke="#ffd52b" stroke-width="20" />          <path d="M1 255H234.226L307.006 307H790" stroke="#ffd52b" stroke-width="20" />          <path d="M0 305H233.035L329.72 375H1028" stroke="#ffd52b" stroke-width="20" />          <rect y="186" width="236" height="24" fill="#ffd52b" />          <ellipse cx="790" cy="25.5" rx="25" ry="25.5" fill="#ffd52b" />          <circle r="14" transform="matrix(1 0 0 -1 790 25)" fill="white" />          <ellipse cx="790" cy="307.5" rx="25" ry="25.5" fill="#ffd52b" />          <circle r="14" transform="matrix(1 0 0 -1 790 308)" fill="white" />        </svg>      </div>      <p id="people">共 <b>0</b> 人</p>    </div>  </div></body></html>

到此这篇关于css+svg实现b站充电效果的示例代码的文章就介绍到这了,更多相关css b站充电内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!


  • 上一条:
    CSS运用阿里巴巴矢量库快速在对应位置加上好看的图标效果(实例代码)
    下一条:
    CSS动画实现领积分效果的思路详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客