位置: IT常识 - 正文

5个前端练手项目(html css js canvas)(哪里能找到前端练手项目教程)

编辑:rootadmin
5个前端练手项目(html css js canvas)

推荐整理分享5个前端练手项目(html css js canvas)(哪里能找到前端练手项目教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:5个前端练手项目是什么,前端高手,5个前端练手项是什么,适合前端初学者的练手项目,适合前端初学者的练手项目,前端练手项目,适合前端初学者的练手项目,5个前端练手项是什么,内容如对您有帮助,希望把文章链接给更多的朋友!

 前言:

首先祝大家端午节快乐。本篇文章有5个练手项目 对于刚学完前端三剑客的你们。应该是一个很好的实践

目录

🥩.跑马灯

1.1效果图:

1.2思路解析

1.3源码

🍧.彩虹爱心

2.1效果图

2.2思路解析

2.3源码

🌮.闹钟

3.1效果图

3.2思路解析

3.3源码

🍲.自制笔记本

4.1效果展示

4.2思路解析

4.3源码

🍣.自定义写字台(也可自定义字的样式)

5.1效果展示

 5.2思路解析

5.3源码


1.跑马灯1.1效果图:

1.2思路解析

在这个项目中,在html中创立20个span标签

每个span标签设置style为--i:数字的样式用于

在css中动态分配圆圈分几份,transform: rotate(calc(18deg*var(--i)))

利用filter属性结合关键帧动态切换颜色。同时设置每一个span标签进行

旋转

1.3源码<style>* {padding: 0;margin: 0;box-sizing: border-box;}main{display: flex; background-color: #2c3a47;/*用于设置图像居中 */align-items: center;justify-content: center;width: 1920px;height: 1000px;animation: animate1 10s linear infinite;}/* 用于设置动画属性 其中filter用于做利镜其中的hue-rotate属性让图像运用色相旋转*/@keyframes animate1 {0% {filter: hue-rotate(0deg);}100% {filter: hue-rotate(360deg);}}main .cube {position: relative;height: 120px;width: 120px; }main .cube span {position: absolute;top: 0;left: 0;width: 100%;height: 100%;/* 用于设置一个圆圈被分成几份 */transform: rotate(calc(18deg*var(--i)));}/* :before用于设置在给定的属性之前添加效果 */main .cube span::before {content: '';position: absolute;top: 0;left: 0;width: 15px;height: 15px;border-radius: 50%;background-color: aqua;box-shadow: 0 0 10px aqua ,0 0 20px aqua,0 0 40px aqua,0 0 80px aqua,0 0 100px aqua;animation: animate 2s linear infinite;animation-delay: calc(0.1s*var(--i));}@keyframes animate {0% {transform: scale(1);}80%,100% { transform: scale(0);}}.loading{color:#fff;font-size: 20px;position: relative;top:100px;right:100px; }@media (min-width:765px){ }</style></head><body><main><div class="cube"><span style="--i:1;"></span><span style="--i:2;"></span> <span style="--i:3;"></span><span style="--i:4;"></span><span style="--i:5;"></span><span style="--i:6;"></span><span style="--i:7;"></span><span style="--i:8;"></span><span style="--i:9;"></span><span style="--i:10;"></span><span style="--i:11;"></span><span style="--i:12;"></span><span style="--i:13;"></span><span style="--i:14;"></span><span style="--i:15;"></span><span style="--i:16;"></span><span style="--i:17;"></span><span style="--i:18;"></span><span style="--i:19;"></span><span style="--i:20;"></span></div><div class="loading"> <p>loading</p></div></main></body>2.彩虹爱心2.1效果图

2.2思路解析

搭建基本的html结构,采用的svg技术,

通过js动态改变颜色,以及动态实现切换图形

2.3源码<svg id="hearts" viewBox="-600 -400 1200 800" preserveAspectRatio="xMidYMid slice"><defs><symbol id="heart" viewBox="-69 -16 138 138"><path d="M0,12 C 50,-30 110,50 0,120 C-110,50 -50,-30 0,12z"/></symbol></defs></svg>const colors = ["#e03776","#8f3e98","#4687bf","#3bab6f","#f9c25e","#f47274"];const SVG_NS = 'http://www.w3.org/2000/svg';const SVG_XLINK = "http://www.w3.org/1999/xlink";let heartsRy = []function useTheHeart(n){ let use = document.createElementNS(SVG_NS, 'use'); use.n = n; use.setAttributeNS(SVG_XLINK, 'xlink:href', '#heart'); use.setAttributeNS(null, 'transform', `scale(${use.n})`); use.setAttributeNS(null, 'fill', colors[n%colors.length]); use.setAttributeNS(null, 'x', -69); use.setAttributeNS(null, 'y', -69); use.setAttributeNS(null, 'width', 138); use.setAttributeNS(null, 'height', 138); heartsRy.push(use) hearts.appendChild(use);}for(let n = 18; n >= 0; n--){useTheHeart(n)}function Frame(){ window.requestAnimationFrame(Frame); for(let i = 0; i < heartsRy.length; i++){ if(heartsRy[i].n < 18){heartsRy[i].n +=.01 }else{ heartsRy[i].n = 0; hearts.appendChild(heartsRy[i]) } heartsRy[i].setAttributeNS(null, 'transform', `scale(${heartsRy[i].n})`); }}Frame()3.闹钟3.1效果图

3.2思路解析

搭建基本的html结构,动态得到实时的时,分,秒

通过Date()函数获得。将得到的数字根据逻辑,绑定

给各div结构,实行动态旋转。点击按钮,改变背景颜色

3.3源码5个前端练手项目(html css js canvas)(哪里能找到前端练手项目教程)

html:

<body> <button class="toggle">Dark mode</button> <div class="clock-container"> <div class="clock"> <div class="needle hour"></div> <div class="needle minute"></div> <div class="needle second"></div> <div class="center-point"></div> </div> <div class="time"></div> <div class="date"></div> </div></body>

css:

@import url('https://fonts.googleapis.com/css?family=Heebo:300&display=swap');* { box-sizing: border-box;}:root { --primary-color: #000; --secondary-color: #fff;}html { transition: all 0.5s ease-in;}html.dark { --primary-color: #fff; --secondary-color: #333;}html.dark { background-color: #111; color: var(--primary-color);}body { font-family: 'Heebo', sans-serif; display: flex; align-items: center; justify-content: center; height: 100vh; overflow: hidden; margin: 0;}.toggle { cursor: pointer; background-color: var(--primary-color); color: var(--secondary-color); border: 0; border-radius: 4px; padding: 8px 12px; position: absolute; top: 100px;}.toggle:focus { outline: none;}.clock-container { display: flex; flex-direction: column; justify-content: space-between; align-items: center;}.clock { position: relative; width: 200px; height: 200px;}.needle { background-color: var(--primary-color); position: absolute; top: 50%; left: 50%; height: 65px; width: 3px; transform-origin: bottom center; transition: all 0.5s ease-in;}.needle.hour { transform: translate(-50%, -100%) rotate(0deg);}.needle.minute { transform: translate(-50%, -100%) rotate(0deg); height: 100px;}.needle.second { transform: translate(-50%, -100%) rotate(0deg); height: 100px; background-color: #e74c3c;}.center-point { background-color: #e74c3c; width: 10px; height: 10px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); border-radius: 50%;}.center-point::after { content: ''; background-color: var(--primary-color); width: 5px; height: 5px; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); border-radius: 50%;}.time { font-size: 60px;}.date { color: #aaa; font-size: 14px; letter-spacing: 0.3px; text-transform: uppercase;}.date .circle { background-color: var(--primary-color); color: var(--secondary-color); border-radius: 50%; height: 18px; width: 18px; display: inline-flex; align-items: center; justify-content: center; line-height: 18px; transition: all 0.5s ease-in; font-size: 12px;}

js:

const hourEl = document.querySelector('.hour')const minuteEl = document.querySelector('.minute')const secondEl = document.querySelector('.second')const timeEl = document.querySelector('.time')const dateEl = document.querySelector('.date')const toggle = document.querySelector('.toggle')const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];toggle.addEventListener('click', (e) => { const html = document.querySelector('html') if (html.classList.contains('dark')) { html.classList.remove('dark') e.target.innerHTML = 'Dark mode' } else { html.classList.add('dark') e.target.innerHTML = 'Light mode' }})function setTime() { const time = new Date(); const month = time.getMonth() const day = time.getDay() const date = time.getDate() const hours = time.getHours() const hoursForClock = hours >= 13 ? hours % 12 : hours; const minutes = time.getMinutes() const seconds = time.getSeconds() const ampm = hours >= 12 ? 'PM' : 'AM' hourEl.style.transform = `translate(-50%, -100%) rotate(${scale(hoursForClock, 0, 12, 0, 360)}deg)` minuteEl.style.transform = `translate(-50%, -100%) rotate(${scale(minutes, 0, 60, 0, 360)}deg)` secondEl.style.transform = `translate(-50%, -100%) rotate(${scale(seconds, 0, 60, 0, 360)}deg)` timeEl.innerHTML = `${hoursForClock}:${minutes < 10 ? `0${minutes}` : minutes} ${ampm}` dateEl.innerHTML = `${days[day]}, ${months[month]} <span class="circle">${date}</span>`}// StackOverflow https://stackoverflow.com/questions/10756313/javascript-jquery-map-a-range-of-numbers-to-another-range-of-numbersconst scale = (num, in_min, in_max, out_min, out_max) => { return (num - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;}setTime()setInterval(setTime, 1000)4.自制笔记本4.1效果展示

4.2思路解析

通过js实现动态添加DOM结构,绑定创建出DOM结构的

添加,删除按钮。实现监听事件。实现动态改变DOM结构

其他的就是设置css的相关属性,

4.3源码

html:

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" integrity="sha512-1PKOgIY59xJ8Co8+NE6FZ+LOAZKjy+KY8iq0G4B3CyeY6wYHN3yt9PW0XpSriVlkMXe40PTKnXrLnZ9+fkDaog==" crossorigin="anonymous" /> </head> <body> <button class="add" id="add"> <i class="fas fa-plus"></i> Add note </button> <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/1.2.2/marked.min.js"></script> </body>

 css:

@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;400&display=swap');* { box-sizing: border-box; outline: none;}body { background-color: #7bdaf3; font-family: 'Poppins', sans-serif; display: flex; flex-wrap: wrap; margin: 0; padding-top: 3rem;}.add { position: fixed; top: 1rem; right: 1rem; background-color: #9ec862; color: #fff; border: none; border-radius: 3px; padding: 0.5rem 1rem; cursor: pointer;}.add:active { transform: scale(0.98);}.note { background-color: #fff; box-shadow: 0 0 10px 4px rgba(0, 0, 0, 0.1); margin: 30px 20px; height: 400px; width: 400px; overflow-y: scroll;}.note .tools { background-color: #9ec862; display: flex; justify-content: flex-end; padding: 0.5rem;}.note .tools button { background-color: transparent; border: none; color: #fff; cursor: pointer; font-size: 1rem; margin-left: 0.5rem;}.note textarea { outline: none; font-family: inherit; font-size: 1.2rem; border: none; height: 400px; width: 100%; padding: 20px;}.main { padding: 20px;}.hidden { display: none;}

js:

const addBtn = document.getElementById('add')const notes = JSON.parse(localStorage.getItem('notes'))if(notes) { notes.forEach(note => addNewNote(note))}addBtn.addEventListener('click', () => addNewNote())function addNewNote(text = '') { const note = document.createElement('div') note.classList.add('note') note.innerHTML = ` <div class="tools"> <button class="edit"><i class="fas fa-edit"></i></button> <button class="delete"><i class="fas fa-trash-alt"></i></button> </div> <div class="main ${text ? "" : "hidden"}"></div> <textarea class="${text ? "hidden" : ""}"></textarea> ` const editBtn = note.querySelector('.edit') const deleteBtn = note.querySelector('.delete') const main = note.querySelector('.main') const textArea = note.querySelector('textarea') textArea.value = text main.innerHTML = marked(text) deleteBtn.addEventListener('click', () => { note.remove() updateLS() }) editBtn.addEventListener('click', () => { main.classList.toggle('hidden') textArea.classList.toggle('hidden') }) textArea.addEventListener('input', (e) => { const { value } = e.target main.innerHTML = marked(value) updateLS() }) document.body.appendChild(note)}function updateLS() { const notesText = document.querySelectorAll('textarea') const notes = [] notesText.forEach(note => notes.push(note.value)) localStorage.setItem('notes', JSON.stringify(notes))}5.自定义写字台(也可自定义字的样式)5.1效果展示

 5.2思路解析

搭建html结构,创建canvas标签,

绑定设置的结构比如+,-,颜色改变

动态设置并获取他的值,然后将这些值动态的

设置为canvas语法中设置渲染的宽度,以及设置

颜色的属性

5.3源码

html:

<canvas id="canvas" width="800" height="700"></canvas> <div class="toolbox"><button id="decrease">-</button> <span id="size">10</span> <button id="increase">+</button> <input type="color" id="color"> <button id="clear">X</button></div>

css:

@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap');* { box-sizing: border-box;}body { background-color: #f5f5f5; font-family: 'Roboto', sans-serif; display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; margin: 0;}canvas { border: 2px solid steelblue;}.toolbox { background-color: steelblue; border: 1px solid slateblue; display: flex; width: 804px; padding: 1rem;}.toolbox > * { background-color: #fff; border: none; display: inline-flex; align-items: center; justify-content: center; font-size: 2rem; height: 50px; width: 50px; margin: 0.25rem; padding: 0.25rem; cursor: pointer;}.toolbox > *:last-child { margin-left: auto;}

js:

const canvas = document.getElementById('canvas');const increaseBtn = document.getElementById('increase');const decreaseBtn = document.getElementById('decrease');const sizeEL = document.getElementById('size');const colorEl = document.getElementById('color');const clearEl = document.getElementById('clear');const ctx = canvas.getContext('2d');let size = 10let isPressed = falsecolorEl.value = 'black'let color = colorEl.valuelet xlet ycanvas.addEventListener('mousedown', (e) => { isPressed = true x = e.offsetX y = e.offsetY})document.addEventListener('mouseup', (e) => { isPressed = false x = undefined y = undefined})canvas.addEventListener('mousemove', (e) => { if(isPressed) { const x2 = e.offsetX const y2 = e.offsetY drawCircle(x2, y2) drawLine(x, y, x2, y2) x = x2 y = y2 }})function drawCircle(x, y) { ctx.beginPath(); ctx.arc(x, y, size, 0, Math.PI * 2) ctx.fillStyle = color ctx.fill()}function drawLine(x1, y1, x2, y2) { ctx.beginPath() ctx.moveTo(x1, y1) ctx.lineTo(x2, y2) ctx.strokeStyle = color ctx.lineWidth = size * 2 ctx.stroke()}function updateSizeOnScreen() { sizeEL.innerText = size}increaseBtn.addEventListener('click', () => { size += 5 if(size > 50) { size = 50 } updateSizeOnScreen()})decreaseBtn.addEventListener('click', () => { size -= 5 if(size < 5) { size = 5 } updateSizeOnScreen()})colorEl.addEventListener('change', (e) => color = e.target.value)clearEl.addEventListener('click', () => ctx.clearRect(0,0, canvas.width, canvas.height))

✍在最后,如果觉得博主写的还行,期待🍟点赞  🍬评论 🍪收藏

本文链接地址:https://www.jiuchutong.com/zhishi/299974.html 转载请保留说明!

上一篇:防抖和节流有什么区别?(节流和防抖js)

下一篇:Redis 被问麻了...(redis常见问题解决)

  • 微信怎么群发消息(微信怎么群发消息给指定群)

    微信怎么群发消息(微信怎么群发消息给指定群)

  • 如何在家注销手机卡(如何在家注销手机卡号)

    如何在家注销手机卡(如何在家注销手机卡号)

  • iphone11三个版本的区别(iphone 11各个版本区别)

    iphone11三个版本的区别(iphone 11各个版本区别)

  • 拼多多中订阅物流状态是什么意思(拼多多订阅物流收费吗)

    拼多多中订阅物流状态是什么意思(拼多多订阅物流收费吗)

  • 微信互删 头像是否更新(微信互删头像变灰)

    微信互删 头像是否更新(微信互删头像变灰)

  • 苹果手机什么时候买的,怎么查看(苹果手机什么时候换电池最合适)

    苹果手机什么时候买的,怎么查看(苹果手机什么时候换电池最合适)

  • b站能同时登录几个

    b站能同时登录几个

  • 华为图案锁怎么设置(华为手机怎么图案上锁)

    华为图案锁怎么设置(华为手机怎么图案上锁)

  • 4g流量突然很卡是为什么(4g流量突然很卡怎么办)

    4g流量突然很卡是为什么(4g流量突然很卡怎么办)

  • 怎么设置闹钟铃声为自己喜欢的音乐(怎么设置闹钟铃声在耳机里)

    怎么设置闹钟铃声为自己喜欢的音乐(怎么设置闹钟铃声在耳机里)

  • 邮件超过多久不能撤回(邮件多少天不收会退回去)

    邮件超过多久不能撤回(邮件多少天不收会退回去)

  • 戴尔380主机能换哪种主板(戴尔380主机能换吗)

    戴尔380主机能换哪种主板(戴尔380主机能换吗)

  • cpu不兼容怎么处理(cpu不兼容win10)

    cpu不兼容怎么处理(cpu不兼容win10)

  • hiview是什么软件(hiview是什么程序)

    hiview是什么软件(hiview是什么程序)

  • 华为路由A2搭载什么处理器(华为路由a2搭载路由器)

    华为路由A2搭载什么处理器(华为路由a2搭载路由器)

  • 抖音怎样评论带图(抖音怎么评论有意思)

    抖音怎样评论带图(抖音怎么评论有意思)

  • 华为荣耀7x能装几个卡(华为荣耀7x能装电信卡吗)

    华为荣耀7x能装几个卡(华为荣耀7x能装电信卡吗)

  • 小米一键换机微信怎么恢复(小米一键换机微信记录在哪里恢复)

    小米一键换机微信怎么恢复(小米一键换机微信记录在哪里恢复)

  • 小米8青春版截屏的快捷键是什么(小米青春版截图快捷键)

    小米8青春版截屏的快捷键是什么(小米青春版截图快捷键)

  • 系统蓝屏怎么修复(系统蓝屏原因分析)

    系统蓝屏怎么修复(系统蓝屏原因分析)

  • qq名片漂浮物怎么设置(手机qq名片漂浮物在哪设置)

    qq名片漂浮物怎么设置(手机qq名片漂浮物在哪设置)

  • 闲鱼会员名怎么改(闲鱼会员名怎么和淘宝不一样)

    闲鱼会员名怎么改(闲鱼会员名怎么和淘宝不一样)

  • 小米8原装充电器多少w(小米8原装充电线是多少A的)

    小米8原装充电器多少w(小米8原装充电线是多少A的)

  • 小米8如何投屏到电视(小米8如何投屏到小米平板5)

    小米8如何投屏到电视(小米8如何投屏到小米平板5)

  • 电脑屏幕贴膜(电脑屏幕贴膜有气泡怎么办)

    电脑屏幕贴膜(电脑屏幕贴膜有气泡怎么办)

  • 海关进口啥意思
  • 运输发票抵扣联丢了
  • 管理费用中的税金包括哪些
  • 收据盖发票专用章后果
  • 无票收入也需要开票吗
  • 单位购买理财产品需要什么手续
  • 以前年度多缴的税款退回现金流量
  • 信用评估费用收费标准
  • 公司收入是否应优先支付工资
  • 房地产项目管理三大核心
  • 物业公司哪些费用需要公示
  • 公司成立前购买的设备算个人还是公司
  • 资质招投标
  • 商品买一送一是打五折吗
  • 个人如何缴纳公共维修基金
  • 营改增后工程税收怎么计算
  • 关于一般纳税人提供非学历教育服务适用简易计税
  • 印花税如何进行税种认定
  • 零申报企业所得税
  • 技术咨询合同书
  • 计算机著作权登记证书
  • 基建管理费如何进行结转?
  • 劳务市场零工临时工
  • 公共租赁住房的供应对象不包括
  • 日工资计算的三种方法
  • 企业转让库存股,应按实际收到的金额
  • 销售折让和折扣的风险点
  • 分公司特征表述正确的是
  • 递延收益的会计科目
  • 出租设备收取租金合法吗
  • win10显示所有应用
  • phpshuffle
  • 工程质保金账务处理办法
  • vitem
  • 海狸岛好玩吗
  • vue引用svg矢量图
  • php加密后的代码能运行吗?
  • 前端搭建项目
  • es5和es6的区别
  • 餐饮固定成本怎么算的
  • discuz去除官方论坛
  • golang 调用动态库
  • 现金等价物是指企业持有的
  • 股东之间股权转让需要股东会决议吗
  • 小型微利企业的认定标准2023年
  • 劳务公司需要缴纳社保吗
  • 成本利润率算出的不含税吗
  • 织梦遍历栏目描述
  • 信息技术服务有限公司是干什么的
  • 外贸企业主要做什么
  • 进出口企业需要英文公章吗
  • 财政拨款结余明细科目编码
  • 食用油交税吗
  • 营改增后运输企业税收政策
  • 权益法下公允价值变动计入其他综合收益
  • 递延收益为什么属于负债
  • 外出经营流程
  • 地租钱不付如何为
  • 主营业务成本如何调整
  • 本月取得的发票入账后次月对方能红冲吗
  • mysql导入sql脚本指定编码
  • netdrive mac
  • mac应用图标不见了怎么办
  • fedora s9
  • windows找不到cmd怎么办
  • mac视频预览图不显示
  • 无法打开opencv2
  • win10睡眠唤醒键
  • win8文件夹选项在哪
  • linux系统中限定系统口令的长度
  • dos批处理命令大全
  • js导出excel文件前端插件
  • Extjs4 关于Store的一些操作(加载/回调/添加)
  • unet遥感图像分割
  • nodejs使用es6
  • 安卓手机管家在哪里打开
  • JavaScript的函数定义
  • 河北税务总局发票怎么开
  • 税务稽查项目书的填写
  • 德税手卷烟海淘
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设