Center Oversized Image in Div

前端 未结 12 1585
予麋鹿
予麋鹿 2020-11-27 08:52

I have been trying to sort out how to center an oversized image within a div using css only.

We are using a fluid layout, so the width of the image containers varies

相关标签:
12条回答
  • 2020-11-27 09:22

    Late to the game, but I found this method is extremely intuitive. https://codepen.io/adamchenwei/pen/BRNxJr

    CSS

    .imageContainer {
      border: 1px black solid;
    
      width: 450px;
      height: 200px;
      overflow: hidden;
    }
    .imageHolder {
      border: 1px red dotted;
    
      height: 100%;
      display:flex;
      align-items: center;
    }
    .imageItself {
      height: auto;
      width: 100%;
      align-self: center;
    
    }
    

    HTML

    <div class="imageContainer">
      <div class="imageHolder">
        <img class="imageItself" src="http://www.fiorieconfetti.com/sites/default/files/styles/product_thumbnail__300x360_/public/fiore_viola%20-%202.jpg" />
      </div>
    </div>
    
    0 讨论(0)
  • 2020-11-27 09:22

    One option you can use is object-fit: cover it behaves a bit like background-size: cover. More on object-fit.

    ignore all the JS below, that's just for the demo.

    The key here is that you need to set the image inside a wrapper and give it the following properties.

    .wrapper img {
      height: 100%;
      width: 100%;
      object-fit: cover;
    }
    

    I've created a demo below where you change the height / width of the wrapper and see in play. The image will always be vertically and horizontally centered. It will take up 100% of its parent width and height, and will not be stretched / squashed. This means that the aspect ratio of the image is maintained. The changes are applied by zooming in / out instead.

    The only downside to object-fit is that it doesn't work on IE11.

    // for demo only
    const wrapper = document.querySelector('.wrapper');
    const button = document.querySelector('button');
    const widthInput = document.querySelector('.width-input');
    const heightInput = document.querySelector('.height-input');
    
    
    const resizeWrapper = () => {
      wrapper.style.width = widthInput.value + "px";
      wrapper.style.height = heightInput.value + "px";
    }
    
    button.addEventListener("click", resizeWrapper);
    .wrapper {
      overflow: hidden;
      max-width: 100%;
      margin-bottom: 2em;
      border: 1px solid red;
    }
    
    .wrapper img {
      display: block;
      height: 100%;
      width: 100%;
      object-fit: cover;
    }
    <div class="wrapper">
      <img src="https://i.imgur.com/DrzMS8i.png">
    </div>
    
    
    <!-- demo only -->
    <lable for="width">
      Width: <input name="width" class='width-input'>
    </lable>
    <lable for="height">
      height: <input name="height" class='height-input'>
    </lable>
    <button>change size!</button>

    0 讨论(0)
  • 2020-11-27 09:23

    Do not use fixed or an explicit width or height to the image tag. Instead, code it:

          max-width:100%;
          max-height:100%;
    

    ex: http://jsfiddle.net/xwrvxser/1/

    0 讨论(0)
  • 2020-11-27 09:23

    I found this to be a more elegant solution, without flex:

    .wrapper {
        overflow: hidden;
    }
    .wrapper img {
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        /* height: 100%; */ /* optional */
    }
    
    0 讨论(0)
  • 2020-11-27 09:27

    i'm a huge fan of making an image the background of a div/node -- then you can just use the background-position: center attribute to center it regardless of screen size

    0 讨论(0)
  • 2020-11-27 09:29

    based on @Guffa answer
    because I lost more than 2 hours to center a very wide image,
    for me with a image dimendion of 2500x100px and viewport 1600x1200 or Full HD 1900x1200 works centered like that:

     .imageContainer {
      height: 100px;
      overflow: hidden;
      position: relative;
     }
     .imageCenter {
      width: auto;
      position: absolute;
      left: -10%;
      top: 0;
      margin-left: -500px;
     }
    .imageCenter img {
     display: block;
     margin: 0 auto;
     }
    

    I Hope this helps others to finish faster the task :)

    0 讨论(0)
提交回复
热议问题