對鼠標進行操作就會產生鼠標事件,比如按下、松開鼠標左鍵、右鍵或滾輪等。
onmousemove事件:當鼠標指針在指定元素上移動時,就會觸發該事件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
#box{
width: 200px;
height: 200px;
background-color: aqua;
}
</style>
</head>
<body>
<div id="box">
</div>
<script>
let box=document.getElementById("box");
box.onmousemove=function(){
box.style.backgroundColor="red";
}
</script>
</body>
</html>
當鼠標移動到div方形區域內,背景顏色變為紅色。
onmousedown事件:當鼠標指針移動到指定元素上并按下,會觸發該事件。
let box=document.getElementById("box");
box.onmousedown=function(){
box.style.backgroundColor="red";
}
onmouseup事件:當鼠標指針移動到指定元素上按下并離開,會觸發該事件。
let box=document.getElementById("box");
box.onmousedown=function(){
box.style.backgroundColor="red";
}
box.onmouseup=function(){
box.style.backgroundColor="green";
}
createElement():通過指定名稱創建一個元素。
項目目標:
在輸入框輸入非空內容,自動添加到下方列表。
let list=document.getElementById("list");
let word=document.getElementById("word");
let arr=["吃飯", "睡覺", "打豆豆"];
for (let i=0; i < arr.length; i++) {
let temp=document.createElement("li");
temp.innerHTML=arr[i];
list.append(temp);
}
word.onblur=function() {
let value=word.value;
conssole.log(value);
if(value){
let temp=document.createElement("li");
temp.innerHTML=value;
list.append(temp);
}
else
alert("請輸入內容");
}
在事件被觸發時,js會自動生成一個event對象,控制臺輸出event可以查看這個事件的具體信息。
項目目標:瀏覽器中有一個紅色小球,鼠標點擊,小球就會移動到點擊的位置。
let box=document.getElementById("box");
document.onclick=function(event) {
let x=event.clientX;
let y=event.clientY;
box.style.left=x + "px";
box.style.top=y + "px";
}
移動時disX和disY沒有變化:
項目目標:拖動紙飛機移動。
let img=document.getElementById("img");
img.onmousedown=function (event) {
let disX=event.clientX - this.offsetLeft;
let disY=event.clientY - this.offsetTop;
img.onmousemove=function (event) {
let l=event.clientX - disX;
let t=event.clientY - disY;
this.style.left=l + 'px';
this.style.top=t + 'px';
}
img.onmouseup=function () {
img.onmouseup=img.onmousemove=null;
}
}
<script src="https://lf3-cdn-tos.bytescm.com/obj/cdn-static-resource/tt_player/tt.player.js?v=20160723"></script>
addEventListener()
- 也可以通過addEventListener()來為元素綁定事件
addEventListener(type, listener [, useCapture])
- 參數:
type 要監聽的事件的字符串,注意這里不需要寫on
listener 回調函數,當事件發生后調用的函數
useCapture 布爾值,是否在捕獲階段觸發事件,一般都是false
通過addEventListener()可以為一個元素的一個事件綁定多個響應函數,
這樣當事件被觸發時,響應函數會按照事件的綁定順序依次執行
該方法不支持IE8及以下的瀏覽器
通過addachEvent()可以為一個元素的相同事件綁定多個響應函數 該方法支持IE8以下的瀏覽器—兩個參數addachEvent (on事件,回調函數)
不同的是—先綁定的后執行,后綁定的先執行!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件的綁定</title>
<script>
window.onload=function () {
var btn01=document.getElementById('btn01');
// 通過 對象.屬性 的形式綁定響應函數時,同時只能為一個事件綁定一個響應函數
// btn01.onclick=function () {
// alert(1);
// };
//
btn01.onclick=function () {
alert(2);
};
btn01.onclick=null;
/*
addEventListener()
- 也可以通過addEventListener()來為元素綁定事件
addEventListener(type, listener [, useCapture])
- 參數:
type 要監聽的事件的字符串,注意這里不需要寫on
listener 回調函數,當事件發生后調用的函數
useCapture 布爾值,是否在捕獲階段觸發事件,一般都是false
通過addEventListener()可以為一個元素的一個事件綁定多個響應函數,
這樣當事件被觸發時,響應函數會按照事件的綁定順序依次執行
該方法不支持IE8及以下的瀏覽器
通過addachEvent()可以為一個元素的相同事件綁定多個響應函數 該方法支持IE8以下的瀏覽器—兩個參數addachEvent (on事件,回調函數)
不同的是—先綁定的后執行,后綁定的先執行!
*/
// btn01.addEventListener("click",function () {
// alert(1);
// }, false)
//
// btn01.addEventListener("click",function () {
// alert(2);
// }, false)
//
// btn01.addEventListener("click",function () {
// alert(3);
// }, false)
// btn01.removeEventListener()
/*
removeEventListener(type, listener[, useCapture]);
- 用來移除元素上的事件監聽器
*/
function fn() {
alert(123);
}
btn01.addEventListener('click',fn, false);
btn01.removeEventListener('click', fn, false);
};
</script>
</head>
<body>
<button id="btn01">點我一下</button>
</body>
</html>
關于事件的傳播方向當時兩大巨頭網景和微軟有著不同的理解:
網景公司認為事件應該由外向內傳遞,
事件發生時,應該先從外層元素上的事件,然后向內一層一層傳遞
這一事件的傳播機制,稱為 事件的捕獲
微軟公司認為事件應該由內向外傳遞
事件發生時,應該先從內層元素(觸發事件的元素)開始,然后一層一層傳遞
這一事件的傳播機制,稱為 事件的冒泡
于是W3C將事件整個分為了三個階段:
1.捕獲階段
- 事件發生后首先從外層元素向內層元素進行事件的捕獲
- 默認情況下此階段并不會觸發事件
通常在捕獲階段不想觸發事件--可以將addEventListener()的第三個參數設置為false
- 如果希望在捕獲階段觸發事件,可以將addEventListener()的第三個參數設置為true
2.目標階段
- 捕獲到達觸發事件的元素,捕獲終止
3.冒泡階段
- 從觸發事件的元素開始,向外層進行事件的冒泡,并觸發事件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#box1{
width: 300px;
height: 300px;
background-color: #bfa;
}
#box2{
width: 150px;
height: 150px;
background-color: #ff0;
}
#box3{
width: 50px;
height: 50px;
background-color: orange;
}
</style>
<script>
window.onload=function () {
/*
關于事件的傳播方向當時兩大巨頭網景和微軟有著不同的理解:
網景公司認為事件應該由外向內傳遞,
事件發生時,應該先從外層元素上的事件,然后向內一層一層傳遞
這一事件的傳播機制,稱為 事件的捕獲
微軟公司認為事件應該由內向外傳遞
事件發生時,應該先從內層元素(觸發事件的元素)開始,然后一層一層傳遞
這一事件的傳播機制,稱為 事件的冒泡
于是W3C將事件整個分為了三個階段:
1.捕獲階段
- 事件發生后首先從外層元素向內層元素進行事件的捕獲
- 默認情況下此階段并不會觸發事件
通常在捕獲階段不想觸發事件--可以將addEventListener()的第三個參數設置為false
- 如果希望在捕獲階段觸發事件,可以將addEventListener()的第三個參數設置為true
2.目標階段
- 捕獲到達觸發事件的元素,捕獲終止
3.冒泡階段
- 從觸發事件的元素開始,向外層進行事件的冒泡,并觸發事件
*/
//分別為三個元素綁定單擊響應函數
var box1=document.getElementById('box1');
var box2=document.getElementById('box2');
var box3=document.getElementById('box3');
box1.addEventListener('click',function () {
alert(1);
}, true); //傳false 就不會在捕獲階段觸發
box2.addEventListener('click',function () {
alert(2);
}, true);
box3.addEventListener('click',function () {
alert(3);
}, true);
};
</script>
</head>
<body>
<div id="box1">
<div id="box2">
<div id="box3"></div>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#box1{
width: 100px;
height: 100px;
background-color: #f00;
position: absolute;
}
#box2{
width: 100px;
height: 100px;
background-color: orange;
}
#box3{
width: 100px;
height: 100px;
background-color: yellow;
}
#box4{
width: 100px;
height: 100px;
background-color: tomato;
}
.drag{
position: absolute;
}
</style>
<script>
window.onload=function () {
//獲取box1對象
var box1=document.getElementById('box1');
// 創建一個變量,記錄拖拽的狀態
//var isDrag=false; // 默認拖拽沒有開始
var left, top;
// 創建一個變量,記錄被拖拽的對象
var dragEle=null;
//為box1綁定鼠標按下的事件
document.addEventListener('mousedown',function (ev) {
// alert(ev.button);
// button用來表示鼠標的按鈕 0表示左鍵 1表示滾輪按下 2表示右鍵
// 判斷元素是否是拖拽元素
if(ev.target.classLisr.contains('drag')==='drag' && ev.button===0){
// 開始拖拽 將isDrag設置為true
// isDrag=true;
// 將ev.target 賦值給dragEle
dragEle=ev.target;
// 取消默認行為
ev.preventDefault();
// 獲取鼠標和元素的距離
left=ev.offsetX;
top=ev.offsetY;
}
}, false);
// 開始拖拽 , 為document綁定一個鼠標移動的事件
document.addEventListener('mousemove',function (ev) {
if(dragEle){
dragEle.style.left=ev.clientX - left +'px';
dragEle.style.top=ev.clientY - top + 'px';
}
}, false);
//設置onmouseup來停止拖拽
document.addEventListener('mouseup', function (ev) {
// 將 isDrag 設置為false,停止拖拽
// isDrag=false;
dragEle=null;
});
};
</script>
</head>
<body>
<div id="box1" class=""></div>
<div id="box2" class="drag"></div>
<div id="box3" class="drag"></div>
<div id="box4" class="drag"></div>
<img src="an.jpg" class="drag">
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box1{
width: 100px;
height: 100px;
background-color: #bfa;
}
.hello{
width: 200px;
height: 200px;
background-color: #ff0;
}
</style>
<script>
window.onload=function () {
var box1=document.querySelector('.box1');
// 使用className獲取的元素的class值,就是原本的class值
// 例如:box1.className 是這樣的 box1 box2 box3 box4
// classList 是一個類數組對象,在它里邊將元素的每一個class屬性都設置為了數組中的一個元素
/*
自己實現一組類相關的方法,要求兼容IE8以上的瀏覽器
classList只支持IE10以上的瀏覽器
contains() 用來檢查classList是否含有某個類,如果有返回true,沒有返回false
add() 用來向元素中添加一個或多個class
remove() 移除元素中的一個或多個class
replace() 使用一個新的class替換元素中的class
toggle() 切換元素中的指定class,如果有則刪除,如果沒有則添加
*/
var btn01=document.getElementById('btn01');
btn01.addEventListener('click',function () {
// alert(box1.classList.contains('hello'));
// box1.classList.add('hello');
// box1.classList.remove('box1');
// box1.classList.replace('box1', 'hello');
box1.classList.toggle('hello');
},false)
};
</script>
</head>
<body>
<button id="btn01">點我一下</button>
<div class="box1 box2 box3 box4"></div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>鼠標事件</title>
<style>
*{
margin: 0;
padding: 0;
}
.menu{
width: 200px;
position: absolute;
background-color: #bfa;
list-style: none;
display: none;
}
.menu li:hover{
background-color: #ff0;
}
</style>
<script>
//contextmenu 表示右鍵菜單的事件
document.addEventListener("contextmenu",function (ev) {
// 如果取消了contextmenu的默認行為,將會導致右鍵菜單不會出現
ev.preventDefault();
// 將菜單顯示出來
var menu=document.querySelector('.menu');
menu.style.display='block';
menu.style.left=ev.clientX + 'px';
menu.style.top=ev.clientY + 'px';
},false);
document.addEventListener('click',function () {
var menu=document.querySelector('.menu');
menu.style.display='none';
},false)
</script>
</head>
<body>
<ul class="menu">
<li>菜單一</li>
<li>菜單二</li>
<li>菜單三</li>
<li>菜單四</li>
<li>菜單五</li>
<li>菜單六</li>
<li>菜單七</li>
</ul>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#box1{
width: 100px;
height: 100px;
background-color: #f00;
}
</style>
<script>
window.onload=function () {
/*
box1可以根據鼠標滾輪滾動的方向變長或變短
*/
// 獲取box1
var box1=document.getElementById('box1');
box1.addEventListener('wheel',function (ev) {
// alert(ev);
//wheel 事件會在鼠標滾輪滾動的時候觸發
// deltaX 獲取鼠標滾輪橫向滾動方向
// 向左撥-3 向右撥3
// 左-100 右100(Chrome)
// deltaY 獲取鼠標滾輪縱向滾動方向
// 上-3 下3
// 上-100 下100
// 如果滾輪向下滾,box1變長
if(ev.deltaY > 0){
box1.style.height=box1.clientHeight + 10 + 'px';
}else{
// 如果滾輪向上滾,box1變短
box1.style.height=box1.clientHeight - 10 + 'px';
}
},false)
};
</script>
</head>
<body>
<div id="box1"></div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box1{
width: 100px;
height: 100px;
background-color: #bfa;
margin-top: 50px;
}
.yellow{
width: 200px;
height: 200px;
background-color: #ff0;
}
</style>
<script>
window.onload=function () {
var btn=document.getElementById('btn');
var box1=document.querySelector('.box1');
btn.addEventListener('click',function () {
replaceClass(box1, 'yellowgreen', 'yellow');
// alert(hasClass(box1,'box1'));
// toggleClass(box1, 'yellow');
// addClass(box1, 'yellow');
// 修改box1的樣式
// box1.style.width='300px';
// box1.style.height='300px';
// box1.style.backgroundColor='yellowgreen';
// 檢查className中是否含有yellow,然后在添加
// var re=new RegExp("\\byellow\\b")
// if(!re.test(box1.className)){
// // 將box1的class屬性修改為yellow
// box1.className +=' '+'yellow';
// }
// /\byellow\b/
// var reg=/\byellow\b/;
// 使用構造函數創建一個正則
// reg=new RegExp("\\byellow\\b"); // /\byellow\b/
// alert(reg);
},false)
};
//定義一個函數,用來為任意的元素添加class
// ele 表示要添加樣式的元素
// className 表示要添加的class
function addClass(ele, className) {
if(!hasClass(ele,className)){
// 將box1的class屬性修改為yellow
ele.className +=' '+className;
}
}
// 定義一個函數用來檢查類中是否含有某個class
function hasClass(ele, className) {
var re=new RegExp("\\b"+className+"\\b");
return re.test(ele.className);
}
// 刪除元素的指定類
function removeClass(ele, className) {
// 根據className創建一個正則表達式
var re=new RegExp('\\s*\\b'+className+'\\b');
// 將ele.className中符合正則表達式的內容,替換為空串
ele.className=ele.className.replace(re, '');
}
// 切換class,如果元素中具有該class則刪除,如果沒有則添加
function toggleClass(ele, className) {
// 檢查元素中是否含有該class
if(hasClass(ele, className)){
removeClass(ele, className);
}else{
addClass(ele, className);
}
}
// 替換元素class屬性
function replaceClass(ele, oldCls, newCls) {
// 根據oldCls創建一個正則表達式
var re=new RegExp('\\b'+oldCls+'\\b');
// 將ele.className中符合re的內容替換為newCls
ele.className=ele.className.replace(re, newCls);
}
</script>
</head>
<body>
<button id="btn">點我一下</button>
<div class="box1 yellowgreen"></div>
</body>
</html>
歡迎關注我的原創文章:小伙伴們!我是一名熱衷于前端開發的作者,致力于分享我的知識和經驗,幫助其他學習前端的小伙伴們。在我的文章中,你將會找到大量關于前端開發的精彩內容。
學習前端技術是現代互聯網時代中非常重要的一項技能。無論你是想成為一名專業的前端工程師,還是僅僅對前端開發感興趣,我的文章將能為你提供寶貴的指導和知識。
在我的文章中,你將會學到如何使用HTML、CSS和JavaScript創建精美的網頁。我將深入講解每個語言的基礎知識,并提供一些實用技巧和最佳實踐。無論你是初學者還是有一定經驗的開發者,我的文章都能夠滿足你的學習需求。
此外,我還會分享一些關于前端開發的最新動態和行業趨勢。互聯網技術在不斷發展,新的框架和工具層出不窮。通過我的文章,你將會了解到最新的前端技術趨勢,并了解如何應對這些變化。
我深知學習前端不易,因此我將盡力以簡潔明了的方式解釋復雜的概念,并提供一些易于理解的實例和案例。我希望我的文章能夠幫助你更快地理解前端開發,并提升你的技能。
如果你想了解更多關于前端開發的內容,不妨關注我的原創文章。我會不定期更新,為你帶來最新的前端技術和知識。感謝你的關注和支持,我們一起探討交流技術共同進步,期待與你一同探索前端開發的奇妙世界!
#2023年度創作挑戰#
圖1
圖2
圖3
圖4
圖5
圖6
圖7
圖8
就愛UI - 分享UI設計的點點滴滴
*請認真填寫需求信息,我們會在24小時內與您取得聯系。