使用html+css+JavaScript制作抛物线小球

简介: 使用html+css+JavaScript制作抛物线小球

效果如下:

20210910113034512.gif

一般用于给购物车添加按钮时进行的特效

//html
<div class="addToCart">
    <span>+</span>
  </div>
  <!-- 这里的标签是为了写css样式 -->
  <!--  <div class="outer">
  <div class="inner"></div>
  </div> -->
  <div class="shopCart">
    <span>Cart</span>
  </div>

首先要先布局

然后设置其样式

//css样式
.addToCart {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  top: 100px;
  left: 100px;
  position: absolute;
  background: #0f79b9;
  font-size: 30px;
  color: #fff;
  font-weight: bolder;
  line-height: 32px;
  text-align: center;
  cursor: pointer;
  z-index: 10; }
  .addToCart span {
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none; }
.outer {
  z-index: 9;
  top: 100px;
  left: 100px;
  position: absolute;
  transition: -webkit-transform 1s linear;
  transition: transform 1s linear;
  transition: transform 1s linear, -webkit-transform 1s linear; }
  .outer .inner {
    border-radius: 50%;
    width: 36px;
    height: 36px;
    top: 0;
    left: 0;
    position: absolute;
    background: #e0c01b;
    opacity: 1;
    transition: all 1s cubic-bezier(.29,-0.48,.99,.19)}
.shopCart {
  width: 100px;
  height: 40px;
  line-height: 40px;
  border-radius: 5px;
  background: #35b317;
  color: #fff;
  text-align: center;
  position: absolute;
  right: 100px;
  bottom: 100px; }
/*# sourceMappingURL=cssway.css.map */

效果如图所示:

20210910113444406.png 下面是给元素添加JS效果

var addToCart = document.querySelector('.addToCart');
    var shopCart = document.querySelector('.shopCart');
    // 对函数进行封装
    function createBall() {
    // 创建一个outer
    var outer = document.createElement('div');
    // 创建outer
    var inner = document.createElement('div');
    //把inner塞到outer里面
    // 生成两个节点 classlist:该属性适用于在元素中添加,移除以及切换CSS类
    // classlist属性是只读的,但可以使用add()和remover()方法去修改它
    outer.classList.add('outer'); //添加一个outer的节点
    inner.classList.add('inner'); //添加一个inner的节点
    // appendChild():向节点节点添加最后一个子节点
    // insertBefore(newnode,existingnode):在已有子节点之前插入新的子节点newnode要插入的子节点,existingnode要添加新的节点前的子节点。两个值都要添加
    outer.appendChild(inner); //把inner塞到outer里面  inner为变量,不是字符串,所以不需要加引号
    // 在body里面增加一个outer
    document.body.appendChild(outer)
    return outer;
    }

然后调用createBall(),实现添加标签

20210910113713502.png

核心是点击事件:

// createBall()
    /* 核心是点击事件 */
    // 对盒子做一个点击事件
    addToCart.addEventListener('click', function(e) {
    // 两个作用域不同,之间没有关系
    var outer = createBall(),
      // firstchild可以获取多余文本节点
      inner = outer.firstElementChild, //获取outer第一个子元素
      // 起始的按钮就是点击的目标
      startBtn = e.target,
      // getBoundingClientRect():可以获得页面中某个元素的上下左右别别相对浏览器视窗的位置
      // +上下左右的间距
      startPoint = startBtn.getBoundingClientRect(),
      // cart的上下左右的间距
      endPoint = shopCart.getBoundingClientRect(),
      instanceX = endPoint.left - startPoint.left,
      // 结束的左边(cart) - 开始的左边(+)
      // 结束的上边(cart) - 开始的上边(+)
      // 可以获取两者之间的长度和高度
      // 开始和结束必须使用定位,否则不会发生变化
      instanceY = endPoint.top - startPoint.top;
    outer.style.transform = 'translate3d(' + instanceX + 'px,0,0)';
    // 外面的小球控制他的水平方向
    inner.style.transform = 'translate3d(0,' + instanceY + 'px,0)';
    // 里面的小球控制它的垂直方向,形成一个抛物线
    })

