一条道简单的算法引发的思考

news2024/11/23 21:25:04

前言

新一季的 Rick&Morty 已经上线,剧集质量虽然有所下降,但 E03 中的 SheepCounter 挺有意思。自己照着剧中的设定开发了一款界面极其相似、交互更为丰富的小程序,小程序的终极目标只有一个:数羊!数羊!!数羊!!!。

不会真有人觉得这款小程序会起到催眠作用吧。

小程序虽然简单,但也探索出了一些有意思的小实现。下面就和大家分享探讨一下:

曲线路径的动画实现

首先就是小羊跳入、跳出界面的动画,仔细观察地话可以发现,小羊移动的路径其实是条曲线。

水平或者垂直移动的动画不难实现,我们可以通过控制绝对定位下的 left/right 或者 top/bottom 来实现。

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><title></title><meta name="description" content="" /><meta name="viewport" content="width=device-width, initial-scale=1" /><style> .zone {position: relative;width: 200px;height: 400px;top: 100px;left: 400px;border: 1px solid red;}.ball {position: absolute;width: 50px;height: 50px;background-color: cadetblue;border-radius: 50%;top: 30px;right: -100px;animation: XIn 1s linear;animation-fill-mode: forwards;}@keyframes XIn {0% {right: -100px;}100% {right: 50%;}} </style></head><body><div class="zone"><div class="ball"></div></div></body>
</html> 

如果是需要曲线移动呢?animation 中似乎没有可以设置曲线移动的属性。不过我们可以参照高中物理知识思考一下,二维平面上移动无外乎水平或者垂直两个方向,当两个方向的移动同时发生且速度不一致时,便可以合成为曲线运动。结合此原理,我们可以轻松地想到:只要在animation中同时设置速度不一致的垂直移动动画和水平移动动画即可。

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><title></title><meta name="description" content="" /><meta name="viewport" content="width=device-width, initial-scale=1" /><style> .zone {position: relative;width: 200px;height: 400px;top: 100px;left: 400px;border: 1px solid red;}.ball {position: absolute;width: 50px;height: 50px;background-color: cadetblue;border-radius: 50%;top: 30px;right: -100px;animation: XIn 1s cubic-bezier(0.28, 0.58, 0.4, 0.73), YIn 1s linear;animation-fill-mode: forwards;}@keyframes XIn {0% {right: -100px;}100% {right: 50%;}}@keyframes YIn {0% {top: 30px;}100% {top: 50%;}} </style></head><body><div class="zone"><div class="ball"></div></div></body>
</html> 

这样也就成功实现了曲线移动效果。

自定义输入框的实现

可以看到,在我们小程序的数羊界面中已经有了自定义实现了键盘。在小程序中进行输入时,我们肯定不希望弹起系统键盘。

输入框最有辨识度的特点是什么?那自然是闪烁的光标。光标才可以为我们自定义的输入框注入灵魂。闪烁效果其实也只是个动画而已,以下是简单的实现效果:

.sCursor {position: absolute;display: inline-block;width: 3px;height: 50px;margin-left: 4px;background: #000;top: 24px;animation: blink 800ms infinite reverse;
}

@keyframes blink {0% {opacity: 1;}100% {opacity: 0;}
} 
<View className={style.sInput}>{/* <!-- 文本 --> */}{inputValue?.split('').map((v: string, i: number) => (<Text key={i} className={style.sValue}>{v} </Text> ))} {/* <!-- 光标 --> */}<View className={style.sCursor} />
</View> 

为了避免用户忘记了自己数到了第几只羊,我决定在用户输入错误两次后,用placeholder的形式来提示用户。自定义placeholder的思路也非常简单,只需要将其绝对定位至正常输入的文本之下:

