将一个div中的溢出内容转移到另一个div中

17

情况:我有两个高度固定的div,都设置了溢出隐藏,并且第一个div内有动态文本内容。如果该内容超出第一个div的溢出边界,我希望它自动溢出到第二个div中。

我的问题很简单:如何实现这一点?我进行了研究,找到的最接近的东西是一个JQuery插件,可以自动创建类似于报纸布局的列。虽然这不完全是我需要的,但它确实给了我希望,说明这在更简单的层面上是可行的。

视觉示例:

  <html>
     <head>
       <style type="text/css">
          div{height:1in;width:4in;overflow:hidden}
        </style>
     </head>
    <body>
     <div id="d1">...(enough text to cause overflow exceeding 1in height)...</div>
     <div id="d2">...(the rest of the text that got cut off from the first div)...</div>
    </body>
   </html>

谢谢大家!根据所有的意见,我整理了以下内容。注意:这可能并不适合每个人的目的:

  1. 我用jQuery实现了它
  2. 这是非常概念性的
  3. 每个额外的项目都是自己的元素,而不仅仅是开放文本
  4. 针对我的需求,我已经知道单个 div 不会超出溢出限制

话虽如此:

HTML

<html>
<head>
<style type="text/css">
    #base{border:1px black solid;height:2in;width:3in;overflow:hidden;}
    #overflow{border:1px black solid;width:3in;}
    .content{width:2in}
</style>
<script type="text/javascript" src="ref/js/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="work.js"></script>
</head>
<body>
<div id="base">
    <div id="sub"></div>
</div>
<br />
<div id="overflow">
</div>

jQuery

$(document).ready(function(){

//  An array of content, loaded however you wish
var items=new Array();
items[0]='<div class="content" id="C0" style="border:1px blue solid;height:.75in">content 1</div>';
items[1]='<div class="content" id="C1" style="border:1px green solid;height:.75in">content 2</div>';
items[2]='<div class="content" id="C2" style="border:1px red solid;height:.75in">content 3</div>';
items[3]='<div class="content" id="C3" style="border:1px yellow solid;height:.75in">content 4</div>';
items[4]='<div class="content" id="C4" style="border:1px orange solid;height:.75in">content 5</div>';

//  Variable for the height of the parent div with the fixed width
var baseheight=$("#base").css('height').substring(0,$("#base").css('height').length-2);

//  Function to dynamically get the height of the child div within the fixed width div
function subheight(){return $("#sub").css('height').substring(0,$("#sub").css('height').length-2);}

// For each individual piece of content...
for(i=0;i<items.length;i++)
    {
    //  Add it to the child div
    $("#sub").append(items[i]);

    // Variable for the difference in height between the parent and child divs
    var diff=subheight()-baseheight;

    //  If this piece of content causes overflow...
    if(diff>0)
        {

        // Remove it...
        var tooMuch="#C"+i;$(tooMuch).remove();

        // And put it in the overflow div instead
        $("#overflow").append(items[i]);
        }
    }

});

你能展示一个例子吗?代码?图片?我无法想象你的概念。 - elclanrs
想象一下这是一个div:|文本|。你想要像这样的东西吗:|长内容| <其他东西> |长内容溢出| - Tikhon Jelvis
当然,我会将示例放在我的原始帖子中。 - John Ruiz
@JohnRuiz 你找到类似的解决方案了吗?你是否找到最佳性能的适当解决方案? - Gitesh Purbia
@GiteshPurbia 对不起让你等了这么久才回复。这个问题实际上已经有5年以上的历史了,所以我建议任何我获得的解决方案都可以被更现代的东西所取代。 - John Ruiz
@JohnRuiz 我也想了一下该怎么做。我使用了列数 CSS 属性并完成了我的任务 :) - Gitesh Purbia
6个回答

10

这是纯JavaScript的做法。

你需要在JS中实现以下步骤:

  1. 获取cont1的高度。
  2. 当内容加载到cont1时,获取<p>的高度。
  3. 如果<p>的高度大于cont1的高度,则从<p>的文本末尾开始移除文本(并将其存储到临时变量中),直到其高度等于或小于cont1的高度为止。
  4. 被移除的文本(之前已存储)将被放入第二个cont2中。将文本包装在<p>中,以便下一次需要执行此操作时,您将再次与两个容器打交道。

这不是最优雅的代码(当内容很长时,循环会导致滞后),但值得一试

HTML:

<div id="cont1">
    <p>long text here</p>
</div>
<div id="cont2">
    <p><!-- future content --></p>
</div>

CSS:

