余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

看了就会,原生js实现碰壁反弹效果(用c语言写一个小球碰壁反弹路线轨迹)

xiyangw 2022-11-26 15:54 17 浏览 0 评论

谷歌浏览器中代码运行效果图

写在前面,觉得文章还可以的朋友,可以点一手关注,在前端学习路上,我与你一路前行。

原生js效果实现小球碰壁反弹效果。在谷歌浏览器中运行的,曾经一位高级程序员说过,能用js实现的,终究还是用js实现。所以原生js技能对于前端工程师特别重要。

这个小demo的重点和难点就是鼠标事件函数,和offsetHeight与offsetTop的区别于用法。如果有朋友进行优化了,还请赐教,因为这个代码还存在一些不足。

offsetHeight:它返回的高度是内容高+padding+边框,但是注意哦,木有加margin哦,当然一般也木有啥需要把margin加进去.

1、offsetLeft

假设 obj 为某个 HTML 控件。

obj.offsetTop 指 obj 距离上方或上层控件的位置,整型,单位像素。

obj.offsetLeft 指 obj 距离左方或上层控件的位置,整型,单位像素。

obj.offsetWidth 指 obj 控件自身的宽度,整型,单位像素。

obj.offsetHeight 指 obj 控件自身的高度,整型,单位像素。

我们对前面提到的“上方或上层”与“左方或上层”控件作个说明。

<div id="tool">
<input type="button" value="提交">
<input type="button" value="重置">
</div>

“提交”按钮的 offsetTop 指“提交”按钮距“tool”层上边框的距离,因为距其上边最近的是 “tool” 层的上边框。

“重置”按钮的 offsetTop 指“重置”按钮距“tool”层上边框的距离,因为距其上边最近的是 “tool” 层的上边框。

“提交”按钮的 offsetLeft 指“提交”按钮距“tool”层左边框的距离,因为距其左边最近的是 “tool” 层的左边框。

“重置”按钮的 offsetLeft 指“重置”按钮距“提交”按钮右边框的距离,因为距其左边最近的是“提交”按钮的右边框。

以上属性在 FireFox ,google中也有效。

另 外:我们这里所说的是指 HTML 控件的属性值,并不是document.body,document.body 的值在不同浏览器中有不同解释(实际上大多数环境是由于对 document.body 解释不同造成的,并不是由于对 offset 解释不同造成的)。

offsetTop 与 style.top 的区别

我们知道 offsetTop 可以获得 HTML 元素距离上方或外层元素的位置,style.top 也是可以的,二者的区别是:

一、offsetTop 返回的是数字,而 style.top 返回的是字符串,除了数字外还带有单位:px。

(深坑,这个demo的主要时间就卡在这了,注意着)

二、offsetTop 只读,而 style.top 可读写。

三、如果没有给 HTML 元素指定过 top 样式,则 style.top 返回的是空字符串。

offsetLeft 与 style.left、offsetWidth 与 style.width、offsetHeight 与 style.height 也是同样道理。

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <style>
 * {
 margin: 0;
 padding: 0;
 }
 
 ol,
 ul,
 li {
 list-style: none;
 }
 
 .wrap {
 width: 400px;
 height: 400px;
 margin: 20px auto;
 background: #ddd;
 position: relative;
 overflow: hidden;
 }
 
 .sty {
 width: 50px;
 height: 50px;
 background: #f00;
 position: absolute;
 left: 112px;
 top: 10px;
 }
 
 .boardDiv {
 width: 100px;
 height: 20px;
 position: absolute;
 bottom: 100px;
 background: #f00;
 cursor: pointer;
 border-radius: 10px;
 }
 </style>
</head>
<body>
 <div class="wrap" id='wrapId'>
 <div class="sty" id='styId'></div>
 <div class='boardDiv' id='boardId'></div>
 </div>
 <script type='text/javascript'>
 var doc = document;
 var N = 0;
 function gId(n) {
 return doc.getElementById(n);
 };
 var _L = 5;
 var _T = 5;
 // 运动的衰减
 // _T = 0.77 * _T;
 setInterval(function() {
 var el = gId('styId').offsetLeft + _L;
 var et = gId('styId').offsetTop + _T;
 N = N + 1;
 console.log(et);
 //垂直方向
 if (et >= gId('wrapId').offsetHeight - gId('styId').offsetHeight) {
 et = gId('wrapId').offsetHeight - gId('styId').offsetHeigBht;
 _T = -1 * _T;
 _T = 0.77 * _T;
 } else if (et <= 0) {
 et = 0;
 _T = -1 * _T;
 _T = 0.77 * _T;
 }
 //水平方向
 if (el >= gId('wrapId').offsetWidth - gId('styId').offsetWidth) {
 el = gId('wrapId').offsetWidth - gId('styId').offsetWidth;
 _L = -1 * _L;
 _L = 0.77 * _L;
 } else if (el <= 0) {
 el = 0;
 _L = -1 * _L;
 _L = 0.77 * _L;
 }
 // 先判断y轴
 if (et > gId('boardId').offsetTop - 50 &&
 et < gId('boardId').offsetTop + 20) {
 // 再判断x轴
 if (gId('styId').offsetLeft > gId('boardId').offsetLeft - 40 &&
 gId('styId').offsetLeft < gId('boardId').offsetLeft + 140) {
 _T = -1 * _T;
 }
 }
 gId('wrapId').onmousemove = function(e) {
 var el = (e.pageX - gId('wrapId').offsetLeft - 50) + 'px';
 gId('boardId').style.left = el;
 }
 // 这个给元素设置 gId('styId').style.top必须是数字加px
 gId('styId').style.top = et++ + 'px';
 gId('styId').style.left = el++ + 'px';
 //清除定时器
 if (N > 1000) {
 clearInterval;
 }
 }, 50);
 </script>
