欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

响应式布局-图片列表如何在窄屏(<320px)中显示为列,在宽屏(>768px)中显示为有间隙的一行

程序员文章站 2024-03-20 17:10:40
...

       摘要:本文旨在介绍在宽屏(>768px)中图片列表中如何显示为有固定间隙的一行排列,介绍了笔者自己尝试过得五种写法,并分析了其缺点,采用什么方法就得见人见智,具体情况具体分析了。

        如何在窄屏(<320px)中显示为一列呢,做出的显示效果如下图,其铺设方式是占满整行。

                                                                                                       响应式布局-图片列表如何在窄屏(<320px)中显示为列,在宽屏(>768px)中显示为有间隙的一行                                       

          笔者习惯先写小屏样式,再逐渐升级到大屏样式,以提升样式代码的复用性。该示意图结构代码可参考下方:

              <ul id="media">
			<li>
				<img src="img/img1.jpg">
			</li>
			<li>
				<img src="img/img2.jpg">
			</li>
			<li>
				<img src="img/img3.jpg">
			</li>
		</ul>
       其样式代码可参考下方(因为是先写的小屏样式(屏宽<320px),则可不写媒体查询语句,直接写样式):
#media li {
		margin-bottom: 10px;
	}
	
	#media li img {
		width: 100%;
	}

     将img的width设置为100%,既设置了img的铺设方式(铺满整行),撑开了它的父级即li的宽度,同时也是设定img的高度是随着img的宽度进行等比缩放,即高度会随着屏幕宽度变化而变化;

   接下来就开始探讨如何在宽屏(>320px)中进行显示,显示效果如下图(以768px频宽为例),要求图片与图片间隔在之后的屏幕宽度中固定显示为3px;

                         响应式布局-图片列表如何在窄屏(<320px)中显示为列,在宽屏(>768px)中显示为有间隙的一行

      方法一:

                        

@media all and (min-width:768px) {
#media {
			margin-right: -3px;
		}
		#media li {
		        float: left;
		        width: 33.07%;
			margin-right: 3px;
		}
}
      实际上此类方法是行不通的,因为width是由浏览器计算,存在误差,会出现第三张图片被挤到下一行的现象,如果想通过调整media的margin-right使图片排列在一行,会发现margin-right负值已经到一个不可理喻的值;


    方法二

    

@media all and (min-width:768px) {
#media {
			margin-right: -0.4%;
		}

#media li {
                    float: left;
		    width: 33%;
		    margin-right: 0.3%;
}
    此方法实现的仅仅是>768px且<992px屏幕的图片排列效果,因为中间的间隙是固定的,想要在>992px屏幕中也呈现与设计图一样的效果,则需要重新计算li的宽度和其margin-left值。因为浏览器存在误差,所以在计算时,需要将li和其margin-right百分值取整,使其总和小于数学意义上的100%,ul的margin-right需要根据li计算后的总和,再进行计算;


    方法三

#media li {
                       box-sizing:border-box;
		       width:33.3%;
                       padding-right:3px;
                        
		}
#media li:nth-of-type(3){
                     padding-right:0;
             }
}
   此方法使用了怪异盒模型(box-sizing),笔者在此使用了css3选择器来设置第三个li的padding-right值。如果考虑到兼容(部分浏览器不兼容css3选择器语法),可单独给该li设置一个类,再给这个类加相应样式。此方法有一个缺点:因为第三个li使用了怪异盒模型且无padding值,其图片实际显示效果会比另外两张图大且高一些,虽然误差不大,但是肉眼可见;

      方法四

     改变结构,即在结构中li(除第三个li)中增加一个空的span,使span的宽度为3px,高度为100%。设置li的宽度为33.3%,再使用定位将span定在两张图片之间。因为要改变结构,并不推荐此方法。且此类方法会改变图片的内容显示(因为有一部分被遮挡),故只阐述其做法,不展示代码;


      方法五

@media all and (min-width:768px) {
  #media {
			display: flex;
			justify-content:space-between;
		}
		#media li {
			width:33.07%;
		}
}
    此方法使用了flex布局,在计算好li的宽度后,剩余的空间会平均分配在两个元素(li)中间。但此方法与方法二缺点一致,无法将li之间的间隙随着屏幕逐渐变大而固定为3px,需要多次调整li的width。