javascript - 如何修复这个使用绝对位置的选项卡布局?
问题描述
我知道绝对位置是如何工作的,但在这种情况下,它会破坏布局。当然,我可以使用min-height
媒体查询为每个屏幕尺寸使用 ,但这不是一个完整的解决方案,因为客户端可以上传任何图像尺寸。
下面的内容与使用绝对位置的选项卡重叠。我正在使用绝对位置,以便动画工作。是否有可能添加 jQuery 代码来检测图像高度并自动应用它,还是有更好的解决方案?我该如何解决这个问题?
JSFiddle:https://jsfiddle.net/6yo5b198/
HTML:
<div class="modules">
<div class="container">
<div class="row">
<div class="col-md-12 col-12">
<div id="exTab1">
<div class="row">
<div class="col-md-3 col-12">
<ul class="nav nav-pills">
<li class="active">
<a class="nav-link active" href="#a1a" data-toggle="tab">Overview</a>
</li>
<li><a class="nav-link " href="#a2a" data-toggle="tab">About Us</a>
</li>
<li><a class="nav-link " href="#a3a" data-toggle="tab">Services</a>
</li>
</ul>
</div>
<div class="col-md-9 col-12">
<div class="tab-content clearfix">
<div class="tab-pane active" id="a1a">
<img src="https://i.postimg.cc/xjFVtP8v/1511048-810098669070876-8091817687576561426-n.jpg">
</div>
<div class="tab-pane" id="a2a">
<img src="https://i.postimg.cc/d3XM3JpH/198582c8c440a3a96817d79a6dc28731-640x469.jpg">
</div>
<div class="tab-pane" id="a3a">
<img src="https://i.postimg.cc/qMhVYC69/50445941-10213980102716788-1077889899119509504-n.jpg">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="">
<h1>Other web contents go here.</h1>
</div>
CSS:
.tab-content .tab-pane img {
opacity: 0;
-moz-transform: translateX(50px);
-ms-transform: translateX(50px);
-o-transform: translateX(50px);
-webkit-transform: translateX(50px);
transform: translateX(50px);
transition: 1s all cubic-bezier(0.075, 0.82, 0.165, 1);
max-width: 100%;
height: auto;
}
.tab-content .active img {
opacity: 1;
transform: translate(0);
}
#exTab1 .tab-content {
overflow: hidden;
}
#exTab1 .tab-content .tab-pane {
display: block;
position: absolute;
overflow: hidden;
}
解决方案
您不想要min-height
,因为您不知道每个响应级别的高度(在移动设备上可能会更低)。您想要的是让.active
选项卡设置选项卡的高度。为此,您需要将其position
重新设置为static
.
#exTab1 .tab-content .tab-pane.active {
position: static;
}
这也需要您将 a 添加top: 0
到其他的。没有它,当前活动选项卡之后的选项卡将不会位于选项卡容器的顶部,而是位于活动选项卡的底部。
您更新的小提琴:https ://jsfiddle.net/websiter/grkn493p/
注意:如果您还希望容器高度的变化平滑,则必须height
在容器上使用并在每次选项卡更改时转换它,方法是从当前选项卡的高度读取它。
设置过渡:
#exTab1 .tab-content {
transition: height .3s cubic-bezier(.4,0,.2,1);
}
Get the active tab's height when the tab changes and set it on the container:
$(function() {
// on document ready...
$('.nav').on('shown.bs.tab', function(e){
// on every `shown.bs.tab` triggered on a `.nav`, run this code:
const $target = $($(e.target).attr('href'));
//find target from `href` tab attribute
$target.is('div') && $target.closest('.tab-content').css({
// if target is div, set it's css to
height: $target.height()
// the height of target (defined above)
})
});
});
更新小提琴:https ://jsfiddle.net/websiter/uz0fkrj2/
请注意更新的小提琴更进一步。我注意到调整页面大小时容器上的设置高度没有更新。这带来了两个明显的问题:
- a)更新高度的功能需要更改为与目标无关(因为我们不知道
resize
事件中的目标)。但这很容易解决,因为目标是当前的.active
选项卡面板。 - b)
window.resize
过于频繁地触发,并且如此频繁地设置页面中每个选项卡容器的高度会导致性能问题(页面动画会错开)。为了避免这种情况,我throttle
编辑了更新功能(不允许它运行的频率超过x
毫秒)。我导入了 lodash 并使用了它的_.throttle
方法——有一个 jQuery 等价物,但我不确定它的语法——从未使用过。
推荐阅读
- typescript - typescript 如何定义多个类型数组
- java - 如何在运行时更新 JLabel
- android - 如何处理应用内更新中的 InstallException?
- laravel - 错误:调用 int 上的成员函数 where()
- python - 如何创建循环来评估条件函数
- python - python在docker-compose中为tasker运行脚本
- kubernetes - 在 Internal.UpdateClusterInternal 之后删除了部署
- python - 如何在jinja2中导入变量
- java - 从其他类android设置进度条值
- javascript - 如何选择这个元素(在 Python 中)