DOM 经典案例

1.百度换肤案例

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
	<style type="text/css">
		* {
			margin: 0;
			padding: 0;
		}

		body {
			background: url(img/百度换肤1.jpg) no-repeat;
			background-size: 100%;
		}

		ul {
			width: 880px;
			margin: auto;
		}

		li {
			list-style-type: none;
			float: left;

		}

		img {
			height: 120px;
			width: 220px;
		}
	</style>
</head>
<body>
	<ul class="baidu">
		<li><img src="img/百度换肤1.jpg" /></li>
		<li><img src="img/百度换肤2.jpg" /></li>
		<li><img src="img/百度换肤3.jpg" /></li>
		<li><img src="img/百度换肤4.jpg" /></li>
	</ul>
	<script>
		//案例分析:1.给一组元素注册事件
		//2.给4个图片利用循环注册点击事件
		//3.当点击这个图片,让页面背景改为当前图片
		//4.核心算法:把当前图片的src路径取过来,给body作为背景即可
		var imgs = document.querySelector('.baidu').querySelectorAll('img');//不会
		for (var i = 0; i < imgs.length; i++) {
			imgs[i].onclick = function () {
				//this.src就是点击图片的路径
				console.log(this.src);
				//把路径this.src给body
				document.body.style.backgroundImage = 'url(' + this.src + ')';//这一步就很牛逼么不是
			}
		}
	</script>
</body>
</html>

2.表单全选,取消全选

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
</head>
<body>
	<input type="checkbox" id='choose_all_btn'>全选</button>
	<div>
		<input type="checkbox" name="t">珍珠
		<input type="checkbox" name="t">椰果
		<input type="checkbox" name="t">啵啵
		<input type="checkbox" name="t">冰淇淋
	</div>
	<script>
		//1.全选和取消全选做法: 让所有复选框的checked属性(选中状态) 跟随 全选按钮即可
		//获取元素
		var chooseAll = document.getElementById('choose_all_btn');
		var tt = document.getElementsByName('t');
		//注册事件
		chooseAll.onclick = function () {
			//this.check 可以得到当前复选框的选中状态 如果是true就是选中,false就是未选中
			console.log(this.checked);
			for (var i = 0; i < tt.length; i++) {
				tt[i].checked = this.checked;
			}
		}
		//2.下面复选看看需要全部选中,上面全选才能选中做法:给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否
		//有没有没选中的,如果有一个没选中的,上面全选就选不中。
		//3.可以设置一个变量来控制全选是否选中
		for (var i = 0; i < tt.length; i++) {
			tt[i].onclick = function () {
				//flag控制全选按钮是否选中
				var flag = true;
				//每次点击下面的复选框都要循环检查4个小按钮是否被全选中
				for (var i = 0; i < tt.length; i++) {
					if (!tt[i].checked) {
						flag = false;
						break;//退出for循环 这样可以提高执行效率 因为只要有一个没有选中,剩下的就无需循环
					}
				}
				chooseAll.checked = flag;
			}
		}
	</script>
</body>
</html>

3.动态生成表格

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>动态生成表格</title>
	<style type="text/css">
		table {
			width: 250px;
			height: 100px;
			border: #000000 1px solid;
			border-collapse: collapse;
			text-align: center;
			margin: 50px auto;
		}

		th,
		td {
			border: #000000 1px solid;
		}

		thead {
			background-color: #A5A5A5;
			font: bold;
		}
	</style>
