如何使文本随 div 大小自适应?

14

我正在建立一家电子商务网站。所有产品都显示在单独的div中。我有一个问题:在每个产品的div中,我想显示产品描述的一部分。当产品描述超出div的长度时,它会简单地显示在div的边缘上。我已经尝试将问题放入图片中:enter image description here

如图所示,我希望解决三个问题:

  • 我想限制文本以适应div。
  • 我想确保这不是在单词的中间完成的
  • 我想在预览描述的末尾添加“阅读更多”链接。

现在我在其他电子商务网站上看到了很多这样的内容,但是寻找了几个小时后,我没有找到清晰的说明如何做到这一点。

这是生成所有产品卡的代码:

for($i = 0; $i<$numberOfItems; $i++) {
    //echo $output_array[$i]["itemName"];
    echo '<a href="/itemDetails.php?itemCode=';echo $output_array[$i]["itemCode"]; echo '&itemName='; echo $output_array[$i]["itemName"];echo'">
    <div id="item" style="background-color: transparent; width:243px;height:auto;float:left; margin-left:20px; margin-top:20px; max-width:800px; display:inline-block;">
    <div id="itemPicture" class="itemImage"; > 
    <div id="price" class="pricetag">
    <div id="priceText" class="priceText";>';
    echo "€".$output_array[$i]["itemPrice"];

    echo '</div></div>';
    $imageSource = "http://www.imagine-app.nl/ProductImages/".$output_array[$i]["firstImage"].".jpg";
    echo '<img src="';echo $imageSource; echo'" style="max-width:100%; border:0px;"> 

    </div>

    <div id="itemName" class="itemName"">';
        echo $output_array[$i]["itemName"];
    echo '</div>'; ?>

    <div id="itemDescription" class="itemDescription" style="height:">
    <?  echo $output_array[$i]["itemDescription"];
    echo '</div>';
    ?>

    <?php
    echo '<div id="itemComment" class="itemComment"">
          Lees verder! 
    </div>

</div></a>';
}

有人知道如何解决这些问题吗?非常感谢任何帮助。先谢谢了!

更新

答案让我了解到“行截断”,这似乎是执行我需要的任务的 CSS 或 JavaScript 代码。实施 musically_ut 提供的 JavaScript 代码和 Unamata Sanatarai 的 CSS,将我带到了这个结果: enter image description here

我可以说已经取得了进展,因为文本不再只是横跨我的 div 边界。我只剩下两个问题:

  • 文本截断的内容正在某些情况下穿过产品卡片的页脚。
  • 它有时会中断一个单词。(它是荷兰语。应该在那里的单词是“beschikt”。)

欢迎任何建议。

PS:第二张屏幕截图使用了 CSS 实现,因为 JavaScript 实现仅适用于一个产品(可能是因为产品卡片是由 PHP 的“for”循环生成的 div)。


在这里已经回答了类似的问题:https://dev59.com/CXzaa4cB1Zd3GeqPRIlz#21798739 - Mr. Alien
3个回答

9
您想要的是多行文本截断。不幸的是,CSS目前只允许截取第一行文本。 Webkit / Opera允许截取多行,但我怀疑这在这里对您没有什么帮助。

有几种解决方法(甚至有一个全CSS的解决方案),在这里描述:http://css-tricks.com/line-clampin/

然而,最可靠的方法似乎是使用JavaScript来完成任务:Clamp.js


