WeChat アプレットは画像適応を実装します (複数の画像をサポート)

高洛峰
リリース: 2018-05-11 16:22:24
オリジナル
4787 人が閲覧しました

この記事では、WeChat アプレットがどのように画像調整を実装するかについての関連情報を主に紹介します。この記事で紹介した方法は、複数の写真にも適しています。一緒に見てみましょう。

WeChat アプレットの画像調整は比較的一般的な要件であることは誰もが知っていますが、通常、WEBView では max-width:100% を設定するだけで済みますが、widthFix も実装できます。欠点は、画像の幅が設定値以上でなければならないことです。そうしないと、伸縮や変形が発生します。この記事では、別の方法を使用して調整します。 max-width:100%.在微信里面虽然widthFix也能实现,但有一个缺陷就是图片的宽度值要大于或者等于设定的值,否则就会发生拉伸变形,本文通过另外一种来适应。

首先我们来看看图片组件给的一些说明:

属性名 类型 默认值 说明
src String
图片资源地址
mode String 'scaleToFill' 图片裁剪、缩放的模式
binderror HandleEvent
当错误发生时,发布到 AppService 的事件名,事件对象event.detail = {errMsg: 'something wrong'}
bindload HandleEvent
当图片载入完毕时,发布到 AppService 的事件名,事件对象event.detail = {height:'图片高度px', width:'图片宽度px'}

注:image组件默认宽度300px、高度225px

mode 有 13 种模式,其中 4 种是缩放模式,9 种是裁剪模式。

模式 说明
scaleToFill 不保持纵横比缩放图片,使图片的宽高完全拉伸至填满 image 元素
aspectFit 保持纵横比缩放图片,使图片的长边能完全显示出来。也就是说,可以完整地将图片显示出来。
aspectFill 保持纵横比缩放图片,只保证图片的短边能完全显示出来。也就是说,图片通常只在水平或垂直方向是完整的,另一个方向将会发生截取。
widthFix 宽度不变,高度自动变化,保持原图宽高比不变

如果说要有一种比较合适的方案,大概是widthFix,然而上面这些模式中,所要求的前提是需要给图片标签设定一个宽度值或者一个高度值。但有时候我们根本不想限定图片的宽高,我们需要的是图片自身能够根据自身的大小来适配。

而widthFix模式就要求你必须先设定一个宽度值,如果出来的图片比给定的width小呢?此时图片则会发生拉伸的现象。 (常见应用在文章中,因为文章中的插图有可能比默认的宽小,比如常见的表情)。

其实上面的标签中,图片为我们预留了一个函数bindLoad。下面看看我是怎么支持自适应的。

有一个前提,就是多图的时候,你需要知道这个图片是处于所有中的位置index,我们通过这个位置来保存图片的宽度和高度。

<image src="http://ww4.sinaimg.cn/bmiddle/006q8Q6bjw1fbwucs1cctj30t80t8myh.jpg" bindLoad="imageLoad" style="width:{{imageSize[0].width}}rpx; 
height:{{imageSize[0].height}}rpx" data-index="0" mode="scaleToFill"/>
<image src="http://ww4.sinaimg.cn/bmiddle/006q8Q6bjw1fbwucs1cctj30t80t8myh.jpg" bindLoad="imageLoad" style="width:{{imageSize[1].width}}rpx; 
height:{{imageSize[1].height}}rpx" data-index="1" mode="scaleToFill"/>
ログイン後にコピー
var px2rpx = 2, windowWidth=375;
page({
 data:{
 imageSize:{}
 },
 onLoad:function(options){
 wx.getSystemInfo({
 success: function(res) {
 windowWidth = res.windowWidth;
 px2rpx = 750 / windowWidth;
 }
 })
 },
 imageLoad:function(e){
 //单位rpx
 var originWidth = e.detail.width*px2rpx, 
 originHeight = e.detail.height*px2rpx,
 ratio = originWidth/originHeight;
 var viewWidth = 710,viewHeight//设定一个初始宽度
 //当它的宽度大于初始宽度时,实际效果跟mode=widthFix一致
 if(originWidth>= viewWidth){
 //宽度等于viewWidth,只需要求出高度就能实现自适应
 viewHeight = viewWidth/ratio;
 }else{
 //如果宽度小于初始值,这时就不要缩放了
 viewWidth = originWidth;
 viewHeight = originHeight;
 }
 var imageSize = this.data.imageSize;
 imageSize[e.target.dataset.index] = {
 width:viewWidth,
 height:viewHeight
 }
 this.setData({
 imageSize:imageSize
 })
 }
})
ログイン後にコピー

如果我们的图片中不仅限定了宽度,还限定了高度值,比如我们限定max-height之类的。那我们的imageLoad函数则要调整为根据他们的宽高比来输出。

imageLoad:function(e){
 var originWidth = e.detail.width * px2rpx,
 originHeight=e.detail.height *px2rpx,
 ratio = originWidth/originHeight ;
 var viewWidth = 220,viewHeight = 165, viewRatio = viewWidth/viewHeight;
 if(ratio>=viewRatio){
 if(originWidth>=viewWidth){
 viewHeight = viewWidth/ratio;
 }else{
 viewWidth = originWidth;
 viewHeight = originHeight
 }
 }else{
 if(originWidth>=viewWidth){
 viewWidth = viewRatio*originHeight
 }else{
 viewWidth = viewRatio*originWidth;
 viewHeight = viewRatio*originHeight;
 }
 }
 var image = this.data.imageSize;
 image[e.target.dataset.index]={
 width:viewWidth,
 height:viewHeight
 }
 this.setData({
 imageSize:image
})
},
ログイン後にコピー

