【JavaScript吉光片羽】--- 滑動條

燈光的亮度控制需要一個滑動條,先借用lamp源碼中Bar:

var Bar = function (opt) {var defaults = {$id: "", // 進度條dom節點idmin: 1, // 刻度最小值stepCount: 5, // 刻度步數step: 1, // 刻度步長$alpha: "",//顯示亮度的idtouchEnd: function () { } // 拖動完成回調
    };this.option = $.extend(defaults, opt);this.barNode = $("#" + this.option.$id);this.parentNode = this.barNode.parents(".J_slider_box");this.sliderNode = this.barNode.find(".J_slider");this.fillNode = this.barNode.find(".J_fill");this.valNode = this.barNode.find(".J_value");this.val = this.option.min;// this.valNode.text(this.val);this._init();return this;
}
Bar.prototype = {/*** 根據比例值來重新渲染進度條的位置* @param ratio 取值:0~1*/refreshPos: function (ratio) {if (ratio >= 1 || ratio < 0) { // 等于1時,js的%取值有問題,故排除return;}// 根據觸點位置更新進度條var percentage = ratio * 100;this.sliderNode.css("left", percentage + "%");this.fillNode.css("width", percentage + "%");var unit = 1 / this.option.stepCount,halfUnit = unit / 2,a = Math.floor(ratio / unit),b = ratio % unit,index = a + (b < halfUnit ? 0 : 1);this.val = this.option.min + index * this.option.step;if (this.option.$alpha) {$("#" + this.option.$alpha).html(this.val);} else {this.valNode.text(this.val);}},/*** 設置指定的進度值*/setVal: function (val) {var ratio = (val - this.option.min) / (this.option.step * this.option.stepCount);this.refreshPos(ratio);},_init: function () {var bar = this;if (!(bar.barNode.width() > 0)) {setTimeout(function () {bar._init();}, 100); // 直到vm渲染完成之后才能取得正確的dom高寬return;}bar.leftDis = bar.barNode.offset().left;bar.sliderWidth = bar.barNode.width();bar.barNode.on("touchmove", function (e) {e.preventDefault();// bar.parentNode.addClass("on");var touch = e.changedTouches ? e.changedTouches[0] : e;var ratio = (touch.pageX - bar.leftDis) / bar.sliderWidth;bar.refreshPos(ratio);});bar.barNode.on("touchend", function (e) {e.preventDefault();//bar.parentNode.removeClass("on");var touch = e.changedTouches ? e.changedTouches[0] : e;var ratio = (touch.pageX - bar.leftDis) / bar.sliderWidth;bar.refreshPos(ratio);bar.option.touchEnd(bar.val);});bar.refreshPos(this.val);}
};
View Code

html:

     <div class="lightsider"><div id="lightsider" class="slider_box J_slider_box"><i class="slider_box_icon icon dark"></i><div id="lightBar" class="slider_box_bar"><div class="slider_box_slider J_slider" style="left:0%"><p class="slider_box_slider_label J_value"></p><i class="slider_box_slider_touch"></i></div><div class="slider_box_line"><span class="slider_box_line_fill J_fill" style="width:0%"></span></div></div><i class="slider_box_icon icon light"></i></div></div>  

css:

.slider_box {display: -webkit-box;display: -webkit-flex;display: -ms-flexbox;display: flex;-webkit-box-align: center;-webkit-align-items: center;-ms-flex-align: center;align-items: center;
}.slider_box_icon {display: block;width: 35px;height: 35px;
}
.slider_box_bar {position: relative;margin: 0 10px;padding: 33px 0;-webkit-box-flex: 1;-webkit-flex: 1;-ms-flex: 1;flex: 1;
}
.slider_box_slider {position: absolute;height: 33px;top: 0;left: 0;z-index: 1;-webkit-transform: translate(-50%, 0);-ms-transform: translate(-50%, 0);transform: translate(-50%, 0);
}.slider_box_slider_touch {position: absolute;left: 50%;bottom: -11px;margin-left: -8px;width: 20px;height: 20px;border-radius: 15px;background-color: white;border: 1px solid rgb(195, 194, 194);
}
.slider_box_line {position: relative;height: 4px;border-radius: 4px;background-color: rgb(195, 194, 194);
}
.slider_box_line_fill {position: absolute;top: 0;left: 0;height: 4px;background-color: gold;border-radius: 4px;
}

JavaScript 調用:

   var bar = new Bar({ $id: "lightsider", stepCount: 100, min: 0, $alpha: "alpha" });

stepCount相當于最大長度。$alpha用來顯示亮度值。效果如下

主要的原理就是監聽 touchmove事件,通過移動的pageX減去圓點左邊的位置除以滑動條的總長度得到比率,最后換算成step

   bar.leftDis = bar.barNode.offset().left;bar.sliderWidth = bar.barNode.width();bar.barNode.on("touchmove", function (e) {e.preventDefault();// bar.parentNode.addClass("on");var touch = e.changedTouches ? e.changedTouches[0] : e;var ratio = (touch.pageX - bar.leftDis) / bar.sliderWidth;bar.refreshPos(ratio);});

如果是豎著的滑動條呢??暫且定義一個UpBar對象:

var UpBar = function (opt) {var defaults = {$id: "", // 進度條dom節點idmin: 1, // 刻度最小值stepCount: 5, // 刻度步數step: 1, // 刻度步長$alpha: "",//顯示亮度的idtouchEnd: function () { } // 拖動完成回調
    };this.option = $.extend(defaults, opt);this.barNode = $("#" + this.option.$id);this.parentNode = this.barNode.parents(".J_slider_box");this.sliderNode = this.barNode.find(".J_slider");this.fillNode = this.barNode.find(".J_fill");this.valNode = this.barNode.find(".J_value");this.val = this.option.min;// this.valNode.text(this.val);this._init();return this;
}
UpBar.prototype = {/*** 根據比例值來重新渲染進度條的位置* @param ratio 取值:0~1*/refreshPos: function (ratio) {if (ratio >= 1 || ratio < 0) { // 等于1時,js的%取值有問題,故排除return;}// 根據觸點位置更新進度條var percentage = ratio * 100;this.sliderNode.css("bottom", percentage + "%");this.fillNode.css("height", percentage + "%");var unit = 1 / this.option.stepCount,halfUnit = unit / 2,a = Math.floor(ratio / unit),b = ratio % unit,index = a + (b < halfUnit ? 0 : 1);this.val = this.option.min + index * this.option.step;if (this.option.$alpha) {$("#" + this.option.$alpha).html(this.val);} else {//  this.valNode.text(this.val);
        }},/*** 設置指定的進度值*/setVal: function (val) {var ratio = (val - this.option.min) / (this.option.step * this.option.stepCount);this.refreshPos(ratio);},_init: function () {var bar = this;if (!(bar.barNode.height() > 0)) {setTimeout(function () {bar._init();}, 100); // 直到vm渲染完成之后才能取得正確的dom高寬return;}bar.topDis = bar.barNode.offset().top;bar.sliderHeight = bar.barNode.height();bar.barNode.on("touchmove", function (e) {e.preventDefault();var touch = e.changedTouches ? e.changedTouches[0] : e;var ratio =1- (touch.pageY - bar.topDis) / bar.sliderHeight;bar.refreshPos(ratio);});bar.barNode.on("touchend", function (e) {e.preventDefault();var touch = e.changedTouches ? e.changedTouches[0] : e;var ratio =1- (touch.pageY - bar.topDis) / bar.sliderHeight;bar.refreshPos(ratio);bar.option.touchEnd(bar.val);});bar.refreshPos(this.val);}
};
View Code

css:

.slider_box_slider_up {position: absolute;width: 33px;top: 0;right: -20px;z-index: 1;-webkit-transform: translate(-50%, 0);-ms-transform: translate(-50%, 0);transform: translate(-50%, 0);
}
.slider_box_slider_touch_up {position: absolute;width: 20px;height: 20px;bottom: -10px;left: 0;border-radius: 15px;background-color: white;border: 1px solid rgb(195, 194, 194);
}
.slider_box_line_up {width: 4px;height: 100%;border-radius: 4px;position: relative;margin: 0 auto;background-color: rgb(195, 194, 194);
}
.slider_box_line_fill_up {position: absolute;bottom:0;left: 0;width: 4px;background-color: gold;border-radius: 4px;
}

html:

 <div class="soundBar"><div id="soundBar" class="slider_box_up J_slider_box"><div class="slider_box_line_up"><span class="slider_box_line_fill_up J_fill" style="height: 0%"></span></div><div class="slider_box_slider_up J_slider" style="bottom: 0%"><i class="slider_box_slider_label J_value"></i><i class="slider_box_slider_touch_up"></i></div></div></div>

調用:

  var bar = new UpBar({ $id: "soundBar", stepCount: 100, min: 0 });

效果如下:

主要的區別是left-->bottom,width-->height,另外一個因為y軸是以左上角為0,0的,touch.pageY越往下越大,所以算比率的時候用要這樣:

 bar.topDis = bar.barNode.offset().top;bar.sliderHeight = bar.barNode.height();bar.barNode.on("touchmove", function (e) {e.preventDefault();var touch = e.changedTouches ? e.changedTouches[0] : e;var ratio =1- (touch.pageY - bar.topDis) / bar.sliderHeight;bar.refreshPos(ratio);});

有興趣也可以合二為一。如需要獲取值,就訂閱touchEnd事件。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397054.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397054.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397054.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ldd /usr/bin/mysql_mysql客戶端登錄時報mysql: relocation error錯誤

在安裝了xtrabackup后&#xff0c;再用下列命令登錄時報下列錯誤[rootlocalhost ~]# mysql -u root -pmysql: relocation error: mysql: symbol strmov, version libmysqlclient_16 not defined in file libmysqlclient.so.16 with link time reference解決方法&#xff1a;查看…

python語言用什么關鍵字來聲明一個類_python使用什么關鍵字定義類

什么是類&#xff1f; 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。 什么是方法&#xff1f; 類中的函數即為方法 如何定義一個類&#xff1f; 定義類&#xff0c;語法格式如下&#xff1a;class ClassName:. . .…

谷歌+安卓,他已經改變了世界兩次,但還想多來幾次

回望拉里佩奇的創業經歷&#xff0c;小巴發現他在幾個創業者最有可能犯&#xff08;si&#xff09;錯&#xff08;bi&#xff09;的節點上都處理得很好。 你還記得你用的第一個搜索網站是什么嗎&#xff1f; Google.com 講到它的創始人&#xff0c;一般要連起來念&#xff0c; …

centos7 DNS服務器搭建

DNS&#xff0c;全稱Domain Name System&#xff0c;即域名解析系統。 DNS幫助用戶在互聯網上尋找路徑。在互聯網上的每一個計算機都擁有一個唯一的地址&#xff0c;稱作“IP地址”&#xff08;即互聯網協議地址&#xff09;。由于IP地址&#xff08;為一串數字&#xff09;不方…

lisp中怎樣調取圖形_CAD的lisp程序已加載,怎樣繪圖?

回答&#xff1a;1.計算所有線段總長度(加載后只需框選所有線段便可得出這些線段的總長度)(defun c:LL ()(setvar "cmdecho" 1)(setq en (ssget(list (0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0)(setq ll 0)(repeat (sslength en)(setq ss (…

Java Web的web.xml文件作用及基本配置(轉)

其實web.xml就是asp.net的web.config一個道理。 說明&#xff1a; 一個web中完全可以沒有web.xml文件&#xff0c;也就是說&#xff0c;web.xml文件并不是web工程必須的。 web.xml文件是用來配置&#xff1a;歡迎頁、servlet、filter等的。當你的web工程沒用到這些時&#xff0…

stand up meeting 12/21/2015

part組員 工作 工作耗時/h明日計劃工作耗時/h UI馮曉云 完成PDF UI主頁面的頁面切換功能&#xff0c;待完善 4 完善頁面切換&#xff0c;修補彈窗bug 4foxit PDF Reader朱玉影 修改了對pdf中文本進行搜索的代碼&#xff0c;使其更加robust 4 pdf…

python快速檢測視頻跳過幀_使用Python實現跳幀截取視頻幀

本文實例為大家分享了Python跳幀截取視頻幀的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下 可以自由設定時長來截取視頻&#xff0c;經實測效果理想。期間遇到的一個麻煩是我的視頻文件在D:盤&#xff0c;在原視頻D盤目錄上不能保存截取的圖片文件&#xff0c;后改…

BZOJ3999: [TJOI2015]旅游

BZOJ3999: [TJOI2015]旅游 Description 為了提高智商&#xff0c;ZJY準備去往一個新世界去旅游。這個世界的城市布局像一棵樹。每兩座城市之間只有一條路徑可以互達。每座城市都有一種寶石&#xff0c;有一定的價格。ZJY為了賺取最高利益&#xff0c;她會選擇從A城市買入再轉手…

一張圖看懂單機/集群/熱備/磁盤陣列(RAID)

單機部署(Standalone) 只有一個飲水機提供服務器&#xff0c;服務只部署一份 集群部署(Cluster) 多個飲水機同時提供服務&#xff0c;服務冗余部署&#xff0c;每個冗余的服務都對外提供服務&#xff0c;一個服務掛掉時依然可用 熱備部署(Hot-swap) 只有一個桶提供服務&#xf…

typescript vuex_Vue3+TypeScript完整項目上手教程

作者&#xff1a;TinssonTaihttps://juejin.im/post/6875713523968802829一個完整的Vue3Ts項目,支持.vue和.tsx寫法 項目地址&#xff1a;https://github.com/vincentzyc/vue3-demo.gitTypeScript 是JS的一個超集&#xff0c;主要提供了類型系統和對ES6的支持&#xff0c;使用 …

JS中window.showModalDialog()詳解

window.showModalDialog()方法用來創建一個顯示HTML內容的模態對話框。 window.showModelessDialog()方法用來創建一個顯示HTML內容的非模態對話框。 使用方法&#xff1a; vReturnValue window.showModalDialog(sURL [, vArguments] [,sFeatures]) vReturnValue window.show…

一個簡單的javascript節流器實現

節流器 javascript的節流器主要用于延緩某些動作的執行&#xff0c;比如ajax請求&#xff0c;如果input框注冊了input事件&#xff0c;那么當用戶輸入時就會持續的觸發這個事件&#xff0c;如果回調函數中持續的通過ajax調用后臺的接口&#xff0c;就會對服務器產生一定壓力。這…

一些會用到的知識

為什么80%的碼農都做不了架構師&#xff1f;>>> HtmlAgilityPack 用來解析HTML代碼 microsoft.mshtml CsQuery 解析HTML代碼 轉載于:https://my.oschina.net/uwith/blog/813725

eclipse怎么升級到java ee,如何為Java EE開發人員升級Eclipse?

Is there any non-painful way to upgrade an Eclipse installation? I have tried browsing the eclipse site but I cannot find an useful description.解決方案Add the update URL to your available sites:Window > Preferences > Install/Update > Available S…

LeetCode 7 Reverse Integer(反轉數字)

題目來源&#xff1a;https://leetcode.com/problems/reverse-integer/ Reverse digits of an integer. Example1: x 123, return 321Example2: x -123, return -321 解題思路&#xff1a; 其實這道題看起來非常簡單&#xff0c;要實現也是幾行代碼的事。但是有個小問題容易被…

各種蘊含算法思想的DP - 3

內容中包含 base64string 圖片造成字符過多&#xff0c;拒絕顯示轉載于:https://www.cnblogs.com/cmyg/p/9566723.html

python圖像對比_用python實現對比兩張圖片的不同

from PIL import Image from PIL import ImageChops def compare_images(path_one, path_two, diff_save_location): """ 比較圖片&#xff0c;如果有不同則生成展示不同的圖片 參數一: path_one: 第一張圖片的路徑 參數二: path_two: 第二張圖片的路徑 參數三:…

Kafka 分布式環境搭建

這篇文章將介紹如何搭建kafka環境&#xff0c;我們會從單機版開始&#xff0c;然后逐漸往分布式擴展。單機版的搭建官網上就有&#xff0c;比較容易實現&#xff0c;這里我就簡單介紹下即可&#xff0c;而分布式的搭建官網卻沒有描述&#xff0c;我們最終的目的還是用分布式來解…

Docker Machine搭建并加入節點

對于集群服務器來講&#xff0c;要在每臺機器上手動安裝Docker是一件及其痛苦的事情&#xff0c;還好有Docker Machine這一工具&#xff0c;Docker三劍客中的一角. 一、Docker Machine介紹 這個工具已經出了比較久了&#xff0c;Docker Machine官方介紹&#xff1a;https://doc…