
前端小白别慌:用HTML+CSS搞定小球抛物线动画(附避坑指南)
前端小白别慌:用HTML+CSS搞定小球抛物线动画(附避坑指南)
这玩意儿真能只用CSS做?
说实话,我一开始听到"用CSS做抛物线动画"这个说法的时候,第一反应是:兄弟你是不是昨晚加班加糊涂了?抛物线诶,那是物理引擎干的事儿,是Canvas里写公式算轨迹的活儿,你让我用CSS那个只会左右摇摆、上下浮动的小可怜来实现?这合理吗?
但人吧,就是不能被固有认知限制住。前阵子接了个需求,产品经理说要个小球从屏幕左边扔到右边的动画效果,还要带那种真实的重力感。我下意识就想上GSAP或者写个requestAnimationFrame逐帧算。但回头一想,就这么个小破需求,我要是引入一整个动画库,包体积直接膨胀几十KB,绩效评审的时候老大问起来,我说"为了扔个球"?这不找骂吗。
于是我就硬着头皮研究了一下,结果发现:CSS这老伙计藏得挺深啊。它确实能扔球,而且扔得还挺像那么回事。今天咱们就把这层窗户纸捅破,看看怎么用纯CSS(顶多加点JS控制播放)整出像样的抛物线效果。全程干货,坑我都替你们踩过了,放心食用。
先别急着上JS,咱先唠点实在的
我知道很多人一看到动画需求,条件反射就是写JS。setInterval、requestAnimationFrame、算坐标、更新样式……这一套流程熟得跟自己家似的。但有个残酷的现实你们得面对:JS实现的动画,在主线程忙的时候很容易掉帧。特别是那些低端安卓机,后台再跑个微信,你的小球立马变PPT。
CSS动画的优势在于它跑在合成器线程上,不占用JS主线程。说人话就是:即使你的JS在拼命算数据,CSS该咋动还咋动,丝滑得很。而且浏览器对CSS动画的优化做了很多年,硬件加速什么的都是基操。
但问题是,CSS天生是个"直来直去"的家伙。translateX就是从A到B直线运动,translateY同理。抛物线可是曲线啊,X轴匀速走,Y轴加速下落,这俩还得同时发生,CSS咋整?
别急,咱们先把CSS动画的底裤扒开看看。
技术底裤扒一扒:CSS动画到底能干啥
很多人觉得CSS动画就是@keyframes里写几个from to,顶多加个rotate转个圈。那你们可真是小瞧它了。CSS动画的核心其实是组合和叠加。
先来个最基础的,看看animation和transform这对CP到底能玩出啥花样:
.ball {
width: 50px;
height: 50px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 50%;
/* 关键在这里:动画配置 */
animation: throw 2s ease-out forwards;
}
@keyframes throw {
0% {
transform: translateX(0) translateY(0);
}
100% {
transform: translateX(300px) translateY(200px);
}
}
这代码一跑,小球确实动了,但它是斜着走直线,跟抛物线半毛钱关系没有。为啥?因为CSS的transform属性,如果同时写translateX和translateY,浏览器会把它当成一个整体的2D变换矩阵来处理。你感觉像是往右往下同时走,实际上人家走的是对角线。
这时候就得请出我们的秘密武器了:不同的timing-function(时间函数)。
贝塞尔曲线timing-function不只是调速那么简单
平时我们用ease、ease-in、ease-out,可能只是觉得"哦,这个启动快一点"、“那个停下来缓一点”。但在抛物线这个场景里,timing-function是决定成败的关键。
咱们先把运动拆开想:真实的抛物线,水平方向是匀速运动(忽略空气阻力),垂直方向是匀加速运动(重力加速度)。这俩运动是同时发生的,但规律完全不同。
CSS里正好有个骚操作:你可以给同一个元素的不同transform属性,分别设置不同的animation!或者说,用不同的keyframes控制不同的轴,然后给它们配不同的时间函数。
看好了,这是核心思路:
.ball {
width: 40px;
height: 40px;
background: #ff6b6b;
border-radius: 50%;
position: relative;
/* X轴动画:匀速 */
animation: moveX 2s linear forwards;
}
.ball::after {
content: '';
position: absolute;
width: 100%;
height: 100%;
background: inherit;
border-radius: inherit;
/* Y轴动画:加速下落 */
animation: moveY 2s ease-in forwards;
}
@keyframes moveX {
from { transform: translateX(0); }
to { transform: translateX(400px); }
}
@keyframes moveY {
from { transform: translateY(0); }
to { transform: translateY(300px); }
}
等等,你可能会问:这不对啊,Y轴用ease-in是加速吗?没错,ease-in是慢启动快结束,看起来就是加速下落。但这里有个坑:咱们平时说的"重力加速度向下",在网页坐标系里,Y轴是向下增加的,所以ease-in正好模拟了重力加速的效果。
但这个写法有个问题:小球确实走了曲线,但你仔细看会发现,它是沿着一条"匀速向右+加速向下"的路径走,这确实是抛物线没错。不过这种写法用了伪元素::after,有时候会影响你给小球加其他效果,比如阴影啊、光泽啊什么的。
所以还有另一种更野的路子:用单层元素+复合动画。
小球抛物线怎么"画"出来的
刚才说伪元素的方案,其实有点取巧。咱们来点更硬核的,只用一层div,纯靠transform的组合技巧。
原理是这样的:既然transform: translateX(100px) translateY(100px)是走直线,那我能不能先把坐标系转一下,让"直线"变成"曲线"?
还真能。想象一下,如果我把整个坐标系旋转45度,然后沿着X轴移动,再转回来……算了,太绕了。直接上代码:
.parabola-ball {
width: 50px;
height: 50px;
background: radial-gradient(circle at 30% 30%, #4ecdc4, #44a3aa);
border-radius: 50%;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
/* 关键:用rotate配合translate */
animation:
parabolaX 2s linear forwards,
parabolaY 2s ease-in forwards;
}
@keyframes parabolaX {
0% { transform: translateX(0); }
100% { transform: translateX(500px); }
}
@keyframes parabolaY {
0% { transform: translateY(0) scale(1); }
50% { transform: translateY(-100px) scale(0.9); }
100% { transform: translateY(200px) scale(1.1); }
}
哎等等,我上面这个代码其实有点问题。如果你直接这么写,会发现Y轴的动画把X轴的给覆盖了。因为CSS里,同一个属性的多个animation,后面的会覆盖前面的。而且transform这个属性,你分开写translateX和translateY,浏览器最终还是会合并计算。
所以正确的姿势是:利用wrapper(包装器)。外层div管X轴,内层div管Y轴。这样两层独立,互不干扰。
<div class="ball-wrapper">
<div class="ball"></div>
</div>
.ball-wrapper {
animation: moveHorizontal 2s linear forwards;
}
.ball {
width: 60px;
height: 60px;
background: linear-gradient(145deg, #f093fb 0%, #f5576c 100%);
border-radius: 50%;
box-shadow:
0 10px 20px rgba(245, 87, 108, 0.3),
inset 0 -5px 10px rgba(0,0,0,0.1);
animation: moveVertical 2s cubic-bezier(0.55, 0.085, 0.68, 0.53) forwards;
}
@keyframes moveHorizontal {
from { transform: translateX(0); }
to { transform: translateX(600px); }
}
@keyframes moveVertical {
from {
transform: translateY(0) rotate(0deg);
}
50% {
/* 最高点,稍微压扁一点模拟物理效果 */
transform: translateY(-150px) rotate(180deg) scaleY(0.9);
}
to {
transform: translateY(300px) rotate(360deg);
}
}
看到没,这样就把X和Y彻底解耦了。外层只管左右走,匀速;内层只管上下走,先上去再下来,模拟抛射。而且我在Y轴动画里加了rotate,小球一边飞一边转,视觉效果直接拉满。那个cubic-bezier(0.55, 0.085, 0.68, 0.53)是个自定义贝塞尔曲线,比默认的ease-in更有"抛出去"的感觉,你们可以慢慢调这个参数,调出最顺眼的弧度。
两种主流实现思路大PK
说到这儿,我得把市面上常见的几种方案拎出来溜溜,给你们做个对比。省的你们看完文章还得去百度"CSS抛物线哪种方案最好"。
方案A:纯Keyframes硬刚派
这种方案最头铁,直接在keyframes里把所有关键帧都算好,比如每10%一个点,手动调整位置模拟曲线。
.hardcore-ball {
width: 50px;
height: 50px;
background: #667eea;
border-radius: 50%;
animation: manualParabola 3s ease-out forwards;
}
@keyframes manualParabola {
0% { transform: translate(0, 0); }
10% { transform: translate(50px, -45px); }
20% { transform: translate(100px, -80px); }
30% { transform: translate(150px, -105px); }
40% { transform: translate(200px, -120px); }
50% { transform: translate(250px, -125px); } /* 最高点 */
60% { transform: translate(300px, -120px); }
70% { transform: translate(350px, -105px); }
80% { transform: translate(400px, -80px); }
90% { transform: translate(450px, -45px); }
100% { transform: translate(500px, 0); }
}
优点:兼容性最好,所有浏览器都认;不需要额外DOM元素;理解成本最低,一看就懂。
缺点:太死板了!你想改个抛射高度,得重算所有关键帧;代码量爆炸;而且如果帧率不够,看起来就是一卡一卡的点位移,不够丝滑。
方案B:分离轴心流(就是我上面说的wrapper方案)
<div class="trajectory-x">
<div class="trajectory-y">
<div class="the-ball"></div>
</div>
</div>
.trajectory-x {
display: inline-block;
animation: xAxis 2s linear forwards;
}
.trajectory-y {
display: inline-block;
animation: yAxis 2s ease-in forwards;
}
.the-ball {
width: 40px;
height: 40px;
background: #f093fb;
border-radius: 50%;
/* 给小球加点细节 */
position: relative;
overflow: hidden;
}
/* 给小球加个高光,显得立体 */
.the-ball::before {
content: '';
position: absolute;
top: 10%;
left: 15%;
width: 30%;
height: 30%;
background: radial-gradient(circle, rgba(255,255,255,0.8), transparent);
border-radius: 50%;
}
@keyframes xAxis {
from { transform: translateX(0); }
to { transform: translateX(400px); }
}
@keyframes yAxis {
from { transform: translateY(0); }
to { transform: translateY(300px); }
}
优点:逻辑清晰,X是X,Y是Y;改参数方便,调时间函数就能改变轨迹;性能好,浏览器优化到位。
缺点:多了一层DOM(其实也就多一层);有些人(比如有洁癖的代码审查员)会觉得结构不够"语义化"。
方案C:伪元素偷梁换柱
就是我最早展示的那个,用::before或::after承载一个轴的运动。
.tricky-ball {
width: 50px;
height: 50px;
position: relative;
animation: xMove 2s linear forwards;
}
.tricky-ball::after {
content: '';
position: absolute;
width: 100%;
height: 100%;
background: #4ecdc4;
border-radius: 50%;
animation: yMove 2s ease-in forwards;
}
优点:DOM结构最干净,就一个div;实现简单。
缺点:伪元素被动画占用了,你想给小球加个别的高亮或装饰就麻烦了;而且有些浏览器对伪元素动画的支持偶尔抽风(虽然现代浏览器基本没问题)。
我的建议:正经项目用方案B,wrapper那套。虽然多写个div,但维护起来真香。方案C适合那种一次性的小效果,比如按钮里飞出个图标什么的。方案A……除非你要支持IE9,否则别跟自己过不去。
浏览器兼容性那些破事
说到兼容性,我就来气。前面这些代码,你在Chrome里跑,丝般顺滑;在Firefox里跑,也没毛病;但到了Safari……特别是iOS的Safari,有时候就会给你整点幺蛾子。
最明显的问题是:transform的3D加速在Safari里有时候不认账。你可能会发现动画卡卡的,或者结束后小球位置回不到预期的地方。
解决办法也简单,强制开启硬件加速:
.ball-wrapper {
animation: moveHorizontal 2s linear forwards;
/* Safari必备:开启3D加速 */
transform: translateZ(0);
will-change: transform;
}
.ball {
animation: moveVertical 2s ease-in forwards;
transform: translateZ(0);
will-change: transform;
}
看见那两行了吗?transform: translateZ(0)是个黑科技,骗浏览器说"我要做3D变换啦",浏览器一听赶紧上GPU渲染。will-change后面细说,这里先记住,Safari特别吃这一套。
还有个坑是iOS的弹性滚动。如果你的小球是在一个可滚动的容器里做抛物线,iOS那个橡皮筋效果(bounce effect)有时候会干扰动画计算,导致小球飞着飞着突然抖一下。这种情况……建议把容器设成overflow: hidden或者overflow: auto加上-webkit-overflow-scrolling: touch,但后者有时候还是会有问题。最稳妥的办法是让动画区域避开滚动容器,或者等滚动完全停止再触发动画。
安卓那边倒是挺省心,Chrome for Android对CSS动画的支持相当到位。但要注意低端机,如果小球很大(比如100px以上),加上阴影、渐变什么的,可能会掉帧。这时候得权衡视觉效果和性能了。
开发时踩过的雷我都替你炸过了
接下来这一段,全是血泪史。我当初调这个效果的时候,凌晨三点还在对着屏幕骂娘。你们看完能少熬几个夜。
为啥小球飞一半突然抽搐?
这种情况多半发生在用单个元素复合变换的时候。比如你这样写:
/* 错误示范 */
.ball {
animation:
moveX 2s linear forwards,
moveY 2s ease-in forwards;
}
看起来没毛病对吧?但如果moveX和moveY的keyframes里都有transform属性,浏览器解析的时候可能会冲突。特别是当两个动画的duration不完全一样,或者有个delay的时候,计算出来的transform矩阵会乱跳。
解决办法:坚持用wrapper分离,或者确保只有一个axis用transform,另一个用left/top(但后者性能差,不推荐)。
还有个更隐蔽的原因:transform-origin没设对。默认值是center center,但如果你小球之前有别的transform操作,或者父元素有旋转,这个原点计算就会乱。显式声明一下保险:
.ball {
transform-origin: center center;
/* 或者如果你要自定义起点 */
transform-origin: 25px 25px;
}
动画结束后小球回弹到起点?
这是新手最常犯的错。你看着小球完美地飞到了终点,心里正美呢,它突然"嗖"地一下回到原位。当场崩溃。
原因是你没加forwards。CSS动画默认是backwards,就是"执行完回归初始状态"。
/* 错的 */
animation: throw 2s ease-out;
/* 对的 */
animation: throw 2s ease-out forwards;
/* 如果你还要保持最后一帧的状态不消失 */
animation: throw 2s ease-out forwards;
animation-fill-mode: forwards; /* 这行其实跟上面forwards关键字效果一样,写一种就行 */
forwards这玩意就是告诉浏览器:动画完了别动,保持住!没有这个,小球当然得"回家"啊。
动画触发时机不对,页面一加载就飞了
有时候你只是想做个按钮,点击了才扔球,结果页面刷新,球自己飞走了。这是因为animation默认页面加载完就开始。
解决办法:
- 用animation-play-state: paused先暂停,再用JS控制
- 或者直接不写animation,用JS动态添加class
.ball {
animation: throw 2s ease-out forwards;
animation-play-state: paused; /* 先憋着 */
}
.ball.throwing {
animation-play-state: running; /* 扔! */
}
document.getElementById('throwBtn').addEventListener('click', () => {
document.querySelector('.ball').classList.add('throwing');
});
性能优化小技巧,别让老板骂你页面卡
做动画,性能是底线。你效果再酷炫,卡成PPT也是白搭。特别是现在移动端流量占大头,用户手机五花八门,优化必须做在前面。
尽量用transform和opacity
这条铁律我都说了八百遍了,但还是要强调。left、top、width、height、margin这些属性,一变就会触发重排(reflow),浏览器要重新计算整个页面的布局。transform和opacity只触发**重绘(repaint)**甚至直接走合成器,性能差着数量级呢。
/* 千万别这么干 */
@keyframes badIdea {
from { left: 0; top: 0; }
to { left: 500px; top: 300px; }
}
/* 乖乖用transform */
@keyframes goodIdea {
from { transform: translate(0, 0); }
to { transform: translate(500px, 300px); }
}
用will-change提前打招呼
will-change是个好东西,相当于告诉浏览器:“我这元素待会儿要变形啊,你先准备准备”。浏览器收到暗示,会提前把元素提升到GPU层,动画开始时候就不用手忙脚乱地创建了。
.ball-wrapper, .ball {
will-change: transform;
}
但注意:别滥用!你如果在整个页面的所有元素上都加will-change,浏览器内存会被吃光,反而更卡。只在确定要动画的元素上加,而且动画结束后最好移除(虽然现代浏览器会自动处理,但严谨点总没错)。
// 动画结束后清理
ball.addEventListener('animationend', () => {
ball.style.willChange = 'auto';
});
减少重绘区域
如果你的小球下面有复杂的背景,或者有别的元素在动,浏览器每次重绘可能要处理很大一块区域。尽量让小球独立成一个层(layer),这样它动的时候,浏览器只需要重绘它那一小块。
除了will-change,transform: translateZ(0)或者opacity: 0.99(对,接近但不完全透明)也能强制创建新层。但层太多也会消耗内存,适度使用。
想改方向、调高度、换速度?参数化思维安排上
前面我们写的都是固定数值,400px、300px什么的。但实际项目中,你可能需要:扔近一点、扔远一点、抛高一点、甚至从右往左扔。难道每次都去改keyframes?那也太蠢了。
CSS变量(Custom Properties)这时候就派上用场了。咱们把整个动画参数化:
<div class="pitcher" style="--distance: 500px; --height: -200px; --duration: 1.5s;">
<div class="baseball"></div>
</div>
.pitcher {
/* 默认值 */
--distance: 300px;
--height: -150px;
--duration: 2s;
display: inline-block;
animation: xAxis var(--duration) linear forwards;
}
.baseball {
width: 40px;
height: 40px;
background: radial-gradient(circle at 35% 35%, #fff, #ddd);
border-radius: 50%;
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
animation: yAxis var(--duration) ease-in forwards;
}
@keyframes xAxis {
from { transform: translateX(0); }
to { transform: translateX(var(--distance)); }
}
@keyframes yAxis {
from { transform: translateY(0); }
50% { transform: translateY(var(--height)); } /* 最高点 */
to { transform: translateY(0); } /* 落回地面 */
}
/* 甚至方向也能变:从右往左扔 */
.pitcher.left-handed {
animation-name: xAxisReverse;
}
@keyframes xAxisReverse {
from { transform: translateX(0); }
to { transform: translateX(calc(var(--distance) * -1)); }
}
看到了吧?通过在HTML的style属性里改变量,同一个CSS类能表现出完全不同的动画效果。你还可以加上--bounce变量控制弹性,--rotation控制旋转圈数,想怎么玩怎么玩。
这比用JS计算然后写style方便多了,性能也好,因为CSS变量是浏览器原生支持的,不需要JS介入主线程。
配合少量JS控制播放-暂停,体验直接拉满
虽然咱们主打CSS动画,但交互控制还得靠JS。不过别怕,不需要引入TweenMax那种大家伙,原生API就够了。
class BallThrower {
constructor(wrapperSelector) {
this.wrapper = document.querySelector(wrapperSelector);
this.ball = this.wrapper.querySelector('.ball');
this.isThrowing = false;
}
throw() {
if (this.isThrowing) return;
// 先重置
this.reset();
// 强制回流,确保重置生效
void this.wrapper.offsetWidth;
// 开始动画
this.wrapper.classList.add('animating');
this.ball.classList.add('animating');
this.isThrowing = true;
// 监听结束
this.ball.addEventListener('animationend', () => {
this.isThrowing = false;
this.onComplete?.();
}, { once: true });
}
reset() {
this.wrapper.classList.remove('animating');
this.ball.classList.remove('animating');
this.isThrowing = false;
}
// 动态调整参数
setPower(distance, height) {
this.wrapper.style.setProperty('--distance', `${distance}px`);
this.wrapper.style.setProperty('--height`, `${-Math.abs(height)}px`); // 确保是负值(向上)
}
}
// 使用
const thrower = new BallThrower('.pitcher');
thrower.setPower(600, 250);
document.getElementById('throwBtn').addEventListener('click', () => {
thrower.throw();
});
// 甚至可以做个拖拽瞄准的功能
let isDragging = false;
let startX, startY;
document.addEventListener('mousedown', (e) => {
isDragging = true;
startX = e.clientX;
startY = e.clientY;
});
document.addEventListener('mouseup', (e) => {
if (!isDragging) return;
isDragging = false;
const dx = e.clientX - startX;
const dy = startY - e.clientY; // 往上拉是负值,咱们要正值作为高度
// 根据拖拽距离计算抛射力度
thrower.setPower(
Math.min(Math.abs(dx) * 2, 800), // 最大800px
Math.min(dy * 1.5, 400) // 最大高度400px
);
thrower.throw();
});
这段代码演示了怎么用JS控制CSS动画的触发,以及如何通过CSS变量动态调整参数。用户拖拽鼠标,根据拖拽距离决定扔多远、扔多高,体验是不是很游戏化?
而且注意那个void this.wrapper.offsetWidth,这是强制浏览器回流(reflow)的小技巧。如果不这么做,直接remove再add class,浏览器可能会优化掉这个操作,导致动画不重置。
最后唠句实在话:这效果真值得你死磕吗?
写到这儿,我得跟你们掏心窝子说两句。咱们做前端的,经常陷入一种"技术自嗨"的陷阱。比如这个CSS抛物线,是能实现,代码也优雅,但你要想清楚:你的产品真的需要吗?
如果只是个简单的提示图标飞一下,用个现成的库,或者干脆让UI改成淡入淡出,可能更划算。甲方要是只想要个loading圈,你非得给他整物理引擎,那不是能力问题,是沟通问题。
但如果是游戏化的交互、数据可视化的轨迹展示、或者那种需要极致流畅度的H5活动页,那咱们今天聊的这些就值回票价了。特别是那种"看起来很简单但做起来很绕"的效果,一旦用纯CSS搞定了,性能碾压JS方案,那种成就感还是有的。
记住,技术是为产品服务的。CSS动画再炫,也不要滥用。合理评估需求,选择最合适的方案,这才叫专业。别为了秀技术而秀技术,老板和客户要的是结果,不是你的代码有多聪明。
好了,今天就聊到这儿。代码都给你们了,坑也填平了,剩下的就是自己动手试试。有问题欢迎在评论区(哦对,咱们这是文章,没评论区)……有问题就自己console.log调试吧,反正前端都是这么过来的。加油,共勉!
欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
推荐:DTcode7的博客首页。
一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟!
| 专栏系列(点击解锁) | 学习路线(点击解锁) | 知识定位 |
|---|---|---|
| 《微信小程序相关博客》 | 持续更新中~ | 结合微信官方原生框架、uniapp等小程序框架,记录请求、封装、tabbar、UI组件的学习记录和使用技巧等 |
| 《AIGC相关博客》 | 持续更新中~ | AIGC、AI生产力工具的介绍,例如stable diffusion这种的AI绘画工具安装、使用、技巧等总结 |
| 《HTML网站开发相关》 | 《前端基础入门三大核心之html相关博客》 | 前端基础入门三大核心之html板块的内容,入坑前端或者辅助学习的必看知识 |
| 《前端基础入门三大核心之JS相关博客》 | 前端JS是JavaScript语言在网页开发中的应用,负责实现交互效果和动态内容。它与HTML和CSS并称前端三剑客,共同构建用户界面。 通过操作DOM元素、响应事件、发起网络请求等,JS使页面能够响应用户行为,实现数据动态展示和页面流畅跳转,是现代Web开发的核心 | |
| 《前端基础入门三大核心之CSS相关博客》 | 介绍前端开发中遇到的CSS疑问和各种奇妙的CSS语法,同时收集精美的CSS效果代码,用来丰富你的web网页 | |
| 《canvas绘图相关博客》 | Canvas是HTML5中用于绘制图形的元素,通过JavaScript及其提供的绘图API,开发者可以在网页上绘制出各种复杂的图形、动画和图像效果。Canvas提供了高度的灵活性和控制力,使得前端绘图技术更加丰富和多样化 | |
| 《Vue实战相关博客》 | 持续更新中~ | 详细总结了常用UI库elementUI的使用技巧以及Vue的学习之旅 |
| 《python相关博客》 | 持续更新中~ | Python,简洁易学的编程语言,强大到足以应对各种应用场景,是编程新手的理想选择,也是专业人士的得力工具 |
| 《sql数据库相关博客》 | 持续更新中~ | SQL数据库:高效管理数据的利器,学会SQL,轻松驾驭结构化数据,解锁数据分析与挖掘的无限可能 |
| 《算法系列相关博客》 | 持续更新中~ | 算法与数据结构学习总结,通过JS来编写处理复杂有趣的算法问题,提升你的技术思维 |
| 《IT信息技术相关博客》 | 持续更新中~ | 作为信息化人员所需要掌握的底层技术,涉及软件开发、网络建设、系统维护等领域的知识 |
| 《信息化人员基础技能知识相关博客》 | 无论你是开发、产品、实施、经理,只要是从事信息化相关行业的人员,都应该掌握这些信息化的基础知识,可以不精通但是一定要了解,避免日常工作中贻笑大方 | |
| 《信息化技能面试宝典相关博客》 | 涉及信息化相关工作基础知识和面试技巧,提升自我能力与面试通过率,扩展知识面 | |
| 《前端开发习惯与小技巧相关博客》 | 持续更新中~ | 罗列常用的开发工具使用技巧,如 Vscode快捷键操作、Git、CMD、游览器控制台等 |
| 《photoshop相关博客》 | 持续更新中~ | 基础的PS学习记录,含括PPI与DPI、物理像素dp、逻辑像素dip、矢量图和位图以及帧动画等的学习总结 |
| 日常开发&办公&生产【实用工具】分享相关博客》 | 持续更新中~ | 分享介绍各种开发中、工作中、个人生产以及学习上的工具,丰富阅历,给大家提供处理事情的更多角度,学习了解更多的便利工具,如Fiddler抓包、办公快捷键、虚拟机VMware等工具 |
吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

&spm=1001.2101.3001.5002&articleId=157578793&d=1&t=3&u=61d0d15a51be4e79888c36aa7123190d)
2万+

被折叠的 条评论
为什么被折叠?



