金色小芝麻

vuePress-theme-reco 金色小芝麻    2021 - 2023
金色小芝麻 金色小芝麻

Choose mode

  • dark
  • auto
  • light
主页
分类
  • JavaScript
  • BUG复盘
  • SVG笔记
  • TypeScript
  • 个人总结
  • CSS笔记
  • 开发工具
  • 前端入门
  • Vue2.0
  • 性能优化
  • 架构学习
  • 每日一题
标签
时间轴
社交
  • 掘金 (opens new window)
author-avatar

金色小芝麻

83

文章

27

标签

主页
分类
  • JavaScript
  • BUG复盘
  • SVG笔记
  • TypeScript
  • 个人总结
  • CSS笔记
  • 开发工具
  • 前端入门
  • Vue2.0
  • 性能优化
  • 架构学习
  • 每日一题
标签
时间轴
社交
  • 掘金 (opens new window)
  • 前端入门

    • 博客搭建过程及相关配置
    • 数组中的16种常用方法
    • JS中的数据类型简析——基本数据类型值
    • JS中的数据类型object基础
    • JS中三种常见的判断
    • 数据类型之间的区别(堆内存Heap VS 栈内存Stack)
    • JS基础练习题及解析
    • 开关灯的小案例
    • JS中数据类型检测方法——typeof
    • 条件判断几个小练习
    • JS循环——for循环
    • 自定义属性实现选项卡小案例
    • 字符串中的12种常用方法
    • DOM操作的简单原理
    • JS实现隔行变色鼠标跟随小案例
    • JS中function的基础知识
    • JS中数组去重的三种方法
    • JS中时间格式化的三种方法
    • JS中URL参数处理的三种方法
    • JS小案例——获取随机验证码
    • DOM操作之——获取DOM标签的9种方式
    • DOM操作之——DOM节点类型及属性
    • DOM操作之——元素的增删改、样式修改、插入内容
    • JS中THIS相关问题梳理
    • JS中的变量提升机制
    • 在全局:私有上下文中:带VAR和不带VAR的区别
    • 作用域和作用域链查找机制
    • JS中堆栈内存的释放问题
    • JS中的闭包机制
    • ES3和ES6定义变量的区别
    • JS中的单例和工厂设计模式
    • JS中的面向对象OOP理论基础
    • 构造函数创建自定义类
    • JS中的原型和原型链
    • Math中常用的9种方法
    • 从一道阿里经典面试题剖析函数三种角色
    • 重写内置call
    • 重写一个内置new
    • 浏览器渲染页面的主体流程
    • 减少DOM的回流和重绘
    • JS中的多种继承方式
    • JS中数据类型检测四种方式的优缺点
    • JS中的正则表达式&&全面梳理
    • 非严格模式 🆚 严格模式的区别
    • 数组方法reduce、filter、flat
    • 获取数组中最大值/最小值的三种基础方法
    • 轮播图——渐隐渐显版
    • 深克隆 VS 浅克隆|深比较 VS 浅比较|回调函数
    • 轮播图——左右切换版
    • 事件及事件绑定、事件对象及事件传播
    • 从在地址栏输入网址到看到页面的过程&&AJAX基础
    • 想自学JS吗?想提升JS底层原理吗?76张脑图带你彻底搞懂原生JS
    • 面试手写API系列
    • 30张脑图带你从零开始学VUE
    • JS中的盒子模型
    • 初识JS-基础中的基础
    • 前端发展简史
    • JS中的三大类输出方式

JS实现隔行变色鼠标跟随小案例

vuePress-theme-reco 金色小芝麻    2021 - 2023

JS实现隔行变色鼠标跟随小案例

金色小芝麻 2020-04-12

效果图

# 一、结构样式,以及基于CSS3实现

