我需要选择一行以在其上添加hover
效果。我试图用div
将所有单元格换行,但是所有标记都被破坏了。有谁知道如何做吗?这有可能吗?
在此处查看完整代码:https://codesandbox.io/s/goofy-easley-w5rrg
const TableWrapperUI = styled.div `
display: grid;
box-sizing: border-box;
width: 100%;
border: 1px solid #dbeaf4;
grid-template-columns: repeat(
${props => props.columns && props.columns},
fit-content(400px)
);
justify-items: center;
padding: 5px 0;
justify-content: space-between;
> span {
padding: 5px;
justify-self: left;
:hover {
background: #dbeaf4;
}
}`;
const LineUI = styled.div `
border-bottom: 1px solid #dbeaf4;
width: 100%;
grid-column: 1 / -1;
`;
答案 0 :(得分:4)
您不能从子网格中选择整行,但是如果要突出显示背景,则可以伪造它。
const TableWrapperUI = styled.div`
display: grid;
box-sizing: border-box;
width: 80%;/* demo, to show overflow cut off */
overflow:hidden;
border: 1px solid #dbeaf4;
grid-template-columns: repeat(
${props => props.columns && props.columns},
fit-content(400px)
);
justify-items: center;
padding: 5px 0;
justify-content: space-between;
> span {
padding: 5px;
justify-self: left;
position: relative;
:hover {
background: #dbeaf4;
}
:hover::before, ::before {
content: "";
position: absolute;
background: inherit;
top: 0;
bottom: 0;
left: -100vw;
right: -100vw;
}
:hover::before {
z-index:-1
}
}
`;
答案 1 :(得分:4)
display: contents;
来营救!
Kinda。
根据您的browser support and/or accessibility requirements,我们可以使用相对较新的display: contents
property,使用您的一般结构来实现所需的效果。
描述display: contents
有点困难,因此,我将指出这个出色的CSS Tricks article。
要使用它,我们将一行<span>
中的每组元素都用<div>
包装到display: contents
中。这使我们可以定位div:hover > span
元素并应用背景色。
还需要对样式进行一些其他小的更改,例如使<span>
元素填充可用宽度。这是一个工作示例:
.parent {
display: grid;
box-sizing: border-box;
width: 100%;
border: 1px solid #dbeaf4;
grid-template-columns: repeat(4, minmax(15%, max-content));
padding: 5px 0;
}
.parent span {
padding: 5px;
border-bottom: 1px solid #dbeaf4;
}
.row {
display: contents;
}
.row:hover span {
background-color: #dbeaf4;
cursor: pointer;
}
<div class="parent">
<div class="row">
<span>1</span>
<span>2</span>
<span>3</span>
<span>Knowledge process outsourcing land the plane yet to be inspired is to become creative, innovative and energized we want this</span>
</div>
<div class="row">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
</div>
<div class="row">
<span>We need to socialize the comms with the wider stakeholder community</span>
<span>2</span>
<span>3</span>
<span>4</span>
</div>
<div class="row">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
</div>
<div class="row">
<span>1</span>
<span>2</span>
<span>3</span>
<span>4</span>
</div>
</div>
具有React和样式化组件
现在我们可以使用CSS了,我们可以将其放回样式化组件中。我对您的代码进行的主要更改是使用<LineUI />
组件来包装每一行以及上面的新CSS。
const titles = [
"Id",
"Type",
"Name",
"Category",
"Client",
"Date",
"Watched",
"Amount",
"State",
"Delete"
];
const data = [
{
id: 23,
type: "test",
name: "joaaaahnny cageasdasdasd cageasdasdasd cageasdasdasd cageasdasdasd",
category: "selasdasler",
client: "custom",
date: "01-01-2019",
watched: "yes",
amount: 1231,
state: "pending",
delete: "button"
},
{
id: 211,
type: "test",
name: "johnny cage",
category: "seller",
client: "custsdsom",
date: "01-01-2019",
watched: "yes",
amount: 1231,
state: "pending",
delete: "button"
},
{
id: 2222,
type: "test",
name: "johnny cage",
category: "seller",
client: "custom",
date: "01-01-2019",
watched: "yes",
amount: 1231,
state: "pending",
delete: "button"
},
{
id: 2222,
type: "test",
name: "johnny cage",
category: "seller",
client: "custom",
date: "01-01-2019",
watched: "yes",
amount: 1231,
state: "pending",
delete: "button"
},
{
id: 2222,
type: "test",
name: "johnny cage",
category: "seller",
client: "custom",
date: "01-01-2019",
watched: "yes",
amount: 1231,
state: "pending",
delete: "button"
},
{
id: 2222,
type: "test",
name: "johnny cage",
category: "seller",
client: "custom",
date: "01-01-2019",
watched: "yes",
amount: 1231,
state: "pending",
delete: "button"
},
{
id: 2222,
type: "test",
name: "johnny cage",
category: "seller",
client: "custom",
date: "01-01-2019",
watched: "yes",
amount: 1231,
state: "pending",
delete: "button"
}
];
const TableWrapperUI = styled.div`
display: grid;
box-sizing: border-box;
width: 100%;
border: 1px solid #dbeaf4;
grid-template-columns: repeat(
${props => props.columns && props.columns},
minmax(auto, max-content)
);
padding: 5px;
> * {
padding: 5px;
}
`;
const LineUI = styled.div`
display: contents;
> * {
padding: 5px;
border-bottom: 1px solid #dbeaf4;
}
:hover > * {
background-color: #dbeaf4;
cursor: pointer;
overflow: visible;
}
`;
const Table = ({ children, titles, data }) => {
const [amountColumns, setAmountColumns] = React.useState(0);
React.useEffect(() => {
setAmountColumns(titles.length);
}, []);
const displayData = data => {
return data.map((x, idx) => {
return (
<React.Fragment key={idx}>
<LineUI>
{Object.keys(x).map((value, ids) => (
<span key={ids}>{x[value]}</span>
))}
</LineUI>
</React.Fragment>
);
});
};
const displayTitles = titles => {
return titles.map((title, idx) => {
return <span key={idx}>{title}</span>;
});
};
return (
amountColumns > 0 && (
<TableWrapperUI columns={amountColumns}>
{displayTitles(titles)}
{displayData(data)}
</TableWrapperUI>
)
);
};
function App() {
return (
<div className="App">
<Table columns={10} titles={titles} data={data} />
</div>
);
}
ReactDOM.render(<App />, document.getElementById("root"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/styled-components/4.3.2/styled-components.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js"></script>
<div id="root"></div>
答案 2 :(得分:0)
这是基于网格的解决方案,请在网格中使用两行。
1)带网格的标题行
2)带网格的表网格主体
引用此链接:https://codesandbox.io/embed/hopeful-pascal-hfdzx
更新的CSS:
const TableRowUI = styled.div`
display: grid;
box-sizing: border-box;
width: 100%;
border-top: 1px solid #dbeaf4;
grid-template-columns: repeat(
${props => props.columns && props.columns},
1fr
);
justify-items: center;
justify-content: space-between;
> span {
padding: 5px;
justify-self: left;
}
`;
const TableHeadUI = styled.div`
display: grid;
box-sizing: border-box;
width: 100%;
border-bottom: 1px solid #dbeaf4;
grid-template-columns: repeat(
${props => props.columns && props.columns},
1fr
);
justify-items: center;
justify-content: space-between;
> span {
padding: 5px;
justify-self: left;
}
`;
最终代码段:
答案 3 :(得分:0)
使用table
代替span
变得简单。
Codesandbox示例-Link
table {
border: 1px solid #dbeaf4;
}
table tbody tr:hover {
background: #dbeaf4;
}
table tbody td {
border-top: 1px solid #dbeaf4;
}
th,
td {
text-align: left;
padding: 5px;
}
<table>
<thead>
<tr>
<th>Id</th>
<th>Type</th>
<th>Name</th>
<th>Category</th>
<th>Client</th>
<th>Date</th>
<th>Watched</th>
<th>Amount</th>
<th>State</th>
<th>Delete</th>
</tr>
</thead>
<tbody>
<tr>
<td>23</td>
<td>test</td>
<td>joaaaahnny cageasdasdasd cageasdasdasd cageasdasdasd cageasdasdasd</td>
<td>selasdasler</td>
<td>custom</td>
<td>01-01-2019</td>
<td>yes</td>
<td>1231</td>
<td>pending</td>
<td>button</td>
</tr>
<tr>
<td>211</td>
<td>test</td>
<td>johnny cage</td>
<td>seller</td>
<td>custsdsom</td>
<td>01-01-2019</td>
<td>yes</td>
<td>1231</td>
<td>pending</td>
<td>button</td>
</tr>
<tr>
<td>2222</td>
<td>test</td>
<td>johnny cage</td>
<td>seller</td>
<td>custom</td>
<td>01-01-2019</td>
<td>yes</td>
<td>1231</td>
<td>pending</td>
<td>button</td>
</tr>
<tr>
<td>2222</td>
<td>test</td>
<td>johnny cage</td>
<td>seller</td>
<td>custom</td>
<td>01-01-2019</td>
<td>yes</td>
<td>1231</td>
<td>pending</td>
<td>button</td>
</tr>
<tr>
<td>2222</td>
<td>test</td>
<td>johnny cage</td>
<td>seller</td>
<td>custom</td>
<td>01-01-2019</td>
<td>yes</td>
<td>1231</td>
<td>pending</td>
<td>button</td>
</tr>
<tr>
<td>2222</td>
<td>test</td>
<td>johnny cage</td>
<td>seller</td>
<td>custom</td>
<td>01-01-2019</td>
<td>yes</td>
<td>1231</td>
<td>pending</td>
<td>button</td>
</tr>
<tr>
<td>2222</td>
<td>test</td>
<td>johnny cage</td>
<td>seller</td>
<td>custom</td>
<td>01-01-2019</td>
<td>yes</td>
<td>1231</td>
<td>pending</td>
<td>button</td>
</tr>
</tbody>
</table>
答案 4 :(得分:-1)
您可以通过一种简单的方法将所有数据添加到表中 https://codesandbox.io/s/hidden-moon-p6emo