使用js原生实现年份轮播选择效果实例


Posted in Javascript onJanuary 12, 2021

前言

用js实现一个年份轮换选择效果。废话不多说,看图:

使用js原生实现年份轮播选择效果实例

一、思路是什么?

  • 布局: 左右箭头使用实体字符 < 和 > 年份5个span。使用用flex布局横向排列。
  • js逻辑:(注:年份数据为number数组)
    • a> . 默认展示年份数据前5个。
    • b>. firstIndex记录要显示的5个年份的起始索引。点击右侧箭头+1,直到firstIndex+5 刚好等于年份数组长度,不在递增。点击左侧箭头-1,直到firstIndex为0,不在递减。初始值为0。
    • c>.selectedIndex记录当前点击选中的年份索引。默认显示第一个即2021。初始值0。
    • d>.firstIndex值发生变化,获取firstIndex,firstIndex+1,firstIndex+2…firstIndex+4对应的年份,渲染到页面。并且这5个索引中某一个和selectedIndex相等,说明选中的年份,刚好在当前页面显示的年份当中。所以,与之相等的index对应的span添加选中样式,其他4个span移除选中样式。
  • css:左右箭头逻辑,默认全部添加可点击样式:firstIndex=0,移除左可点击样式,firstIndex+5=年份数组长度,移除右可点击样式。

二、全部代码

1. html

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
 <link rel="stylesheet" href="index.css" rel="external nofollow" type="text/css"/>
 <script type="text/javascript" src="echarts.min.js"></script>
 <script type="text/javascript" src="index.js"></script>
</head>
<body>
<div class="container">

 <div id="left" class="arrow_left" onclick="clickBefore()" style="cursor:default" unselectable="on" onselectstart="return false;">
 <span><</span>
 </div>
 <div id="wrap" class="wrap">
 <span onclick="selected(this)">1</span>
 <span onclick="selected(this)">2</span>
 <span onclick="selected(this)">3</span>
 <span onclick="selected(this)">4</span>
 <span onclick="selected(this)">5</span>
 </div>
 <div id="right" class="arrow_right arrow_active" onclick="clickNext()" style="cursor:default" unselectable="on" onselectstart="return false;">
 <span>></span>
 </div>

</div>

<div class="content" id="content">

</div>
</body>
</html>

2.js

代码如下:

window.onload = function () {
 //首次渲染列表
 initList(firstIndex);
};

let yearArr = [2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021];
yearArr.reverse();

//起始索引
let firstIndex = 0;
//选中索引,默认选中第一个
let selectedIndex = 0;


/**
 * 初始化列表
 */
function initList(firstIndex) {

 //渲染页面span列表
 let spanList = document.getElementById('wrap').getElementsByTagName('span');
 for (let i = 0; i < spanList.length; i++) {
 let index = firstIndex + i;
 let span = spanList[i];
 span.innerText = yearArr[index];

 //选中样式添加和移除
 if (index === selectedIndex) {
  span.classList.add('active');
 } else {
  span.classList.remove('active')
 }
 }
 //页面内容显示值
 document.getElementById('content').innerText = '当前选中年份:' + yearArr[selectedIndex];
}

/**
 * 下一页
 */
function clickNext(div) {
 if (firstIndex + 5 < yearArr.length) {
 firstIndex = firstIndex + 1;
 initList(firstIndex)
 }
 arrowActive();
}

/*
* 上一页
 */
function clickBefore(div) {
 if (firstIndex > 0) {
 firstIndex = firstIndex - 1;
 initList(firstIndex)
 }
 arrowActive();
}

/**
 * 选中
 */
function selected(span) {
 let value = span.innerText;
 let index = yearArr.findIndex((el) => {
 return el + "" === value;
 })
 selectedIndex = index !== -1 ? index : 0;
 initList(firstIndex);
}

/**
 * 左右箭头激活
 * firstIndex = 0: 右激活 左不
 * firstIndex = length-5:左激活 右不
 * 其他:全激活
 */
