ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptをベースに画像切り取り効果を実装するサンプルコード(写真)

JavaScriptをベースに画像切り取り効果を実装するサンプルコード(写真)

黄舟
黄舟オリジナル
2017-03-22 14:44:341783ブラウズ

この記事では、画像の切り取り効果を実現するための JavaScript の使用方法を主に紹介しており、必要な友達は参考にしてください

マウスの座標位置を取得する方法を学習します。およびモニターのマウス ボタンを使用して、マウスをドラッグして画像のサイズを変更することができます。

CSSでクリップ属性を学ぶこともできます。

1. CSS を使用して画像の不透明度とトリミング効果を実現します。

画像切り取りの3層構造

1. 不透明度の最初のレイヤー、レイヤーの透明度を設定します

2. クリップの2番目のレイヤー、クリップ属性:画像の一部を表示するように切り取ります。画像、その他 部分的に非表示

3. マーキー絶対の 3 番目のレイヤー (2 番目のレイヤーと重なる)、8 つのタッチ ポイントの効果を含む

JavaScriptをベースに画像切り取り効果を実装するサンプルコード(写真)

html コード:

<p id="box">
 <img src="img/1.jpg" id="img1" />
 <img src="img/1.jpg" id="img2" />
 <p id="main">
  <p class="pmin up-left"></p>
  <p class="pmin up"></p>
  <p class="pmin up-right"></p>
  <p class="pmin right"></p>
  <p class="pmin right-down"></p>
  <p class="pmin down"></p>
  <p class="pmin left-down"></p>
  <p class="pmin left"></p>
 </p>
</p>

css コード:

body{
  background: #333;
 }
 #box{
  width: 500px;
  height: 380px;
  position: absolute;
  top: 100px;
  left: 200px;
 }
 #img1,#img2{
  position: absolute;
  top: 0;
  left: 0;
 }
 #img1{
  opacity: 0.3;
 }
 #img2{
  clip: rect(0,200px,200px,0);
 }
 #main{
  position: absolute;/*第三层需用绝对定位浮在上面*/
  width: 200px;
  height: 200px;
  border: 1px solid #fff;
 }
 .pmin{
  position: absolute;
  width: 8px;
  height: 8px;
  background: #fff;
 }
 .up-left{margin-top: -4px;margin-left: -4px;cursor: nw-resize;}
 .up{
  left: 50%;/*父元素盒子main宽度的一半,注意要有绝对定位*/
  margin-left:-4px;
  top: -4px;
  cursor: n-resize;
 }
 .up-right{top: -4px;right: -4px;cursor: ne-resize;}
 .right{top: 50%;margin-top: -4px;right: -4px;cursor: e-resize;}
 .right-down{right: -4px;bottom: -4px;cursor: se-resize;}
 .down{bottom: -4px;left: 50%;margin-left: -4px;cursor: s-resize;}
 .left-down{left: -4px;bottom: -4px;cursor: sw-resize;}
 .left{left: -4px;top: 50%;margin-top: -4px;cursor: w-resize;}

two 、JavaScript は選択ボックスのオフセットを取得します

選択ボックスのマウスドラッグ位置の詳細な説明:

offsetLeft: 親要素の左境界線に対する要素の距離

clientX: 横座標マウスの位置;

clientWidth: 要素 幅;

offsetXY: はイベントが発生するボックス モデル内の座標であり、スクロール バーとは関係ありません。

clientXY: これはブラウザ全体の利用可能な部分の座標であり、スクロール バーとは関係ありません。つまり、スクロール バーを表示するためにドラッグする必要がある領域は考慮されません。

pageXY: スクロールバーに関連する、Web ページ全体の座標です。

JavaScriptをベースに画像切り取り効果を実装するサンプルコード(写真)

getPosition() 関数を構築して、画面の左および上からの要素の距離を取得します

js コードは次のとおりです:

//获取元素相对于屏幕左边及上边的距离,利用offsetLeft
 function getPosition(el){
  var left = el.offsetLeft;
  var top = el.offsetTop;
  var parent = el.offsetParent;
  while(parent != null){
   left += parent.offsetLeft;
   top += parent.offsetTop;
   parent = parent.offsetParent;
  }
  return {"left":left,"top":top};
 }

3. JavaScript はコントロールの連絡先を実装します

マウスを監視するには、プレス、ドラッグ、リリースのイベントによってマーキーのサイズを制御します。

違いに注意してください:

Element.clientWidth プロパティは、要素の内部幅をピクセル単位で表します。このプロパティには パディング が含まれますが、垂直スクロールバー (存在する場合)、境界線、および マージン は含まれません。

