好吧,我被困了,自己找不到答案。希望有人可以给我一个提示。
我尝试满足以下要求:
到目前为止一切顺利,我能够满足所有这些要求,除了带滚动条的那个。如果我尝试从当前扩展的新闻中获取滚动条,它会再次折叠并且滚动条消失。我知道我的.hover配置为如果我离开newsentry并且Scrollbar不是newsentry div的一部分它总是SlideUp。但我不知道要改变什么仍然有新闻块的整体滚动条,但如果我试图“达到”它将不会消失。
P.s。:只有Newsentry的滚动条看起来很奇怪。这就是为什么我想要将滚动条“绑定”到父容器:S
HTML
<div id="newsblock">
<div> // some auto generated div's i have to life with, so the news entries are not 'direct' children of the newsblock.
<div class="newsentry">
<div class="newstitle">...</div>
<div class="newstext">...</div>
</div>
... another 9 'newsentry' divs.
</div>
</div>
JS
$(".newsentry").hover(
function() {
$(this).children(".newstext").stop(true,true).slideDown();
},
function() {
$(this).children(".newstext").stop(true,true).slideUp();
}
);
CSS
.newsblock {
height: 200px;
overflow-y: auto;
}
答案 0 :(得分:1)
当光标离开.newsentry
时,解决方案可能只有当它进入另一个.newsentry
或离开#newsblock
时才能关闭它。
滚动条是#newsblock
的一部分,当您继续使用该条目时,该条目不再关闭。
编辑:在讨论了滚动问题之后,我在结束动画中添加了step
回调,以确保.newsentry
打开的顶部仍然可见当其他条目关闭时。
这是一个有效的例子:
var $newsblock = $("#newsblock");
function closeAllNews(slideUpArgs){
return $(".newstext").stop(true).slideUp(slideUpArgs);
}
function openNews(news, slideDownArgs){
$(news).find(".newstext").stop(true).slideDown(slideDownArgs);
}
function ensureNewsTopVisible(news){
// Check if the top of the newsentry is visible...
var top = $(news).position().top;
if(top < 0){
// ...and if not, scroll newsblock accordingly.
$newsblock.scrollTop($newsblock.scrollTop() + top);
}
}
$(".newsentry").each(function(){
var $this = $(this);
// When the mouse enter a news entry...
$this.on("mouseenter", function(){
// ...close all opened entries (normally there is at most one)...
closeAllNews({
// (while making sure that the top of this entry remains visible
// at each step)
step: ensureNewsTopVisible.bind(null, $this)
});
// ...open this newsentry.
openNews($this);
});
});
// When the mouse get out of the newsblock, close all news.
$newsblock.on("mouseleave", closeAllNews);
.newstitle {
font-size: 2em;
}
.newstext {
display: none;
}
#newsblock {
max-height: 150px;
overflow: scroll;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="newsblock">
<div>
<div class="newsentry">
<div class="newstitle">News 1</div>
<div class="newstext"></div>
</div>
<div class="newsentry">
<div class="newstitle">News 2</div>
<div class="newstext"></div>
</div>
<div class="newsentry">
<div class="newstitle">News 3</div>
<div class="newstext"></div>
</div>
<!-- Etc. -->
</div>
</div>
<!-- Ignore the script below. It is just filling in the news' text. -->
<script>
$(".newstext").each(function(i, newstext){
$.get("http://baconipsum.com/api/?type=meat-and-filler&format=html¶s=5&num=" + i)
.then(function(ipsumHtml){
$(newstext).html(ipsumHtml);
});
});
</script>
答案 1 :(得分:0)
试试这个:
$(".newsentry, .newsblock").hover( // <-- changed
function() {
$(this).children(".newstext").stop(true,true).slideDown();
},
function() {
$(this).children(".newstext").stop(true,true).slideUp();
}
);
当您将鼠标悬停在标题或块本身上时,这可确保块保持打开状态。
这是你的意思吗?
答案 2 :(得分:0)
如果您使用点击操作而不是悬停以向下滑动新闻文本块,那将会更好,因为用户可能会意外地悬停在任何新闻条目上以便到达滚动条。我认为你需要一个类似手风琴的功能。如果你没有点击而不是悬停,你可以使用下面的代码。
$(".newsentry").click(
function() {
$(".newstext").stop(true,true).slideUp();
$(this).children(".newstext").stop(true,true).slideDown();
}
);
或使用下面的一个来悬停。
$(".newsentry").hover(
function() {
$(".newstext").stop(true,true).slideUp();
$(this).children(".newstext").stop(true,true).slideDown();
},
function(){}
);
在您不小心将鼠标悬停在其他新闻条目上之前,这不会关闭新闻文本块。
答案 3 :(得分:0)
如果我错了,会有一个笑话。我只想改变你的css
/* not .newsblock **/
#newsblock {
height: 200px;
overflow-y: scroll;/* not auto*/
}