javascript - Nivo 响应线图仅响应于变宽,而不是变窄

标签 javascript css reactjs css-grid

我正在尝试使用 nivo 制作响应式折线图.

我用这个 MWE 重新创建了我的尝试:

import React, { useState, useEffect } from "react";
import { ResponsiveLine } from "@nivo/line";
import styled from "styled-components";

const HoursGraphWrapper = styled.div`
  display: grid;
  grid-template-rows: 300px;
  grid-template-columns: 1fr;
  grid-gap: 10px;
`;

const useWindowWidth = () => {
  let width, setWidth;
  if (typeof window !== "undefined") {
    [width, setWidth] = useState(window.innerWidth);
  } else {
    [width, setWidth] = useState(1001);
  }

  useEffect(() => {
    const handleResize = () => setWidth(window.innerWidth);
    window.addEventListener("resize", handleResize);
    return () => {
      window.removeEventListener("resize", handleResize);
    };
  });

  return width;
};

const TestGraph = () => {
  const width = useWindowWidth();

  return (
    <HoursGraphWrapper>
      <ResponsiveLine
        data={[
          {
            id: "A",
            data: [
              { x: "2019-01-11", y: 11 },
              { x: "2019-01-12", y: 20 },
              { x: "2019-01-13", y: 24 },
              { x: "2019-01-14", y: 25 },
              { x: "2019-01-15", y: 15 },
              { x: "2019-01-16", y: 50 },
              { x: "2019-01-17", y: 30 },
              { x: "2019-01-18", y: 31 }
            ]
          },
          {
            id: "B",
            data: [
              { x: "2019-01-11", y: 30 },
              { x: "2019-01-12", y: 24 },
              { x: "2019-01-13", y: 22 },
              { x: "2019-01-14", y: 15 },
              { x: "2019-01-15", y: 35 },
              { x: "2019-01-16", y: 45 },
              { x: "2019-01-17", y: 20 },
              { x: "2019-01-18", y: 11 }
            ]
          }
        ]}
        colors={{ scheme: "set1" }}
        xScale={{
          type: "time",
          format: "%Y-%m-%d",
          precision: "day"
        }}
        xFormat="time:%Y-%m-%d"
        yScale={{
          type: "linear",
          stacked: false
        }}
        axisLeft={{
          format: value => `${value}hr`,
          legend: "Total Hours",
          legendOffset: -50,
          legendPosition: "middle"
        }}
        axisBottom={{
          format: "%b %d",
          legend: "Date",
          legendOffset: 36,
          legendPosition: "middle",
          tickValues: width < 1000 ? 5 : undefined
        }}
        curve="monotoneX"
        enablePoints={width > 1000}
        pointBorderWidth={1}
        useMesh={true}
        enableSlices={false}
        margin={{ top: 10, right: 20, bottom: 60, left: 80 }}
        animate={true}
      />
    </HoursGraphWrapper>
  );
};

export default TestGraph;

如果我让浏览器变宽 - 折线图会像您预期的那样响应,填充空间。

我遇到的问题是,如果我使浏览器变窄,则图形不会调整大小以填充 100% 的浏览器宽度,就像我将其变宽时那样。对于新的浏览器宽度来说,它仍然太宽了。有趣的是,刷新时图表总是占据浏览器的 100%。

如何在浏览器变宽和变窄时让图表100%占据浏览器?

最佳答案

我已经解决了这个问题,感谢这个关于 SO 的问题和答案:Flex items not shrinking when window gets smaller

解决方案是在 ResponsiveLine 图形周围添加一个 div 包装器,样式如下:

最小宽度:0;

关于javascript - Nivo 响应线图仅响应于变宽,而不是变窄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59276119/

相关文章:

css - 几乎所有的 Bootstrap 样式在 IE8 中都不起作用。在 chrome 和 firefox 中工作正常

jQuery 图片悬停问题

javascript - 使用 PHP 生成的 JS 文件不会在 IE6 中首次加载

Javascript 为什么 onClick 被回车键调用

javascript - 如果我只想获取 HTML 格式的流,输入 `file.stream()` 与 `response.body` 有什么区别?

javascript - 是否可以通过 PWA 设置闹钟? (构建计时器/闹钟应用程序)

javascript - 如何在 React 中通过 API 下载文件?

javascript - 加载或准备好消息

javascript - iframe跨域获取CSS

javascript - 如何在函数中用 this 指向 React 组件?