</head>
<body>
	<table>
		<thead>
			<tr>
				<th>姓名</th>
				<th>科目</th>
				<th>成绩</th>
				<th>操作</th>
			</tr>
		</thead>
		<tbody>
			<!-- <tr>
					<td>魏璎珞</td>
					<td>JavaScript</td>
					<td>100</td>
					<td><a href="javascipt:;">删除</a></td>
				</tr>
				<tr>
					<td>弘历</td>
					<td>JavaScript</td>
					<td>90</td>
					<td><a href="javascipt:;">删除</a></td>
				</tr>
				<tr>
					<td>傅恒</td>
					<td>JavaScript</td>
					<td>99</td>
					<td><a href="javascipt:;">删除</a></td>
				</tr>
				<tr>
					<td>明玉</td>
					<td>JavaScript</td>
					<td>89</td>
					<td><a href="javascipt:;">删除</a></td>
				</tr> -->
		</tbody>
	</table>
	<script>
		//案例分析:1.因为学生数据都是动态的,我们需要js动态生成。这里我们模拟数据,自己定义好数据,数据我们采取对象形式存储
		//2.所有的数据都是放到tbody里面的行里面
		//3.因为行很多,我们需要循环创建多个行(对应多少人)
		//4.每个行里面又有很多单元格(对应里面的数据),我们还继续使用循环创建多个单元格,并且把数据存入里面(双重for循环)
		//5.最后一列单元格是删除,需要单独创建单元格。
		//开始啦!第一步先去准备好学生的数据
		var datas = [{
			name: '魏璎珞',
			subject: 'JavaScript',
			score: 100
		}, {
			name: '弘历',
			subject: 'JavaScript',
			score: 90
		}, {
			name: '容音',
			subject: 'JavaScript',
			score: 120
		}, {
			name: '尔晴',
			subject: 'JavaScript',
			score: 10
		}
		];
		//2.往tbody里面创建行:有几个人(通过数组的长度)我们就创建几行
		var tbody = document.querySelector('tbody');
		for (var i = 0; i < datas.length; i++) {//外面的for循环管行tr
			//创建tr行
			var tr = document.createElement('tr');
			tbody.appendChild(tr);
			//行里面创建单元格td(跟数据有关系的3个单元格) 单元格的数量取决于每个对象里面的属性个数 for循环遍历对象
			for (var k in datas[i]) {//里面的for循环管列td
				var td = document.createElement('td');
				//把对象里面的属性值给td
				td.innerHTML = datas[i][k];
				tr.appendChild(td);
			}
			//创建有删除2个字的单元格
			var td = document.createElement('td');
			td.innerHTML = '<a href="javascript:;">删除</a>';
			tr.appendChild(td);
		}
		//删除操作
		var as = document.querySelectorAll('a');
		for (var i = 0; i < as.length; i++) {
			as[i].onclick = function () {
				//点击a 删除当前a所在的行(链接的爸爸的爸爸) node.removeChild(child)
				tbody.removeChild(this.parentNode.parentNode);
			}
		}

			// for(var k in obj){
			// 	k得到的是属性名
			// 	obj[k]得到是属性值
			// }
	</script>
</body>
</html>

4.仿京东密码小眼睛切换

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
	<style type="text/css">
		.box {
			width: 300px;
			margin: 100px auto;
			border-bottom: #7FFFD4 1px solid;
		}

		.box input {
			width: 250px;
			height: 50px;
			border: 0;
			outline: 0;
			/* 这玩意老子倒是没想到 */
		}

		#eye {
			width: 30px;
			float: right;
			margin-top: 15px;
		}

		#neye {
			width: 30px;
			float: right;
			margin-top: 15px;
			display: none;
		}
	</style>
</head>

<body>
	<!-- 仿京东隐藏明文案例的<body>部分 -->
	<div class="box">
		<label for=''><img src="img/闭眼.jpg" id="eye" alt="" /></label>
		<input type="password" id="pwd" name="password" value="" />
	</div>
	<script>
		//仿京东显示隐藏密码明文案例
		//核心思路:点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
		//一个按钮两个状态,点击一次切换成文本框,继续点击一次切换为密码框
		//算法:利用一个flag变量,来判断flag的值,如果为1就切换成文本框,如果是0就切换为密码框
		//1.获取元素
		var eye = document.getElementById('eye');
		var pwd = document.getElementById('pwd');

		var flag = 0;
		eye.onclick = function () {
			//点击一次之后,flag一定要变化
			if (flag == 0) {
				pwd.type = 'text'; //呦呦呦,这一步,记下来记下来!!!!!
				eye.src = 'img/睁眼.jpg';
				flag = 1;
			} else {
				pwd.type = 'password';
				eye.src = 'img/闭眼.jpg';
				flag = 0;
			}
		}
	</script>
</body>

</html>

5.仿淘宝关闭二维码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#close_btn {
				width: 15px;
				height: 20px;
				border: 1px solid black;
				text-align: center;
				position: relative;
				left: 125px;
				bottom: 28px;
			}
		</style>
	</head>
	<body>
		<!-- 仿淘宝关闭二维码案例 -->
		<div class="box">
			淘宝二维码<br />
			<img src="img/淘宝.png" alt="" />
			<div id="close_btn">×</div>
		</div>
		<script>
			//案例:仿淘宝关闭二维码案例
			//当鼠标点击二维码关闭的时候,则关闭整个二维码
			//核心思路:利用样式的显示和隐藏完成,display:none隐藏元素 display:block显示元素
			//②点击按钮,就让这个二维码盒子隐藏起来即可
			var btn = document.getElementById('close_btn');
			var box = document.querySelector('.box');
			btn.onclick = function() {
				box.style.display = 'none';

			}
		</script>
	</body>