.inputZone {width: 500px;height: 100px;position: relative;.sInput {width: 100%;height: 100%;padding: 10px 40px;letter-spacing: 6px;position: relative;.sValue {font-size: 60px;font-family: 'handwriting';}.sCursor {//...}}.sTip {position: absolute;font-size: 60px;font-family: 'handwriting';z-index: 1;top: 10px;left: 40px;color: rgb(145, 142, 142);}
} 
<View className={style.inputZone}><View className={style.sInput}>{/* <!-- 文本 --> */}{inputValue?.split('').map((v: string, i: number) => (<Text key={i} className={style.sValue}>{v}</Text>))}{/* <!-- 光标 --> */}<View className={style.sCursor} /></View>{tip && !inputValue ? (<Text className={style.sTip}>{tip}</Text>) : null}
</View> 

键盘功能的实现就更简单了,只需要根据不同按钮点击事件触发相应的功能就行。想必大家都能想到,这里不贴代码了。

尾言

兴趣是学习的最好老师。一款看起来极其简单的小程序,真正实践开发起来也能遇到一些未曾了解过的知识点。Xdm,如果你也有有趣的点子,别犹豫,行动起来吧!

最后插一句,希望Rick&Morty后续剧集的质量能upup!!

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89832.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据Kudu(六):Kudu Java Api操作

文章目录 ​​​​​​Kudu Java Api操作 一、​​​​​​​​​​​​​​添加Maven依赖

zos-open gb28181,rtsp,rtmp,hls直播储存回放,上下级级联

fslib框架 fslib框架是一套可运行于生产环境的支持c/c线程死锁,线程cpu资源统计,死机时自动记录死机所对应的源码位置的调试框架,部分功能支持php语言&#xff1b;fslib框架内置了很多实用库配置库(FsConfig)--支持向上向下兼容的配置模块&#xff0c;同时可以导出与导入json和…

Ajax(三)

1.form表单的基本使用 1.1 什么是表单 表单在网页中主要负责数据采集功能。HTML中的<form>标签&#xff0c;就是用于采集用户输入的信息&#xff0c;并通过<form>标签的提交操作&#xff0c;把采集到的信息提交到服务器端进行处理。 1.2 表单的组成部分 表单标签…

java+MySQL 基于ssm的网上定点餐外卖系统

网上订餐不是一蹴而就的事情,它需要的是线上线下的共同努力。对于线上来说,安全、稳定、功能完善的网站构建必不可少,这是主要的也是最重要的一部分,网站是“脸面”,好的脸面会吸引更多的顾客光顾。而对于线下来说,好的菜品是一个订餐网站的支柱,我们不能仅靠各色各样的图片满足…

mockito的详细使用

目录 1.概述 2.使用 2.1.依赖 2.2.校验 2.2.1.值校验 2.2.2.顺序校验 2.2.3.指定返回 2.3.注解 2.3.1.Mock 2.3.2.Spy 2.3.3.Captor 2.3.4.InjectMocks 1.概述 mock&#xff0c;一种JAVA单元测试技术&#xff0c;mock允许使用模拟对象替换测试中的系统部件&#xf…

【Redis】Redis 分布式锁

文章目录概述Redis 实现分布式锁加锁释放锁死锁概述 在单体项目中&#xff0c;我们处理多线程同时操作某一处代码块或者变量时就使用 Synchronized 或者 Lock 锁去保证数据的安全性&#xff0c;但是&#xff0c;现在我们基本上都是使用微服务&#xff0c;当我们把服务部署到多…

一文说透小程序插件及其作用价值

最近工作接触小程序插件比较多&#xff0c;就想着不如跟大家系统分享一下小程序插件相关的内容。 首先&#xff0c;我们要先弄清楚小程序插件究竟是什么&#xff1f; 简单来说&#xff0c;小程序插件就是可被添加到小程序内直接使用的功能组件。插件依附于主程序的辅助程序&a…

详解c++---string的介绍(上)

这里写目录标题什么是stringstring的构造函数string的赋值重载string的遍历第一种方式 [ ]第二种方式 范围for第三种方式 正向迭代器反向迭代器string中的capacitysize lengthmax_sizecapacityreserveresizeshrink_to_fitstring的element access什么是string 那这里大家就只用…

k8s编程operator实战之云编码平台——③Code-Server Pod访问实现

文章目录1、openresty介绍和安装2、实现code-server的反向代理3、动态反向代理实现启动多个code-server访问k8s编程operator系列&#xff1a;k8s编程operator——(1) client-go基础部分k8s编程operator——(2) client-go中的informerk8s编程operator——(3) 自定义资源CRDk8s编…

【提高代码可读性】—— 手握多个代码优化技巧、细数哪些惊艳一时的策略

回顾 前期 趁着下班前五分钟书写——Vue3通讯(常规写法、语法糖、v-modle、兄弟通讯)_0.活在风浪里的博客-CSDN博客Vue3 组件通讯https://blog.csdn.net/m0_57904695/article/details/128145150?spm1001.2014.3001.5501 目录 一、可选链接运算符【&#xff1f;.】 二、空…

AD20和立创EDA设计(2)提取立创EDA的原理图库和PCB库

&#xff08;1&#xff09;因为AD20需要自己画原理图库和PCB库。所以我建议新手先用立创EDA画好原理图&#xff0c;转换为PCB&#xff08;注意&#xff0c;只需要转换出PCB即可&#xff0c;因为我们需要立创EDA的PCB库。不懂没关系&#xff0c;后面就清楚了&#xff09; &#…

把随身WiFi的esim卡移植到SIM卡放到手机使用

esim移植到实体sim卡&#xff0c;手把手教你esim改实体卡操作 自用先机的棒子&#xff0c;3-5倍虚标&#xff0c;在单位用&#xff0c;网速还行就是信号不好&#xff0c;uz801_v3.0的板子&#xff0c;410单天线&#xff0c;没有改装潜力&#xff0c;发热还大&#xff0c;加了风…

炸裂!速度百倍提升,高性能 Python 编译器 Codon 火了!

众所周知&#xff0c;Python 是一门简单易学、具有强大功能的编程语言&#xff0c;在各种用户使用统计榜单中总是名列前茅。相应地&#xff0c;围绕 Python&#xff0c;研究者开发了各种便捷工具&#xff0c;以更好的服务于这门语言。 编译器充当着高级语言与机器之间的翻译官…

[附源码]Nodejs计算机毕业设计基于Web企业客户管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

数据分析图表-FineReport 图表切换接口

1. 概述 1.1 问题描述 图表往往是按照从左往右或从右往左的顺序来切换。那么如何实现点击图表直接切换到其他不相邻的图表呢&#xff1f;效果如下图所示&#xff1a; 1.2 实现思路 给图表添加 JavaScript 类型的超级链接&#xff0c;调用图表接口FR.Chart.WebUtils.getChart(…

如何选择美股l2接口类型?

如何选择美股l2接口类型&#xff1f; 首先要选择稳定的美股l2接口&#xff0c;因为在进行股票行情分析的时候对于其数据的真实性和准确性都有很高的要求。不靠谱的数据平台容易造成数据传输卡顿&#xff0c;或数据获取不准确的情况&#xff0c;轻则影响企业运作&#xff0c;重…

SpringSecurity[6]-Thymeleaf中Spring Security的使用/退出登录/Spring Security中CSRF

上一篇:SpringSecurity[5]-基于表达式的访问控制/基于注解的访问控制/Remember Me功能实现 链接:SpringSecurity[4]-访问控制url匹配/内置访问控制方法介绍/角色权限判断_豆虫儿的博客-CSDN博客 十一、基于表达式的访问控制 十四、Thymeleaf中Spring Security的使用 Spring…

java计算机毕业设计基于安卓Android的校园财务流水系统APP

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

Unity脚本基础

【重点面试题】1、Unity3D中的协程&#xff08;coroutine&#xff09;&#xff0c;C#线程和进程之间的区别是什么&#xff1f; 简记&#xff1a;协程和线程区别 协程(协同程序Coroutine): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。 Un…

workerman+TP6实战网站客服系统之项目初始化

TP6 官方手册: 安装 ThinkPHP6.0完全开发手册 看云 安装TP6: composer create-project topthink/think tp6 报错: 解决问题: PHP默认把这个 proc_open 函数禁用了,取消禁用即可 取消禁用函数流程参考之前一篇文章 php workerman入门之运行起来_山山河川的博客-CSDN博…