</body>
</html>

相关推荐

Vue的框架(了解)

前端MVC设计模式MVC设计模式,其实就是将前端实现某个业务的所有代码划分为三部分Model:模型,指数据模型,这个数据一般来自于服务器View:视图,指页面标签内容Controller:控制...

Vue.js实战 第五章练习一

练习要求:在原有表格基础上,新增一项是否选中该商品的功能,总价变为只计算选中商品的总价,同时提供一个全选的按钮。实现思路:按照vue数据和dom元素双向绑定的特性,定义allCheckStatus变量...

Vue基础到进阶教程之class和style绑定

关于class和style我们并不陌生,这个在学习css的时候就是家常便饭了,操作元素的class列表和内联样式是数据绑定的一个常见需求。因为它们都是属性,所以我们可以用v-bind处理它们,...

深入Vue 必学高阶组件 HOC「进阶篇」

作者:ssh转发连接:https://mp.weixin.qq.com/s/seKoLSIMtTd1sU4uDrgZCA前言高阶组件这个概念在React中一度非常流行,但是在Vue的社区里讨论...

周末大礼包,23道高质量中级前端面试题。金九银十,建议收藏

这套面试题考察的内容比较常见,涉及到JavaScript、ES6、CSS、Vue、简单算法,浏览器相关知识等。题目列表1.JavaScript的数据类型有哪些2.什么是同源策略3.跨域的方法...

vue3.0-摒弃Object.defineProperty,基于 Proxy 的观察者机制

写在前面:11月16日早上,Vue.js的作者尤大大在VueToronto的主题演讲中预演了Vue.js3.0的一些新特性,其中一个很重要的改变就是Vue3将使用ES6的Proxy作...

程序员都必掌握的前端教程之VUE基础教程(七)

阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到。本篇文章成哥继续带大家来学习前端VUE教程,今天主要讲解VUE的表单处理等知识点。下面我们就一起来学习该块内容吧!01简介在日常开发中,我...

web前端开之网站搭建框架之vue详解

网站搭建框架之vueVue是web前端快速搭建网站的框架之一。它与jQuery有所不同,是以数据驱动web界面(以操作数据改变页面,而jQuery是以操作节点来改变页面),同时,vue还实现了数据的双...

vue3.0尝鲜-基于 Proxy 的观察者机制探索

Vue.js的作者尤大大在VueToronto的主题演讲中预演了Vue.js3.0的一些新特性,其中一个很重要的改变就是Vue3将使用ES6的Proxy作为其观察者机制,取代之前使用...

TypeScript 设计模式之观察者模式

一、模式介绍1.背景介绍在软件系统中经常碰到这类需求:当一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化。这是建立一种「对象与对象之间的依赖关系」,一个对象发生改变时将「自动通知其他...

vue面试3

1.单页面应用与多页面应用的去别2.简述一下Sass、Less,且说明区别?他们是动态的样式语言,是CSS预处理器,CSS上的一种抽象层。他们是一种特殊的语法/语言而编译成CSS。变量符不一样,les...

VUE v-bind 数据绑定

动态的绑定一个或多个attribute,也可以是组件的prop。缩写::或者.(当使用.prop修饰符)期望:any(带参数)|Object(不带参数)参数:attrOrP...

vue初学习之自定义选择框实现

v-model简单介绍在使用vue的过程中会经常用到input和textarea这类表单元素,vue对于这些元素的数据绑定和我们以前经常用的jQuery有些区别。vue使用v-model实现这些标签...

Vue实现拖拽穿梭框功能四种方式

一、使用原生js实现拖拽打开视频讲解更加详细Vue实现拖拽穿梭框功能的四种方式_哔哩哔哩_bilibili<html><head><meta...

Vue3.x setup 语法糖实现props双向绑定

1.背景为了封装一下Element-Plus的分页插件,需要实现父子组件之间的传值。2.父组件<scriptsetuplang="ts">letqueryPa...

取消回复欢迎 发表评论: