- 网页特效原理
- JavaScript 就是修改样式(文档)
- 编写 JS 的流程
- 布局:HTML + CSS
- 属性:确定要修改的属性
- 事件: 确定用户 做哪些操作(产品设计)
- 编写 JS :在事件中,用 JS 来修改页面元素的样式
-
分析效果实现原理
- 样式:div 的 display / none
- 事件:onmouseover / onmouseout
- 动手编写效果
-
特效基础
- 事件驱动:onmouseover
- 元素属性操作:obj.style.[...]
- 特效实现原理概括:响应式用户操作,对页面元素样式修改
-
兼容性问题
// div2.style.display='block'; // 部分浏览器不兼容 document.getElementById('div2').style.display='block'; // 所有浏览器兼容
-
函数
- 制作更复杂的效果
- 直接在事件内写代码会很乱
- 引入 function() 函数的基本形式
- 把 JS 标签里放入到函数里,类似于 css 里的 class
- 变量的使用:别名
- 定义和调用
- 函数定义:告诉系统有这个函数,不会执行
- 函数调用:执行函数里面的代码
- 关系和区别
-
代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>第一个JS效果</title> <style> #div2 { display: none; background: red; width: 100px; height: 50px; font-size: 16px; } #div1 { display: block; background: red; width: 100px; height: 100px; font-size: 16px; } </style> <script> // 封装 getElementById 函数 function get(id) { return document.getElementById(id); } // 显示 div2 function show() { // div2.style.display='block'; // 部分浏览器不兼容 get('div2').style.display='block'; } // 隐藏 div2 function hide() { // div2.style.display='none'; // 部分浏览器不兼容 get('div2').style.display='none'; } // div1 变绿 function toGreen() { get('div1').style.background='green'; } // div1 变蓝 function toblue() { get('div1').style.background='blue'; } // div1 变红 function toRed() { get('div1').style.background='red'; } // 点击循环变色 var i = 0; function changeColor() { console.log('i=',i) if (i == 0) { toGreen(); i++; console.log('i=',i) return; } if (i == 1) { toblue(); i++; console.log('i=',i) return; } if (i == 2) { toRed(); i = i - 2; console.log('i=',i) return; } } </script> </head> <body> <!-- 调用页内函数修改样式 --> <input type="button" onclick="changeColor()" value="按钮"> <div id="div1"> </div> <!-- 行内 JS 修改样式 --> <input type="checkbox" onmouseover="div2.style.display='block';" onmouseout="div2.style.display='none';" value="按钮"> <div id="div2"> <p>文字<br>文字2</p> </div> </body> </html>
-
网页换肤
- 土豆网 “开灯” “关灯效果”
- 任何标签都可以加 ID ,包括 link
- 任何标签的属性,都可以修改
- HTML 里面怎么写,JS 里面就怎么写
-
if 判断
- 特效实现原理
- if 基本形式
- JS 里面
= 赋值, == 判断
- 为 a 链接添加 JS
<a href="javascript:;"></a>
- className 的使用
class
是关键字,所以用className
代替- 其它 HTML 里面怎么写,JS 里面就怎么写
-
代码
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <link id="link1" rel="stylesheet" type="text/css" href="css/grey.css"> <script> function changeColor() { if (document.getElementById('link1').href == 'file:///E:/web/node/JStest/JStest/JavaScript/css/grey.css') { document.getElementById('link1').href='css/black.css'; document.getElementById('b1').value='开灯'; console.log('black') } else { document.getElementById('link1').href='css/grey.css'; document.getElementById('b1').value='关灯'; console.log('bl2:', document.getElementById('link1').href) } } function changeText() { document.getElementById('text1').value='456'; document.getElementById('text1').title='文字1'; } function showHide() { var div2 = document.getElementById('div2'); if(div2.style.display == 'block') { div2.style.display ='none'; console.log('1'); } else { div2.style.display = 'block'; div2.style.background = 'blue'; } console.log('display:', div2.style.display); } function class1() { var div = document.getElementById('div4'); div.className='div4'; div.id='div5'; } </script> </head> <body> <!-- 换肤 --> <input id="b1" type="button" onclick="changeColor()" value="关灯"> <div id="div1">1</div> <div id="div2">2</div> <div id="div3">3</div> <input type="button" value="显示隐藏div2" onclick="showHide()"> <br> <!-- HTML 里面怎么写,JS 里面就怎么写 --> <input id="text1" type="text" value="123"> <input type="button" value="改文字" onclick="changeText()"> <br> <!-- a 链接的使用 --> <a href="javascript:;">javascript:;</a> <!-- className 的使用 --> <div id="div4" style="width: 100px; height: 50px; background: grey;">4</div> <input type="button" value="className" onclick="class1()"> </body> </html>
-
改变背景颜色
- 函数传参:参数就是占位符
- 函数里面变量用传参
- 函数传参:参数就是占位符
-
改变 div 的任意样式
- 操纵属性的第二种方式
- 要修改的属性不确定时:
元素.style[ 变量/字符串 ] = 变量/字符串
- JS 中用
.
的地方都可以用[]
代替; - 字符串变量区别和关系 :带引号是字符串,不带是变量
- 要修改的属性不确定时:
- 将属性名作为参数传递
- 操纵属性的第二种方式
-
style 与 className
元素.style.属性 = 变量/字符串
- style 是修改行内样式
- 行内样式优先级最高,之后再修改 className 不会有效果
- 建议:只操作一种样式,要么只操作 style ,要么只操作 className
-
代码:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>函数传参</title> <style> div { display: block; background: red; width: 100px; height: 100px; font-size: 16px; } .div2 { display: block; background: grey; width: 100px; height: 100px; } </style> <script> // 封装 getElementById 函数 function get(id) { return document.getElementById(id); } // div1 变绿 function toGreen() { get('div1').style.background='green'; } // div1 变蓝 function toblue() { get('div1').style.background='blue'; } // div1 变红 function toRed() { get('div1').style.background='red'; } // 点击循环变色 var i = 0; function changeColor() { console.log('i=',i) if (i == 0) { toGreen(); i++; console.log('i=',i) return; } if (i == 1) { toblue(); i++; console.log('i=',i) return; } if (i == 2) { toRed(); i = i - 2; console.log('i=',i) return; } } // 函数传参 function toColor(color, width) { get('div1').style.background = color; get('div1').style.width = width; } // 将属性名作为参数传递 function chgName(name, width) { // get('div1').style.name = width; // name 会被当作属性赋值 get('div1')['style'][name] = width; // 数组 可以加字符串或者变量 } // 样式优先级 function chgClass(className) { get('div1').className = className; } </script> </head> <body> <!-- 调用页内函数修改样式 --> <input type="button" onclick="changeColor()" value="循环"> <!-- 函数传参 --> <input type="button" onclick="toColor('green', '200px')" value="变绿"> <input type="button" onclick="toColor('blue', '300px')" value="变蓝"> <input type="button" onclick="toColor('red', '400px')" value="变红"> <input type="button" onclick="chgName('height', '200px')" value="变高"> <input type="button" onclick="chgClass('div2')" value="class变灰"> <div id="div1"></div> </body> </html>
- 提取事件
- 为元素添加事件
- 事件和其它属性一样,可以用 JS 添加:
元素.事件 = 函数名/函数;
- 不能加括号,加括号直接执行函数
window.onload
的意义:等待页面加载完成再执行 JS- 行为( js )、样式( css )、结构( html ) 三者分离
- 事件和其它属性一样,可以用 JS 添加:
- 为元素添加事件
- 获取一组元素
元素.getElementsByTagName('标签名')
- 数组的使用
- 数组的属性
- 全选的实现
- 代码: 同下
-
用 while 引入 循环的概念
- while 循环语法
- 自增的意义
- 循环的构成:初始化、条件、语句、自增
- while 循环语法
-
for 循环
- 用 for 代替 while 循环
- 用 for 循环为一组元素甜腻骄傲事件
- 什么时候用循环----一组元素
- 例子
- 全选---- checked 属性
- 反选---- for 循环配合 if 判断
- 用 for 代替 while 循环
-
代码:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>提取行间事件和循环</title> <style> div { display: block; border: 1px solid black; width: 100px; height: 100px; margin: 10px; float: left; } </style> <script> window.onload = function () { // 封装 getElementById 函数 function get(id) { return document.getElementById(id); } // 封装 getElementsByTagName function gets(tagName) { return document.getElementsByTagName(tagName) } // 提取行间样式 get('btn1').onclick = function () { get('btn1').value = '提取成功'; } // 修改一组元素中的某一个元素 get('btn2').onclick = function () { gets('div')[2].style.background = 'blue'; } // 修改一组元素- while 循环 get('btn3').onclick = function () { var i = 0; while ( i < gets('div').length ) { gets('div')[i].style.background = 'yellow'; i++; } } // for get('btn4').onclick = function () { for (var i = 0; i < gets('div').length; i++ ){ gets('div')[i].style.background = 'pink'; } } // 全选的实现 if 判断 无需div get('btn5').onclick = function () { for (var i = 0; i < gets('input').length; i++ ){ if (gets('input')[i].type == 'checkbox'){ if (gets('input')[i].checked == false) { gets('input')[i].checked = true; } else { gets('input')[i].checked = false; } } } } // 元素.getElementsByTagName 方法 单个div get('btn6').onclick = function () { var div2 = get('div2'); var inp = div2.getElementsByTagName('input'); for (var i = 0; i < inp.length; i++ ){ // console.log(inp); if (inp[i].checked == false) { inp[i].checked = true; } else { inp[i].checked = false; } } } // 元素.getElementsByTagName 方法 多个div get('btn7').onclick = function () { var div2 = gets('div'); for (var i = 0; i < div2.length; i++ ){ var div = gets('div')[i]; var inps = div.getElementsByTagName('input'); for (var a = 0; a < inps.length; a++){ if (inps[a].checked == false) { inps[a].checked = true; } else { inps[a].checked = false; } } } } }; </script> </head> <body> <!-- 提取行间样式 --> <input id="btn1" type="button" value="按钮"> <!-- 修改一组元素中的某一个元素 --> <input type="button" id="btn2" value="改第三个元素"> <!-- 修改一组元素-循环 --> <input type="button" id="btn3" value="while循环改一组元素"> <input type="button" id="btn4" value="for循环改一组元素"> <input type="button" id="btn5" value="全选"> <input type="button" id="btn6" value="全选2"> <input type="button" id="btn7" value="全选3"> <div><input type="checkbox" name="1" id="c1"></div> <div><input type="checkbox" name="1" id="c2"></div> <div><input type="checkbox" name="1" id="c3"></div> <div><input type="checkbox" name="1" id="c4"></div> <div><input type="checkbox" name="1" id="c5"></div> <div id="div2"> <input type="checkbox" name="" id=""> <input type="checkbox" name="" id=""> <input type="checkbox" name="" id=""> <input type="checkbox" name="" id=""> <input type="checkbox" name="" id=""> <input type="checkbox" name="" id=""> <input type="checkbox" name="" id=""> </div> </body> </html>
-
按钮的实现
- 添加事件
- this 的使用: 指当前发生事件的元素
- 先清空所有按钮,再选中当前按钮
- 添加事件
-
内容的实现(ul)
- 先隐藏所有 ul,再显示当前 ul
- 索引值的使用:什么时候用索引值
- HTML 添加 index 会被 FireFox 过滤
- JS 添加 index
- 先隐藏所有 ul,再显示当前 ul
-
代码:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>导航选项卡</title> <style> body { margin: 0; padding: 0; } #div2 { width: 200px; height: 200px; margin-top: 20px; position: relative; } #div1 { width: 200px; height: 20px; position: absolute; top: 0px; } ul { margin: 0; padding: 0; display: block; background: rgb(157, 234, 253); float: left; position: absolute; display: none; width: 200px; height: 200px; } .ul { display: block; } a { display: block; float: left; width: 49px; height: 20px; background: rgb(7, 184, 253); border-left: 1px solid rgb(255, 0, 234); text-decoration: none; } .a { background: rgb(32, 108, 221); } </style> <script> window.onload = function (){ // 封装 getElementById 函数 function get(id) { return document.getElementById(id); } // 封装 getElementsByTagName function gets(tagName) { return document.getElementsByTagName(tagName) } // 显示第一个元素 gets('ul')[0].className = 'ul'; // 当鼠标覆盖某个标签时 显示对应元素 for (var i = 0; i < 4; i++) { gets('a')[i].index = i; gets('a')[i].onmouseover = function () { for (var a = 0; a < 4; a++) { gets('ul')[a].className = ''; gets('a')[a].className = ''; } // console.log(this); gets('ul')[this.index].className = 'ul'; this.className = 'a'; } } } </script> </head> <body> <div id="div1"> <a href="javascript:;" id="a0">1</a> <a href="javascript:;" id="a1">2</a> <a href="javascript:;" id="a2">3</a> <a href="javascript:;" id="a3">4</a> </div> <div id="div2"> <ul> <li>1</li> <li>1</li> <li>1</li> </ul> <ul> <li>2</li> <li>2</li> <li>2</li> </ul> <ul> <li>3</li> <li>3</li> <li>3</li> </ul> <ul> <li>4</li> <li>4</li> <li>4</li> </ul> </div> </body> </html>
-
程序实现思路
- 类似于选项卡,只是下面只有一个div
- innerHTML 的使用
-
数组的使用
- 定义:
arr = [1, 2, 3]
- 使用:
arr[0]
- 定义:
-
字符串拼接
- 作用:拼接两个字符串
- 问题:拼接中的优先级
- 就近相加, 字符串后面数字相加要加括号
-
代码:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>简易日历</title> <style> body { margin: 0; padding: 0; } td { border: 5px solid rgb(218, 218, 218); text-align: center; background: rgb(83, 83, 83); color: white; } .td { background: rgb(255, 255, 255); color: rgb(0, 0, 0); } /* 日历数字区 */ #t1 { border: 10px solid rgb(218, 218, 218); margin:0 auto; position: relative; width: 240px; height: 320px; background: rgb(218, 218, 218); } /* 下方文字 */ #d2 { margin:0 auto; width: 240px; height: 100px; background: rgb(218, 218, 218); } #p1 { position: relative; margin: auto; width: 205px; height: 80px; background: rgb(255, 255, 255); } </style> <script> window.onload = function () { // 封装 getElementById 函数 function get(id) { return document.getElementById(id); } // 封装 getElementsByTagName function gets(tagName) { return document.getElementsByTagName(tagName) } // 获取所有 td,注册 onmouseover 事件,添加索引 // console.log(gets('td')) var tds = gets('td'); var i = 0; for (i = 0; i < tds.length; i++) { tds[i].index = i; tds[i].onmouseover = function () { // 先清空 td className for (a = 0; a < tds.length; a++) { tds[a].className = ''; } // 修改td className 并插入文字 tds[this.index].className = 'td'; // console.log(i); get('p1').innerHTML = (this.index + 1) + arr[this.index]; } } arr = [ '月活动:学编程、英语', '月活动:学编程、英语', '月活动:学编程、日语', '月活动:学编程、画画', '月活动:学编程、旅游', '月活动:学编程', '月活动:学编程', '月活动:学编程', '月活动:学编程', '月活动:学编程', '月活动:学编程', '月活动:学编程' ] } </script> </head> <body> <div id="d1"> <table id="t1"> <tr> <td>1 <br>JAN</td> <td>2 <br>FER</td> <td>3 <br>MAR</td> </tr> <tr> <td>4 <br>APR</td> <td>5 <br>MAY</td> <td>6 <br>JUN</td> </tr> <tr> <td>7 <br>JUL</td> <td>8 <br>AUG</td> <td>9 <br>SEP</td> </tr> <tr> <td>10 <br>OCT</td> <td>11 <br>NOV</td> <td>12 <br>DEC</td> </tr> </table> <div id="d2"> <p id="p1"> </p> </div> </div> </body> </html>