利用Js+Css实现折纸动态导航效果实例源码

发布时间 - 2026-01-10 22:47:46    点击率:

先来看看第一种实现方式

效果图如下:

不再采用ul li的布局方式

-webkit-transform-style:preserve-3d只对子元素有作用,所以每个div都加。

实例源码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style>
.wrap{margin:30px auto;width:302px;-webkit-perspective:800px; -webkit-transform-style:preserve-3d; position:relative;}
.wrap div{ position:absolute; top:52px;left:0;-webkit-transform-style:preserve-3d; -webkit-transform-origin:top;}
.wrap span{ display:block;width:300px;border:1px solid #000;height:50px; font:16px/50px "宋体"; background:#ccc;}
</style>
</head>
<body>
<input type="button" value="展开" />
<input type="button" value="收缩" />
<div class="wrap" id="list">
 <span>第一项</span>
 <div>
  <span>第二项</span>
  <div>
   <span>第三项</span>
   <div>
    <span>第四项</span>
    <div>
    <span>第五项</span>
     <div>
      <span>第六项</span>
      <div>
       <span>第七项</span>
      </div>
     </div>
    </div>
   </div>
  </div>
 </div>
</div>
<script>
window.onload=function()
{
 var oList=document.getElementById("list");
 var aDiv=oList.getElementsByTagName("div");
 var aBtn=document.getElementsByTagName("input");
 aBtn[1].onclick=function()
 {
 for(var i=0;i<aDiv.length;i++)
 {
 aDiv[i].style.transition="0.5s "+(aDiv.length-i)*100+"ms";
 aDiv[i].style.WebkitTransform="rotateX(60deg)";
 }
 };
 aBtn[0].onclick=function()
 {
 for(var i=0;i<aDiv.length;i++)
 {
 aDiv[i].style.transition="0.5s "+i*100+"ms";
 aDiv[i].style.WebkitTransform="rotateX(0deg)";
 }
 };
};
</script>
</body>
</html>

第二种实现方式

效果图如下:

这个原先是隐藏的,点击后才展开。

通过关键帧控制每个div的展开状态,当要展开的时候给每个div添加className,但是这个className不是一下子全部添加上去的,而是有延时的,所以用到了定时器。

实例源码

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无标题文档</title>
<style>
@-webkit-keyframes open{
 0%
 {
 -webkit-transform:rotateX(-120deg);
 } 
 40%
 {
 -webkit-transform:rotateX(30deg);
 }
 60%
 {
 -webkit-transform:rotateX(-20deg);
 }
 80%
 {
 -webkit-transform:rotateX(10deg);
 }
 100%
 {
 -webkit-transform:rotateX(0deg);
 }
}
.wrap{margin:30px auto;width:300px;-webkit-perspective:800px;position:relative;}
.wrap h2{ height:50px;background:#F03; text-align:center; font:16px/50px "微软雅黑"; color:#fff; position:relative;z-index:2;}
.wrap div{ position:absolute; top:32px;left:0;-webkit-transform-style:preserve-3d; -webkit-transform-origin:top; -webkit-transform:rotateX(-120deg); transition:.5s;}
.wrap>div{ top:50px;}
.wrap .open{-webkit-animation:open 2s;-webkit-transform:rotateX(0deg);}
.wrap span{ display:block;width:300px;height:30px; font:14px/30px "宋体"; background:#6F3; text-indent:15px; color:#fff; transition:.5s; box-shadow:inset 0 0 30px 20px rgba(0,0,0,1);}
.wrap .open>span{box-shadow:inset 0 0 30px 10px rgba(0,0,0,0);}
.wrap span:hover{ background:#FF0;text-indent:30px;}
</style>
</head>
<body>
<input type="button" value="展开" />
<input type="button" value="收缩" />
<div class="wrap" id="list">
 <h2>标题</h2>
 <div>
  <span>第一项</span>
  <div>
   <span>第二项</span>
   <div>
    <span>第三项</span>
    <div>
     <span>第四项</span>
     <div>
      <span>第五项</span>
      <div>
       <span>第六项</span>
       <div>
        <span>第七项</span>
       </div>
      </div>
     </div>
    </div>
   </div>
  </div>
 </div> 
</div>
<script>
window.onload=function()
{
 var oList=document.getElementById("list");
 var aDiv=oList.getElementsByTagName("div");
 var aBtn=document.getElementsByTagName("input");
 var oTimer=null;
 aBtn[1].onclick=function()
 {
 var i=aDiv.length-1;
 clearInterval(oTimer);
 oTimer=setInterval(function(){
 aDiv[i].className="";
 i--;
 if(i<0)
 {
 clearInterval(oTimer);
 }
 },50); 
 };
 aBtn[0].onclick=function()
 {
 var i=0;
 clearInterval(oTimer);
 oTimer=setInterval(function(){
 aDiv[i].className="open";
 i++;
 if(i==aDiv.length)
 {
 clearInterval(oTimer);
 }
 },200);
 };
};
</script>
</body>
</html>

总结

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


# js如何实现动态导航  # js实现动态导航栏目  # css3  # 3d折纸动画效果  # JS+CSS实现鼠标滑过时动态翻滚的导航条效果  # javascript实现的鼠标悬停时动态翻滚的导航条  # JS实现移动端可折叠导航菜单(现代都市风)  # JS无限级导航菜单实现方法  # vuejs 切换导航条高亮(路由菜单高亮)的方法示例  # js实现水平滚动菜单导航  # 原生JS实现导航下拉菜单效果  # 如何使用wheelnav.js构建酷炫的动态导航菜单  # 宋体  # 无标题文档  # 六项  # 七项  # 第三项  # 第五项  # 第四项  # 是有  # 微软  # 第一项  # 这篇文章  # 后才  # 先来  # 第二种  # 第一种  # 有疑问  # origin  # left  # text  # block 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  如何在IIS管理器中快速创建并配置网站?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何正确选择百度移动适配建站域名?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel怎么调用外部API_Laravel Http Client客户端使用  iOS正则表达式验证手机号、邮箱、身份证号等  Android自定义控件实现温度旋转按钮效果  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Android自定义listview布局实现上拉加载下拉刷新功能  再谈Python中的字符串与字符编码(推荐)  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  如何挑选最适合建站的高性能VPS主机?  西安专业网站制作公司有哪些,陕西省建行官方网站?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  香港服务器WordPress建站指南:SEO优化与高效部署策略  如何在阿里云虚拟服务器快速搭建网站?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Laravel怎么在Controller之外的地方验证数据  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Linux系统命令中tree命令详解  Laravel如何生成API文档?(Swagger/OpenAPI教程)  活动邀请函制作网站有哪些,活动邀请函文案?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作  深圳网站制作平台,深圳市做网站好的公司有哪些?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  EditPlus中的正则表达式 实战(1)  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  北京网站制作公司哪家好一点,北京租房网站有哪些?  Laravel如何实现模型的全局作用域?(Global Scope示例)  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel观察者模式如何使用_Laravel Model Observer配置  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Laravel如何实现API资源集合?(Resource Collection教程)  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  JavaScript如何实现路由_前端路由原理是什么  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】