日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【JavaScript吉光片羽】--- 滑动条

發(fā)布時(shí)間:2023/11/29 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JavaScript吉光片羽】--- 滑动条 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

燈光的亮度控制需要一個(gè)滑動(dòng)條,先借用lamp源碼中Bar:

var Bar = function (opt) {var defaults = {$id: "", // 進(jìn)度條dom節(jié)點(diǎn)idmin: 1, // 刻度最小值stepCount: 5, // 刻度步數(shù)step: 1, // 刻度步長(zhǎng)$alpha: "",//顯示亮度的idtouchEnd: function () { } // 拖動(dòng)完成回調(diào) };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 = {/*** 根據(jù)比例值來重新渲染進(jìn)度條的位置* @param ratio 取值:0~1*/refreshPos: function (ratio) {if (ratio >= 1 || ratio < 0) { // 等于1時(shí),js的%取值有問題,故排除return;}// 根據(jù)觸點(diǎn)位置更新進(jìn)度條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);}},/*** 設(shè)置指定的進(jìn)度值*/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 調(diào)用:

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

stepCount相當(dāng)于最大長(zhǎng)度。$alpha用來顯示亮度值。效果如下

主要的原理就是監(jiān)聽 touchmove事件,通過移動(dòng)的pageX減去圓點(diǎn)左邊的位置除以滑動(dòng)條的總長(zhǎng)度得到比率,最后換算成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);});

如果是豎著的滑動(dòng)條呢??暫且定義一個(gè)UpBar對(duì)象:

var UpBar = function (opt) {var defaults = {$id: "", // 進(jìn)度條dom節(jié)點(diǎn)idmin: 1, // 刻度最小值stepCount: 5, // 刻度步數(shù)step: 1, // 刻度步長(zhǎng)$alpha: "",//顯示亮度的idtouchEnd: function () { } // 拖動(dòng)完成回調(diào) };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 = {/*** 根據(jù)比例值來重新渲染進(jìn)度條的位置* @param ratio 取值:0~1*/refreshPos: function (ratio) {if (ratio >= 1 || ratio < 0) { // 等于1時(shí),js的%取值有問題,故排除return;}// 根據(jù)觸點(diǎn)位置更新進(jìn)度條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); }},/*** 設(shè)置指定的進(jìn)度值*/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>

調(diào)用:

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

效果如下:

主要的區(qū)別是left-->bottom,width-->height,另外一個(gè)因?yàn)閥軸是以左上角為0,0的,touch.pageY越往下越大,所以算比率的時(shí)候用要這樣:

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事件。

?

總結(jié)

以上是生活随笔為你收集整理的【JavaScript吉光片羽】--- 滑动条的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。