### 自定義滾動條
- 拖拽
- 只有橫向拖拽
- 限制范圍:范圍的大小
- 計算比例:當前值/最大值
- 控制其他對象
- 例子1:控制物體的大小
- 例子2:控制物體的透明度
- 例子3:控制文字滾動
- 代碼:
```HTML
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>自定義滾動條</title>
<link rel="stylesheet" href="../reset.css">
<style>
#div0 {
margin: 10px auto;
width: 600px;
height: 400px;
position: relative;
background-color: blanchedalmond;
}
/* 上下滾動條 */
#div1 {
top: 50px;
right: 50px;
width: 20px;
height: 300px;
position: absolute;
border: rgb(139, 139, 139) solid 1px;
}
#div1_0 {
width: 20px;
height: 40px;
position: absolute;
background-color: rgb(140, 171, 255);
}
/* 文字區 */
#div3 {
left: 60px;
top: 50px;
width: 400px;
height: 300px;
position: absolute;
background-color: rgb(255, 255, 255);
overflow: hidden;
}
#div3_0 {
width: 900px;
position: absolute;
white-space: pre-wrap;
background-color: cornsilk;
}
/* 左右滾動條 */
#div2 {
top: 5px;
right: 140px;
width: 400px;
height: 20px;
position: absolute;
border: rgb(139, 139, 139) solid 1px;
}
#div2_0 {
width: 40px;
height: 20px;
position: absolute;
background-color: rgb(140, 171, 255);
}
</style>
<script>
// 封裝 getElementById 函數
function get(id) {
return document.getElementById(id);
}
// 封裝獲取計算后元素樣式函數,返回小數
function getStyle(obj, name) {
if (obj.currentStyle) {
return obj.currentStyle[name];
} else {
return getComputedStyle(obj, '') [name];
}
}
window.onload = function () {
var oDiv1 = get('div1'); // 上下滾動框
var oDiv1_0 = get('div1_0'); // 上下滾動條
var oDiv3 = get('div3'); // 文字框
// var oDiv3_0 = get('div3_0'); // 文字可視區
var oDiv2 = get('div2'); // 左右滾動框
var oDiv2_0 = get('div2_0'); // 左右滾動條
// 文字TOP = (文字框高-可視區高) * (滾動條TOP/(滾動框高-滾動條高))
// 鼠標按下滾動條時觸發事件
// 鼠標Y移動時,滾動條top 移動
// 鼠標松開時,事件結束
// 合并函數:ev.clientY offsetTop offsetHeight oDiv1 oDiv1_0 oDiv3 oDiv3_0
// 去掉 offset 改用 getStyle
// console.log(oDiv1.children[0], oDiv1_0)
// 直接傳一個對象取子節點或父節點
// 面對對象:srcoll 作為 oDiv1_0 和 oDiv2_0 的方法時,可以用 this 代替 oDiv1_0,只要傳入 ev, 'clientY', oDiv3
oDiv1_0.onmousedown = function (ev) {
scroll(ev, 'clientY', oDiv1, oDiv3);
return false; // 可以解決 chrome FireFox IE9的文字選中問題
}
oDiv2_0.onmousedown = function (ev) {
scroll(ev, 'clientX', oDiv2, oDiv3);
return false; // 可以解決 chrome FireFox IE9的文字選中問題
}
function scroll(ev, dir, obj1 , obj2) {
var attr = '';
var attr2 = '';
if (dir === 'clientY') {
attr = 'height';
attr2 = 'top';
} else if (dir === 'clientX') {
attr = 'width';
attr2 = 'left';
} else {
return console.log('參數錯誤');
}
var oDiv1_0 = obj1.children[0];
var oDiv3_0 = obj2.children[0];
var ev = ev||event;
var disMouse = ev[dir];
// 滾動條舊的位置
var oldPos = parseInt(getStyle(oDiv1_0, attr2));
// 滾動范圍 = 滾動條高 + 滾動框高
var disScroll = parseInt(getStyle(obj1, attr)) - parseInt(getStyle(oDiv1_0, attr));
document.onmousemove = function (ev) {
ev = ev||event;
// 移動距離
var disMove = ev[dir] - disMouse;
// 滾動條TOP = 滾動條TOP + 移動距離
var divScroll = oldPos + disMove;
// 文字TOP = (文字框高-可視區高) * (滾動條TOP/(滾動框高-滾動條高))
var disTxt = parseInt(getStyle(obj2, attr)) - parseInt(getStyle(oDiv3_0, attr));
var divTxt = (disTxt)*(divScroll/disScroll);
// 向下移 disMove > 0; 向上移 disMove < 0
if (disMove > 0 && divScroll <= disScroll) {
oDiv1_0.style[attr2] = divScroll + 'px';
oDiv3_0.style[attr2] = divTxt + 'px';
// 文字區
} else if (disMove <= 0 && divScroll >= 0) {
// 都 = 0;divScroll 才能取到 0px
oDiv1_0.style[attr2] = divScroll + 'px';
oDiv3_0.style[attr2] = divTxt + 'px';
} else {
// 防止移動過快超出判斷范圍, 滾動條距離小于 0 直接到達
if (disMove < 0) {
oDiv1_0.style[attr2] = 0;
oDiv3_0.style[attr2] = 0;
} else if (disMove > 0) {
oDiv1_0.style[attr2] = disScroll + 'px';
oDiv3_0.style[attr2] = disTxt + 'px';
}
}
document.onmouseup = function () {
this.onmousemove = '';
this.onmouseup = '';
}
console.log(disMove,divScroll,disScroll,oldPos,divTxt)
}
}
// oDiv2_0.onmousedown = function (ev) {
// var ev = ev||event;
// var disMouse = ev.clientX;
// var oldPos = this.offsetLeft;
// // 滾動范圍 = 滾動條高 + 滾動框高
// var disScroll = oDiv2.offsetWidth - oDiv2_0.offsetWidth -2;
//
// document.onmousemove = function (ev) {
// ev = ev||event;
// // 移動距離
// var disMove = ev.clientX - disMouse;
// // 滾動條TOP = 滾動條TOP + 移動距離
// var divScroll = oldPos + disMove;
// // 文字TOP = (文字框高-可視區高) * (滾動條TOP/(滾動框高-滾動條高))
// var divTxt= (oDiv3.offsetWidth - oDiv3_0.offsetWidth)*(divScroll / disScroll);
// // 向下移 disMove > 0; 向上移 disMove < 0
// if (disMove > 0 && divScroll <= disScroll) {
// oDiv2_0.style.left = divScroll + 'px';
// oDiv3_0.style.left = divTxt + 'px';
// // 文字區
// } else if (disMove <= 0 && divScroll >= 0) {
// // 都 = 0;divScroll 才能取到 0px
// oDiv2_0.style.left = divScroll + 'px';
// oDiv3_0.style.left = divTxt + 'px';
// } else {
// // 防止移動過快超出判斷范圍, 滾動條距離小于 30 直接到達
// if (disMove < 0 && divScroll < 30) {
// oDiv2_0.style.left = 0;
// oDiv3_0.style.left = 0;
// } else if (disMove > 0 && disScroll - divScroll < 30) {
// oDiv2_0.style.left = disScroll + 'px';
// oDiv3_0.style.left = oDiv3.offsetWidth - oDiv3_0.offsetWidth + 'px';
// }
// }
// document.onmouseup = function () {
// this.onmousemove = '';
// this.onmouseup = '';
// }
// console.log(disMove,divScroll,disScroll,oldPos,divTxt)
// }
// return false; // 可以解決 chrome FireFox IE9的文字選中問題
// }
}
</script>
</head>
<body>
<div id="div0">
<div id="div1">
<div id="div1_0"></div>
</div>
<div id="div2">
<div id="div2_0"></div>
</div>
<div id="div3">
<div id="div3_0">
值 描述
normal 默認。空白會被瀏覽器忽略。
pre 空白會被瀏覽器保留。其行為方式類似 HTML 中的 標簽。inherit 規定應該從父元素繼承 white-space 屬性的值。
nowrap 文本不會換行,文本會在在同一行上繼續,直到遇到 標簽為止。
pre-wrap 保留空白符序列,但是正常地進行換行。
pre-line 合并空白符序列,但是保留換行符。
inherit 規定應該從父元素繼承 white-space 屬性的值。
- 拖拽
- 只有橫向拖拽
- 限制范圍:范圍的大小
- 計算比例:當前值/最大值
- 控制其他對象
- 例子1:控制物體的大小
- 例子2:控制物體的透明度
- 例子3:控制文字滾動
- 代碼:- 拖拽
- 只有橫向拖拽
- 限制范圍:范圍的大小
- 計算比例:當前值/最大值
- 控制其他對象
- 例子1:控制物體的大小
- 例子2:控制物體的透明度
- 例子3:控制文字滾動
- 代碼:- 代碼:- 拖拽
- 只有橫向拖拽
- 限制范圍:范圍的大小
- 計算比例:當前值/最大值
- 控制其他對象
</div>
</div>
</div>
</body>
</html>
```
- 前言
- 初探 JavaScript 魅力
- JavsScript 是什么
- 第一個 JS 特效:鼠標提示框
- 網頁換膚和 if 判斷
- 函數傳參
- 循環 while 和 for
- 導航欄選項卡
- JS 簡易日歷
- JavaScript 基礎
- JavaScript 組成
- 變量類型
- 變量類型轉換
- 變量的作用域和閉包
- 命名規范
- 運算符
- 程序流程控制
- JSON
- 深入 JavaScript
- 函數返回值
- 函數傳參與行間樣式
- 數組基礎操作
- 定時器的使用
- 定時器的作用
- 數碼時鐘
- Date 對象其它方法
- 延時提示框
- 無縫滾動
- DOM基礎應用
- DOM 基礎
- DOM 節點
- 操作元素屬性
- DOM 元素靈活查找
- DOM 操作應用
- 創建、插入和刪除元素
- 文檔碎片
- DOM操作應用高級
- 表格標簽
- 表格應用
- 表單應用
- JS 運動基礎
- 運動基礎
- 運動框架及應用
- 緩沖運動
- 運動的停止條件
- JS 運動應用
- 多物體運動框架
- 任意值運動框架
- 仿 Flash 圖片展示
- JS 運動中級
- 鏈式運動框架
- 完美運動框架
- 運動框架總結
- 運動框架應用
- JS事件基礎
- Event 對象和事件
- 鼠標事件
- 鍵盤事件
- JS 事件中級
- 默認事件
- 拖拽
- JS 事件高級應用
- 事件綁定
- 高級拖拽
- 自定義滾動條
- Ajax 基礎
- Ajax 是什么
- 使用 Ajax
- Ajax 原理
- Ajax 中級
- 編寫 Ajax
- Ajax 數據
- JS 面對對象基礎
- 面對對象是什么
- JS 中的面對對象
- 第一個面對對象的程序
- 工廠方式
- 原型:Prototype
- 面對對象編程方式
- JS 面對對象實例
- 面對對象的選項卡
- JS 面對對象高級
- Json 方式的面向對象
- 拖拽和繼承
- 使用繼承
- 系統對象
- BOM 應用
- BOM 基礎
- 尺寸及坐標
- 常用方法和事件
- COOKIE 基礎與應用
- 什么是 cookie
- 使用 cookie
- JS 中的正則表達式
- 正則表達式基礎
- 字符串與正則配合
- 字符串
- 量詞
- 常用正則例子
- JS Template 模板引擎
- 特性
- 語法
- 實例
- 表達式和運算符分類
- 主要表達式
- 左表達式
- 自增和自減
- 一元運算符
- 算術運算符
- 關系運算符
- 相等運算符
- 位移運算符
- 二進制位運算符
- 二元邏輯運算符
- 條件(三元)運算符
- 賦值運算符