つまり、clientWidth には境界線が含まれず、offsetWidth には境界線が含まれます

1) 右側の連絡先をクリックします

js コード:

var mainp = $(&#39;main&#39;);
 var rightp = $(&#39;right&#39;);
 var isDraging = false;
 var contact = "";//表示被按下的触点
 //鼠标按下时
 rightp.onmousedown = function(){
  isDraging = true;
  contact = "right";
 }
 //鼠标松开时
 window.onmouseup = function(){
  isDraging = false;
 }
 //鼠标移动时
 window.onmousemove = function(e){
  if(isDraging == true){
   if(contact == "right"){
    var e = e||window.event;
    var x = e.clientX;//鼠标位置的横坐标
    var widthBefore = mainp.offsetWidth - 2;//选取框变化前的宽度
    //var widthBefore = mainp.clientWidth;
    var addWidth = x - getPosition(mainp).left - widthBefore;//鼠标移动后选取框增加的宽度
    mainp.style.width = widthBefore + addWidth + &#39;px&#39;;//选取框变化后的宽度
   }
  }
 }
//获取id的函数
function $(id){
 return document.getElementById(id);
}

2) 上の連絡先をクリックします

上部中央をクリックすると移動する接点、選択ボックスの高さ、左上隅の位置を変更する必要があります。

増加した高さ = 画面の上部を基準とした選択ボックスの距離 - マウス位置の縦座標

選択ボックスの左上隅の上部の値は、増加した高さから減算する必要があります。マウスを上に移動すると、高さが増加し、上部の値が減少します。移動すると、高さが減少し、上部が増加します。

変更図:

JavaScriptをベースに画像切り取り効果を実装するサンプルコード(写真)

jsコード:


else if(contact == "up"){
    var y = e.clientY;//鼠标位置的纵坐标
    var heightBefore = mainp.offsetHeight - 2;//选取框变化前的高度
    var addHeight = getPosition(mainp).top - y;//增加的高度
    mainp.style.height = heightBefore + addHeight + &#39;px&#39;;//选取框变化后的宽度
    mainp.style.top = mainp.offsetTop - addHeight + &#39;px&#39;;//相当于变化后左上角的纵坐标,鼠标向上移纵坐标减小,下移增大
   }

3) 左の接点をクリック

原理は上の接点をクリックするのと同じで、幅と左の位置が変わります

変更図:

JavaScriptをベースに画像切り取り効果を実装するサンプルコード(写真)

jsコード:


 else if(contact == "left"){
     var widthBefore = mainp.offsetWidth - 2;
      var addWidth = getPosition(mainp).left - e.clientX;//增加的宽度等于距离屏幕左边的距离减去鼠标位置横坐标
      mainp.style.width = widthBefore + addWidth + &#39;px&#39;;
     mainp.style.left = mainp.offsetLeft - addWidth + &#39;px&#39;;//左边的距离(相当于左边位置横坐标)等于选取框距父级元素的距离减去增加的宽度
   }

4) 下の接点をクリック

増加した幅=マウス位置の縦座標 - 画面上端からの距離 - 元の幅

上部の位置左隅は変更する必要はありません

jsコード:


else if(contact = "down"){
     var heightBefore = mainp.offsetHeight - 2;
     var addHeight = e.clientY - getPosition(mainp).top - mainp.offsetHeight;
     mainp.style.height = heightBefore + addHeight + &#39;px&#39;;
    }

5) 四隅をクリックしたときの変更は、高さと幅の変更を重ね合わせたものであるため、上記の4つの変更を関数にカプセル化するのが最善ですメンテナンスとコードの再利用を容易にするため。 S if elseを使用した場合に8回判定が必要な場合は

switch文

に変更して以下のように改造JSコードを簡略化します:

window.onmousemove = function(e){
  var e = e||window.event;
  if(isDraging == true){
   switch (contact){
    case "up" : upMove(e);break;
    case "right" : rightMove(e);break;
    case "down" : downMove(e);break;
    case "left" : leftMove(e);break;
    case "up-right" : upMove(e);rightMove(e);break;
    case "down-right" : downMove(e);rightMove(e);break;
    case "down-left" : downMove(e);leftMove(e);break;
    case "up-left" : upMove(e);leftMove(e);break;
   }
  }
 }
