使卡片和图像大小相同 - 如何使用 CSS 做到这一点?

Mou*_*ror 6 javascript css reactjs material-ui

我在用着reactMaterial-ui是为了Cards. 因为Grid我正在使用 CSS 网格布局。到目前为止,它看起来像这样:

在此输入图像描述

但我的目标是这样的:

在此输入图像描述

我有两个问题:

  1. 我想让所有这些都具有cards相同的高度(415px)。我尝试了 height: 415px.BeerListingScroll-info-box但它不起作用。

  2. 瓶子和小桶的图像尺寸不同 [小桶 (80 像素 x 160 像素) 与瓶子 (80 像素 x 317 像素)]。有什么办法可以让它们在渲染尺寸上更加相似吗?

-

代码:

BeerListingScroll

import React, { Component } from 'react';
import ReduxLazyScroll from 'redux-lazy-scroll';
import { connect } from 'react-redux';
import { bindActionCreators } from 'redux';
import { fetchBeers } from '../../actions/';

import BeersListItem from '../../components/BeersListItem';
import ProgressIndicator from '../../components/ProgressIndicator';

import './style.css';

class BeerListingScroll extends Component {
  constructor(props) {
    super(props);

    this.loadBeers = this.loadBeers.bind(this);
  }

  loadBeers() {
    const { skip, limit } = this.props.beers;
    this.props.fetchBeers(skip, limit);
  }

  render() {
    const { beersArray, isFetching, errorMessage, hasMore } = this.props.beers;
    return (
      <div className="container beers-lazy-scroll">
        <ReduxLazyScroll
          isFetching={isFetching}
          errorMessage={errorMessage}
          loadMore={this.loadBeers}
          hasMore={hasMore}
        >
          <div className="BeerListingScroll-wrapper">
            {beersArray.map(beer => (
              <div key={beer.id} className="BeerListingScroll-info-box">
                <BeersListItem beer={beer} />
              </div>
            ))}
          </div>
        </ReduxLazyScroll>
        <div className="row beers-lazy-scroll__messages">
          {isFetching && (
            <div className="alert alert-info">
              <ProgressIndicator />
            </div>
          )}

          {!hasMore &&
            !errorMessage && (
              <div className="alert alert-success">
                All the beers has been loaded successfully.
              </div>
            )}
        </div>
      </div>
    );
  }
}

function mapStateToProps(state) {
  return {
    beers: state.beers,
  };
}

function mapDispatchToProps(dispatch) {
  return bindActionCreators({ fetchBeers }, dispatch);
}

export default connect(mapStateToProps, mapDispatchToProps)(BeerListingScroll);
Run Code Online (Sandbox Code Playgroud)

BeerListingScroll css

.BeerListingScroll-wrapper {
  display: grid;
  margin: 0;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr) ) ;
  background-color: #f7f7f7;
}

.BeerListingScroll-info-box {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto;
  color: #fff;
  border-radius: 5px;
  padding: 20px;
  font-size: 150%;
  width: 320px;
}


/* This applies from 600px onwards */
@media (min-width: 1820px) {
  .BeerListingScroll-wrapper {
    margin: 0 400px;
  }
}

@media (min-width: 1620px) {
  .BeerListingScroll-wrapper {
    margin: 0 300px;
  }
}

@media (min-width: 1366px) {
  .BeerListingScroll-wrapper {
    margin: 0 200px;
  }
}
Run Code Online (Sandbox Code Playgroud)

BeerListItem是 BeerListingScroll 的子项

import React from 'react';
import Card, { CardContent } from 'material-ui/Card';
import Typography from 'material-ui/Typography';

function BeerListItem(props) {
  return (
    <div>
      <Card raised>
        <CardContent>
          <img src={props.beer.image_url} alt="beer" width="30%" />
          <Typography variant="headline" component="h2">
            {props.beer.name}
          </Typography>
          <Typography component="p">{props.beer.tagline}</Typography>
        </CardContent>
      </Card>
    </div>
  );
}

export default BeerListItem;
Run Code Online (Sandbox Code Playgroud)

github 上的完整项目 -> Github

Mou*_*ror 6

因此,对于图像尺寸,我在这里得到了很好的答案

我补充道:

.BeerListItem-img {
  height: auto;
  max-height: 250px;
  width: auto;
  max-width: 250px;
}
Run Code Online (Sandbox Code Playgroud)

对于卡片大小,我刚刚添加了内部BeerListItem类,Card如下所示(.BeerListItem-main-card):

function BeerListItem(props) {
  return (
    <div>
      <Card raised className="BeerListItem-main-card">
        <CardContent>
          <img
            src={props.beer.image_url}
            alt="beer"
            className="BeerListItem-img"
          />
          <Typography variant="headline" component="h2">
            {props.beer.name}
          </Typography>
          <Typography component="p">{props.beer.tagline}</Typography>
        </CardContent>
      </Card>
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

这是该组件对应的 css。

.BeerListItem-main-card {
  width: 320px;
  height: 415px;
}

.BeerListItem-img {
  height: auto;
  max-height: 250px;
  width: auto;
  max-width: 250px;
}
Run Code Online (Sandbox Code Playgroud)

通过这两个改变,我已经实现了我的目标。


Dal*_*ale 1

您应该尝试探索 display:flex;

这是一个很棒的代码笔的链接,可以帮助您实现您想要的目标:

https://codepen.io/enxaneta/full/adLPwv

更具体地说,这是我根据您可能想要实现的目标创建的示例。

https://jsfiddle.net/dalecarslaw/sxdr3eep/

以下是您应该关注的代码区域:

  display:flex;
  align-items:space-between;
  justify-content:space-between;
  flex-wrap:wrap;
Run Code Online (Sandbox Code Playgroud)