<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>隔行变色,鼠标跟随</title>
	<!-- IMPORT CSS -->
	<link rel="stylesheet" href="reset.min.css">
	<style>
		.newsItem {
			margin: 20px auto;
			width: 500px;
		}

		.newsItem li {
			line-height: 40px;
			border-bottom: 1px dashed lightgray;
		}


		/* 奇偶行变色,鼠标滑过有高亮选中效果,鼠标离开回归原本的颜色 => 真实项目中一定是基于CSS3完成的 */
		.newsItem li:nth-child(even) {
			background: lightcyan;
		}

		.newsItem li:hover {
			background: lightcoral;
		}
	</style>
</head>
<body>
	<ul class="newsItem" id="newsItem">
		<li>1</li>
		<li>2</li>
		<li>3</li>
		<li>4</li>
		<li>5</li>
		<li>6</li>
	</ul>
</body>

# 二、基于JS实现

# 直接用i作为索引不能实现的原因

var newsItem = document.getElementById('newsItem'),
    itemList = newsItem.getElementsByTagName('li');
    
// ======================下面鼠标滑过效果是不行的
// 循环LI集合中的每一项,控制每一项的背景色和滑过需要处理的操作
for (var i = 0; i < itemList.length; i++) {
	// item:每一轮循环要操作的这个LI元素对象
	// i:当前操作LI的索引
	// i % 2 === 1:索引是奇数,代表当前LI是偶数行
	// bg:存储当前行的背景颜色
	var item = itemList[i],
		bg = '#FFF';
	i % 2 === 1 ? bg = 'lightcyan' : null;
	item.style.backgroundColor = bg;

	// 控制每个LI,鼠标滑过显示高亮颜色,鼠标离开回归原始颜色
	item.onmouseover = function () {
		item.style.backgroundColor = 'lightcoral';
	};
	item.onmouseout = function () {
		item.style.backgroundColor = bg;
	};
}

# 为啥不行的原因

  • 首先需要先理解函数的创建及执行

  • 然后我们分析下上面代码不能实现的原因

直到最后一次循环,也就是第五次循环:

# 三、能实现的几种方法

# 1、基于自定义属性解决(没有兼容性)

//===============基于自定义属性解决(没有兼容性)
for (var i = 0; i < itemList.length; i++) {
	var item = itemList[i],
		bg = '#FFF';
	i % 2 === 1 ? bg = 'lightcyan' : null;
	item.style.backgroundColor = bg;
	// 把当前LI的背景颜色赋值给LI元素对象的自定义属性
	item.MyBg = bg;

	item.onmouseover = function () {
		// this是内置的关键词:他存储的就是当前操作谁就是谁
		this.style.backgroundColor = 'lightcoral';
	};
	item.onmouseout = function () {
	// 此处需要知道之前LI的背景颜色:
        //    在后面的某一个操作中,我们需要知道之前的一些信息,此时我们基于自定义属性方案
	//   (在最开始循环的时候,我们把当前LI的背景颜色基于自定义属性的方式,赋值给LI元素对象(堆内存),
	//    后期需要的时候直接从自定义属性中获取到即可)
		this.style.backgroundColor = this.MyBg;
	};
}

# 2、基于闭包解决(没有兼容性)

//=============基于闭包解决(没有兼容性)  
for (var i = 0; i < itemList.length; i++) {
	(function (i) {
		var item = itemList[i],
			bg = '#FFF';
		i % 2 === 1 ? bg = 'lightcyan' : null;
		item.style.backgroundColor = bg;
		item.onmouseover = function () {
			item.style.backgroundColor = 'lightcoral';
		};
		item.onmouseout = function () {
			item.style.backgroundColor = bg;
		};
	})(i);
}

# 3、基于LET解决(原理上和闭包类似)

//===========基于LET解决(原理上和闭包类似)
for (let i = 0; i < itemList.length; i++) {
	let item = itemList[i],
		bg = '#FFF';
	i % 2 === 1 ? bg = 'lightcyan' : null;
	item.style.backgroundColor = bg;
	item.onmouseover = function () {
		item.style.backgroundColor = 'lightcoral';
	};
	item.onmouseout = function () {
		item.style.backgroundColor = bg;
	};
}
欢迎来到 金色小芝麻
看板娘