//获取id的函数
function $(id){
 return document.getElementById(id);
}
//获取元素相对于屏幕左边及上边的距离,利用offsetLeft
 function getPosition(el){
  var left = el.offsetLeft;
  var top = el.offsetTop;
  var parent = el.offsetParent;
  while(parent != null){
   left += parent.offsetLeft;
   top += parent.offsetTop;
   parent = parent.offsetParent;
  }
  return {"left":left,"top":top};
 }
 //up移动
 function upMove(e){
  var y = e.clientY;//鼠标位置的纵坐标
  var heightBefore = mainp.offsetHeight - 2;//选取框变化前的高度
  var addHeight = getPosition(mainp).top - y;//增加的高度
  mainp.style.height = heightBefore + addHeight + 'px';//选取框变化后的宽度
  mainp.style.top = mainp.offsetTop - addHeight + 'px';//相当于变化后左上角的纵坐标,鼠标向上移纵坐标减小,下移增大
 }
 //right移动
 function rightMove(e){
  var x = e.clientX;//鼠标位置的横坐标
  var widthBefore = mainp.offsetWidth - 2;//选取框变化前的宽度
  //var widthBefore = mainp.clientWidth;
  var addWidth = x - getPosition(mainp).left - widthBefore;//鼠标移动后选取框增加的宽度
  mainp.style.width = widthBefore + addWidth + 'px';//选取框变化后的宽度
 }
 //down移动
 function downMove(e){
  var heightBefore = mainp.offsetHeight - 2;
  var addHeight = e.clientY - getPosition(mainp).top - mainp.offsetHeight;
  mainp.style.height = heightBefore + addHeight + 'px';
 }
 //left移动
 function leftMove(e){
  var widthBefore = mainp.offsetWidth - 2;
  var addWidth = getPosition(mainp).left - e.clientX;//增加的宽度等于距离屏幕左边的距离减去鼠标位置横坐标
  mainp.style.width = widthBefore + addWidth + 'px';
  mainp.style.left = mainp.offsetLeft - addWidth + 'px';//左边的距离(相当于左边位置横坐标)等于选取框距父级元素的距离减去增加的宽度
 }


4. セレクトボックス領域の明るい表示を実現

1) 選択ボックスの 2 番目のレイヤー画像は、クリップ属性をリセットする必要があります アイコンの 4 つの側面:

js コード:

//设置选取框图片区域明亮显示
 function setChoice(){
  var top = mainp.offsetTop;
  var right = mainp.offsetLeft + mainp.offsetWidth;
  var bottom = mainp.offsetTop + mainp.offsetHeight;
  var left = mainp.offsetLeft;
  img2.style.clip = "rect("+top+"px,"+right+"px,"+bottom+"px,"+left+"px)";
 }
JavaScriptをベースに画像切り取り効果を実装するサンプルコード(写真)2) マウスが移動すると、画像が選択されますこれは、js コードにあります。 画像が選択されないようにコード行を追加します

//禁止图片被选中
 document.onselectstart = new Function(&#39;event.returnValue = false;&#39;);

CSS スタイルに *{user-select:none} を追加することもできます

これは、テキストが選択できないことを意味します、画像に対して p と同じ効果があります。

5. ドラッグ可能なマーキー位置を実装します

まず、イベントのバブリングを停止します JS コードは次のとおりです:

//鼠标按下触点时
 rightp.onmousedown = function(e){
  e.stopPropagation();
  isDraging = true;
  contact = "right";
 }

6. 画像の切り取り領域のプレビューを実装します

新しい画像のプレビューを追加します地域のp
htmlコード:

<p id="preview">
 <img src="img/1.jpg" id="img3" />
</p>

css代码:

#preview{
  position: absolute;
  width: 500px;
  height: 380px;
  top: 100px;
  left:710px ;
 }
 #preview #img3{position: absolute;}

注意:要让clip:rect(top,right,bottom,left) 起作用,必须让作用元素为相对/绝对定位。

js部分同样是利用clip属性,和setChoice()函数同时被调用

同时为了让右边预览区的左上角位置固定,需要设置其top和left的值

//右边图片预览函数
 function setPreview(){
  var top = mainp.offsetTop;
  var right = mainp.offsetLeft + mainp.offsetWidth;
  var bottom = mainp.offsetTop + mainp.offsetHeight;
  var left = mainp.offsetLeft;
  var img3 = $(&#39;img3&#39;);
  img3.style.top = -top + &#39;px&#39;;
  img3.style.left = -left + &#39;px&#39;;
  img3.style.clip = "rect("+top+"px,"+right+"px,"+bottom+"px,"+left+"px)";
 }

以上がJavaScriptをベースに画像切り取り効果を実装するサンプルコード(写真)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。