</html>

6.分时问候

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<img src="img/上午好.jpg" alt="" title="上午好"/><br />
		<div>上午好</div>
		<script>
		// 分时问候案例:上午打开页面,显示上午好,显示上午图片,下午晚上同理
		// 根据系统不同时间来判断,所以需要用到日期内置对象
		// 利用多分支语句来设置不同的图片
		// 需要一个图片,并且根据时间修改图片,就需要用到操作元素src属性
		// 需要一个div元素,显示不同问候语,修改元素内容即可
		// 1.获取元素
		var img=document.querySelector('img');
		var div=document.querySelector('div');
		// 2.得到当前的小时数
		var date=new Date();
		var h=date.getHours();
		console.log(h);
		// 3.判断小时数改变图片和文字信息
		if(h<12){
		 img.src='img/上午好.jpg';
		 div.innerHTML='上午好!';
		}else if (h<18){
		 img.src='img/中午好.jpg';
		 div.innerHTML='中午好!';
		}else{
		img.src='img/晚上好.jpg';
		div.innerHTML='晚上好!'; 
		}
		
		// 总结:innerHTML别写错啦!!!!
		</script>
	</body>
</html>

7.跟随鼠标的兔兔

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			img{
				width: 80px;
				height: 70px;
				position: absolute;
				top: 2px
			}
		</style>
	</head>
	<body>
		<img src="img/love.gif" alt="" />
		<script>
			//案例分析:1.鼠标不断移动,使用鼠标移动事件:mousemove
			//2.在页面中移动,给document注册事件
			//3.图片要移动距离,而且不占位置,我们使用绝对定位即可
			//4.核心原理:每次鼠标移动,我们都会获得最新的鼠标坐标,把这个x和y坐标作为图片的top和left值就可以移动图片
			var pic=document.querySelector('img');
			document.addEventListener('mousemove',function(e){
				//1.mousemove只要我们鼠标移动1px 就会触发这个事件
				//2.核心:
				var x=e.pageX;
				var y=e.pageY;
				console.log('x坐标是'+x,'y坐标是'+y);
				//3.千万不要忘记给left和top添加px单位
				pic.style.left = x+'px';
				pic.style.top=y+'px';
			})
		</script>
	</body>
</html>

8.简单版发布删除留言

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
	<style type="text/css">
		textarea {
			border: pink 1px solid;
		}

		ul {
			width: 300px;
			height: 20px;
		}

		li {
			width: 300px;
			height: 20px;
			background-color: #FFC0CB;
			color: #e30071;
			margin-bottom: 3px;
		}

		li a {
			float: right;
		}
	</style>
</head>
<body>
	<textarea name='textarea' id="">123</textarea>
	<button>发布</button>
	<br /><br />
	<ul>
	</ul>
	<script>
		//核心思路:点击按钮之后,就动态创建一个li,添加到ul里面
		//创建li的同时,把文本域里面的值通过li.innerHTML赋值给li
		//如果想要新的留言后面显示就用appendChild如果想要前面显示就用insertBefore
		var btn = document.querySelector('button');
		var text = document.querySelector('textarea');
		var ul = document.querySelector('ul');
		btn.onclick = function () {
			if (text.value == '') {
				alert('您没有输入内容');
				return false;
			} else {
				//console.log(text.value);
				//1.创建元素
				var li = document.createElement('li');
				//先有li才能赋值
				li.innerHTML = text.value + '<a href="javascriot:;">删除</a>';
				//2.添加元素
				//ul.appendChild(li);
				ul.insertBefore(li, ul.children[0]);
				//3.删除元素 删除的当前链接的li  它的父亲
				var as = document.querySelectorAll('a');
				for (var i = 0; i < as.length; i++) {
					as[i].onclick = function () {
						//node.removeChild(child);删除的是li  当前a所在的li  this.parentNode;
						ul.removeChild(this.parentNode);
					}
				}
			}
		}

			//删除留言
			//案例分析:1.当我们把文本域里面的值赋值给li时,多添加一个删除的链接
			//2.需要把所有的链接获取过来,当我们点击当前的链接的时候,删除当前链接所在的li
			//3.阻止链接跳转需要添加javascriptvoid(0);或者javascript:;
	</script>
</body>
</html>

