h5頁面要求作出有客戶端的切換效果javascript
有和知乎差很少的貝塞爾側拉,想着以後能夠偷懶套用,因而就寫了個貝塞爾的原型對象。css
// 生成貝塞爾下拉 // 使用原型對象 function Bezier(options) { //默認參數 this.default = $.extend({ direction:'', box:'body', fillStyle:'#A0B7FF', // 默認控制點 point:{ x:0, y:0, opacity:0, } },options); // 實際參數 this.args = this.default; // canvas dom對象 this.canvas = ''; //執行消失標誌(保存消失句柄) this.hideFlag = ''; this.delayFlag = ''; } Bezier.prototype = { //建立貝塞爾 createBezier:function(options){ // 清除繼續隱藏 if(this.hideFlag||this.delayFlag){ clearInterval(this.hideFlag); clearTimeout(this.delayFlag); this.hideFlag = ''; this.delayFlag = ''; } this.args = $.extend(this.default,options); this.fillHtml(); this.drawCanvas(); this.delayHide() }, //填充HTML fillHtml:function(){ var _box = $(this.args.box); var _bezier = _box.find('#bezier_box'); var html = ''; if(_bezier.length === 0){ _box.append('<div class = "_tab_bezier_box"><canvas width="'+_box.width()+'" height="'+_box.height()+'" id = "bezier_box"></canvas></div>'); //爲了保證定位向外部添加屬性 _box.css('position','relative'); _bezier = _box.find('#bezier_box'); } this.canvas = document.getElementById('bezier_box'); }, //延遲自動消失 delayHide:function(){ var that = this; var hideCanvas = function(){ clearInterval(that.hideFlag); that.hideCanvas(); } this.delayFlag = setTimeout(hideCanvas, 500); }, //消失 //扯平而且淡出 hideCanvas:function(){ var that = this; clearInterval(this.hideFlag); //清除延時 clearTimeout(this.delayFlag); var drawHideCanvas = function(){ if(that.args.point.x < that.default.point.x/2){ clearInterval(that.hideFlag) return; } that.args.point.x -= 1; that.args.point.opacity -= 0.005; that.drawCanvas() } this.hideFlag = setInterval(drawHideCanvas,10); }, // 畫以及填充 // point{x:0,y:0,opacity:0} drawCanvas:function(point){ if(!this.canvas){ return; } var _point = $.extend(this.args.point,point); var _box = $(this.args.box); var _direction = this.args.direction; var canvas = this.canvas; _bezier = $(this.args.box).find('#bezier_box'); _bezier.css('opacity',_point.opacity); var _pointX = parseInt(_point.x); var _pointY = parseInt(_point.y); var _boxWidth = _box.width(); var _boxHeight = _box.height(); // 由canvas獲取 繪圖的上下文 var ctx = this.canvas.getContext('2d'); //開始繪製 ctx.beginPath(); //清空畫布 ctx.clearRect(0,0,this.canvas.width,this.canvas.height); switch(_direction){ case 'left': // 繪圖的基點 ctx.moveTo(0,0); //繪製從前一次到這個點的直線 ctx.lineTo(_pointX/2,0); ctx.quadraticCurveTo(_pointX,_pointY,_pointX/2,_boxHeight) // ctx.lineTo(_pointX/2,640) ctx.lineTo(0,_boxHeight); break; case 'right': var leftPoint = _boxWidth - _pointX/2; // 繪圖的基點 ctx.moveTo(_boxWidth,0); //繪製從前一次到這個點的直線 ctx.lineTo(leftPoint,0); ctx.quadraticCurveTo(leftPoint-_pointX/2,_pointY,leftPoint,_boxHeight) ctx.lineTo(_boxWidth,_boxHeight); break; // case 'top': // // 繪圖的基點 // ctx.moveTo(0,0); // //繪製從前一次到這個點的直線 // ctx.lineTo(0,_pointY/2); // // ctx.quadraticCurveTo(_pointX,_pointY,_boxWidth,_pointY/2) // ctx.lineTo(_boxWidth,0); // break; default: break; } //結束繪製 ctx.closePath(); // 進行繪圖處理 ctx.fillStyle = '#C9DAFF'; // 填充路徑 ctx.fill(); } }