css 如何隐藏元素溢出而不裁剪内联图像/文本?

amrnrhlw  于 2023-10-21  发布在  其他
关注(0)|答案(2)|浏览(169)

我有一个容器div,属性为overflow: hiddenmax-height为100 px。这个容器元素包含任意数量的内联元素,包括图像和样式化文本。
当前,如果存在超过100 px的内容,则剪切其余内容。这是我想要的一般行为,除了我不断遇到文本行的部分被裁剪的问题(即,字母的下半部分将被剪掉)或者图像的一半将被裁剪掉。
我找到了一个解决文本问题的方法,通过手动设置列宽属性,但我找不到任何方法来阻止图像被裁剪。如果任何单独的文本行或图像不能在容器div中完整地呈现,我希望隐藏整个图像/文本行。

**总结:**我有一个div元素,它 Package 了一堆内联元素(主要是文本和图像)并隐藏了任何溢出,我不想显示任何文本行或图像,它会裁剪/裁剪某些部分。我已经找到了文本问题的解决方法,但不是图像。如何实现我想要的功能?

编辑:根据评论者的请求,我发布了我的,尽管微不足道的代码:
超文本标记语言:

<div id="test">
  <p>
    This is a test. This is a test.This is a test.This is a test.This is a test.This is a test.This is a test.This is a test.This is a test.
  </p>
  <img src="https://hackernoon.com/hn-images/0*xMaFF2hSXpf_kIfG.jpg" alt="Girl in a jacket" width="500" height="600">
</div>

行内元素将只是 Package 在适当标记中的文本和图像(它们的实际值是动态的,并根据情况而变化。我在这里提供的内容只是一个例子。
CSS:

#test { 
  max-height: 200px;
  max-width:200px;
  overflow: hidden; 
}

这里有一个JS fiddle的例子。正如你所看到的,图像被裁剪了。
这里是another JS Fiddle Example,其中文本本身在行的中途被剪切。
在第一个例子中,我希望图像根本不显示。
在第二种情况下,我希望最后一行根本不显示。
不能完整显示的元素不应显示。我有特别的麻烦得到这个图像所需的行为,所以任何帮助,将特别感谢。

pwuypxnk

pwuypxnk1#

您可以使用JavaScript实现所需的行为。在这个片段中,我只是为了说明的目的,给“隐藏”项一个低不透明度。显然,您可以在实际应用程序中简单地将隐藏项设置为visibility: hiddendisplay: none

const containers = document.querySelectorAll('.container');
containers.forEach(container => hideOverflow(container));

// Hide all overflowing images and portions of text nodes
function hideOverflow(container) {
  container.childNodes.forEach(node => {
    if (node.nodeName !== '#text') {
      if (node.nodeName === 'IMG' ||
          node.querySelector('img') != null) {
        // Hide entire image if it overflows
        if (node.offsetTop + node.offsetHeight > container.offsetHeight) {
          node.classList.add('hidden');
        }
      }
      else {
        // Hide overflowing text characters
        if (node.offsetTop > container.offsetHeight) {
          node.classList.add('hidden');
        }
        else {
          hideChildOverflow(node, container);
        }
      }
    }
  });
}

// Find all descendant text nodes, and hide their overflowing characters
function hideChildOverflow(node, container) {
  if (node.nodeName === '#text') {
    const overflow = document.createRange();
    overflow.setEnd(node, node.length);
    
    // Shrink range until it includes only overflowing characters
    for (let i = 0; i <= node.length; i++) {
      overflow.setStart(node, i);
      
      if (overflow.getBoundingClientRect().top > container.offsetHeight) {
        break;
      }
    }
    
    // Hide the overflowing characters
    const span = document.createElement('span');
    span.classList.add('hidden');
    overflow.surroundContents(span);
  }
  else {
    node.childNodes.forEach(childNode => {
      hideChildOverflow(childNode, container);
    });
  }
}
body {
  display: flex;
}

.container {
  max-height: 200px;
  max-width: 200px;
  border: 1px solid red;
  margin-right: 20px;
}

.hidden {
  opacity: .2;
}
<div class="container">
  <img src="https://picsum.photos/id/237/200/50" width="200" height="50" />
  <p>All of this text is visible, since none of it overflows the container.</p>
  <img src="https://picsum.photos/id/237/200/100" width="200" height="100" />
  <p>This text is below the container, so it gets hidden.</p>
</div>

<div class="container">
  <img src="https://picsum.photos/id/237/200/100" width="200" height="100" />
  <p>The start of this text is visible, but the last part gets hidden since it overflows the bottom of the container. Any piece of text that overflows, even if only partially, gets hidden.</p>
</div>
gijlo24d

gijlo24d2#

如果我理解正确的话,那么你的组件的逻辑如下:
1)如果您的文本和图像的高度在200px以内,则正常显示。
2)如果文本或图像太大,无法放入div,则不显示其中之一。
3)如果文本或图像本身太大,无法放入div中,则不显示它们。
如果这是正确的,那么很可能你需要做的是涉及某种JavaScript。
你可以做的是用JavaScript检查这些段落或图像的高度,然后有条件地应用一些css类来隐藏它们。
下面是一个使用Jquery检查段落是否太高的例子:

if( $('.one-specific-paragraph').height > 200 ){ $('.one-specific-paragraph').addClass('hide-paragraph)};

这里的css类类似于.hide-paragraph{display:none;}
然后对图像做同样的事情。您可能需要在forEach循环或类似的东西中执行此操作,以便它检查每个div,而不仅仅是一个。
如果你想同时检查段落和图片的高度,那么你可以执行一个类似于上面例子的if语句,但是在检查它是否超过200px之前,只需要添加两个元素的高度。
希望能帮上忙。

相关问题