9.排他思想

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
</head>
<body>
	<button>按钮1</button>
	<button>按钮2</button>
	<button>按钮3</button>
	<button>按钮4</button>
	<button>按钮5</button>
	<script>
		//排他思想:如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法
		//1.所有元素全部清除样式(干掉其他人)
		//2.给当前元素设置样式(留下我自己)
		//3.注意顺序不能颠倒,先干到其他人,再设置自己
		var btns = document.getElementsByTagName('button');
		for (var i = 0; i < btns.length; i++) {
			btns[i].onclick = function () {
				//1.先把所有按钮背景颜色去掉  干掉所有人
				for (var i = 0; i < btns.length; i++) {
					btns[i].style.backgroundColor = '';
				}
				//2.然后让当前元素背景颜色为pink  留下老子自己
				this.style.background = 'pink';
			}
		}
	</script>
</body>
</html>

10.显示隐藏文本框内容

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			input{
				border: 2px solid #e2231a;
				color: #bfbfbf;
			}
		</style>
	</head>
	<body>
		<input type="text" value="手机" />
		<script>
			//当鼠标点击文本时,里面的默认文字隐藏,当鼠标离开文本时,里面的文字显示
			//案例分析:1.首先表单需要2个新事件,获得焦点onfocus 失去焦点onblur
			//2.如果获得焦点,判断表单里面内容是否为默认文字,如果是默认文字,就清空表单内容
			//3.如果失去焦点,判断表单内容是否为空,如果为空,则表单内容改为默认文字
			var text=document.querySelector('input');
			text.onfocus=function(){
				//console.log('得到焦点');
				if(this.value === '手机'){
					this.value = '';
				}
				//获得焦点需要把文本框里面的文字颜色变黑
				this.style.color='#0c0c0c';
			}
			text.onblur=function(){
				//console.log('失去焦点');
				if(this.value === ''){
					this.value='手机';
				}
				this.style.color='#bfbfbf';
			}
		</script>
	</body>
</html>

11.tab栏切换布局

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>tab(标签)</title>
	<style type="text/css">
		* {
			margin: 0;
			padding: 0;
		}

		.tab {
			margin: 0 auto;
			width: 500px;
			/* border: 1px solid #000000; */
		}

		.tab_list {
			width: 500px;
			height: 50px;
			/* border: #A5A5A5 1px solid; */
			/* background-color: #e9e9e9; */
			margin: 0 auto;
			margin-top: 50px;
		}

		li {
			list-style-type: none;
			float: left;
			padding: 0px 15px;
			height: 50px;
			line-height: 50px;
			border-top: #999999 1px solid;
			border-bottom: #999999 1px solid;
			background-color: #dbdbdb;
		}

		.tab_list .current {
			color: #fff;
			background-color: #E2231A;
		}

		.item {
			display: none;
			margin: 0 auto;
		}
	</style>
</head>
<body>
	<div class="tab">
		<div class="tab_list">
			<ul>
				<li class="current">商品介绍</li>
				<li>规格与包装</li>
				<li>售后保障</li>
				<li>商品评价</li>
				<li>手机社区</li>
			</ul>
		</div>
		<div class="tab_con">
			<div class="item" style="display: block;">
				<!-- 第一个模块默认显示 -->
				商品介绍模块内容
			</div>
			<div class="item">
				规格与包装模快内容
			</div>
			<div class="item">
				售后保障模快内容
			</div>
			<div class="item">
				商品评价(50000)模快内容
			</div>
			<div class="item">
				手机社区模块内容
			</div>
		</div>
	</div>
	<script>
		//案例分析:①Tab栏切换2个大的模块
		//②上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想)修改类名的方式
		//③下面的模块内容,会跟随上面的选项卡变化,所以下面模块化写到点击事件里面
		//④规律:下面的模块显示内容和上面的选项卡一一对应,相匹配
		//⑤核心思路:给上面的tab_list里面的所有li添加自定义属性,属性值从0开始编号
		//⑥当我们点击tab_list里面的某个小li,让tab_con里面对应序号的内容显示,其余隐藏(排他思想)
		var tab_list = document.querySelector('.tab_list');
		var lis = tab_list.querySelectorAll('li');
		var items = document.querySelectorAll('.item');
		for (var i = 0; i < lis.length; i++) {
			//开始的五个小li 设置索引号
			lis[i].setAttribute('index', i);
			lis[i].onclick = function () {
				//干掉所有人 其余li清除 class这个类
				for (var i = 0; i < lis.length; i++) {
					lis[i].className = '';
				}
				//留下我自己
				this.className = 'current';
				//2.下面的显示内容模块
				var index = this.getAttribute('index');
				console.log(index);
				//干掉所有人 让其余的item这些div隐藏
				for (var i = 0; i < items.length; i++) {
					items[i].style.display = 'none';
				}
				items[index].style.display = 'block';
			}
		}
	</script>
</body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值