div+css图片列表布局(一)

前端切图的时候常常会遇到图片布局,初学者可能会比较生疏。接下来我会以3行3列的图片列表为列子介绍两种经常使用的切图方案:css

clipboard.png

  • float布局
  • display:inline-block布局

首先来说float布局的方法html

float布局

很是简单,通常我会使用ul li布局前端

<ul>
        <li><img src="./images/1.jpg"></li>
        <li><img src="./images/2.jpg"></li>
        <li><img src="./images/3.jpg"></li>
        <li><img src="./images/4.jpg"></li>
        <li><img src="./images/5.jpg"></li>
        <li><img src="./images/6.jpg"></li>
        <li><img src="./images/7.jpg"></li>
        <li><img src="./images/8.jpg"></li>
        <li><img src="./images/9.jpg"></li>
    </ul>

而后给每一个li元素定一个宽度并向左浮动。这里每行要显示3张图片,那么每张图片的宽度可使用百分比来计算:100/3=33.3%。segmentfault

li {
    list-style: none;
    float: left;
    width: 33.3%;/*三列图片排列*/
}

每一个img标签的宽度设为100%,占满整个li的宽度,为了防止图片变形,高度自适应wordpress

li {
    list-style: none;
    float: left;
    width: 33.3%;/*三列图片排列*/
}

li img {
    width: 100%;
}

好了,我们来看看效果。布局

clipboard.png

怎么和咱们想的不同?这时候列表是混乱的。别急,这是由于图片的尺寸不一。若是项目中图片的尺寸差异太大的话,建议在父元素定死一个高度,并设置超出隐藏。可是若是图片尺寸差异不大的话,建议设置height: auto;以达到高度自适应的目的。测试

li {
    list-style: none;
    float: left;
    width: 33.3%;/*三列图片排列*/
    height: 100px;/*当图片尺寸不一的时候,设置一个高度*/
    overflow: hidden;/*超出隐藏*/
}

嗯~和咱们的需求差很少了spa

clipboard.png

这时候产品可能会要求你图片要上下居中ssr

li img {
    position: relative;
    width: 100%;
    top: 50%;/*li高度的一半*/
    transform: translateY(-50%); /*再向上移动自身的50%*/
}

有的同窗可能会想到用margin-top,而不是top。这里须要注意一下,margin-top和margin-bottom的百分比,通常是按容器元素的宽度而不是高度来计算的,padding同理3d

clipboard.png

到这里,一个基本的三行三列图片布局基本就完成了。

可是注意了,新手可能会忽略掉的一个隐藏问题:子元素浮动以后父容器坍塌了,有时候这种特性会严重影响到咱们的布局。咱们来测试一下,在ul元素的先后分别添加一个div元素

.red{
    width: 100%;
    height: 30px;
    border: 1px solid red;
}
.blue{
    width: 100%;
    height: 30px;
    border: 1px solid blue;
}    
    
<div class="red"></div>
<ul>...</ul>
<div class="blue"></div>

能够看到.blue元素紧挨着.red元素了,ul元素表现得像是不存在同样

clipboard.png

这是由于元素浮动后后脱离了文档流,关于浮动的原理能够参阅w3school的CSS 浮动以及CSS浮动属性Float详解,这里再也不赘述。清除浮动的方法有不少,这里推荐添加:after伪元素去除浮动

.clearfix:after{
    position: relative;
    content: '';
    display: block;
    width: 0;
    height: 0;
    visibility: hidden;
    clear: both;
}

<div class="red"></div>
<ul class="clearfix">...</ul>
<div class="blue"></div>

再来看看效果,表现就正常了

clipboard.png

详细代码可戳:http://runjs.cn/detail/fvcssbb7

display:inline-block布局

同float布局差很少,只是咱们要把float: left;替换成display: inline-block;

li {
    list-style: none;
    display: inline-block;
    width: 33.3%;
    /*三列图片排列*/
    height: 100px;
    /*当图片尺寸不一的时候,须要设置一个最大高度*/
    text-align: center;
    /*内容居中*/
    overflow: hidden;
    /*超出隐藏*/
}

clipboard.png

来看一下效果,出现了间隙,并且被挤成两行了。怎么回事?~
注意,inline-block的元素之间会存在间隙,具体请参阅张鑫旭的博客。这里使用font-size: 0;方法清除元素间的间隙

ul {
    width: 100%;
    margin: 0 auto;
    font-size: 0;
}

clipboard.png

这样,咱们想要的效果就完成了。是否是很简单
详细代码能够参考:http://runjs.cn/detail/l867rsbv

下一篇文章:div+css图片列表布局(二)


关注做者吧~

clipboard.png

相关文章
相关标签/搜索