html仿百度贴吧,利用Canvas模仿百度贴吧客户端loading小球的方法示例

前言

最近看到两个好玩的 demo,效果图如下:

40a9583a1a56e729bfe99a322429e171.gif

30eda5cb2d23c34842ee8969df2987d0.gif

今天趁着周末有空,用 H5 的 Canvas 仿了一下。这篇文章只实现第一个效果图。

这是我实现的效果:

b4eb6d64361cdfdb71a1ba8e2958b9f3.gif

实现原理

实现原理是参考简书的那篇文章,这里不再复述。现在我们来一步一步实现这样的效果。

第零步:画一个圆

源码如下:

运行效果如下:

百度贴吧客户端Loading小球

canvas {

border: 1px solid #ccc;

}

var canvas = document.getElementById('canvas')

var ctx = canvas.getContext('2d')

canvas.width = 500

canvas.height = 500

var grid = canvas.width / 4

var cx = canvas.width / 2 // 圆中心点 x 坐标

var cy = canvas.height / 2 // 圆中心点 y 坐标

function circle() {

ctx.beginPath()

ctx.arc(cx, cy, grid / 2, 0, 2 * Math.PI)

}

circle()

ctx.stroke()

19cba9227fffd67c744330b6e31558d4.png

这个 demo 只涉及 Canvas 最简单的用法。

第一步:绘制蓝色的“贴”字

使用 ctx.fillText,在圆的中心绘制一个蓝色的“帖”字。文字粗体、水平居中。

代码如下:

function text(fillStyle) {

var fontSize = size / 250 * 120

ctx.font = 'bold ' + fontSize + 'px Arial'

ctx.textAlign = 'center'

ctx.fillStyle = fillStyle

ctx.fillText('贴', cx, cy + fontSize * 0.3)

}

text('#29a3fe')

效果如下:

7f148bf4e56b0c9672e2aa65a19e89f7.png

第二步:绘制蓝色的波浪

var waveSize = size / 6 // 波浪大小

var x = 0 // 波浪位置偏移大小

function curve() {

ctx.beginPath()

ctx.moveTo(cx - size + x + size / 2, cy)

ctx.quadraticCurveTo(cx - size + size / 4 + x + size / 2, cy - waveSize, cx - size + size / 2 + x + size / 2, cy)

ctx.quadraticCurveTo(cx - size + size * 3 / 4 + x + size / 2, cy + waveSize, cx - size + size + x + size / 2, cy)

ctx.quadraticCurveTo(cx + size / 4 + x + size / 2, cy - waveSize, cx + size / 2 + x + size / 2, cy)

ctx.quadraticCurveTo(cx + size * 3 / 4 + x + size / 2, cy + waveSize, cx + size + x + size / 2, cy)

ctx.lineTo(cx + size + x + size / 2, canvas.height)

ctx.lineTo(cx - size + x + size / 2, canvas.height)

ctx.lineTo(cx - size + x + size / 2, cy)

ctx.closePath()

}

ctx.fillStyle = '#29a3fe'

curve()

ctx.fill()

效果如下:

b9b71527a841fe1de39a1dbe0e1597fb.png

第三步:绘制白色的“贴”字

curve()

ctx.clip()

text('#f00')

第一句代码 curve() 创建了一个波浪形状的路径,和第三步不同的是,这里并没有使用 ctx.fill() 填充路径,而是使用了 ctx.clip() 裁剪路径,这样的话,后面绘制的路径(包括文字)只有在剪裁区域内才能显示。

为了和背景色区分开来,我把“贴”字改成红色。

效果如下:

cb35375e18d74b798cc3bb782e28147a.png

第四步:绘制运动的波浪

function loop(){

ctx.clearRect(0, 0, canvas.width, canvas.height)

x -= 1.5

x = x % size

ctx.save()

circle()

ctx.stroke()

ctx.fillStyle = '#29a3fe'

curve()

ctx.fill()

ctx.restore()

requestAnimationFrame(loop)

}

loop()

效果如下:

7a3a8e3f384626474c2952dd0a28c745.gif

第五步:整合前面的内容

效果如下:

53e32d54e338c6c166fde72623dfa476.gif

第六步:剪裁圆形

把第零步的:

circle()

ctx.stroke()

改成:

circle()

ctx.clip()

这样就能把圆形外面的形状剪裁掉,然后就大功告成了。

最后,附上完整源码:

Title

html,

body {

height: 100%;

}

canvas {

border: 1px solid #ccc;

}

var canvas = document.getElementById('canvas')

var ctx = canvas.getContext('2d')

canvas.width = 500

canvas.height = 500

var size = canvas.width / 4 // 圆的大小

var cx = canvas.width / 2 // 圆中心点 x 坐标

var cy = canvas.height / 2 // 圆中心点 y 坐标

var waveSize = size / 6 // 波浪大小

var x = 0 // 波浪位置偏移大小

function circle() {

ctx.beginPath()

ctx.arc(cx, cy, size / 2, 0, 2 * Math.PI)

}

