01京东tab栏切换
<!--
li标签要想有上面那根红线,那么加一个类叫active就可以了
下面的商品div要显示,就给这个div加一个selected类就可以了
-->
<style type="text/css">
* {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
.wrapper {
width: 1000px;
height: 475px;
margin: 0 auto;
margin-top: 100px;
}
.tab {
border: 1px solid #ddd;
border-bottom: 0;
height: 36px;
width: 320px;
}
.tab li {
position: relative;
float: left;
width: 80px;
height: 34px;
line-height: 34px;
text-align: center;
cursor: pointer;
border-top: 4px solid #fff;
}
.tab span {
position: absolute;
right: 0;
top: 10px;
background: #ddd;
width: 1px;
height: 14px;
overflow: hidden;
}
.products {
width: 1002px;
border: 1px solid #ddd;
height: 476px;
}
.products .main {
float: left;
display: none;
}
.products .main.selected {
display: block;
}
.tab li.active {
border-color: red;
border-bottom: 0;
}
</style>
</head>
<body>
<div class="wrapper">
<ul class="tab">
<li class="tab-item active">国际大牌<span>◆</span></li>
<li class="tab-item">国妆名牌<span>◆</span></li>
<li class="tab-item">清洁用品<span>◆</span></li>
<li class="tab-item">男士精品</li>
</ul>
<div class="products">
<div class="main selected">
<a href="###"><img src="images/guojidapai.jpg" alt="" /></a>
</div>
<div class="main">
<a href="###"><img src="images/guozhuangmingpin.jpg" alt="" /></a>
</div>
<div class="main">
<a href="###"><img src="images/qingjieyongpin.jpg" alt="" /></a>
</div>
<div class="main">
<a href="###"><img src="images/nanshijingpin.jpg" alt="" /></a>
</div>
</div>
</div>
<!--
样式解释:
哪个li加active类,哪个就有上边框红色
哪个main的div加selected,哪个就显示
实现步骤:
1.找到所有的li
2.遍历所有li,给它们注册鼠标移入事件
2.1 谁移入,谁加一个类active
2.2 要先排他,把所有的类恢复
2.3 在外面循环,把li的下标存到li的自定义属性里
2.4 谁移入,取出谁的下标,再根据这个下标找到对应的div,给div加一个类selected(记得要先找到所有的main的div并排他)
-->
<script>
// 找到所有的li标签
var list = document.getElementsByTagName('li');
// 找到所有类叫main的div标签
var mainList = document.getElementsByClassName('main');
// 遍历所有的li,给它们加鼠标移入事件
for(var i = 0; i < list.length; i++){
// 当i=0时,就把0存在了下标0的li里面
// 当i=1时,就把1存在了下标1的li里面
list[i].setAttribute('index',i);
// 鼠标移入事件
list[i].onmouseover = function(){
// 让大家都恢复,循环4次
for(var j = 0; j < list.length; j++){
list[j].className = "tab-item";
mainList[j].className = "main";
}
// 谁移入谁加active
this.className += " active";
// 排他,让其他所有div都恢复默认
// for(var j = 0; j < mainList.length; j++){
// mainList[j].className = "main";
// }
// 谁移入,取出谁的下标
var index = this.getAttribute('index');
mainList[index].className += " selected";
}
}
</script>
02文档树
<!--
网页中的所有内容,都在body标签里,而body在html里
html再往上就是document
document:文档(指的是整个网页内容)
我们所有的元素都在document里面,相当于是由document开枝散叶而来,所以把这种关系图叫文档树(DOM)
元素:网页中的所有标签都叫元素
节点:网页中的所有内容都叫节点,节点包括标签、文本、注释、属性等
总结:我们的网页内容都在document里面,DOM其实指的就是document的文档树模型,操作DOM其实就是操作document
例:
//代表整个网页里所有的li标签
document.getElementsByTagName('li');
因为这是document来调用的,而document代表整个网页,所以它是找所有网页里的li标签
//代表只是找到ul1里面的所有li标签
ul1.getElementsByTagName('li');
03设置body跟网页一样高
/* 跟它的父盒子也就是document一样高 */
/* html{
height:100%;
} */
/* 跟html一样高 */
/* body{
height: 100%;
} */
/* 记住设置body跟网页内容一样高 */
html,body{
height: 100%;
}
.box{
width: 100px;
height: 100px;
background-color: #f00;
}
04节点特征&标签节点特征
<!--
节点:网页中所有内容都叫节点
节点有三大特征:
nodeType: 节点类型
nodeName: 节点名字
nodeValue: 节点值
每种节点特征值不一样:标签有标签的节点特征值,文本有文本的节点特征值,属性也有自己的特征值
所以我们接下来研究一下:标签、属性、文本、注释的各种节点特征值都是几
标签的节点特征:
nodeType: 1
nodeName: 大写的标签名
nodeValue: null
以后如果我拿到一个节点,但是我又不知道这个节点是什么类型,就可以判断nodeType是否等于1,如果等于1就代表是标签
但是我也不知道是什么标签,就可以用nodeName知道是什么标签
-->
</head>
<body>
<div id="box">我是div</div>
<span id="sp">我是span</span>
<script>
// 找到div
var box = document.getElementById('box');
console.log(box.nodeType); //1
console.log(box.nodeName); //DIV
console.log(box.nodeValue); //null
// 找到span
var sp = document.getElementById('sp');
console.log(sp.nodeType); //1
console.log(sp.nodeName); //SPAN
console.log(sp.nodeValue);//null
05属性节点的节点特征
<!--
属性节点特征:
nodeType: 2
nodeName: 一定是属性名,小写
nodeValue:属性值
元素.attributes:
获取它所有的属性
-->
</head>
<body>
<div id="box" class="test" >我是div</div>
<script>
//找到div
var box = document.getElementById('box');
// 这只是叫拿到属性值
// console.log(box.id);
// 怎么整体拿到属性?
// attributes可以拿到所有的属性,是一个伪数组
// 取下标就是找到某个属性
console.log(box.attributes[0].nodeType);//2
console.log(box.attributes[0].nodeName);//id
console.log(box.attributes[0].nodeValue);//box
console.log(box.attributes[1].nodeType);//2
console.log(box.attributes[1].nodeName);//class
console.log(box.attributes[1].nodeValue);//test
06文本节点的节点特征
<!--
childNodes:
找到自己的所有子节点
文本节点的节点特征:
nodeType:3
nodeName:#text
nodeValue:文本的内容
-->
</head>
<body>
<ul id="ul1">
我是文本
<li>隔壁老王1</li>
<li>隔壁老王2</li>
<li>隔壁老王3</li>
<li>隔壁老王4</li>
<li>隔壁老王5</li>
</ul>
<script>
// 找到ul
var ul1 = document.getElementById('ul1');
console.log(ul1.childNodes);
console.log(ul1.childNodes[0].nodeType);//3
console.log(ul1.childNodes[0].nodeName);//#text
console.log(ul1.childNodes[0].nodeValue);//文本的内容
07注释节点的节点特征
<!--
注释节点的节点特征:
nodeType:8
nodeName:#comment
nodeValue:注释的内容
-->
</head>
<body>
<ul id="ul1">
<!-- 我是注释 -->
<li>隔壁老王1</li>
<li>隔壁老王2</li>
<li>隔壁老王3</li>
<li>隔壁老王4</li>
<li>隔壁老王5</li>
</ul>
<script>
// 找到ul1
var ul1 = document.getElementById('ul1');
console.log(ul1.childNodes);
console.log(ul1.childNodes[1].nodeType);//8
console.log(ul1.childNodes[1].nodeName);//#comment
console.log(ul1.childNodes[1].nodeValue);//注释的内容
08如何找到html,body,head标签
<!--
如何找body
document.body
如何找head
document.head
如何找html
document.documentElement
它们都是标签,所以它们的nodeType都为1
-->
</head>
<body id="bd">
<script>
// var bd = document.getElementById('bd');
// console.log(bd);
// body每个网页只有一个,而且默认就有,所以如果你要找body,没必要上面那么麻烦,webAPI封装好了,直接用就行了
// console.log(document.body);
// // 怎么找head
// console.log(document.head);
// // 怎么找html?
// console.log(document.documentElement);
console.log(document.body.nodeType);//1
console.log(document.head.nodeType);//1
console.log(document.documentElement.nodeType);//1
09document节点
<script>
console.log(document.nodeType); //9
console.log(document.nodeName); //#document
console.log(document.nodeValue);//null
</script>
10找子节点和子元素
<!--
childNodes:找到所有子节点,包括标签、文本、注释、属性等
children: 找到所有子元素,也就是说只找到子标签
它也是一个伪数组,里面保存了所有的子标签
-->
</head>
<body>
<ul id="ul1">
<li>隔壁老王1</li>
<li>隔壁老王2</li>
<li>隔壁老王3</li>
<li>隔壁老王4</li>
<li>隔壁老王5</li>
</ul>
<script>
var ul1 = document.getElementById('ul1');
// console.log(ul1.childNodes);
console.log(ul1.children);
// 现在我要找到ul1里所有的li
for(var i = 0; i < ul1.children.length; i++){
console.log( ul1.children[i] );
}
11找父元素
<!--
parentNode:
找父节点,但是找到的只有标签,因为只有标签才能成为别人的父节点
-->
</head>
<body>
我是<h1 id="h1">我是标题</h1>文本
<script>
// console.log( document.body.childNodes);
var h1 = document.getElementById('h1');
console.log(h1.parentNode); //打印body
console.log(document.body.parentNode);//html
console.log(document.body.parentNode.parentNode);//document
12找父元素的补充
<!--
parentNode:照理说这个要包括文本、注释、属性
parentElement:这个只有标签
但是能成为别人父元素的,只有标签
所以在99.9999%情况下,它们两个都是一样的
parentNode最高能找到document,而parentElement不能找到document(因为document不算标签,所以找不到)
建议用parentNode
-->
</head>
<body>
<ul>
<li id="li1">隔壁老王1</li>
<li>隔壁老王2</li>
<li>隔壁老王3</li>
<li>隔壁老王4</li>
<li>隔壁老王5</li>
</ul>
<script>
//找到li1
var li1 = document.getElementById('li1');
// // ul
// console.log(li1.parentNode);
// console.log(li1.parentElement);
// // body
// console.log(li1.parentNode.parentNode);
// console.log(li1.parentElement.parentElement);
// // html
// console.log(li1.parentNode.parentNode.parentNode);
// console.log(li1.parentElement.parentElement.parentElement);
// document
console.log(li1.parentNode.parentNode.parentNode.parentNode); //document
console.log(li1.parentElement.parentElement.parentElement.parentElement);//null
13关闭二维码
<style>
.box {
width: 107px;
height: 127px;
position: fixed;
left: 50%;
top: 50%;
margin-left: -53.5px;
margin-top: -63.5px;
border: 1px solid #d9d9d9;
}
span {
position: absolute;
width: 15px;
height: 15px;
border: 1px solid #d9d9d9;
color: #d9d9d9;
text-align: center;
line-height: 15px;
left: -17px;
top: -1px;
/* 修改鼠标到我范围内的样式
pointer为小手
move 是可拖动的十字架
*/
cursor: pointer;
}
</style>
</head>
<body>
<div class="box">
<img src="images/taobao.jpg" alt="">
<span>x</span>
</div>
<script>
//获取span
var sp = document.getElementsByTagName('span')[0];
// 给span加点击事件
sp.onclick = function(){
this.parentNode.style.display = "none";
}
</script>
14innerText,innerHTML,textContent
<!--
获取
innerText:
获取的只是纯文本,不带标签
innerHTML:
获取的内容带标签
严格来讲,它才是真·获取双标签里所有内容,包括标签
设置:
innerText:
设置的时候带标签,也会标签当纯文本
innerHTML:
设置的时候带标签,会把标签解析出来
innerHTML比innerText功能更强大,
innerText它有兼容问题,它是以前IE弄出来的属性,不是标准属性,所以在火狐45版本之前不支持
innerHTML所有浏览器都支持
textContent其实跟innerText作用是一毛一样的
它也只是只能获取纯文本,以及设置内容时如果带标签会把标签当纯文本
textContent在IE8和之前的浏览器不支持
-->
<style>
.box{
width: 300px;
height: 300px;
background-color: #f00;
}
</style>
</head>
<body>
<div class="box">
我是div
<span>我是span</span>
<h3>我是h3</h3>
</div>
<script>
//找到div
var box = document.getElementsByClassName('box')[0];
// console.log(box.innerText);
// console.log(box.innerHTML);
// box.innerText = "我是修改的内容";
// box.innerHTML = "我是修改的内容";
// box.innerText = "<h3>我是新的h3</h3>";
// box.innerHTML = "<h3>我是新的h3</h3>";
// console.log(box.textContent);
box.textContent = "<h3>我是新的h3</h3>";
</script>
15创建元素的三种方式
<!--
document.write:
可以给body添加内容,你写标签就把标签解析出来就相当于是给body加子元素
缺点:
1.只能给body添加
2.会覆盖body的所有内容
所以这个方法我们不会用
innerHTML:
它可以给所有元素加子元素,但是如果你是直接赋值会覆盖原来的内容
如果想添加新的子元素,最好用+=
document.createElement();
它可以创建出一个新的元素对象
传入 标签名 就可以在内存中创建这个新的标签
但是网页中看不到,要想看到,还必须 调用 appendChild,把它加到某个元素里面
-->
<style>
.box{
width: 300px;
height: 300px;
background-color: #f00;
}
</style>
</head>
<body>
<input type="button" value="添加元素" id="btn">
<div class="box">
<u>我是下划线标签</u>
</div>
<script>
// 找到div
var box = document.getElementsByClassName('box')[0];
document.getElementById('btn').onclick = function(){
// 1.不会用的document.write方法
// document.write('<h3>我是h3</h3>');
// 2.innerHTML
// 用原来的值加一个h3
// box.innerHTML = box.innerHTML + "<h3>我是h3</h3>";
// box.innerHTML += "<h3>我是h3</h3>";
// 3.document.createElement()
// 你要创建什么标签,就在括号里传入这个标签的名字
var res = document.createElement('h3');
res.innerHTML = "我是新的内容";
// 把刚刚创建出来的h3标签,添加到box这个div里
box.appendChild(res);
// console.log(res);
16 innerHTML的影响
<!--
innerHTML:
1.如果在大量循环里用innerHTML添加子元素,会非常耗资源(卡)
innerHTML用+= 看起来是添加一个子元素,其实它本质都是重新赋值
重新赋值就意味着每次都要先删掉原来,再一个一个渲染新的
2.会让原本拥有的子元素的事件丢失
丢失的原因是:它相当于是把之前的元素擦掉重写,所以原来那个事件就丢了
-->
</head>
<body>
<input type="button" value="添加" id="btn">
<div class="box">
<span id="sp">你是有事件的span哦!</span>
</div>
<script>
// 找到span
var sp = document.getElementById('sp');
// 找到div
var box = document.getElementsByClassName('box')[0];
//给span加点击事件
sp.onclick = function () {
alert('span被点击了');
}
document.getElementById('btn').onclick = function () {
box.innerHTML += "<p>新的p标签</p>";
//重新找到新的span,再给新的span加点击事件
var sp = document.getElementById('sp');
sp.onclick = function () {
alert('span被点击了');
}
// 下面这段代码非常卡
// for (var i = 0; i < 10000; i++) {
// document.body.innerHTML += "<p>p标签</p>";
// }
// document.body.innerHTML += "<p>p标签</p>";
//相当于是
// document.body.innerHTML = document.body.innerHTML + "<p>p标签</p>";
// document.body.innerHTML = document.body.innerHTML + "<p>p标签</p>";
// 如果非要用innerHTML做大量拼接,那么先用一个变量,把要添加的内容存起来
// 再一次性赋值给innerHTML就行了
// var str = "";
// for (var i = 0; i < 10000; i++) {
// str += "<p>p标签</p>";
// }
// document.body.innerHTML += str;
};