写到这里就可以实现给小球添加抛物线了

20210910113935427.gif

问题来了,如何让他的小球动画结束过后消失呢?有以下两种方法:

1、 inner.style.opacity = 0;  //当完成之后可以让他过渡结束过后变成透明

效果:

20210910114047906.gif

让他变成透明放进来的东西实际上没有被移除,,点击过多,会影响到内存占用

建议使用第二种方案

function animateEnd(e) {
    var target = e.target;
    // classList.contains:是不是存在这个节点
    if (target.classList.contains('outer')) {
      // 如果有outer,就把他的父节点给移除掉,他的子节点就不会存在
      removeNode(target);
    }
    if (target.classList.contains('inner')) {
      // 移除目标值的parentNode
      removeNode(target.parentNode);
    }
    } 
    //不能直接调用,他不知道这个动画在什么时候移除
    // 应该在动画结束之后移除
    function removeNode(ele) { //移除节点
    ele.parentNode && ele.parentNode.removeChild(ele); //找到目标值的父节点同时移除节点
    // 让这个元素变为空
    ele = null;
    }
    // 加一个监听器,当过渡动画结束过后再去执行这个结束的动画
    window.addEventListener('transitionend', animateEnd, false);
    // animageEnd:在css完成过渡后触发
    //false:冒泡
    //true:捕获

这样就不会有内存占用的问题了

如果想更改抛物线的话可以更改css样式中的贝塞尔曲线更换即可

20210910114414995.png

贝塞尔曲线网址


相关文章
|
9天前
纸屑飘落生日蛋糕场景js+css3动画特效
纸屑飘落生日蛋糕CSS3动画特效是一款js+css3制作的全屏纸屑飘落,生日蛋糕点亮庆祝动画特效。
24 3
|
9天前
|
Web App开发 移动开发 HTML5
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码。画面中心是悬浮于空的梅花鹿,其四周由白色线段组成了一个6边形将中心的梅花鹿包裹其中。四周漂浮的白雪随着多边形的转动而同步旋转。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
36 2
|
20天前
|
前端开发 测试技术 定位技术
如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤
本文深入介绍了如何利用HTML和CSS构建企业级网站的全过程。从项目概述到页面结构设计,再到HTML结构搭建与CSS样式设计,最后实现具体页面并进行优化提升,全面覆盖了网站开发的关键步骤。通过实例展示了主页、关于我们、产品展示、新闻动态及联系我们等页面的设计与实现,强调了合理布局、美观设计及用户体验的重要性。旨在为企业打造一个既专业又具吸引力的线上平台。
42 7
|
20天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
29 6
|
19天前
|
存储 移动开发 前端开发
高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容
本文深入探讨了高效的 HTML 与 CSS 编写技巧,涵盖语义化标签、文档结构优化、CSS 预处理、模块化设计、选择器优化、CSS 变量、媒体查询等内容,旨在提升开发效率、网站性能和用户体验。
31 5
|
20天前
|
前端开发 JavaScript UED
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势
在数字化时代,Web 应用性能优化尤为重要。本文探讨了CSS与HTML在提升Web性能中的关键作用及未来趋势,包括样式表优化、DOM操作减少、图像优化等技术,并分析了电商网站的具体案例,强调了技术演进对Web性能的深远影响。
25 5
|
1月前
|
移动开发 JavaScript 前端开发
html table+css实现可编辑表格的示例代码
html table+css实现可编辑表格的示例代码
53 12
|
26天前
|
JavaScript 前端开发
CSS3 动画和 JavaScript 动画的性能比较
具体的性能表现还会受到许多因素的影响,如动画的复杂程度、浏览器的性能、设备的硬件条件等。在实际应用中,需要根据具体情况选择合适的动画技术。
|
28天前
|
缓存 前端开发 JavaScript
优化CSS和JavaScript加载
优化CSS和JavaScript加载