function arrowActive() {
 let left = document.getElementById('left')
 let right = document.getElementById('right')
 left.classList.add('arrow_active');
 right.classList.add('arrow_active');
 if (firstIndex === 0) {
 left.classList.remove('arrow_active');
 } else if (firstIndex === yearArr.length - 5) {
 right.classList.remove('arrow_active');
 }
}

2.css

代码如下:

body{
 margin-top: 80px;
}
.container {

 display: flex;
 justify-content: center;
 align-items: center;
 margin: 10px;
}

.wrap {
 height: 40px;
 z-index: 1;
 color: black;
 display: flex;
 flex: 1;
 background: rgba(155,226,219,0.5);
 border-radius: 20px;
 margin-left: 20px;
 margin-right: 20px;
}

.wrap span {
 flex: 1;
 text-align: center;
 height: 40px;
 line-height: 40px;
 border-radius: 20px;

}

.active{
 background: #1abc9c;
 color:#fff;
}



.arrow_left {
 left: 10px;
 color: green;
 padding: 0px 14px;
 border-radius: 50%;
 font-size: 30px;
 z-index: 2;
}


.arrow_right {
 right: 10px;
 color: green;
 padding: 0px 14px;
 border-radius: 50%;
 font-size: 30px;
 z-index: 2;
}
.arrow_active{
 color: blue;
}

.content{
 margin-left: 30px;
}

总结

每天记录一点,从小小菜鸟变小菜鸟!!!

到此这篇关于使用js原生实现年份轮播选择效果的文章就介绍到这了,更多相关js原生实现年份轮播选择内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
关于JavaScript的gzip静态压缩方法
Jan 05 Javascript
js trim函数 去空格函数与正则集锦
Nov 20 Javascript
jquery序列化表单去除指定元素示例代码
Apr 10 Javascript
详解JavaScript中的客户端消息框架设计原理
Jun 24 Javascript
基于Jquery实现表单验证
Jul 20 Javascript
JS基础随笔(菜鸟必看篇)
Jul 13 Javascript
Bootstrap进度条学习使用
Feb 09 Javascript
原生js轮播(仿慕课网)
Feb 15 Javascript
js canvas实现简单的图像扩散效果
Jun 28 Javascript
十个免费的web前端开发工具详细整理
Sep 18 Javascript
laravel-admin 与 vue 结合使用实例代码详解
Jun 04 Javascript
TypeScript魔法堂之枚举的超实用手册
Oct 29 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 #Vue.js
详解template标签用法(含vue中的用法总结)
Jan 12 #Vue.js
js动态生成表格(节点操作)
Jan 12 #Javascript
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 #Vue.js
JS addEventListener()和attachEvent()方法实现注册事件
Jan 11 #Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 #Javascript
详解ES6 中的Object.assign()的用法实例代码
Jan 11 #Javascript
You might like
PHP调用三种数据库的方法(3)
2006/10/09 PHP
laravel安装和配置教程
2014/10/29 PHP
php查询mssql出现乱码的解决方法
2014/12/29 PHP
PHP创建自己的Composer包方法
2018/04/09 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
2019/10/12 PHP
永不消失的title提示代码
2007/02/15 Javascript
javascript让setInteval里的函数参数中的this指向特定的对象
2010/01/31 Javascript
把字符串按照特定的字母顺序进行排序的js代码
2014/01/28 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
js实现3D旋转相册
2020/08/02 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
使用IPython来操作Docker容器的入门指引
2015/04/08 Python
Python实现方便使用的级联进度信息实例
2015/05/05 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
python print出共轭复数的方法详解
2019/06/25 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
2019/07/31 Python
详解KMP算法以及python如何实现
2020/09/18 Python
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
火山动力Java笔试题
2014/06/26 面试题
公务员政审单位鉴定材料
2014/05/16 职场文书
团日活动总结怎么写
2014/06/25 职场文书
2014小学年度工作总结
2014/12/20 职场文书
田径运动会通讯稿
2015/07/18 职场文书
家属联谊会致辞
2015/07/31 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
Python 统计序列中元素的出现频度
2022/04/26 Python
基于Redission的分布式锁实战
2022/08/14 Redis