Vue项目中的文本溢出、图片长宽溢出的样式问题处理

474 阅读2分钟

正常情况:

image.png

但万一商品名太长,那就有点尴尬了:

image.png

处理单行、多行文本溢出登场:

1.处理单行文本

对应的标签是div

.text{
    width: 100px;//宽度要定义好,不能用%
    overflow: hidden;//溢出隐藏
    text-overflow: ellipsis;//显示省略符号来代表被修剪的文本。
    white-space: nowrap;//文字不换行
}

image.png

现在就不会了,其他地方同理,如果首页的卡片,用户卡片等等,这也可以将重复的代码提取出来(后面三行),写在global.css中

然后注意要在运用的时候设置固定宽度。

自动换行

word-wrap: break-word;

强制英文单词断行:

word-break: break-all;

2.多行文本溢出

.text-more{
    width: 100px;
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;//必须结合的属性,将对象作为弹性伸缩盒子模型显示
    -webkit-line-clamp:2;//控制文本的行数
    -webkit-box-orient:vertical;//必须结合的属性,设置或检索伸缩盒对象的子元素的排列方式 
}

image.png

像备注这个就可以用多行溢出

控制宽度,行数这个各类自定义

image.png

3.关于商品图片长宽溢出的问题

还是一个细节问题:当img设置为width:100%时,竖图会溢出,设置为height:100%时,横图会溢出,两个设置则长方形图片会拉伸

拉伸:

image.png

长溢出:

image.png

所以采用Vue动态设置CSS样式

先加载图片(注意要onload加载后才能获取图片宽高),获取图片宽高

// 创建实例对象
var img = new Image();
// 图片地址
img.src = this.goodInfo.image;
let res = {}
// onload加载图片,然后获取宽高,加载后才能获取
img.onload = function () {
    res = {
        width: img.width,
        height: img.height
    }
    console.log(res); //获取到图片的宽高,不能写外面,这个涉及了异步的过程
}

可以使用url.complete和callback结合处理这个问题,但比较麻烦,下面采取promise进行优化

return new Promise((reslove, reject) => {
    // 创建实例对象
    var img = new Image();
    // 图片地址
    img.src = imageUrl;
    img.onload = () => {
        // 当图片加载成功则调用resolve
        reslove({
            width: img.width,
            height: img.height
        })
    }
})

这段逻辑在多个地方用到,我们可以把它抽离出来,封装成方法,放utils包下,再按需导入Vue中。

在Vue组件的template中,此处用了下图片懒加载:

<!-- 图片 -->
<div class="good_img">
    <img v-lazy="getFirstImg(goodInfo.image || goodInfo.goodsImage)" alt="" 
    :class="height > imgwidth ? 'height':'width'">
</div>

在css中:

.height{
    height: 100%;
}
.width{
    width: 100%;
}

处理这个问题只想到了这个方法,如果有更好的操作,请大佬在评论区指点指点...

image.png