function curve() {

ctx.beginPath()

ctx.moveTo(cx - size + x + size / 2, cy)

ctx.quadraticCurveTo(cx - size + size / 4 + x + size / 2, cy - waveSize, cx - size + size / 2 + x + size / 2, cy)

ctx.quadraticCurveTo(cx - size + size * 3 / 4 + x + size / 2, cy + waveSize, cx - size + size + x + size / 2, cy)

ctx.quadraticCurveTo(cx + size / 4 + x + size / 2, cy - waveSize, cx + size / 2 + x + size / 2, cy)

ctx.quadraticCurveTo(cx + size * 3 / 4 + x + size / 2, cy + waveSize, cx + size + x + size / 2, cy)

ctx.lineTo(cx + size + x + size / 2, canvas.height)

ctx.lineTo(cx - size + x + size / 2, canvas.height)

ctx.lineTo(cx - size + x + size / 2, cy)

ctx.closePath()

}

function text(fillStyle) {

var fontSize = size / 250 * 120

ctx.font = 'bold ' + fontSize + 'px Arial'

ctx.textAlign = 'center'

ctx.fillStyle = fillStyle

ctx.fillText('贴', cx, cy + fontSize * 0.3)

}

function loop(){

ctx.clearRect(0, 0, canvas.width, canvas.height)

x -= 1.5

x = x % size

ctx.save()

circle()

ctx.clip()

text('#29a3fe')

ctx.fillStyle = '#29a3fe'

curve()

ctx.fill()

curve()

ctx.clip()

text('#fff')

ctx.restore()

requestAnimationFrame(loop)

}

