javascript - 如何使用文本创建 td 边框
问题描述
我想创建一个带有默认边框的简单表,然后在td
元素上获取“悬停”事件(可能由 jquery),这将导致:
a) 顶部边框应为黑色,中间有空白区域
b)在边框的中间应该显示来自那个p
元素的文本td
(文本应该定位在悬停和前一个元素之间)
结果应该看起来像(我用不同的颜色标记悬停的元素):
我不确定,但可能仅通过使用 css 是不可能的,我尝试实现简单的示例,但它不起作用。这个想法是创建一个两个 div(模仿顶部边框)和p
元素。问题是因为 div 总是不可见的(td
当元素悬停时应该替换正常边框),我也不知道如何p
根据需要定位元素。
我怎样才能得到正确的解决方案?
$(document).ready(function() {
var tableBodyContent = "";
for (var i = 0; i < 10; i++) {
tableBodyContent += '<tr>' +
'<td><div class="myTopBorder"><div class="myBorder leftBorder"></div><div class="myBorder rightBorder"></div></div><p class="myText" value="' + i + ':00">ok</p>Item ' + i + '</td>' +
'<td><div class="myTopBorder"><div class="myBorder leftBorder"></div><div class="myBorder rightBorder"></div></div><p class="myText" value="' + i + ':00">ok</p>Item ' + i + '</td>' +
'<td><div class="myTopBorder"><div class="myBorder leftBorder"></div><div class="myBorder rightBorder"></div></div><p class="myText" value="' + i + ':00">ok</p>Item ' + i + '</td>' +
'<td><div class="myTopBorder"><div class="myBorder leftBorder"></div><div class="myBorder rightBorder"></div></div><p class="myText" value="' + i + ':00">ok</p>Item ' + i + '</td>' +
'<td><div class="myTopBorder"><div class="myBorder leftBorder"></div><div class="myBorder rightBorder"></div></div><p class="myText" value="' + i + ':00">ok</p>Item ' + i + '</td>' +
'</tr>'
}
$("#timeTableBody").append(tableBodyContent);
});
$("td").hover(
function() {
$(this).find(".myBorder").each(function(index) {
$(this).show();
});
},
function() {
$(this).find(".myBorder").each(function(index) {
$(this).hide();
});
}
);
table {
border: none;
border-collapse: collapse;
padding: 0;
margin: 0;
}
th,
td {
width: 45px;
height: 20px;
padding: 10px;
}
.myTopBorder {
height: 1px;
width: 100%;
}
.leftBorder,
.rightBorder {
height: 100%;
width: 30%;
display: none;
}
.leftBorder {
float: left;
}
.rightBorder {
float: right;
}
th {
border: 1px solid black;
}
td {
border-top: 1px solid lightgrey;
border-left: 1px solid lightgrey;
border-right: 1px solid lightgrey;
}
td:hover {
border: none;
}
.myText {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
<thead>
<tr>
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
</tr>
</thead>
<tbody id="timeTableBody">
</tbody>
</table>
解决方案
您可以对内容使用伪元素和数据属性,如下所示:
table {
border: none;
border-collapse: collapse;
padding: 0;
margin: 0;
}
th,
td {
width: 45px;
height: 20px;
padding: 10px;
}
th {
border: 1px solid black;
}
td {
border-top: 1px solid lightgrey;
border-left: 1px solid lightgrey;
border-right: 1px solid lightgrey;
position: relative;
}
td::before {
content: attr(data-text);
position: absolute;
z-index: 2;
top: -5px;
font-size: 10px;
left: 0;
right: 0;
text-align: center;
background: linear-gradient(green, green) center left/20px 1px, linear-gradient(green, green) center right/20px 1px;
background-repeat: no-repeat;
opacity: 0;
}
td:hover {
border-top: 0;
background: orange;
}
td:hover::before {
opacity: 1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
<thead>
<tr>
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
</tr>
</thead>
<tbody id="timeTableBody">
<tr>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
</tr>
<tr>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
</tr>
<tr>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
<td data-text="3:00">Item 0</td>
</tr>
</tbody>
</table>
推荐阅读
- amazon-web-services - Kubernetes pod 因卷区不匹配而失败
- javascript - 显示/隐藏密码 ASP.NET
- linux - 在 fork 中反向调用顺序
- pattern-matching - 模式匹配中“as”的范围
- suitescript - 套件中的 Rest SuiteTalk 身份验证问题
- sql - TimescaleDB - 创建一个“透视视图”,其中所有传感器值对应于一行上的特定时间戳
- json - pyspark 将带有键/值对的字典项的 json 数组分解为列
- c# - [失败]:OmniSharp.MSBuild.ProjectManager 尝试更新未在 Unity、VSCode 中加载的项目
- javascript - 如何使用 Graph API 将 Facebook 发布到页面公开
- python - 通过 Selenium Python 进行关键字抓取工具