附录:小图预览,进入全屏模式。

用预览图片的API,wx.previewImage(OBJECT)

まず、画像コンポーネントによって与えられるいくつかの命令を見てみましょう:

属性名< /th> タイプデフォルト値説明
src文字列

画像リソース アドレス
モード文字列'scaleToFill'画像のトリミングとスケーリング モード
バインドエラーHandleEvent

エラーが発生した場合、AppService に発行されるイベント名、イベント オブジェクトevent.detail = {errMsg : ' 何か問題があります'}
bindloadHandleEvent

画像が読み込まれると、イベント名が AppService に発行され、イベント オブジェクトevent.detail = {height:'画像の高さ px'、width:'画像の幅 px'}

注: 画像コンポーネントのデフォルトの幅は 300 ピクセルですそして高さは225pxです

モードには13のモードがあり、そのうち4つはスケーリングモード、9つはクロップモードです。

< td>scaleToFill< td> 画像の長辺が完全に表示されるように、アスペクト比を維持しながら画像を拡大縮小します。つまり、画像を完全に表示することができます。 < /tbody>
モード説明
アスペクト比を維持せずに画像を拡大縮小し、画像の幅と高さが画像要素を埋めるように完全に引き伸ばされます
アスペクトフィット
aspectFill アスペクト比を維持しながら画像を拡大縮小し、画像の短辺のみが完全に表示されるようにします。つまり、通常、画像は水平方向または垂直方向のみで完成し、他の方向ではクリッピングが発生します。
widthFix幅は変更されず、高さは自動的に変更され、元の画像の縦横比は変更されません。

より適切な解決策があるとすれば、それはおそらく widthFix です。ただし、上記のモードでは、必要な前提条件は、画像ラベルの幅の値または高さの値を設定することです。しかし、画像の幅と高さをまったく制限したくない場合があります。必要なのは、画像自体が独自のサイズに応じて調整できることです。 🎜🎜widthFix モードでは、最初に幅の値を設定する必要があります。結果の画像が指定された幅より小さい場合はどうなりますか?このとき、画像は引き伸ばされます。 (一般的な絵文字など、記事内のイラストはデフォルトの幅よりも小さい場合があるため、記事でよく使用されます)。 🎜🎜実際、上記のタグでは、画像は関数bindLoadを予約しています。私が適応性をどのようにサポートしているかを見てみましょう。 🎜🎜前提があります。つまり、複数の写真がある場合、その中でのこの写真の位置インデックスを知る必要があります。この位置は、写真の幅と高さを保存するために使用されます。 🎜
<view class="wrap">
 <image wx:for="{{pictures}}" wx:key="unique" src="{{item}}" data-index="{{index}}" bindtap="previewImage"></image>
</view>
ログイン後にコピー
Page({
 data: {
 pictures: [
 &#39;https://p0.meituan.net/movie/ea4ac75173a8273f3956e514a4c78018253143.jpeg&#39;,
 &#39;https://p0.meituan.net/movie/5d4fa35c6d1215b5689257307c461dd2541448.jpeg&#39;,
 &#39;https://p0.meituan.net/movie/0c49f98a93881b65b58c349eed219dba290900.jpg&#39;,
 &#39;https://p1.meituan.net/movie/45f98822bd15082ae3932b6108b17a01265779.jpg&#39;,
 &#39;https://p1.meituan.net/movie/722de9a7b0c1f9c262162d87eccaec7c451290.jpg&#39;,
 &#39;https://p0.meituan.net/movie/cb9be5bbedb78ce2ef8e83c93f83caca474393.jpg&#39;,
 &#39;https://p1.meituan.net/movie/a852b992cdec15319c717ba9fa9b7a35406466.jpg&#39;,
 &#39;https://p1.meituan.net/movie/dc1f94811793e9c653170cba7b05bf3e484939.jpg&#39;
 ]
 },
 previewImage: function(e){
 var that = this,
 index = e.currentTarget.dataset.index,
 pictures = this.data.pictures;
 wx.previewImage({
 current: pictures[index],
 urls: pictures
 })
 }
})
ログイン後にコピー
🎜 画像が幅を制限するだけでなく、高さの値も制限する場合、たとえば、max-height なども制限します。次に、アスペクト比に従って出力するように imageLoad 関数を調整する必要があります。 🎜rrreee🎜付録: 小さな画像プレビュー、全画面モードに入ります。 🎜🎜プレビュー画像 API、wx.previewImage(OBJECT)を使用する 以下は、対応するコード、スタイル部分、レイアウトを自分で作成したものです。 🎜🎜html コード: 🎜rrreee🎜JS🎜rrreee🎜 画像適応 (複数の画像をサポート) を実装するための WeChat ミニ プログラムの詳細と関連記事については、PHP 中国語 Web サイトに注目してください。 🎜🎜🎜🎜
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!