Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Max-height and max-width for divs with dynamic backgrounds?

I have a code responsible for cropping image and saving its cropped areas in a list of divs. Each of these divs represents each of the cropped images. But the problem is - I dont want them to be so huge, I want them to have fixed height and width, e.g. max 100x100px.

Codesandbox with working image cropping: https://codesandbox.io/s/fast-frost-0b5tt Code revelant to cropping logic:

const width = pos.w + "px";
const height = pos.h + "px";
const marginLeft = - pos.x + "px";
const marginTop = - pos.y + "px";

return (
  <div
    key={i}
    style={{
      width: width,
      height: height,
      backgroundSize: "400px 300px",
      backgroundPosition: `top ${marginTop} left ${marginLeft}`,
      backgroundImage: "url('https://boygeniusreport.files.wordpress.com/2016/11/puppy-dog.jpg?quality=98&strip=all&w=400')"
    }}
  />
);

You will see that image cropping works great, however newly created images have dynamic height and width.

Question: How to make these newly created divs to have fixed width and height, but without destroying it? Thanks!

Edit: New link added (the old one was missing styles)

The goal is to make the children (cropped images) to have static height and width, but keep the background image in correct position. But seems like im too stopid to do it by myself

like image 281
Patrickkx Avatar asked Jun 10 '19 12:06

Patrickkx


People also ask

Can we set min-width and max-width for an element at the same time?

Max-width and min-width can be used together to target a specific range of screen sizes. @media only screen and (max-width: 600px) and (min-width: 400px) {...} The query above will trigger only for screens that are 600-400px wide. This can be used to target specific devices with known widths.

Does Max-Width override width?

max-width overrides width , but min-width overrides max-width .

Does Max-Width include padding?

Description. This property sets the maximum content width of a block or a replaced element. This maximum width does not include padding, borders, or margins.


2 Answers

The following change within your render function will create a 100px square centered on the selection's center point, or as close as possible keeping within the image limits (I'm not sure how to reference the original image's width & height from here).

...
const previews = crops.map(({ pos }, i) => {
  const width = 100 + "px";
  const height = 100 + "px";
  let margx = (pos.w / 2) - 50 + pos.x;
  let margy = (pos.h / 2) - 50 + pos.y;
  if(margx < 0) margx = 0;
  if(margy < 0) margy = 0;
  // this needs origional image width & height (400,300) to get max values
  const maxx = 400-100;
  const maxy = 300-100;
  if(margx > maxx) margx = maxx;
  if(margy > maxy) margy = maxy;
  const marginLeft = - margx + "px";
  const marginTop = - margy + "px";

  return (
    <div
...
like image 56
Arleigh Hix Avatar answered Sep 19 '22 09:09

Arleigh Hix


If you fix both height and width, the previews will look distorted. So I would recommend only fixing the height.

  const fixedHeight = 100;
  const zoom = fixedHeight / pos.h;
  const backgroundWidth = 400 * zoom;
  const backgroundHeight = 300 * zoom;
  const width = pos.w * zoom;
  const height = fixedHeight;
  const marginLeft = -pos.x * zoom;
  const marginTop = -pos.y * zoom;

See results in this codesandbox demo.

like image 31
Munim Munna Avatar answered Sep 19 '22 09:09

Munim Munna