loop()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件介绍 贴吧123(tieba123仿百度贴吧)可以快速建立单贴吧/多贴吧的高效率高可控性轻量级简洁讨论区,推荐用在学校、地区、行业等网站,也可以用本程序建立大型综合性讨论区,同样高效高负载。 注意:因为采用了application做缓存,所以在服务器进程回收的时候偶尔会显示出错信息,刷新一下就好了,如果网站有访问量的话,仅在每天第一次访问的时候会出现这个问题。 贴吧123(tieba123仿百度贴吧) 20120308 更新列表 3.52版 首页进行改版 使用了部分缓存 优化各个页面,打开速度均有提高 页面显示时内容先显示,广告推迟显示 增加了只看楼主功能 增加了qq登陆功能 进行了大数据量环境下的测试 修改了编辑器 去掉了图片防盗部分的代码 修改了sql查询,去掉了影响效率的数据汇总部分 贴吧加入会员的功能进行了调整 新建贴吧增加了权限的控制 手机也可以新建贴吧 贴吧123(tieba123仿百度贴吧)特点: 电脑和手机都能自由访问,手机版也可管理帖子 单贴吧、多贴吧自由切换,可以先建立单贴吧,等时机成熟再改成多贴吧,后台控制 尽量模仿现有的成熟贴吧程序,符合人们的使用习惯 高效率,同时支持access/mssql数据库,可自由转换 多广告位,可以随贴设置广告,也可以设置全站广告,手机版也有相应广告位 在国外主机上表现良好,兼容性强 用户名和密码均为admin 管理地址为 http://xxxx.com/admin
用户名,Email地址,昵称 ajax无刷新验证是否已注册 非空验证 用户名验证:由英文字母和数字组成的4-16位字符,以字母开头! 邮箱验证:Email格式不正确,例如web@sohu.com 昵称验证:由汉字组成的2-8位字符! 密码验证:密码不能含有非法字符,长度在4-10之间 再次输入密码验证:两次输入密码不一致! 注册成功后用户直接保存在session里进入登录页面 搜索框实现智能联想(根据关键字联想贴吧名搜索) 登录成功用户保存在session中显示用户昵称 登录失败显示(登录失败!请重新) 注销可以销毁session中的用户对象 横条广告用flash制作替换效果 个人中心显示用户头像及昵称 奇吧朵朵展示留个贴吧信息(滚动文字) 最新话题展示最新发帖标题并可点击进入 常逛贴吧由用户登录后显示 贴吧分类显示不同类型贴吧鼠标移动上去展示贴吧名 热帖分类展示四个贴吧四条回复 热帖排行榜显示回复最多三个帖子 顶部展示贴吧名称,会员数,帖子数,以及帖吧简介 帖子显示回复次数,标题,内容25字符发帖昵称以及发帖时间 签到按钮可以判断是否登录,签到成功次数加一,提示以签到 显示用户头像和昵称 恢复按钮AJAX判断是否登录,登录后方可发帖 右侧游戏动态加载 翻页可实现看第一页,向前和向后翻页 顶部显示广告,帖子标题 只看楼主可实现只看楼主发表内容,取消只看楼主查看全部回复 显示回复用户头像和昵称,回复内容签名档,楼层,发表时间 关注AJAX判断用户是否已登录,关注成功次数加一,已关注提示 鼠标移动到用户头像可查看用户信息 实现翻页功能 回复条数,返回当前贴吧 回复按钮AJAX判断是否已登录,登陆后方可发帖 我的帖子显示吧名,标题,回复次数,发帖时间,删除提示,删除失败提示 我关注的帖吧显示把名,标题,回复次数,发帖时间,删除提示,删除失败提示
注意:因为采用了application做缓存,所以在服务器进程回收的时候偶尔会显示出错信息,刷新一下就好了,如果网站有访问量的话,仅在每天第一次访问的时候会出现这个问题。 用本程序,您可以快速建立单贴吧/多贴吧的高效率高可控性轻量级简洁讨论区,推荐用在学校、地区、行业等网站,也可以用本程序建立大型综合性讨论区,同样高效高负载。 特点: 电脑和手机都能自由访问,手机版也可管理帖子 单贴吧、多贴吧自由切换,可以先建立单贴吧,等时机成熟再改成多贴吧,后台控制 尽量模仿现有的成熟贴吧程序,符合人们的使用习惯 高效率,同时支持access/mssql数据库,可自由转换 多广告位,可以随贴设置广告,也可以设置全站广告,手机版也有相应广告位 在国外主机上表现良好,兼容性强 3.3-3.5升级指南 (网站包含四千条数据,用来测试,您可以直接在tieba123_topic_disp表中删除所有信息来清空数据) -----------utf-8版本更新资料-------- 调整了部分页面,效率进一步提高 修改了ubb编辑器 修复了feed部分的页面 修复了众多细节问题 修改了样式表文件 修改了单贴吧模式的界面 修改了申请吧主自动通过方式 增加了vip会员功能 增加了会员动态功能 增加了管理员后台记录 增加了ET采集器接口(需收费)可结合采集器采集任意网站内容(包括百度贴吧) 增加了其他一些功能 可以直接修改bar.asp和post.asp(topic.asp)的名字,避免同质化,方便收录 ----------------第三版更新记录-------------- 开发出功能完善的手机版,并且拥有全部的管理功能,可以手机管理帖子 系统设置使用缓存,减少数据库读取次数,有效提高了速度 后台管理进行了优化,能够批量删除主题和回复 后台广告管理进行了分离,更方便设置广告 添加了wap访问页面随贴广告 修正其他一些问题 ----------------第二版更新记录-------------- 解决了由于容错代码所掩盖的系统错误,修改三十多个文件,速度和效率上有了质的提高。 解决了不能建吧的错误 帖子列表和帖子浏览页面用div进行了小范围的调整,右侧的广告已经不能影响速度 在速度上有了进一步的提高 去掉了前台操作的弹出对话框提示 增加了利用404错误页面进行跳转的功能(在国外主机上受限) 修复了后台管理中批量删除隐藏帖子的错误 修复了后台因为权限设置导致的漏洞 修改了js调用 解决了前台管理员编辑帖子不能自动保留的问题 解决了英文字符造成内容页撑开的问题 解决了在二级目录下出现的不能访问数据库的问题 解决了后台分类添加出现的错误 解决了js调用文件出现“缺少十六进制”的错误提示 贴吧排行和最新帖子去掉了分页 修改了后台贴吧分类管理 (重要) 增加了后台帖子搜索 修复了编辑帖子的错误 修复了表情显示的问题,在非ubb状态下,依然能正常使用表情 -------------   功能   -------------------- 本站程序来源于琪琪贴吧3.5sp2(感谢),在原有功能基础上,在人性化管理和设置的方面,增加了不少功能,修改了不少细节。 1 只有管理人员才能看到管理项目,前台不能删除帖子,只能屏蔽,保证信息不会损失。 2 增加了对国外服务器的支持,不再出现乱码。 3 显示时间使用统一的格式,不再受服务器影响。 4 修改了原来的登录和退出弹出新窗口的问题。 5 增加新帖审核功能,开启后所有内容不审核不能显示,吧主和管理员可以审核帖子。 6 重新调整后台,增加了一些细节设置的项目,同时调整了后台显示的结构。 7 调整了验证码设置 8 增加多个广告位,如顶部,顶部右侧,底部,列表右侧,帖子上部和右侧,同时随贴也有广告位 9 增加了“单帖吧版”,可以通过简单设置,做成留言本形式 10 增加了“同名跳转”功能,可以设置贴吧跳转到同名的贴吧 11 改进了举报功能,可以举报帖子和贴吧 12 前台管理功能增强了,模仿知名贴吧系统对吧主管理操作进行了改进 13 前台界面进行了调整,避免了帖子列表和内容页出现卡死现象 14 调整了会员状态条位置 15 重新进行了安全检测和修改 16 增加了帖子列表和内容页右侧的边栏,可以放广告或其他内容 17 去掉了专门的贴图和帮助部分,用单独的帖子来代替 18 调整了帖子的浏览方式,加快了显示速度 19 增加了ctul enter发布帖子 20 修改了一些不合适的文件名 21 改变了密码的加密方式,相对安全一点,还有调整的余地 22 修改了编辑器 23 修复了一些细节方面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值