You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Chakra UI Popover中正确显示带项目符号的HTML列表?

在Chakra UI Popover中正确显示HTML列表的解决方案

方案1:使用Chakra UI原生列表组件(推荐)

既然基于Chakra UI开发,直接用它提供的UnorderedList和ListItem组件是最优解——既规避dangerouslySetInnerHTML的安全风险,又能完美适配Chakra的样式体系,无需额外CSS调整:

import { Popover, PopoverTrigger, PopoverContent, UnorderedList, ListItem, Button } from '@chakra-ui/react';

function HoverListPopover() {
  return (
    <Popover trigger="hover" placement="bottom">
      <PopoverTrigger>
        <Button>HOVER HERE</Button>
      </PopoverTrigger>
      <PopoverContent p={4}>
        <UnorderedList>
          <ListItem>test</ListItem>
          <ListItem>test</ListItem>
          <ListItem>test</ListItem>
        </UnorderedList>
      </PopoverContent>
    </Popover>
  );
}

方案2:修复dangerouslySetInnerHTML的样式问题

如果必须通过HTML字符串注入列表,问题根源是Chakra UI默认重置了列表的原生样式(比如list-style: none、padding-left: 0),需要手动恢复列表的默认行为:

方法A:内联样式嵌入HTML字符串

import { Popover, PopoverTrigger, PopoverContent, Button, Box } from '@chakra-ui/react';

function HoverHTMLListPopover() {
  const listHtml = `
    <ul style="list-style-type: disc; padding-left: 1.5rem; margin: 0;">
      <li style="display: list-item; margin: 0.25rem 0;">test</li>
      <li style="display: list-item; margin: 0.25rem 0;">test</li>
      <li style="display: list-item; margin: 0.25rem 0;">test</li>
    </ul>
  `;

  return (
    <Popover trigger="hover" placement="bottom">
      <PopoverTrigger>
        <Button>HOVER HERE</Button>
      </PopoverTrigger>
      <PopoverContent p={4}>
        <Box dangerouslySetInnerHTML={{ __html: listHtml }} />
      </PopoverContent>
    </Popover>
  );
}

方法B:用Chakra+Emotion统一设置样式

import { Popover, PopoverTrigger, PopoverContent, Button, Box } from '@chakra-ui/react';
import { css } from '@emotion/react';

const listStyle = css`
  ul {
    list-style-type: disc;
    padding-left: 1.5rem;
    margin: 0;
  }
  li {
    display: list-item;
    margin: 0.25rem 0;
  }
`;

function HoverHTMLListPopover() {
  const listHtml = `
    <ul>
      <li>test</li>
      <li>test</li>
      <li>test</li>
    </ul>
  `;

  return (
    <Popover trigger="hover" placement="bottom">
      <PopoverTrigger>
        <Button>HOVER HERE</Button>
      </PopoverTrigger>
      <PopoverContent p={4}>
        <Box css={listStyle} dangerouslySetInnerHTML={{ __html: listHtml }} />
      </PopoverContent>
    </Popover>
  );
}

关于你之前遇到的单符号问题

仅给li添加display: list-item不足以解决问题:Chakra默认会给ul设置list-style: none和padding-left: 0,导致项目符号无法显示或所有符号重叠;若ul被意外设置为display: flex等布局,li会挤在同一行,看起来只有一个符号。

内容的提问来源于stack exchange,提问作者amu03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:27:20