前端小白别慌:用HTML+CSS搞定小球抛物线动画(附避坑指南)

在这里插入图片描述

前端小白别慌:用HTML+CSS搞定小球抛物线动画(附避坑指南)

这玩意儿真能只用CSS做?

说实话,我一开始听到"用CSS做抛物线动画"这个说法的时候,第一反应是:兄弟你是不是昨晚加班加糊涂了?抛物线诶,那是物理引擎干的事儿,是Canvas里写公式算轨迹的活儿,你让我用CSS那个只会左右摇摆、上下浮动的小可怜来实现?这合理吗?

但人吧,就是不能被固有认知限制住。前阵子接了个需求,产品经理说要个小球从屏幕左边扔到右边的动画效果,还要带那种真实的重力感。我下意识就想上GSAP或者写个requestAnimationFrame逐帧算。但回头一想,就这么个小破需求,我要是引入一整个动画库,包体积直接膨胀几十KB,绩效评审的时候老大问起来,我说"为了扔个球"?这不找骂吗。

于是我就硬着头皮研究了一下,结果发现:CSS这老伙计藏得挺深啊。它确实能扔球,而且扔得还挺像那么回事。今天咱们就把这层窗户纸捅破,看看怎么用纯CSS(顶多加点JS控制播放)整出像样的抛物线效果。全程干货,坑我都替你们踩过了,放心食用。

先别急着上JS,咱先唠点实在的

我知道很多人一看到动画需求,条件反射就是写JS。setIntervalrequestAnimationFrame、算坐标、更新样式……这一套流程熟得跟自己家似的。但有个残酷的现实你们得面对:JS实现的动画,在主线程忙的时候很容易掉帧。特别是那些低端安卓机,后台再跑个微信,你的小球立马变PPT。

CSS动画的优势在于它跑在合成器线程上,不占用JS主线程。说人话就是:即使你的JS在拼命算数据,CSS该咋动还咋动,丝滑得很。而且浏览器对CSS动画的优化做了很多年,硬件加速什么的都是基操。

但问题是,CSS天生是个"直来直去"的家伙。translateX就是从A到B直线运动,translateY同理。抛物线可是曲线啊,X轴匀速走,Y轴加速下落,这俩还得同时发生,CSS咋整?

别急,咱们先把CSS动画的底裤扒开看看。

技术底裤扒一扒:CSS动画到底能干啥

很多人觉得CSS动画就是@keyframes里写几个from to,顶多加个rotate转个圈。那你们可真是小瞧它了。CSS动画的核心其实是组合叠加

先来个最基础的,看看animationtransform这对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属性,如果同时写translateXtranslateY,浏览器会把它当成一个整体的2D变换矩阵来处理。你感觉像是往右往下同时走,实际上人家走的是对角线。

这时候就得请出我们的秘密武器了:不同的timing-function(时间函数)

贝塞尔曲线timing-function不只是调速那么简单

平时我们用easeease-inease-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这个属性,你分开写translateXtranslateY,浏览器最终还是会合并计算。

所以正确的姿势是:利用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;
}

看起来没毛病对吧?但如果moveXmoveY的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默认页面加载完就开始。

解决办法:

  1. 用animation-play-state: paused先暂停,再用JS控制
  2. 或者直接不写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

这条铁律我都说了八百遍了,但还是要强调。lefttopwidthheightmargin这些属性,一变就会触发重排(reflow),浏览器要重新计算整个页面的布局。transformopacity只触发**重绘(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-changetransform: 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等工具

吾辈才疏学浅,摹写之作,恐有瑕疵。望诸君海涵赐教。望轻喷,嘤嘤嘤

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。愿斯文对汝有所裨益,纵其简陋未及渊博,亦足以略尽绵薄之力。倘若尚存阙漏,敬请不吝斧正,俾便精进!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DTcode7

客官,赏个铜板吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值