整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

CSS 文本超出隐藏

行文本超出隐藏

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
p{
width: 600px;
margin: 100px auto;
border: 1px solid red;

/*文本是否换行*/
white-space: nowrap;
/*文本超出: 显示省略符号来代表被修剪的文本。*/
text-overflow: ellipsis;

/*超出隐藏*/
overflow: hidden;
}
</style>
</head>
<body>
<p>是指阴影的垂直偏移量,其值也可以是正或负值,如果为正值,阴影在对象的底部,反之其值为负值时,阴影在对象的顶部;
阴影模糊半径.................................................
</p>
</body>
</html>

多行文本超出隐藏

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
p{
width: 600px;
margin: 100px auto;
border: 1px solid red;

display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
</style>
</head>
<body>
<p>是指阴影的垂直偏移量,其值也可以是正或负值,如果为正值,阴影在对象的底部,反之其值为负值时,阴影在对象的顶部;
阴影模糊半径......
</p>
</body>
</html>

注意: 目前只在webkit内核浏览器(Chrome、Safari、移动端浏览器)中生效

过去的几年里,前端开发发生了革命性的变化,变得更高效、更快,当然也更大。 SPA 框架的引入使 Web 开发发生了重大变化。更多繁重的工作转移到了前端,需要处理更多的事情,例如动态 UI、路由、状态管理等。因此,程序员习惯于使用新方法和第三方来减轻一些繁重的工作。当然,它有它的优点,但也有缺点,让我们变得更懒惰。但是如果我告诉你,在前端的这段时间里,你可能错过了一些基本功能,而不是使用它们,而是使用第三方包甚至更糟糕的是,自定义样式来实现基本的东西?!是的,当然,让我们从 HTML 中您可能不知道的 15 个功能的基础开始,它们将帮助您轻松实现友好的 UI。事不宜迟,我们开始学习吧!

1、内容可编辑属性

contenteditable 是可以在元素上设置以使内容可编辑的属性。它适用于 DIV、P、UL 等元素。您需要这样 <element contenteditable=”true|false”> 设置它。

<h2> Earth 616 superheroes </h2> 
<ul class="content-editable" contenteditable="true">     
 <li> 1. Iron Man</li>     
 <li> 2. Captain America</li>     
 <li> 3. Black Panther</li> 
</ul>

2、详情标签(Details)

<details> 标签向用户提供按需详细信息。默认情况下,小部件是折叠的。打开时,它会展开并显示其中的内容。

<summary> 标签与 <details> 一起使用实现一个可以折叠打开标题及详情内容。

<details>     
<summary>Click here to see more from Earth 616</summary>              
<table>
  <tr>                    
    <th>ID</th>                    
    <th>Name</th>                    
    <th>Location</th>                    
    <th>Job</th>                
  </tr>                
  <tr>                    
    <td>1</td>                    
    <td>John Doe</td>                    
    <td>Earth</td>                    
    <td>Human</td>                
 </tr>          
</table>  
</details>

3、Datalist 标签

<datalist> 标记指定预定义选项列表并提供自动完成功能。

<label for=”superhero”>In case of emergency, which superhero would you call?:</label>
<input list=”superheroes” name=”superhero” id=”superhero”>
<datalist id=”superheroes”>
 <option value=”Iron Man”>
 <option value=”Captain America”>
 <option value=”Black Panther”>
 <option value=”Thor”>
 <option value=”Spider Man”>
</datalist>

4、Range 属性

范围输入类型的表单类似于滑块范围选择器。

<head>
    <script>
        function changeValue(event) {
            let value = event.target.value;
            let output = document.getElementById('output');
            output.value = value;
        }
    </script>
</head>
<body>
    <form method="post">
        <input 
             type="range" 
             name="range" 
             min="0" 
             max="100" 
             step="1" 
             value=""
             onchange="changeValue(event)"/>
     </form>
     <div class="range">
          <output id="output" name="result">  </output>
     </div>
</body>

5、Meter 标签

<meter> 标签定义了定义范围内的标量测量值或分数值

<label for="home">Cloud storage</label>
<meter id="home" value="0.4">40%</meter><br>
<label for="root">Internal storage</label>
<meter id="root" value="0.6">60%</meter><br>

6、 Progress 标签

<progress> 标签表示任务的进度。

<label for="home">6/10 tasks done</label>
<progress value="60" max="100" id="home"></progress>

7、颜色选择器

一个简单的颜色选择器。

<p id="colorPicker">Color Picker!</p>
<input type="color" onchange="showColor(event)">

8、标记内容标签

使用 <mark> 标记突出显示任何文本内容。

<p>Did you know that <mark>not all heroes wear capes.</mark></p>

9、块引用和引用

如果您要包含来自不同来源的内容,您绝对应该引用该来源。

<figure>
  <blockquote>
    <p>It's an imperfect world, but its the only one we've got.</p>
  </blockquote>
  <figcaption>--TONY STARK, <cite>IRON MAN</cite></figcaption>  
</figure>

10、缩写标签(Abbreviation)

“abbr”是abbreviation的简称!这里的想法是,如果您使用标题(例如“Mr.”)或首字母缩略词(例如“SHIELD”),abbr 标签会准确指示该缩写的含义。

<p>Agent Phil Coulson leads a team of highly skilled agents from the     
global law-enforcement organisation known as 
<abbr title="Strategic Homeland Intervention, Enforcement,
and Logistics Division">SHIELD</abbr>. 
</p>

11、<del> and <ins>

实际上有一个标记用于带删除线的文本,另一个标记表示替换文本。

<p><del>Iron Man</del>
<ins>Captain America</ins>
is ehmmm.. yea the captain!</p>

12、Output 标签

<output> 标签表示计算的结果。通常,此元素定义一个区域,该区域将用于显示某些计算的文本输出。

<form oninput="x.value=parseInt(a.value) * parseInt(b.value)">
    <input type="number" id="a" value="0"> 
      * <input type="number"  id="b" value="0"> 
    = <output name="x" for="a b"></output>
</form>

13、Hidden 属性

在隐藏元素方面,我们都尝试过不同的方法,比如使用 opacity:0, visibility:hidden, height:0; width:0, display:none 在我们的 CSS 文件中。每一个都有自己的用例,适用于不同的布局。另一个与它们类似的选项是隐藏的 HTML 属性。如果一个元素在其上指定了隐藏,它将被隐藏。我碰巧有用于存储值的隐藏输入,所以如果您也需要它,请不要吃惊。

<div hidden>...</div>

14、Time 标签

<time> 标记定义特定时间(或日期时间)。

该元素的 datetime 属性用于将时间转换为机器可读的格式,以便浏览器可以提供通过用户日历添加日期提醒,搜索引擎可以产生更智能的搜索结果。

<p>The next assemble meeting is postponed on
  <time datetime="2022-12-01">2022-12-01</time>.</p>

15、Audio 标签

<audio> 标签将定义一种声音,该标签可以与三个支持的文件一起使用。它们是 MP3、WAV 和 OGG。然后浏览器将选择它支持的第一个。

<audio controls>
  <source src=”introduction.ogg” type=”audio/ogg”>       
  <source src=”introduction.mp3” type=”audio/mpeg”>       
  Your browser does not support this audio      
</audio>

结束

好了,今天的分享就到这里,通过本文的学习,你可以轻松的使用HTML原生标签能力,就能够实现以前复杂的第三方UI组件提供的功能。感谢你的阅读,如果你喜欢我的分享,别忘了点赞转发,让更多的人看到,最后别忘记点个关注,你的支持将是我分享最大的动力,后续我会持续输出更多内容,敬请期待。

原文:https://medium.com/codex/i-bet-you-didnt-know-about-these-15-html-features-9b0824dba28f

作者:Arsen Shkenza

非直接翻译,有自行改编和添加部分,翻译水平有限,难免有疏漏,欢迎指正

SS的布局有太多种方式,元素的表现也有很多的形式。

像我们熟悉的那些:行内元素、块元素、列表元素、表格元素、绝对定位、固定定位、浮动、弹性布局、网格布局等等等等。

一个元素的具体渲染可能会受到父子元素、兄弟元素的影响。

大多数情况我们都可以通过一些手段,来解决我们遇到的布局或表现问题。

比如给一个元素赋予了浮动,那么可以通过清除浮动来消除影响,再比如通过绝对定位来调整元素的位置,也可以通过padding或margin等避免其他元素被覆盖。

但是也有那么一些情况,我们不太好处理,比如某一个元素希望相对于它的父级区域做固定定位,而不是基于整个页面,能做到吗?再比如给定一个盒容器,无论子元素怎么排序布局或者浮动,也不会影响其他相邻盒子的渲染,该怎么做到?

其实不止这些,还有很多的实际场景让我们很棘手,你是否在设计和实现方面做过平衡和妥协?

对于现在的浏览器来说,所支持的CSS功能不允许我们说:我不行,我做不到。

别的不说,今天要讲的contain就能用来解决上面的问题,它能做的事情还有很多,基于自身天然的属性,甚至能轻松提升你的性能!

contain概述

contain表明该元素要独立于页面中的其他元素,该元素中的所有内容都被局限在一个独立的区域,跟其他元素隔离开来,从而使得基于该元素的所有计算都是独立的,被限制在该DOM子树中,而不是整个页面。这样能够让页面的性能提升。

该元素构成的容器,可以控制其产生的尺寸范围、样式作用域、布局方式、绘制区域。会生成新的包含区块、新的层叠上下文、新的区块格式化上下文。这些控制手段都对应着不同的局限属性,在容器内对局限属性的修改,不会影响容器外的部分,也就不会使得页面经常重新渲染,尤其在动态修改页面元素时会带来更好的性能受益。

我们理解它的时候,不要把它想成是包含的意思,理解成它的作用,是对包含内容的一个局限,之后也会多次用到"局限"这个词。

分类

一、关键词

通过关键词,可以指定不同的局限属性,从而产生不同的局限效果。

  1. none:不应用任何局限。
  2. size:元素的尺寸无视子元素而单独计算,在行向和块向上都应用该局限。
  3. inline-size:元素的尺寸无视子元素而单独计算,只在行向上应用该局限。
  4. layout:使得该元素的布局与元素外的任何内容相互独立,互不影响。即该元素所构成的容器从页面中隔离出来,单独计算布局。
  5. style:对于容器内的某些可能影响外部属性的值,被限制在容器内,不参与整体的计算,比如计数器和引号不会参与之前或者之后的计算,会有独立的计算,对于外面来说就好像这个元素没存在过一样,或者说不知道有它的存在。
  6. paint:限制该元素的绘制区域范围,子元素的渲染永远不会出现在容器外,容器的边界限定了子元素的可见内容。例如容器在屏幕外,那么就永远不用绘制,因为其子元素也肯定在屏幕外,不像margin负值放在屏幕外那样,子元素可能延伸到屏幕内。
  7. content:相当于设置了layout、paint、style,也就是除了size之外的所有值。
  8. strict:给该元素应用所有局限规则,相当于设置size、layout、paint、style。

二、组合值

也就是上面2-6关键字的任意组合,跟顺序无关,多个值之间用空格分隔开。跟个数也无关,可以设置任意的数量。不过要注意,size和inline-size同时只能设置一个,因为它俩是冲突的。

三、全局值

全局值的作用,可以参考我在font-size那篇文章中的解释说明,它们的作用机制和原理都是一样的,这里不在重复赘述。

示例

我们来对上面所说的内容,做一些示例,来看看它们的实际工作方式。

先构建一个基本的代码,之后都以这个为基础改造和演示:

<div style="background-color: bisque;">
  我是父元素
  <div style="background-color: coral;">
    我是子元素
  </div>
</div>
<div style="background-color: lightpink;">
  我是父兄弟元素
</div>

看下现在的效果:

效果

记住这个效果,因为我们接下来就要改变contain属性,观察它所发生的变化。

  1. 通过尺寸来控制
<div style="contain: size;background-color: bisque;">
  我是父元素
  <div style="background-color: coral;">
    我是子元素
  </div>
</div>
<div style="background-color: lightpink;">
  我是父兄弟元素
</div>

给父元素加上contain:size样式:

效果

可以看到,"我是父元素"和"我是父兄弟元素"重合了,也就说,父兄弟元素的渲染,直接从父元素渲染开始的位置开始渲染的。就好像父元素不存在一样。

这里面的奥妙通过控制台看一下,其实就很容易解开了:

效果

就是因为父元素的高度为0了。在解释之前先说明一下,行向指的是我们书写的方向,就是指的从左往右,你就可以理解成是多个行内元素排列的方向,一直往后面追加的方向。块向指的是我们折行的方向,也就是指的从上往下,你就可以理解成是多个块级元素排列的方向,一直往下追加的方向。

理解了这两个之后,我们就知道,由于size影响着这两个方向上的局限,它会变得无视子元素。因为如果没有主动设置尺寸的话,就好像子元素不存在一样,那么它就没有高度,所以兄弟元素就自然而然的顶上来了。

这时,我们改一下设置,让它只在行向上有局限:

<div style="contain: inline-size;background-color: bisque;">
  我是父元素
  <div style="background-color: coral;">
    我是子元素
  </div>
</div>
<div style="background-color: lightpink;">
  我是父兄弟元素
</div>

通过设置contain:inline-size:

效果

可以看到,效果又回来了,这是因为我们没有在块向上做局限,因此高度会自然撑开。

既然说到了这里,我们再看一下,它是如何在行向上进行局限的,构造如下代码:

<div style="contain: inline-size;display: inline-block;background-color: bisque;">
  我是父元素
  <div style="background-color: coral;">
    我是子元素
  </div>
</div>
<div style="background-color: lightpink;">
  我是父兄弟元素
</div>

设置父元素为行内块,增加display:inline-block:

效果

瞬间又变成了这样,这同样是因为,行内局限使得父元素独立计算尺寸,而我们又没手动指定,因此它的宽度为0,子元素也跟着宽度为0,所以就变成了一个字一换行。

这时即使你给子元素加上宽度,在行向上父元素也会无视你:

效果

你看我们给子元素加上100px的宽度,但是鼠标查看父元素,依然是宽度为0。

  1. 通过布局来控制

指定contain:layout,可以让该元素独立计算它的内部布局,不受外界影响,我们先将子元素设定一个固定定位:

<div style="background-color: bisque;">
  我是父元素
  <div style="position: fixed;top: 10px;background-color: coral;">
    我是子元素
  </div>
</div>
<div style="background-color: lightpink;">
  我是父兄弟元素
</div>

看下现在的效果:

效果

完全没毛病,子元素固定到页面顶部的10px位置。

现在应用一下我们的布局限制:

<div style="contain: layout;background-color: bisque;">
  我是父元素
  <div style="position: fixed;top: 10px;background-color: coral;">
    我是子元素
  </div>
</div>
<div style="background-color: lightpink;">
  我是父兄弟元素
</div>

再看下显示的效果:

效果

咦?明明是固定定位,它的位置却是相对于父元素的。这就是布局限制的作用,相当于父元素告诉页面,从现在开始,这片的布局归我管,所有的行为都向我请示,由我指挥。

同样,其他的position值,也都是基于父元素的布局限制来渲染的,这里就不做一一演示了。

其实,不光是position,只要是关于布局的,都会在此局限下生效,这里再演示一个浮动的例子:

<div style="height: 80px;padding: 5px;background-color: bisque;">
  <h2 style="margin-bottom: 7px;">我是父元素</h2>
  <p style="float: left;background-color: coral;">
    我是子元素
  </p>
</div>
<div style="height: 80px;padding: 5px;background-color: lightpink;">
  <h2>我是父兄弟元素</h2>
  <p style="background-color: coral;">
    我是父兄弟子元素
  </p>
</div>

两个父元素各包含两个子元素,其中第一个父元素的第二个子元素设置为左浮动,为了更好的演示,我把子元素改成了h2和p标签,看下现在的效果:

效果

父元素的两个子元素正常显示,但是父兄弟元素的第一个子元素里面的文字,被挤的偏移了,这是由于父元素的第二个子元素设置浮动引起的,通过控制台看下就明白了:

效果

红线是我标出来的,可以看到,父兄弟元素的h2和父元素的浮动有一丁点的重合,导致文字被推开,这就是浮动产生的影响。

我们通过布局局限,来控制浮动只发生在局限内,稍微改下代码:

<div style="contain: layout;height: 80px;padding: 5px;background-color: bisque;">
  <h2 style="margin-bottom: 7px;">我是父元素</h2>
  <p style="float: left;background-color: coral;">
    我是子元素
  </p>
</div>
<div style="height: 80px;padding: 5px;background-color: lightpink;">
  <h2>我是父兄弟元素</h2>
  <p style="background-color: coral;">
    我是父兄弟子元素
  </p>
</div>

给父元素添加了contain:layout,这是浮动就不会影响后面的布局了:

效果

通过布局局限,我们可以把所有的关于布局的影响,都控制在容器内,这样即使容器内布局发生了改变,也完全不会影响页面其他内容,在动态页面中,如果需要频繁的修改某些元素,通过这种方式管理和设计页面,就能很有效的改善渲染的性能。

  1. 通过样式来控制

这里的样式主要是针对计数器和引号的作用域,能控制它们只在所局限的范围内单独计算,而不会影响全局的结果,就好像它们是单独拿出来作为一个独立的文档一样,看个例子:

body {
  counter-reset: my-list;
}
div > div::before {
  counter-increment: my-list;
  content: "(" counter(my-list) "):";
}
<div>
  <div>第1行</div>
  <div>第2行</div>
  <div>第3行</div>
  <div>第4行</div>
  <div>第5行</div>
  <div>第6行</div>
</div>

我们设计这样一个列表,通过自定义的计数器,设置一个前缀的显示:

效果

如果我们希望第三行独立出来,进行样式局限,不参与外部计数:

<div>
  <div>第1行</div>
  <div>第2行</div>
  <div style="contain: style;">第3行</div>
  <div>第4行</div>
  <div>第5行</div>
  <div>第6行</div>
</div>

那么它就会展现成这个样子:

效果

注意第三行的计数,已经重置为1,并且第四行从3开始,接着第二行的值继续计数。

  1. 通过绘制来控制

这个也比较厉害,就是父元素啥样就是啥样,子元素永远不会在容器外渲染:

<div style="background-color: bisque;width: 100px;height: 100px;">
  <div>
  海客谈瀛洲,烟涛微茫信难求。
  越人语天姥,云霞明灭或可睹。
  天姥连天向天横,势拔五岳掩赤城。
    </div>
</div>

有这样一个代码块,容器的宽高为100px,内容有超出部分:

效果

我们可以通过绘制局限来使容器外的内容不显示:

<div style="contain: style;background-color: bisque;width: 100px;height: 100px;">
  <div>
  海客谈瀛洲,烟涛微茫信难求。
  越人语天姥,云霞明灭或可睹。
  天姥连天向天横,势拔五岳掩赤城。
  </div>
</div>

添加contain:paint,只让绘制区域被限制在容器内部:

效果

这个跟overflow:hidden有一点区别,就是绘制局限真的就是正常绘制,只不过不绘制容器外的部分,而hidden虽然隐藏,但是依然能通过js进行滚动。

  1. 通过组合值来控制

我们也可以通过任意的值的组合来控制所需要的局限,也可以通过strict或content关键字来快速的做到这一点。这里就不再重复演示了

最后

合理的使用contain,不但能快速实现我们的需求,也能减少我们的修改量,而且会降低不理解现象的情况的出现频率,更能提升页面的性能。

尤其是布局局限,提供给了我们更多的发挥空间,而且任意的复制到其他地方,也不会对外部元素有影响。

每天一点小知识,希望能够帮助到你。