2017-10-25 7 views
7

私の画面にはcanvasが4つあり、上に2つ、下に2つあります。HTML offsetLeft変更の遅延

それぞれには、キャンバスを最大にし、他を隠すボタンがあります。

このボタンは、各キャンバスの上に配置され、絶対位置はキャンバスのoffsetTopoffsetLeftに基づいています。

ただし、キャンバスを最大化または最小化すると、ボタン式はwidthプロパティのみを更新します。

奇妙なことは、resizeも呼び出す画面のサイズを変更すると、すべてが適切な場所に移動するということです。

Initial screen

After maximizing

Then after resizing screen

EDIT:追加情報:私はVueJSを使用していますと、他のキャンバスを隠すために、私は彼らにのみ親divsを、v-show="false"を適用display: noneを適用します。

一部抜粋:

初期リサイズとリスナー:

window.onload = function() { 
    resizeAll(); 
    window.addEventListener('resize', resizeAll, false); 
}; 

リサイズハブ:

function resizeAll() { 
    vue.$refs.panelOne.resizeDefault(); 
    // ... 
    vue.$refs.panelN.resizeDefault(); 
} 

パネルのサイズ変更デフォルトとメソッドのサイズを変更します。の伝播である

私はSPHINXに同意
function getScreenDimensions() { 
    return { 
     width: window.innerWidth - 310, 
     height: window.innerHeight * 0.92 
    }; 
} 

function getHalfScreenDimensions() { 
    return { 
     width: (window.innerWidth - 310)/2, 
     height: (window.innerHeight * 0.92)/2 
    }; 
} 
+1

おそらく人々があなたを助けることができるようにスニペット全体を添付したいと思うでしょう。あなたのスニペットをVueから分離できない場合は、https://codesandbox.io/s/vue – deathangel908

+0

を使用できます。キャンバスのサイズを変更し、次にボタンを再描画してみてください。キャンバスのoffsetTopとLeftの値は、ボタンを再描画するときに更新されないことがあります。引き続き動作しない場合は、setTimeOutを使用します。 –

+0

スニペットを追加しました。基本的に、setTimeoutを適用すると動作します。しかし、私はもっと簡単な解決法を選びたいと思っています。それ以外のものがうまく動作しない場合、私はその答えを受け入れることをうれしく思います。 – Luiz

答えて

1

、それが問題のように思える:

resizeDefault() { 
     let dimensions; 
     if (this.expanded) { 
      dimensions = getScreenDimensions(); 
     } else { 
      dimensions = getHalfScreenDimensions(); 
     } 
     this.resize(dimensions.width, dimensions.height); 
    } 

resize (width, height) { 
     this.canvas.width = width; 
     this.canvas.height = height; 
     this.expandStyles.top = (this.canvas.offsetTop + 10) + 'px'; 
     this.expandStyles.left = (this.canvas.offsetLeft + this.canvas.width - 40) + 'px'; 
     drawInterface.redraw(); 
    } 

そして最後に、寸法ゲッターは:「expandStylesは、」ボタンに適用されるCSSスタイルですthis.expandStylesの反応性プロパティを実際のDOMに変換します。あなたのキャンバスと位置付けアプリケーションを持つテンプレートの部分を共有できる場合に便利です。

一方、setTimeOutが正しく感じられない場合は、Vue: nextTickを使用して操作の順序(スタイルの再計算、再描画)を設定することで、さらに「Vue-way」を実行できます。

関連する問題