Html 使样式化组件(img)的行为类似于按钮

Html 使样式化组件(img)的行为类似于按钮,html,css,reactjs,styled-components,wai-aria,Html,Css,Reactjs,Styled Components,Wai Aria,我已经创建了一个组件,它的外观完全符合我的要求,但是图标(CollapseIcon&ExpandIcon)需要是选项卡式的,这样用户就可以通过键盘打开手风琴了。我曾尝试将它们包装在按钮元素中,但它破坏了页面的样式。我添加了role=“button”和tabindex,但没有用-有人能推荐一个好的解决方案吗 const Accordion = styled.div` background-color: #e5e9eb; height: 87px; width: 612px; bor

我已经创建了一个组件,它的外观完全符合我的要求,但是图标(
CollapseIcon
&
ExpandIcon
)需要是选项卡式的,这样用户就可以通过键盘打开手风琴了。我曾尝试将它们包装在按钮元素中,但它破坏了页面的样式。我添加了
role=“button”
和tabindex,但没有用-有人能推荐一个好的解决方案吗

const Accordion = styled.div`
  background-color: #e5e9eb;
  height: 87px;
  width: 612px;
  border-radius: 2px;
  border: 1px solid #27282a;
  margin-bottom: 48px;

  span {
    font-size: 14px;
    line-height: 20px;
    padding-left: 24px;
    padding-right: 24px;
    display: block;
  }
`;

const AccordionExpanded = styled.div`
  background-color: #e5e9eb;
  height: 174px;
  width: 612px;
  border-radius: 2px;
  border: 1px solid #27282a;
  margin-bottom: 48px;

  span {
    font-size: 14px;
    line-height: 20px;
    padding-left: 24px;
    padding-right: 24px;
    display: block;
  }
`;

const Title = styled.h3`
font-size: 12px;
letter-spacing: 1px;
text-transform: uppercase;
padding-left: 24px;
padding-top: 20px;
padding-bottom: 0px;
`;

const ExpandIcon = styled.img`
height: 40px;
width: 40px;
float: right;
margin-right: 12px;
`;

const CollapseIcon = styled.img`
height: 40px;
width: 40px;
float: right;
margin-right: 12px;
-webkit-transform: rotate(180deg);
`;

const Button = styled.button`
`;

const IconButton = styled.button`
height: 40px;
width: 40px;
float: right;
margin-right: 12px;
background-color: red;
`;

const ExpandableString = ({ attribute, className }: Props) => {
  const [isExpanded, setIsExpanded] = React.useState(false);
  const fullDescription = attribute.readonlyvalue;
  const shortHeading = fullDescription.substring(0, 40) + '...';

  function toggleContent() {
    setIsExpanded(prev => !prev);
  }

  return (
    isExpanded ? 
    <AccordionExpanded className={className}>
      <Title>Goods being sent
        <CollapseIcon role="button" tabindex="0" onKeyDown={toggleContent} onClick={toggleContent} src={chevron}/>
      </Title>
      <span>{fullDescription}</span>
    </AccordionExpanded> : 
    <Accordion className={className}>
      <Title>Goods being sent
        <ExpandIcon role="button" tabindex="0" onKeyDown={toggleContent} onClick={toggleContent} src={chevron} />
      </Title>
      <span>{shortHeading}</span>
    </Accordion>
  );
};
const Accordion=styled.div`
背景色:#e5e9eb;
高度:87px;
宽度:612px;
边界半径:2px;
边框:1px实心#27282a;
边缘底部:48px;
跨度{
字体大小:14px;
线高:20px;
左侧填充:24px;
右边填充:24px;
显示:块;
}
`;
const accordioexpanded=styled.div`
背景色:#e5e9eb;
高度:174px;
宽度:612px;
边界半径:2px;
边框:1px实心#27282a;
边缘底部:48px;
跨度{
字体大小:14px;
线高:20px;
左侧填充:24px;
右边填充:24px;
显示:块;
}
`;
const Title=styled.h3`
字体大小:12px;
字母间距:1px;
文本转换:大写;
左侧填充:24px;
填充顶部:20px;
垫底:0px;
`;
const ExpandIcon=styled.img`
高度:40px;
宽度:40px;
浮动:对;
右边距:12px;
`;
const CollapseIcon=styled.img`
高度:40px;
宽度:40px;
浮动:对;
右边距:12px;
-webkit变换:旋转(180度);
`;
const Button=styled.Button`
`;
const IconButton=styled.button`
高度:40px;
宽度:40px;
浮动:对;
右边距:12px;
背景色:红色;
`;
const ExpandableString=({attribute,className}:Props)=>{
常量[isExpanded,setIsExpanded]=React.useState(false);
const fullDescription=attribute.readonlyvalue;
const shortHeading=fullDescription.substring(0,40)+'…';
函数toggleContent(){
setIsExpanded(prev=>!prev);
}
返回(
我扩张了吗?
正在发送的货物
{fullDescription}
: 
正在发送的货物
{短标题}
);
};

你离答案太近了

索引的第一个字符应大写

tabIndex={0}
以下是可操作的代码沙盒供您参考


tabIndex value也可以是数字字符串。OPs唯一的错误是tabIndex的情况。但这将很好地工作:tabIndex=“0”哦,是的。你是对的。改变了我的答案太棒了,谢谢。发现当上面和下面有更多可选项卡元素时,手风琴组件卡住(在展开和关闭之间切换)的问题