- the traditional practice is to write a div, and turn the image into a background image of the div, adding a positioning center and cover to fill it, or if you only use img, you can also try the object-fit attribute, which is the width and height value directly cover.
- layout can be inline-block or flex should be OK, if the spacing is known, then direct calc with vw/vmin should be fine, width and height are the same on the line.
question 1: pictures use background
, background-size:cover
. If lazy loading is involved or background
cannot be used, it is not easy to do. If you want to compare width and height or cut, the size of the back end is usually clipped and sent back.
if you agree to show all the pictures, with blanks up and down or left and right, you can also do the same as below.
.parent{
width:200px;
height:200px;
position:relative;
}
.child{
max-width:100%;
max-height:100%;
width:auto;
height:auto;
position:absolute;
top:50%;
left:50%;
-webkit-transform:translate(-50%,-50%);
transform:translate(-50%,-50%);
}
question 2: list item container padding:5px;box-sizing:border-box;display:inline-block
, list container gives white space on both sides, set font-size:0;
to prevent the gap between items, do not need to use flex
.
//css
.box {
width: 500px;
}
.img-box {
width: 33.33%;
height: 0;
padding-bottom: 33.3%;
box-sizing: border-box;
float: left;
border-right: 10px solid -sharpffffff;
margin-bottom: 10px;
background: -sharp000 no-repeat center center;
background-size: contain;
}
.img-box:nth-child(3n) {
border-right: none;
}
//html
<div class="box">
<div class="img-box" style="background-image: url(http://pic1.win4000.com/wallpaper/5/532931489604e.jpg)"></div>
<div class="img-box" style="background-image: url(http://img.zcool.cn/community/0108185543f09e0000019ae906d8f6.jpg@1280w_1l_2o_100sh.jpg)"></div>
<div class="img-box" style="background-image: url(http://img.zcool.cn/community/01626057ff29a1a84a0d304f3b5991.jpg@1280w_1l_2o_100sh.jpg)"></div>
<div class="img-box" style="background-image: url(http://pic1.win4000.com/wallpaper/5/532931489604e.jpg)"></div>
<div class="img-box" style="background-image: url(http://img.zcool.cn/community/0108185543f09e0000019ae906d8f6.jpg@1280w_1l_2o_100sh.jpg)"></div>
<div class="img-box" style="background-image: url(http://img.zcool.cn/community/01626057ff29a1a84a0d304f3b5991.jpg@1280w_1l_2o_100sh.jpg)"></div>
</div>
question 1: your current situation is that the height is fixed and the width is uncertain. To ensure that the picture is displayed in the proportion of the original image, use js to obtain the original width and height of the picture, and then calculate the width to be displayed according to the original width and height, as follows:
var img = new Image ()
img.src = "url.png";
var naturalWidth = img.naturalWidth,
naturalHeight= img.naturalHeight;
/ / if the width of the picture to be displayed is showHeight, the width of the picture to be displayed is as follows
var showWidth = (showHeight / naturalHeight) * showHeight
problem 2: when it is impossible to guarantee the consistent aspect ratio of the picture uploaded by the user, only the top width or fixed height can be guaranteed. Flex
is recommended for this layout.
see that your problem should mainly be stuck on the equal width and height of this picture. Here is a solution: use padding-bottom/top
to get width
.
handle height with :: after
, open the container, :: before
render the actual content
at the same time, the outer container uses margin:-$gap$ / 2
to remove the surrounding gaps
Online Demo: https://codepen.io/Jiasm/pen/.
is a background-color
simulation. If you want to use a picture, write it as background-url
+ background-size:
.
.wrap {
border: 1px solid blue;
width: 400px;
}
.border {
position: relative;
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
margin: -5px; /* fill panel */
}
.item {
width: 33.33%;
position: relative;
}
.item::before {
display: block;
content: '';
width: 100%;
padding-top: 100%;
}
.item::after {
content: '';
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
background: red;
}