この記事では主に、画像のローカルプレビュー、トリミング、圧縮、アップロードを実装するための vue.js を紹介します。コードはシンプルでわかりやすく、非常に優れており、必要な友人は参照できます。
以下。コードには Vue 2.0 および ES6 構文が含まれます。
純粋な javascrpit 実装。ie9 以降のブラウザと互換性があり、ファイル形式、長さ、幅、サイズをローカルに検出して、ブラウザの操作を軽減します。
現実は残酷です。Ie9と互換性を持たせるために、2番目の記事で説明します。
<p id="wrap"> <label> 点我上传图片 <input type='file' @change="change" ref="input"> </label> <img :src="src" ref="img"> </p> new Vue({ el: '#wrap', data: { // 一张透明的图片 src:'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7', elInput: null }, methods: { change(e){ // ... } } })
最新のブラウザでは非常に簡単です
function getSize(e){ return e.target.files[0].size; }
ie9 ではまだ利用可能純粋な JS ソリューション。
したがって、サイズを判断する必要がある場合は、IE9 を直接バイパスして判断する必要はありません
const refs = this.$refs const elInput = refs.input const elImg = refs.img
最新のブラウザでは、FileReader を呼び出してローカル画像を読み取ります。画像アドレスを変更して、プレビュー用に Base64 形式に変換します。
function getSrc(){ const reader = new FileReader(); reader.onload = (e) => { const src = e.target.result; elImg.src = src; }; if (elInput.files && elInput.files[0]) { reader.readAsDataURL(elInput.files[0]); } }
しかし問題はまた出てきて、ie9はFileReaderをサポートしていませんが、ieフィルターを通して表示することができます。
function getSrc(){ elInput.select(); elInput.blur(); const src = document.selection.createRange().text; document.selection.empty(); elImg.style.filter = `progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src='${src}')`; }
フィルター内の sizingMethod='scale'
は、画像がコンテンツのスケーリングに適応できるように記述されています。 sizingMethod='scale'
的写法是为了图片能适应内容缩放。
由于 IE9 对安全限制有所增强,实践中会遇到以下两个问题:
如果 file 控件获得焦点,则 document.selection.createRange()
拒绝访问,因此需要在 elInput.select()
后面加一句 elInput.blur()
即可。
为了让上传按钮更美观,默认给 input[type=file]
的设置了样式 visible:hidden
,这样会导致 ie9 下报错。应该会被浏览器认为欺骗用户点击,只好曲线救国。
label{ overflow:hidden; } label input[type='file']{ position:absolute; top:9999px; left:9999px; }
同理,利用 ie 滤镜和 FileReader 的方案对 ie9 和非 ie9 分别实现。
ie9 的方案
参数 src 接受的是本地图片路径
let tempEl; const getSizeIncompatible = (src, callback) => { if (!tempEl) { tempEl = document.createElement('p'); tempEl.style.position = 'absolute'; tempEl.style.width = '1px'; tempEl.style.height = '1px'; tempEl.style.left = '-9999px'; tempEl.style.top = '-9999px'; tempEl.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image)'; document.body.insertBefore(tempEl, document.body.firstChild); } tempEl.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = src; callback(tempEl.offsetWidth, tempEl.offsetHeight); };
其中 sizingMethod='image'
ファイル コントロールがフォーカスを取得すると、 document.selection.createRange()
がアクセスを拒否するため、 elInput.select()
の後に elInput.blur()
を追加するだけです。
input[type=file]
にはスタイル visible:hidden
がデフォルトで設定されています。これにより、IE9 ではエラーが発生します。 。ブラウザーはユーザーがクリックすることをだましていると見なす必要があるため、ユーザーは国を救うためにカーブを通過する必要があります。 const getSize = (src, callback) => { const image = new Image(); image.onload = () => { callback(image.width, image.height); }; image.src = src; };
同様に、ieフィルターとFileReaderソリューションを使用して、それぞれie9と非ie9に実装します。
rrreee
を受け入れます。ここで、sizingMethod='image'
は、画像の元のサイズを表示します。
パラメータ src は、base64 でエンコードされた画像パスを受け入れます
🎜🎜rrreee🎜🎜🎜 上記は私がまとめたもので、将来的に皆さんのお役に立てれば幸いです。 🎜🎜関連記事: 🎜🎜🎜Vue が以下の表に従って配列を変更し、ページがレンダリングされない問題の解決策 🎜🎜🎜🎜🎜vue2.0 axios クロスドメインとレンダリングの問題の解決策 🎜🎜🎜🎜🎜オプションlayuiでの選択のオーバーレイの問題解決策🎜🎜🎜🎜🎜🎜🎜🎜🎜以上が画像のローカルプレビュー、トリミング、圧縮、アップロードなどの一連の機能をvue.jsで実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。