亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

JavaScript實現選擇框按比例拖拉縮放的方法

2019-11-20 11:55:39
字體:
來源:轉載
供稿:網友

本文實例講述了JavaScript實現選擇框按比例拖拉縮放的方法。分享給大家供大家參考。具體如下:

這里通過javascript實現可以像PS一樣拉出一個選擇框的效果。里面的很多方法都是我們值得學習的。

運行效果如下圖所示:

具體代碼如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>JavaScript拖拉縮放效果</title></head><body><script>var isIE = (document.all) ? true : false;var $ = function (id) {  return "string" == typeof id ? document.getElementById(id) : id;};var Class = {  create: function() {    return function() { this.initialize.apply(this, arguments); }  }}var Extend = function(destination, source) {  for (var property in source) {    destination[property] = source[property];  }}var Bind = function(object, fun) {  return function() {    return fun.apply(object, arguments);  }}var BindAsEventListener = function(object, fun) {  var args = Array.prototype.slice.call(arguments).slice(2);  return function(event) {    return fun.apply(object, [event || window.event].concat(args));  }}var CurrentStyle = function(element){  return element.currentStyle || document.defaultView.getComputedStyle(element, null);}function addEventHandler(oTarget, sEventType, fnHandler) {  if (oTarget.addEventListener) {    oTarget.addEventListener(sEventType, fnHandler, false);  } else if (oTarget.attachEvent) {    oTarget.attachEvent("on" + sEventType, fnHandler);  } else {    oTarget["on" + sEventType] = fnHandler;  }};function removeEventHandler(oTarget, sEventType, fnHandler) { if (oTarget.removeEventListener) {  oTarget.removeEventListener(sEventType, fnHandler, false); } else if (oTarget.detachEvent) {  oTarget.detachEvent("on" + sEventType, fnHandler); } else {   oTarget["on" + sEventType] = null; }};//縮放程序var Resize = Class.create();Resize.prototype = {//縮放對象initialize: function(obj, options) {  this._obj = $(obj);//縮放對象    this._styleWidth = this._styleHeight = this._styleLeft = this._styleTop = 0;//樣式參數  this._sideRight = this._sideDown = this._sideLeft = this._sideUp = 0;//坐標參數  this._fixLeft = this._fixTop = 0;//定位參數  this._scaleLeft = this._scaleTop = 0;//定位坐標  this._mxSet = function(){};//范圍設置程序  this._mxRightWidth = this._mxDownHeight = this._mxUpHeight = this._mxLeftWidth = 0;//范圍參數  this._mxScaleWidth = this._mxScaleHeight = 0;//比例范圍參數  this._fun = function(){};//縮放執行程序  //獲取邊框寬度  var _style = CurrentStyle(this._obj);  this._borderX = (parseInt(_style.borderLeftWidth) || 0) + (parseInt(_style.borderRightWidth) || 0);  this._borderY = (parseInt(_style.borderTopWidth) || 0) + (parseInt(_style.borderBottomWidth) || 0);  //事件對象(用于綁定移除事件)  this._fR = BindAsEventListener(this, this.Resize);  this._fS = Bind(this, this.Stop);  this.SetOptions(options);  //范圍限制  this.Max = !!this.options.Max;  this._mxContainer = $(this.options.mxContainer) || null;  this.mxLeft = Math.round(this.options.mxLeft);  this.mxRight = Math.round(this.options.mxRight);  this.mxTop = Math.round(this.options.mxTop);  this.mxBottom = Math.round(this.options.mxBottom);  //寬高限制  this.Min = !!this.options.Min;  this.minWidth = Math.round(this.options.minWidth);  this.minHeight = Math.round(this.options.minHeight);  //按比例縮放  this.Scale = !!this.options.Scale;  this.Ratio = Math.max(this.options.Ratio, 0);  this.onResize = this.options.onResize;  this._obj.style.position = "absolute";  !this._mxContainer || CurrentStyle(this._mxContainer).position == "relative" || (this._mxContainer.style.position = "relative"); }, //設置默認屬性 SetOptions: function(options) { this.options = {//默認值    Max:    false,//是否設置范圍限制(為true時下面mx參數有用)    mxContainer:"",//指定限制在容器內    mxLeft:    0,//左邊限制    mxRight:  9999,//右邊限制    mxTop:    0,//上邊限制    mxBottom:  9999,//下邊限制    Min:    false,//是否最小寬高限制(為true時下面min參數有用)    minWidth:  50,//最小寬度    minHeight:  50,//最小高度    Scale:    false,//是否按比例縮放    Ratio:    0,//縮放比例(寬/高)    onResize:  function(){}//縮放時執行 }; Extend(this.options, options || {}); }, //設置觸發對象 Set: function(resize, side) {  var resize = $(resize), fun;  if(!resize) return;  //根據方向設置  switch (side.toLowerCase()) {  case "up" :    fun = this.Up;    break;  case "down" :    fun = this.Down;    break;  case "left" :    fun = this.Left;    break;  case "right" :    fun = this.Right;    break;  case "left-up" :    fun = this.LeftUp;    break;  case "right-up" :    fun = this.RightUp;    break;  case "left-down" :    fun = this.LeftDown;    break;  case "right-down" :  default :    fun = this.RightDown;  };  //設置觸發對象  addEventHandler(resize, "mousedown", BindAsEventListener(this, this.Start, fun)); }, //準備縮放 Start: function(e, fun, touch) {    //防止冒泡(跟拖放配合時設置)  e.stopPropagation ? e.stopPropagation() : (e.cancelBubble = true);  //設置執行程序  this._fun = fun;  //樣式參數值  this._styleWidth = this._obj.clientWidth;  this._styleHeight = this._obj.clientHeight;  this._styleLeft = this._obj.offsetLeft;  this._styleTop = this._obj.offsetTop;  //四條邊定位坐標  this._sideLeft = e.clientX - this._styleWidth;  this._sideRight = e.clientX + this._styleWidth;  this._sideUp = e.clientY - this._styleHeight;  this._sideDown = e.clientY + this._styleHeight;  //top和left定位參數  this._fixLeft = this._styleLeft + this._styleWidth;  this._fixTop = this._styleTop + this._styleHeight;  //縮放比例  if(this.Scale){    //設置比例    this.Ratio = Math.max(this.Ratio, 0) || this._styleWidth / this._styleHeight;    //left和top的定位坐標    this._scaleLeft = this._styleLeft + this._styleWidth / 2;    this._scaleTop = this._styleTop + this._styleHeight / 2;  };  //范圍限制  if(this.Max){    //設置范圍參數    var mxLeft = this.mxLeft, mxRight = this.mxRight, mxTop = this.mxTop, mxBottom = this.mxBottom;    //如果設置了容器,再修正范圍參數    if(!!this._mxContainer){      mxLeft = Math.max(mxLeft, 0);      mxTop = Math.max(mxTop, 0);      mxRight = Math.min(mxRight, this._mxContainer.clientWidth);      mxBottom = Math.min(mxBottom, this._mxContainer.clientHeight);    };    //根據最小值再修正    mxRight = Math.max(mxRight, mxLeft + (this.Min ? this.minWidth : 0) + this._borderX);    mxBottom = Math.max(mxBottom, mxTop + (this.Min ? this.minHeight : 0) + this._borderY);    //由于轉向時要重新設置所以寫成function形式    this._mxSet = function(){      this._mxRightWidth = mxRight - this._styleLeft - this._borderX;      this._mxDownHeight = mxBottom - this._styleTop - this._borderY;      this._mxUpHeight = Math.max(this._fixTop - mxTop, this.Min ? this.minHeight : 0);      this._mxLeftWidth = Math.max(this._fixLeft - mxLeft, this.Min ? this.minWidth : 0);    };    this._mxSet();    //有縮放比例下的范圍限制    if(this.Scale){      this._mxScaleWidth = Math.min(this._scaleLeft - mxLeft, mxRight - this._scaleLeft - this._borderX) * 2;      this._mxScaleHeight = Math.min(this._scaleTop - mxTop, mxBottom - this._scaleTop - this._borderY) * 2;    };  };  //mousemove時縮放 mouseup時停止  addEventHandler(document, "mousemove", this._fR);  addEventHandler(document, "mouseup", this._fS);  if(isIE){    addEventHandler(this._obj, "losecapture", this._fS);    this._obj.setCapture();  }else{    addEventHandler(window, "blur", this._fS);    e.preventDefault();  }; }, //縮放 Resize: function(e) {  //清除選擇  window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();  //執行縮放程序  this._fun(e);  //設置樣式,變量必須大于等于0否則ie出錯  with(this._obj.style){    width = this._styleWidth + "px"; height = this._styleHeight + "px";    top = this._styleTop + "px"; left = this._styleLeft + "px";  }  //附加程序  this.onResize(); }, //縮放程序 //上 Up: function(e) {  this.RepairY(this._sideDown - e.clientY, this._mxUpHeight);  this.RepairTop();  this.TurnDown(this.Down); }, //下 Down: function(e) {  this.RepairY(e.clientY - this._sideUp, this._mxDownHeight);  this.TurnUp(this.Up); }, //右 Right: function(e) {  this.RepairX(e.clientX - this._sideLeft, this._mxRightWidth);  this.TurnLeft(this.Left); }, //左 Left: function(e) {  this.RepairX(this._sideRight - e.clientX, this._mxLeftWidth);  this.RepairLeft();  this.TurnRight(this.Right); }, //右下 RightDown: function(e) {  this.RepairAngle(    e.clientX - this._sideLeft, this._mxRightWidth,    e.clientY - this._sideUp, this._mxDownHeight  );  this.TurnLeft(this.LeftDown) || this.Scale || this.TurnUp(this.RightUp); }, //右上 RightUp: function(e) {  this.RepairAngle(    e.clientX - this._sideLeft, this._mxRightWidth,    this._sideDown - e.clientY, this._mxUpHeight  );  this.RepairTop();  this.TurnLeft(this.LeftUp) || this.Scale || this.TurnDown(this.RightDown); }, //左下 LeftDown: function(e) {  this.RepairAngle(    this._sideRight - e.clientX, this._mxLeftWidth,    e.clientY - this._sideUp, this._mxDownHeight  );  this.RepairLeft();  this.TurnRight(this.RightDown) || this.Scale || this.TurnUp(this.LeftUp); }, //左上 LeftUp: function(e) {  this.RepairAngle(    this._sideRight - e.clientX, this._mxLeftWidth,    this._sideDown - e.clientY, this._mxUpHeight  );  this.RepairTop(); this.RepairLeft();  this.TurnRight(this.RightUp) || this.Scale || this.TurnDown(this.LeftDown); }, //水平方向 RepairX: function(iWidth, mxWidth) {  iWidth = this.RepairWidth(iWidth, mxWidth);  if(this.Scale){    var iHeight = this.RepairScaleHeight(iWidth);    if(this.Max && iHeight > this._mxScaleHeight){      iHeight = this._mxScaleHeight;      iWidth = this.RepairScaleWidth(iHeight);    }else if(this.Min && iHeight < this.minHeight){      var tWidth = this.RepairScaleWidth(this.minHeight);      if(tWidth < mxWidth){ iHeight = this.minHeight; iWidth = tWidth; }    }    this._styleHeight = iHeight;    this._styleTop = this._scaleTop - iHeight / 2;  }  this._styleWidth = iWidth; }, //垂直方向 RepairY: function(iHeight, mxHeight) {  iHeight = this.RepairHeight(iHeight, mxHeight);  if(this.Scale){    var iWidth = this.RepairScaleWidth(iHeight);    if(this.Max && iWidth > this._mxScaleWidth){      iWidth = this._mxScaleWidth;      iHeight = this.RepairScaleHeight(iWidth);    }else if(this.Min && iWidth < this.minWidth){      var tHeight = this.RepairScaleHeight(this.minWidth);      if(tHeight < mxHeight){ iWidth = this.minWidth; iHeight = tHeight; }    }    this._styleWidth = iWidth;    this._styleLeft = this._scaleLeft - iWidth / 2;  }  this._styleHeight = iHeight; }, //對角方向 RepairAngle: function(iWidth, mxWidth, iHeight, mxHeight) {  iWidth = this.RepairWidth(iWidth, mxWidth);    if(this.Scale){    iHeight = this.RepairScaleHeight(iWidth);    if(this.Max && iHeight > mxHeight){      iHeight = mxHeight;      iWidth = this.RepairScaleWidth(iHeight);    }else if(this.Min && iHeight < this.minHeight){      var tWidth = this.RepairScaleWidth(this.minHeight);      if(tWidth < mxWidth){ iHeight = this.minHeight; iWidth = tWidth; }    }  }else{    iHeight = this.RepairHeight(iHeight, mxHeight);  }  this._styleWidth = iWidth;  this._styleHeight = iHeight; }, //top RepairTop: function() {  this._styleTop = this._fixTop - this._styleHeight; }, //left RepairLeft: function() {  this._styleLeft = this._fixLeft - this._styleWidth; }, //height RepairHeight: function(iHeight, mxHeight) {  iHeight = Math.min(this.Max ? mxHeight : iHeight, iHeight);  iHeight = Math.max(this.Min ? this.minHeight : iHeight, iHeight, 0);  return iHeight; }, //width RepairWidth: function(iWidth, mxWidth) {  iWidth = Math.min(this.Max ? mxWidth : iWidth, iWidth);  iWidth = Math.max(this.Min ? this.minWidth : iWidth, iWidth, 0);  return iWidth; }, //比例高度 RepairScaleHeight: function(iWidth) {  return Math.max(Math.round((iWidth + this._borderX) / this.Ratio - this._borderY), 0); }, //比例寬度 RepairScaleWidth: function(iHeight) {  return Math.max(Math.round((iHeight + this._borderY) * this.Ratio - this._borderX), 0); }, //轉向程序 //轉右 TurnRight: function(fun) {  if(!(this.Min || this._styleWidth)){    this._fun = fun;    this._sideLeft = this._sideRight;    this.Max && this._mxSet();    return true;  } }, //轉左 TurnLeft: function(fun) {  if(!(this.Min || this._styleWidth)){    this._fun = fun;    this._sideRight = this._sideLeft;    this._fixLeft = this._styleLeft;    this.Max && this._mxSet();    return true;  } }, //轉上 TurnUp: function(fun) {  if(!(this.Min || this._styleHeight)){    this._fun = fun;    this._sideDown = this._sideUp;    this._fixTop = this._styleTop;    this.Max && this._mxSet();    return true;  } }, //轉下 TurnDown: function(fun) {  if(!(this.Min || this._styleHeight)){    this._fun = fun;    this._sideUp = this._sideDown;    this.Max && this._mxSet();    return true;  } }, //停止縮放 Stop: function() {  removeEventHandler(document, "mousemove", this._fR);  removeEventHandler(document, "mouseup", this._fS);  if(isIE){    removeEventHandler(this._obj, "losecapture", this._fS);    this._obj.releaseCapture();  }else{    removeEventHandler(window, "blur", this._fS);  } }};</script><style type="text/css">#rRightDown,#rLeftDown,#rLeftUp,#rRightUp,#rRight,#rLeft,#rUp,#rDown{  position:absolute;  background:#C00;  width:7px;  height:7px;  z-index:5;  font-size:0;}#rLeftDown,#rRightUp{cursor:ne-resize;}#rRightDown,#rLeftUp{cursor:nw-resize;}#rRight,#rLeft{cursor:e-resize;}#rUp,#rDown{cursor:n-resize;}#rLeftDown{left:-4px;bottom:-4px;}#rRightUp{right:-4px;top:-4px;}#rRightDown{right:-4px;bottom:-4px;background-color:#00F;}#rLeftUp{left:-4px;top:-4px;}#rRight{right:-4px;top:50%;margin-top:-4px;}#rLeft{left:-4px;top:50%;margin-top:-4px;}#rUp{top:-4px;left:50%;margin-left:-4px;}#rDown{bottom:-4px;left:50%;margin-left:-4px;}#bgDiv{width:600px; height:300px; border:10px solid #666666; position:relative;}#dragDiv{border:1px solid #000000; width:100px; height:60px; top:50px; left:50px; background:#fff;}</style><div id="bgDiv"> <div id="dragDiv"> <div id="rRightDown"> </div> <div id="rLeftDown"> </div> <div id="rRightUp"> </div> <div id="rLeftUp"> </div> <div id="rRight"> </div> <div id="rLeft"> </div> <div id="rUp"> </div> <div id="rDown"></div> </div></div><input id="idScale" type="button" value="設置比例" /><input id="idMin" type="button" value="設置最小范圍" /><script>var rs = new Resize("dragDiv", { Max: true, mxContainer: "bgDiv" });rs.Set("rRightDown", "right-down");rs.Set("rLeftDown", "left-down");rs.Set("rRightUp", "right-up");rs.Set("rLeftUp", "left-up");rs.Set("rRight", "right");rs.Set("rLeft", "left");rs.Set("rUp", "up");rs.Set("rDown", "down");$("idScale").onclick = function(){  if(rs.Scale){    this.value = "設置比例";    rs.Scale = false;  }else{    this.value = "取消比例";    rs.Ratio = 0;    rs.Scale = true;  }}$("idMin").onclick = function(){  if(rs.Min){    this.value = "設置最小范圍";    rs.Min = false;  }else{    this.value = "取消最小范圍";    rs.Min = true;  }}</script></body></html>

