RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1109280
Accepted
user380202
user380202
Asked:2020-04-12 21:44:49 +0000 UTC2020-04-12 21:44:49 +0000 UTC 2020-04-12 21:44:49 +0000 UTC

球从方块边界的边缘反弹?

  • 772

父块中有一个球:

body {
  background: black;
}

.box {
  position: relative;
  overflow: hidden;
  margin: 0 auto;
  width: 500px;
  height: 300px;
  border-radius: 5px;
  box-shadow: inset 0 0 2px black;
  background-color: white;
}

.ball {
  position: absolute;
  width: 20px;
  height: 20px;
  border-radius: 100%;
  background-color: black;
  box-shadow: inset -5px -5px 5px rgba(0, 0, 0, .5), 15px 15px 2px rgba(0, 0, 0, .05);
}
<div class="box">
  <div class="ball"></div>
</div>

我怎样才能让它无限期地移动并从这个块的边界边缘反弹?

javascript
  • 3 3 个回答
  • 10 Views

3 个回答

  • Voted
  1. Best Answer
    user355286
    2020-04-12T22:55:45Z2020-04-12T22:55:45Z
    if(шарик.x < 0 || шарик.x > контейнер.width - шарик.width) {
      скорость шарика по оси X умножаем на -1
    }
    
    if(шарик.y < 0 || шарик.y > контейнер.height - шарик.height) {
      скорость шарика по оси Y умножаем на -1
    }
    

    const container_info = {
      w: container.getBoundingClientRect().width,
      h: container.getBoundingClientRect().height
    }
    
    const ball_info = { 
      x:0,y:0, vx:4,vy:4,
      w: ball.getBoundingClientRect().width,
      h: ball.getBoundingClientRect().height
    }
    
    function updatePositionInformation(info) {
      info.x += info.vx
      info.y += info.vy
    }
    
    function translateDomElement(el, info) {
      el.style.transform = `translate(${info.x}px, ${info.y}px)`
    }
    
    function checkXPosition(el_info, container_info) {
      return el_info.x < 0 || el_info.x > container_info.w - el_info.w
    }
    
    function checkYPosition(el_info, container_info) {
      return el_info.y < 0 || el_info.y > container_info.h - el_info.h
    }
    
    function boundaries(el_info, x_out, y_out) {
      if(x_out) el_info.vx *= -1
      if(y_out) el_info.vy *= -1
    }
    
    function render() {
      updatePositionInformation(ball_info)
      translateDomElement(ball, ball_info)
      
      boundaries(
        ball_info,
        checkXPosition(ball_info, container_info),
        checkYPosition(ball_info, container_info),
      )
      
      requestAnimationFrame(render)
    }
    
    render()
    body {
      height: 100vh;
      margin: 0;
      
      display: flex;
      align-items: center;
      justify-content: center;
      
      background-color: black;
    }
    
    #container {
      position: relative;
      
      width: 250px;
      height: 150px;
      
      background-color: white;
    }
    
    #ball {
      position: absolute;
      
      width: 15px;
      height: 15px;
      
      border-radius: 50%;
      background-color: black;
    }
    <div id=container> <div id=ball></div> </div>

    • 12
  2. Sevastopol'
    2020-04-13T00:26:13Z2020-04-13T00:26:13Z

    嗯...为什么不在 CSS 中做呢?只需添加两行动画:

    body {
      background: black;
    }
    
    .box {
      position: relative;
      overflow: hidden;
      margin: 0 auto;
      width: 500px;
      height: 300px;
      border-radius: 5px;
      box-shadow: inset 0 0 2px black;
      background-color: white;
    }
    
    .ball {
      position: absolute;
      width: 20px;
      height: 20px;
      border-radius: 100%;
      background-color: black;
      box-shadow: inset -5px -5px 5px rgba(0, 0, 0, .5), 15px 15px 2px rgba(0, 0, 0, .05);
      animation: moveX 3s linear 0s infinite alternate, moveY 3.5s linear 0s infinite alternate;
    }
    
    @keyframes moveX {from {left: 0;} to {left: 480px;}}
    @keyframes moveY {from {top: 0;} to {top: 280px;}}
    <div class="box"><div class="ball"></div></div>

    • 11
  3. Alexandr_TT
    2020-04-13T00:57:58Z2020-04-13T00:57:58Z

    为什么不在 SVG 中做呢?

    <svg version="1.1" xmlns="http://www.w3.org/2000/svg"  
    xmlns:xlink="http://www.w3.org/1999/xlink" height="100vh" viewBox="0 0 400 400">
    
    <rect width="100%" height="100%" rx="25"  fill="green" stroke="#9D8500" stroke-width="15"/>
    <circle cx="50%" cy="20%" r="3%" fill="url(#gradB)" >
    
     <animate attributeName="cx" dur="3" values="3%;97%;3%"  
       repeatCount="indefinite" /> 
     <animate attributeName="cy" dur="2.8" values="3%;97%;3%"  
       repeatCount="indefinite" />
    </circle>
    
    <circle cx="30%" cy="70%" r="3%" fill="url(#gradR)" >
    
     <animate attributeName="cx" dur="2.7" values="97%;3%;97%"  
       repeatCount="indefinite" /> 
     <animate attributeName="cy" dur="3.1" values="3%;97%;3%"  
       repeatCount="indefinite" />
    </circle>
    
     <radialGradient id="gradB" cx="20%" cy="20%" r="100%" fx="30%" fy="30%">
       <stop stop-color="white" offset="0"/>
       <stop stop-color="blue" offset="25%"/>
       <stop stop-color="rgb(0,0,192)" offset="50%"/>
       <stop stop-color="rgb(0,0,127)" offset="70%"/>
       <stop stop-color="rgb(0,0,64)" offset="85%"/>
       <stop stop-color="rgb(0,0,0)" offset="100%"/>
     </radialGradient>
    
     <radialGradient id="gradR" cx="20%" cy="20%" r="100%" fx="30%" fy="30%">
       <stop stop-color="white" offset="0"/>
       <stop stop-color="red" offset="25%"/>
       <stop stop-color="rgb(192,0,0)" offset="50%"/>
       <stop stop-color="rgb(127,0,0)" offset="70%"/>
       <stop stop-color="rgb(64,0,0)" offset="85%"/>
       <stop stop-color="rgb(0,0,0)" offset="100%"/>
     </radialGradient>
    
    </svg>

    • 8

相关问题

  • 第二个 Instagram 按钮的 CSS 属性

  • 由于模糊,内容不可见

  • 弹出队列。消息显示不正确

  • 是否可以在 for 循环中插入提示?

  • 如何将 JSON 请求中的信息输出到数据表 Vuetify vue.js?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何从列表中打印最大元素(str 类型)的长度?

    • 2 个回答
  • Marko Smith

    如何在 PyQT5 中清除 QFrame 的内容

    • 1 个回答
  • Marko Smith

    如何将具有特定字符的字符串拆分为两个不同的列表?

    • 2 个回答
  • Marko Smith

    导航栏活动元素

    • 1 个回答
  • Marko Smith

    是否可以将文本放入数组中?[关闭]

    • 1 个回答
  • Marko Smith

    如何一次用多个分隔符拆分字符串?

    • 1 个回答
  • Marko Smith

    如何通过 ClassPath 创建 InputStream?

    • 2 个回答
  • Marko Smith

    在一个查询中连接多个表

    • 1 个回答
  • Marko Smith

    对列表列表中的所有值求和

    • 3 个回答
  • Marko Smith

    如何对齐 string.Format 中的列?

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5