#cont1{
    height:100px;
    background:red;
    margin-bottom:10px;
    padding:10px;
}
#cont2{
    height:100px;
    background:blue;
    margin-bottom:10px;
    padding:10px;
}

JS:

//existing text must be rendered in the first container so we know how high it is compared to the div

//get references to avoid overhead in jQuery
var cont1 = $('#cont1');
var cont1Height = cont1.height();

var p1 = $('#cont1 p');
var p1Height = p1.height();

var p2 = $('#cont2 p');

//get text and explode it as an array
var p1text = p1.text();
p1text = p1text.split('');

//prepare p2 text
p2text = [];

//if greater height
while (p1Height > cont1Height) {

    //remove last character
    lastChar = p1text.pop();

    //prepend to p2 text
    p2text.unshift(lastChar);

    //reassemble p1 text
    p1temp = p1text.join('');

    //place back to p1
    p1.text(p1temp);

    //re-evaluate height
    p1Height = p1.height();

    //loop
}

//if less than, assemble p2 text and render to p2 container
p2.text(p2text.join(''));​

同意,这个问题没有JS是无法解决的,因为你需要根本性地改变内容标记。 - Hawken
这是一个概念验证代码:http://jsfiddle.net/P7Dfz/4/(由于循环可能会有延迟) - Joseph

7

这个方法有些不太正式,但应该可以工作。http://jsfiddle.net/D6L7u/

基本上,它会将第一个div的内容复制到第二个div中,然后进行偏移,以便初始文本不会显示两次。

HTML

<div id="one" class="mydiv">
Tail beef tenderloin chicken. Ground round tenderloin t-bone biltong fatback andouille bacon, ribeye leberkase boudin ham hock capicola salami frankfurter chicken. Boudin meatball pig strip steak, tongue sirloin brisket bacon capicola beef t-bone hamburger shankle beef ribs frankfurter. Capicola bresaola brisket chuck, short ribs ham jerky. Hamburger venison turkey short ribs jerky, bresaola chuck filet mignon spare ribs. Drumstick kielbasa sirloin jowl flank shoulder, salami tail short ribs corned beef chicken jerky tri-tip bresaola.
</div>

<div id="two" class="mydiv">

</div>​​​​​​​​​​​​​​​​​​​​​​​​​​​

CSS

​​.mydiv
{
    float: left;
    width: 200px;
    height: 200px;
    border: 1px solid black;
    overflow: hidden;
}

JS

​$(​function() {
    var copy = $("#one").clone().attr("id", "onecopy").css({
        "margin-top": "-200px",
        "height":"400px"
    });
    $("#two").append(copy);
});

你可能希望修改js,使其更加动态,例如获取div#one的当前高度而不是静态值。

1
我进行了一些微小的修改,使其更加自动化 http://jsfiddle.net/D6L7u/1/ - user1040899

1

0
一个像这样的框架可以让你检测到内容溢出(否则是一项困难的任务)。然后,你可以决定如何处理溢出的内容。

http://jsfiddle.net/mrtsherman/R7cZL/

<div  id="a" contenteditable>Start typing here...</div>
<div  id="b"></div>
<div  id="c">You should position me way off the screen</div>
<div  id="d">I'm a mirror of div C</div>

div {         
    border: 1px solid gray; 
    margin: 5px; 
    height: 75px; 
    width: 100px; 
    overflow: hidden; 
    display: inline-block;
}
div#c { visibility: hidden; position: absolute; left: -9999px; }

$('#a').bind('input propertychange', function() {
    //copy current content into hidden div c
    $('#c').html($(this).html());
    //now we know height of content if it we didn't have overflow on
    var cHeight = $('#c').height();
    //compare to current height, if greater than then we have overflowed
    if (cHeight > $(this).height()) {
        //move new content in div B
        //there are lots of ways to do this and it depends on what
        //people's input is. Can they cut/paste in?
        //Maybe we start at the end of the string, working backwards until
        //we find that content now fits.
    }
});​

0

HTML

<div id="block1" style=">
  <p>
    long text...
  </p>  
</div>

<div id="block2">

</div>

Jquery

var $1stblock = $('#block1');
var $2ndblock = $('#block2');
var $1stpar = $('#block1 p');
var diff = $1stpar.height() - $1stblock.height();
$1stpar.clone().appendTo($block2).css('top', diff);

CSS

div {
  position: relative;
  overflow: hidden;
}

div p {
  position: absolute;
}

0

由于高度是固定的。将第一个div中的html复制到第二个div中,并将第二个div向上滚动与div高度相同的距离。

将会有两份文本的副本,但视觉效果就像包裹内容一样。

这里有一个工作示例:http://jsfiddle.net/natedavisolds/bxzCK/16/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接