希望本文所述對大家的javascript程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
57pao成人永久免费视频| 日韩av成人在线| 色多多国产成人永久免费网站| 国产亚洲精品久久久久久777| 777国产偷窥盗摄精品视频| 亚洲视频电影图片偷拍一区| 国产精品成人免费视频| 国产小视频国产精品| 日韩高清电影好看的电视剧电影| 中文字幕视频在线免费欧美日韩综合在线看| 91久久精品国产91性色| 日本在线观看天堂男亚洲| 亚洲精品wwww| 国产日韩欧美夫妻视频在线观看| 欧美专区在线观看| 国产久一一精品| 国产亚洲视频中文字幕视频| 国产69久久精品成人看| 国产精品成人av在线| 福利一区福利二区微拍刺激| 久久久精品一区二区三区| 成人午夜一级二级三级| 成人高清视频观看www| 亚洲女人天堂视频| 91国在线精品国内播放| 亚洲日本aⅴ片在线观看香蕉| 国产精品视频免费在线| 亚洲综合视频1区| 久久视频国产精品免费视频在线| 亚洲欧美中文字幕| 欧美性猛交xxxx免费看漫画| 91chinesevideo永久地址| x99av成人免费| 欧美成年人视频网站| 欧美日本啪啪无遮挡网站| 国产成一区二区| 欧美成人网在线| 免费不卡在线观看av| 91国内产香蕉| 久久久精品日本| 亚洲女人初尝黑人巨大| 日本精品在线视频| 国产黑人绿帽在线第一区| 日韩成人xxxx| 久久久黄色av| 欧美日韩视频在线| 欧美一区二区三区艳史| 久久久久久久久久国产| 国产不卡精品视男人的天堂| 亚洲色图av在线| 精品久久久久久亚洲国产300| 日韩在线视频免费观看高清中文| 国模精品系列视频| 亚洲第一精品夜夜躁人人躁| 日韩国产欧美精品一区二区三区| 精品女厕一区二区三区| 热门国产精品亚洲第一区在线| 国产欧美日韩精品丝袜高跟鞋| 57pao成人国产永久免费| 欧美专区在线播放| 欧美日韩国产精品一区二区三区四区| 久久色精品视频| 欧美最猛性xxxxx(亚洲精品)| 国产欧美日韩精品丝袜高跟鞋| 91成人国产在线观看| 亚洲精品久久久久久久久久久| 日本亚洲精品在线观看| 久久亚洲精品毛片| 日韩亚洲欧美成人| 欧美午夜女人视频在线| 日韩精品视频在线播放| 欧美激情亚洲视频| 国产欧美在线看| 亚洲精品日韩av| 国产日韩欧美日韩大片| 日本不卡免费高清视频| 精品久久久久久久久国产字幕| 精品国内产的精品视频在线观看| 久久在线视频在线| 亚洲一区二区三区777| 亚洲第一天堂av| 欧美专区中文字幕| 欧美极品少妇xxxxx| 91啪国产在线| 日韩中文字幕免费视频| 国产精品综合不卡av| 欧美成人在线免费| 95av在线视频| 69久久夜色精品国产69乱青草| 欧美激情一级欧美精品| 国产精品自产拍在线观看中文| 成人黄色在线免费| 日韩av影视综合网| 中文字幕日韩视频| 国产91色在线免费| 97超级碰碰碰久久久| 久热爱精品视频线路一| 国产91精品久久久久| 欧美国产精品va在线观看| 麻豆国产精品va在线观看不卡| 久久久久www| 中文字幕亚洲欧美在线| 日韩av大片在线| 国产成人综合久久| 51午夜精品视频| 日产精品99久久久久久| 精品久久久久久中文字幕大豆网| 91精品91久久久久久| 疯狂蹂躏欧美一区二区精品| 欧美国产日本高清在线| 国产精品扒开腿做爽爽爽视频| 欧美性猛交xxxx黑人| 亚洲精品欧美极品| 欧美亚洲一区在线| 91香蕉国产在线观看| 亚洲欧美在线x视频| 日韩人体视频一二区| 欧美成人免费网| 麻豆国产精品va在线观看不卡| 米奇精品一区二区三区在线观看| 日韩女在线观看| 欧美高清激情视频| 久久精品国产成人| 欧美激情乱人伦| 日韩av影视综合网| 欧美性生交xxxxx久久久| 欧美日韩免费观看中文| 国产欧美一区二区三区在线看| 久久久av电影| 亚洲三级黄色在线观看| 欧美激情一二三| 久久亚洲精品一区二区| 91亚洲午夜在线| 国产精品中文字幕在线| 尤物九九久久国产精品的分类| 久久精品99久久久香蕉| 久久夜精品va视频免费观看| 国产成人涩涩涩视频在线观看| 国产精品丝袜久久久久久高清| 黑人巨大精品欧美一区免费视频| 欧美一级淫片丝袜脚交| 亲爱的老师9免费观看全集电视剧| 国产一区二区三区在线看| 国产精品爽黄69| 欧美怡春院一区二区三区| 国产精品久久色| 亚洲精品小视频| 亚洲国产精品高清久久久| 国产精品久久久久久中文字| 中文字幕日本精品| 91久久久久久久久久久| 精品自拍视频在线观看| 成人亚洲欧美一区二区三区| 77777少妇光屁股久久一区| 狠狠躁夜夜躁人人爽天天天天97| 欧美性猛交xxxxx免费看| 国产精品日本精品| 亚洲国产小视频| 亚洲欧美国产精品专区久久| 国产精品爽黄69天堂a| 国产精品久久视频| 97精品一区二区视频在线观看| 亚洲japanese制服美女| 日韩av网站在线|