嗨!感谢您的回复!我已经更新了问题,介绍了目前为止所取得的进展。我在实现JavaScript代码时遇到了一个问题:它只适用于一个产品卡片。这可能是因为所有div都是由php的“for”循环生成的,因此具有相同的id属性。您知道解决此问题的方法吗? - Joris416
1
@Imaginedigital 在 php 循环中使用 class 属性而不是 id,这样做更好。此外,它们不应该具有相同的 id,否则会使 HTML 无效。 - musically_ut
我可以让php将div的名称作为产品id,这样可以吗?谢谢。另外,您知道如何解决我更新的问题吗? - Joris416
@Imaginedigital 是的,只要产品名称仅包含有效字符并且是唯一的即可。至于问题,看起来容器缺少overflow: hidden,但如果没有查看源代码,我无法确定。 - musically_ut
这是当前的源代码(CSS实现):.itemDescription{ background-color:rgb(255,255,255); width:243px; height:80px; text-align:left; font-family:"Gill Sans"; font-size:16px; color:#000; display: block; display: -webkit-box; -webkit-line-clamp: 4; -webkit-box-orient: vertical; overflow:hidden; } - Joris416

6
使用CSS文本溢出行夹紧
div {
  display: block; 
  display: -webkit-box;
  width: 200px;
  height: 40px;
  margin: 0 auto;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  padding:20px;
  overflow:hidden;
  text-overflow: ellipsis;
}

实时示例:http://jsfiddle.net/5Z4Wu/


3
这个夹子不会在第一行断点处截断吗?我认为提问者想要一个多行夹子。 - musically_ut
感谢您调整您的答案。但是,现在我怀疑这个解决方案是否只适用于webkit?演示似乎在Firefox中无法正常工作。 - musically_ut
嗨!你的解决方案取得了最好的进展,非常感谢!!我已经编辑了问题并列出了剩下的问题。你知道如何解决它们吗?(文字被中断,截断的文本可见。) - Joris416

2

请查看我自己创建的代码片段

该代码片段中的脚本根据屏幕大小将“了解更多”链接设置在有限区域/溢出设置(已隐藏)div 的右下角。单击“了解更多”链接,将切换溢出内容的可见性。

jQuery

/*Only change required in this script if id name of div containing text is different*/
var txtCont = $('#wrappingText');
/*******************************/
var lines = txtCont.get(0).getClientRects();
txtCont.css('display','inline-block');

jQuery.fn.exists = function(){return this.length>0;}

function debugTxt(txt)
{
    var lineHeight = txtCont.css('line-height').replace("px", '');
    var txtContHeight = txtCont.height();
    txtCont.parent().height(lineHeight*Math.floor(txtContHeight/lineHeight));
    if (txt*lineHeight>txtContHeight){
       if(!txtCont.parent().find('.knowMore').exists()){
       txtCont.parent().append('<div class="knowMore">Know </div>');
    }}
    else
       txtCont.parent().find('.knowMore').remove();
}
debugTxt(lines.length);

$('.knowMore').click(function(){
    $(this).prev().toggleClass("visible");
    $(this).toggleClass('knowLess');
    $(this).parent().toggleClass("parentClick");
});

使用适当的CSS可以获得正确的输出。以下是在fiddle中使用的CSS:

#wrapper{
    position:relative;
}
html,body,#wrapper,#wrappingText{
    margin:0px;
    padding:0px;
    width:100%;
    height:100%;
}
#wrappingText{
    display:inline;
    overflow:hidden;
}
.knowMore{
    position:absolute;
    bottom:0px;
    right:0px;
    background-color:white;
    color:blue;
    cursor:pointer;
}
.knowMore:before{
    content:"...";
}
.knowMore:after{
    content:"More";
}
.knowLess:before{
    content:"";
}
.knowLess:after{
    content:"Less";
}

.visible{
    overflow:visible !important;
}

.parentClick{
    width:auto !important;
    height:auto !important;
}

更新

<div class="container">
.
.
.
<div class="wrapper">
<div class="wrappingText"></div>
</div>
.
.
.
</div>

上述结构应该用于在fiddle中使用的插件。您可以使用所需的类名。在上面的HTML中,wrappingText是包含文本的div。它必须被包裹在另一个div中,在上面的HTML中,wrappingText被包裹在类名为wrapper的div中。
要使用插件,只需使用包含文本的div的类名调用插件,并将主父类名作为参数传递。
$('.wrappingText').knowMoreLess('.container'); // CALLING PLUGIN

在下面更新的代码片段中,添加了其他说明和细节,请参考注释:

更新后的代码片段


抱歉回复晚了!我有一个关于这种方法的问题。由于我所有的产品卡都是通过 php 循环生成的,我的 div 名称对于产品名称是可变的(网页不知道名称)。我能否在这个脚本中加入一段 html/php 代码,让它知道需要调整哪个 DIV?(希望我表达清楚了,抱歉英语不太好) - Joris416
你能发布一下循环生成的HTML输出吗? - Zword
我已经更新了我的问题并附上了它。感谢您的快速回复! - Joris416
好的,我会查看并发布更新。稍后检查更新。 - Zword
你是否使用了所需的CSS、jQuery和HTML结构? - Zword
显示剩余6条评论

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