CSS基础知识04

文本溢出通常是指在限定的空间内不能容纳所输入的文字,导致文字超出了容器的边界

一、文本溢出

1.1.css属性处理

所用到的属性

属性属性值
overflowvisible:默认值,内容不会被修剪,会呈现在元素框之外。
hidden:内容会被修剪,并且其余内容是不可见的。
scroll:内容会被修剪,但是浏览器会显示滚动条,以便查看其余的内容。
auto:如果内容被修剪,则浏览器会显示滚动条,以便查看其它的内容(超出会显示,不超出不显示,只显示y方向的)。
inherit:规定应该从父元素继承overflow属性值。

属性属性值
white-spacenormal:默认值,空白会被浏览器忽略。

nowrap:文本不会换行,文本会在同一行上继续,直到遇到<br>标签为止。

pre:空白会被浏览器保留,其行为方式类似HTML中的<pre>标签。
pre-wrap:保留空白序列,但是正常地进行换行。
pre-line:合并空白符,但是保留所有换行符。
inherit:规定应该从父元素继承white-space属性值。

属性属性值
text-overflowclip:不显示省略号(...),而是简单地裁剪。
ellipsis:当对象文本溢出时,显示省略标记(...),省略标记插入的位置通常是最后一个字符或最后一个词(取决于具体实现)。

要实现溢出时产生省略号的效果,通常需要结合使用white-space: nowrap(或pre-wrap等根据需求选择)和overflow: hidden属性。

例:

.text-container {width: 200px; /* 容器宽度 */white-space: nowrap; /* 强制文本在一行内显示 */overflow: hidden; /* 溢出内容为隐藏 */text-overflow: ellipsis; /* 溢出省略号 */
}

1.2.多行文本溢出处理

对于多行文本溢出,可以使用CSS的一些高级属性或JavaScript来实现。

1.CSS 多行文本溢出处理

CSS3 引入了-webkit-line-clamp属性(非标准属性,但得到了广泛支持),它允许限制在一个块元素显示的文本的行数。结合overflow: hiddentext-overflow: ellipsis-webkit-box-orient: vertical属性,可以实现多行文本溢出显示省略号的效果。

例如:

.multiline-text {overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 2; /* 控制显示的行数 */max-height: 3.2em; /* 根据行数计算出的高度,用于确保容器高度正确 */
}

2.JavaScript截断文本

使用JavaScript可以更加灵活地处理文本截断和省略号的添加。可以通过编写一个截断算法来确定截断位置并添加省略号。

例如:

function truncateText(text, maxLength) {if (text.length <= maxLength) {return text;}const truncated = text.substr(0, maxLength - 1);return truncated + '…';
}const text = '这是一段很长的文本,可能需要截断显示在页面上';
const maxLength = 20;
const truncatedText = truncateText(text, maxLength);
console.log(truncatedText); // 输出: '这是一段很长的文本…'

1.3.使用JavaScript库

还可以使用一些专门处理文本溢出的JavaScript库,如clamp-jsline-clamp等。这些库提供了更多灵活的选项和配置,可以根据需要来处理多行文本的溢出情况。例如,使用clamp-js库可以非常方便地实现多行文本溢出显示省略号的效果:

import clamp from 'clamp-js';
const element = document.getElementById('myText');
clamp(element, { clamp: 2 }); // 控制显示的行数为2

二、设置透明度

1.使用opacity属性(需要子元素都变透明)

opacity 属性可以应用于任何元素,并设置其整体透明度。值范围为 0(完全透明)到 1(完全不透明)

.element {opacity: 0.5; /* 设置50%的透明度 */
}

注意,使用 opacity 会使元素及其所有子元素都变得透明。

2.使用 RGBA 或 HSLA 颜色值(针对特定的颜色属性)

RGBA 和 HSLA 颜色模式允许你指定颜色的红、绿、蓝(或色调、饱和度、亮度)值以及一个额外的 alpha 通道值,用于设置透明度。

RGBA 示例:

.element {background-color: rgba(255, 0, 0, 0.5); /* 红色背景,50%透明度 */
}

HSLA 示例

.element {background-color: hsla(0, 100%, 50%, 0.5); 
/* 红色(色调为0),100%饱和度,50%亮度,50%透明度 */
}

使用 RGBA 或 HSLA 的好处是你可以只针对特定的颜色属性(如背景色或文本色)设置透明度,而不会影响元素的其他部分。

 3.使用 background-color 的 rgba() 与 background 的结合

有时你可能想要一个元素有透明的背景色,但文本或其他内容保持不透明。这时,你可以使用 rgba() 来设置 background-color

.element {background-color: rgba(0, 0, 0, 0.5); /* 黑色背景,50%透明度 */color: white; /* 白色文本 */
}

4. 使用 ::before 或 ::after 伪元素和 opacity(部分透明)

如果你想要一个元素的部分内容透明,而另一部分不透明,你可以使用伪元素。例如,你可以创建一个半透明的背景覆盖在元素上:

.element {position: relative; /* 确保伪元素相对于此元素定位 */z-index: 1; /* 确保元素本身在伪元素之上 */
}.element::before {content: "";position: absolute;top: 0;left: 0;right: 0;bottom: 0;background-color: rgba(0, 0, 0, 0.5); /* 黑色背景,50%透明度 */z-index: -1; /* 确保伪元素在元素之下 */
}

上述例子,.element 的内容将保持不透明,而一个半透明的黑色背景将覆盖在它之上。

可以使用盒模型来创建固定宽度的布局、流式布局、响应式布局等。

三、渐变边框

3.1.使用背景图像和box-shadow

可以将渐变色设置为元素的背景图像,并使用box-shadow来模拟边框的效果。这种方法的一个缺点是,它不会创建一个真正的边框,而是一个在元素外部的阴影效果。

.element {width: 200px;height: 100px;background: linear-gradient(to right, red, blue); /* 渐变色背景 */box-shadow: 0 0 0 10px rgba(0, 0, 0, 0.1); /* 模拟边框的阴影,但这里不是真正的边框 *//* 注意:这里的box-shadow只是为了演示,它并不真正创建渐变色边框 */
}

注意:上面的box-shadow示例并不创建渐变色边框,而是创建了一个围绕元素的阴影。要真正模拟渐变色边框,你可能需要更复杂的技巧,比如使用伪元素

3.2.使用伪元素(::before和::after)

可以使用伪元素来创建一个真正的渐变色边框。这种方法涉及为元素添加额外的层,并为这些层设置渐变色背景和适当的尺寸和位置。

.element {position: relative;width: 200px;height: 100px;z-index: 1; /* 确保内容在伪元素之上 */
}/* 顶部边框 */
.element::before {content: '';position: absolute;top: 0;left: 0;right: 0;height: 4px;background: linear-gradient(to right, red, blue); /* 渐变色 */z-index: -1; /* 确保伪元素在元素之下 */
}/* 右侧边框 */
.element::after {content: '';position: absolute;top: 0;right: 0;bottom: 0;width: 4px;background: linear-gradient(to bottom, red, blue);
/* 垂直渐变色,但这里为了与顶部边框一致,可以调整为与顶部相同的水平渐变,或根据需要调整 */z-index: -1; 
/* 确保伪元素在元素之下,但这里由于::before已经设置了-1,所以实际上这个z-index可以是-2或其他小于1的值,只要保证它在内容之下即可 */
/* 注意:由于CSS的层叠规则,如果两个伪元素有相同的z-index且都设置为-1,它们的堆叠顺序由它们在CSS中出现的顺序决定。在这个例子中,::before会先被渲染,然后是::after,但由于它们都是-1,所以视觉上它们是在同一层上的。然而,由于我们只需要确保伪元素在内容之下,所以这里的z-index值可以稍有不同,只要它们都小于内容的z-index即可。 */
}/* 为了完整性,添加底部和左侧边框的伪元素 */
/* 底部边框,使用一个新的伪元素,但这里我们可以利用已有的::after通过调整样式来避免额外的DOM节点,不过为了清晰起见,我们还是单独写出 */
/* 注意:在实际应用中,为了性能优化和代码简洁性,你可能会考虑合并伪元素,但这里为了教学目的,我们分开写 */
.element-bottom-border::after { 
/* 假设我们为需要底部边框的特定元素添加了这个类,或者你可以直接写在.element里并调整样式 */content: '';position: absolute;bottom: 0;left: 0;right: 0;height: 4px; /* 与顶部边框相同的厚度 */background: linear-gradient(to right, red, blue); /* 与顶部边框相同的渐变色 */z-index: -1; /* 确保在内容之下 *//* 注意:这里我们其实没有真正创建一个新的伪元素,而是假设了如果需要一个底部边框,应该如何设置。在实际应用中,你应该将这部分样式合并到.element::after中,并通过调整top和bottom属性来创建一个完整的边框框架,或者为.element添加一个新的伪元素(比如::after用于右侧和底部,再添加一个::before的变种用于左侧和可能需要的顶部调整,但在这个例子中我们已经有了顶部) */
}/* 左侧边框,同样地,我们可以利用已有的伪元素或添加一个新的 */
.element-left-border::before { /* 同样地,这是一个假设的类,用于说明如何添加左侧边框 */content: '';position: absolute;top: 0;bottom: 0;left: 0;width: 4px; /* 与右侧边框相同的厚度 */background: linear-gradient(to bottom, red, blue); /* 可以与右侧边框相同,也可以根据需要调整 */z-index: -1; /* 确保在内容之下 *//* 注意:同样地,这里我们其实是在描述如何添加左侧边框的样式,而不是真正创建了一个新的伪元素。在实际应用中,你应该将这些样式合并到已有的伪元素中,或者为.element添加一个新的伪元素来处理左侧边框 */
}/* 但是,为了简洁和性能,我们通常会尝试合并伪元素。下面是一个合并了所有边框样式的例子,但注意这只是一个概念性的展示,因为CSS不允许单个伪元素同时覆盖元素的四个边(至少不是以这种方式)。然而,你可以通过调整伪元素的尺寸和位置来模拟一个完整的边框框架。 *//* 合并边框样式的尝试(概念性展示,不完全正确) */
/* .element::pseudo-all-borders {content: '';position: absolute;top: 0; left: 0; right: 0; bottom: 0;/* 这里无法直接设置四个边的渐变色边框,因为伪元素是一个单独的层,它不能同时拥有四个独立的边框。但是,你可以通过一些技巧来模拟,比如使用多个背景层(虽然这通常不是通过伪元素实现的,而是通过元素本身和CSS的多背景特性),或者通过JavaScript动态创建和定位多个伪元素。在这个例子中,我们将继续使用两个伪元素(::before和::after)来分别处理水平和垂直方向的边框。*//* 由于这个伪类/伪元素是不存在的,并且上面的注释说明了为什么,所以下面的代码将被注释掉以避免混淆。background: linear-gradient(to right, red, blue) top left / 100% 4px no-repeat,  // 顶部边框linear-gradient(to bottom, red, blue) top right / 4px 100% no-repeat, // 右侧边框(但这样设置并不会正确显示,因为背景是层叠的,且这里尝试将两个渐变放在同一个伪元素上是不正确的)/* ...(省略了底部和左侧边框的尝试,因为它们同样不会按预期工作)*/z-index: -1;
} *//* 正确的做法是使用两个伪元素,并分别设置它们的样式来模拟四个边框 */
/* 下面的代码是实际可行的,它使用了.element::before和.element::after,并通过调整它们的尺寸和位置来模拟边框 */
.element::before,
.element::after {content: '';position: absolute;z-index: -1;
}.element::before {/* 合并顶部和左侧边框的样式(通过调整宽度和高度) */top: 0;left: 0;width: calc(100% - 4px); /* 减去右侧边框的宽度 */height: 4px; /* 顶部边框的高度 */background: linear-gradient(to right, red, blue); /* 顶部边框的渐变色 */
}.element::after {/* 合并右侧和底部边框的样式(通过调整宽度和高度,并设置top为底部边框的上边缘位置,但这里为了简单起见,我们将其设置为覆盖整个右侧和底部) */top: 4px; /* 从顶部边框下方开始 */right: 0;bottom: 0;width: 4px; /* 右侧边框的宽度 */background: linear-gradient(to bottom, red, blue) right top / 4px 100% no-repeat, /* 右侧边框的渐变色(但这样设置只会显示右侧边框的顶部部分,因为背景是层叠的,我们需要另一个伪元素或方法来处理底部部分,或者调整这个伪元素的尺寸和位置来覆盖整个右侧和底部,但这里为了简化,我们仅展示右侧边框的顶部) *//* 注意:这里的背景设置是不完整的,因为它不能同时显示右侧和底部的渐变色边框。在实际应用中,你可能需要为底部边框创建一个额外的伪元素,或者调整这个伪元素的尺寸和位置来覆盖整个右侧和底部,并使用多个背景层(但CSS不允许单个元素或伪元素有多个独立的背景层用于不同的边框),或者通过其他方法(如JavaScript)来动态创建和定位多个伪元素。然而,为了这个示例的简洁性,我们将仅展示如何设置右侧边框的顶部部分。*//* 由于上述限制,下面我们将仅设置右侧边框的样式,并省略底部边框的尝试,因为那将需要额外的技巧或伪元素。 */linear-gradient(to bottom, transparent, transparent 39px, red 40px, blue 100%) 0 4px / 100% calc(100% - 4px) no-repeat; /* 这是一个尝试同时显示右侧和底部边框的技巧,但它依赖于透明到渐变的过渡,并且不是完美的解决方案。这里的39px和40px是为了在右侧边框和假设的底部边框之间创建一个微小的间隙(因为渐变会覆盖到边框的边缘),但这种方法并不推荐,因为它依赖于固定的尺寸和可能的视觉不一致性。在实际应用中,你应该寻找更可靠的方法来处理这种情况。 *//* 注意:上面的背景设置尝试同时处理右侧和底部边框是不正确的,并且可能会导致不可预测的结果。这里仅作为展示尝试和

四、阴影

4.1.文字阴影

文字阴影使用 text-shadow 属性来定义。你可以指定水平偏移、垂直偏移、模糊半径和阴影颜色。

语法:

text-shadow: 水平阴影 垂直阴影 模糊距离 阴影颜色;
水平阴影:可以是正值(向右)或负值(向左)

垂直阴影:可以是正值(向下)或负值(向上)

模糊距离:值越大,阴影越模糊。如果不需要模糊效果,可以设置为 0。

示例:

p {text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.3);
}

4.2.盒阴影

盒子阴影使用 box-shadow 属性来定义。你可以指定水平偏移、垂直偏移、模糊半径、扩展半径和阴影颜色。

语法:

box-shadow:水平阴影 垂直阴影 模糊距离  阴影扩展半径 阴影颜色 inset;

水平阴影:可以是正值(向右)或负值(向左)

垂直阴影:可以是正值(向下)或负值(向上)

模糊距离:值越大,阴影越模糊。如果不需要模糊效果,可以设置为 0。

阴影的扩展半径:正值会使阴影变大,负值会使阴影变小。
阴影的颜色

inset:可选,将外部阴影 (outset) 改为内部阴影。如果指定为 inset,则阴影会出现在盒子内部。

示例:

div {box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.5), -1px -1px 2px rgba(255, 255, 255, 0.3) inset;
}

这将为 <div> 元素添加一个向右偏移 3 像素、向下偏移 3 像素、模糊半径为 5 像素、颜色为半透明的黑色的外部阴影,以及一个向左偏移 -1 像素、向上偏移 -1 像素、模糊半径为 2 像素、颜色为半透明的白色的内部阴影。

效果:

五、transform

5.1.  2D转换函数

平移(Translate)

语法:transform: translate(x, y); 或 transform: translateX(x); 或 transform: translateY(y);

功能:将元素在水平方向(X轴)和/或垂直方向(Y轴)上移动指定的距离。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Translate Example</title>
<style>.translate-box {width: 100px;height: 100px;background-color: lightblue;transform: translate(50px, 50px); /* 平移50px到右和50px到下 */}
</style>
</head>
<body>
<div class="translate-box">Translate</div>
</body>
</html>

旋转(Rotate)

语法:transform: rotate(angle);

功能:围绕元素的中心点将元素旋转指定的角度。角度为正时表示顺时针旋转,为负时表示逆时针旋转。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rotate Example</title>
<style>.rotate-box {width: 100px;height: 100px;background-color: lightcoral;transform: rotate(45deg); /* 旋转45度 */}
</style>
</head>
<body>
<div class="rotate-box">Rotate</div>
</body>
</html>

缩放(Scale)

语法:transform: scale(x, y); 或 transform: scaleX(x); 或 transform: scaleY(y);

功能:改变元素的宽度(X轴)和/或高度(Y轴)的缩放比例。数值大于1表示放大,小于1表示缩小。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Scale Example</title>
<style>.scale-box {width: 100px;height: 100px;background-color: lightgreen;transform: scale(1.5, 1.5); /* 宽度和高度都放大1.5倍 */}
</style>
</head>
<body>
<div class="scale-box">Scale</div>
</body>
</html>

倾斜(Skew)

语法:transform: skew(x-angle, y-angle); 或 transform: skewX(x-angle); 或 transform: skewY(y-angle);

功能:使元素在水平方向(X轴)和/或垂直方向(Y轴)上倾斜指定的角度。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Skew Example</title>
<style>.skew-box {width: 100px;height: 100px;background-color: lightpink;transform: skew(20deg, 10deg); /* X轴倾斜20度,Y轴倾斜10度 */}
</style>
</head>
<body>
<div class="skew-box">Skew</div>
</body>
</html>

矩阵变形(Matrix)

语法:transform: matrix(a, b, c, d, e, f);

功能:通过一个包含六个值的变换矩阵来指定一个2D变换。这个矩阵可以包含旋转、缩放、移动(平移)和倾斜功能。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>2D Matrix Example</title>
<style>.matrix-box {width: 100px;height: 100px;background-color: lightsteelblue;transform: matrix(1, 0.5, -0.5, 1, 0, 0); /* 2D矩阵变形 */}
</style>
</head>
<body>
<div class="matrix-box">Matrix 2D</div>
</body>
</html>

5.2.  3D转换函数(部分)

虽然问题主要关注2D转换,但CSS3 transform属性还支持3D转换函数,如:

3D旋转(Rotate3d)

语法:transform: rotate3d(x, y, z, angle);

功能:围绕一个通过元素原点的3D向量(由x、y、z定义)将元素旋转指定的角度。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Rotate3d Example</title>
<style>.container {perspective: 1000px; /* 设置透视效果 */}.rotate3d-box {width: 100px;height: 100px;background-color: lightgoldenrodyellow;transform: rotate3d(1, 1, 0, 45deg); /* 绕X和Y轴组成的平面旋转45度 */transform-style: preserve-3d; /* 保持子元素的3D转换 */}
</style>
</head>
<body>
<div class="container"><div class="rotate3d-box">Rotate3d</div>
</div>
</body>
</html>

3D缩放(Scale3d)

语法:transform: scale3d(x, y, z);

功能:改变元素在3D空间中的缩放比例。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>3D Scale Example</title>
<style>.container {perspective: 1000px; /* 设置透视效果 */}.scale3d-box {width: 100px;height: 100px;background-color: lightseagreen;transform: scale3d(1.5, 1, 1); /* 沿X轴放大1.5倍,Y轴和Z轴保持不变 */transition: transform 1s; /* 添加过渡效果 */}.scale3d-box:hover {transform: scale3d(2, 1, 1); /* 沿X轴放大2倍,Y轴和Z轴保持不变 */}
</style>
</head>
<body>
<div class="container"><div class="scale3d-box">Scale3D</div>
</div>
</body>
</html>

transform-origin属性

功能:用于设置元素转换的基点(参照点)。默认点是元素的中心点。

语法:transform-origin: x y; 其中x和y可以是数值(带单位,如px、em等)、百分比或关键字(left、right、bottom、top、center)。

示例1:改变旋转的原点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Transform Origin Example</title>
<style>.box {width: 100px;height: 100px;background-color: lightcoral;transform-origin: top left; /* 设置旋转的原点为左上角 */transform: rotate(45deg); /* 旋转45度 */}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
示例2:使用百分比设置原点位置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Transform Origin Percentage Example</title>
<style>.box {width: 200px;height: 200px;background-color: lightblue;transform-origin: 50% 50%; /* 使用百分比设置原点为元素中心 */transform: scale(1.5); /* 缩放1.5倍 */}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>

5.3.注意事项

transform-origin 属性只有在设置了 transform 属性时才会起作用。

transform-origin 属性可以接受两个或三个值来指定原点位置。两个值时,第一个值表示X轴偏移量,第二个值表示Y轴偏移量。三个值时,第三个值表示Z轴偏移量(用于3D变换)。

原点位置可以使用百分比、具体的长度单位(如px、em等)或关键字(如top、right、bottom、left、center)来指定。

变换效果(如旋转、缩放等)会基于指定的原点位置进行。

在使用transform属性时,需要注意元素的布局和定位关系,以确保转换效果符合预期。

某些转换函数(如3D转换)可能需要浏览器支持特定的前缀(如-webkit-)才能正常工作。

转换函数可以组合使用,以实现更复杂的视觉效果。但需要注意性能问题,过多的转换可能会影响页面的渲染速度。

5.4.案例

@keyframes 是 CSS 中用于定义动画关键帧的规则。它允许指定动画在特定时间点的样式,从而在动画的起始和结束之间创建平滑的过渡效果。通过 @keyframes,可以控制动画中的每一个细节,包括动画何时开始、何时结束、以及动画过程中元素如何变化

1.爱心

<style>* {margin: 0;padding: 0;}.box {position: absolute;Left: 50%;top: 50%;transform: translate(-50%, -50%);}.left,.right {width: 100px;height: 150px;background-color: red;fLoat: left;border-radius: 50% 50% 0 0;}.left {transform: rotate(46deg);transform-origin: right bottom;animation: move1 0.8s infinite;}.right {transform: rotate(-46deg);transform-origin: left bottom;animation: move2 0.8s infinite;}@keyframes move1{0%{transform: rotate(46deg) scale(1);}100%{transform: rotate(46deg) scale(1.4);}}@keyframes move2{0%{transform: rotate(-46deg) scale(1);}100%{transform: rotate(-46deg) scale(1.4);}}
</style>
<body><div class="box"><div class="left"></div><div class="right"></div></div>
</body>

2.风车

<style>* {padding: 0;margin: 0;}.box {width: 200px;height: 200px;position: relative;transform: rotate(90deg);    animation: one 2.0s infinite;}@keyframes one{0%{transform: rotate(0deg);}100%{transform: rotate(1800deg);}}.triangle {border-top: 50px solid transparent;border-right: 50px solid green;border-bottom: 50px solid transparent;border-left: 50px solid transparent;position: absolute;}.box div:nth-of-type(2) {top: 0;left: 100px;border-right: 50px solid yellow;transform: rotate(90deg);}.box div:nth-of-type(3) {top: 100px;left: 100px;border-right: 50px solid red;transform: rotate(180deg);}.box div:nth-of-type(4) {top: 100px;left: 0;border-right: 50px solid blue;transform: rotate(270deg);}
</style>
<div class="box"><div class="triangle"></div><div class="triangle"></div><div class="triangle"></div><div class="triangle"></div>
</div>

上述内容若有遗漏或不足之处,恳请各位大佬不吝赐教,指正并帮助美化,以期更加完善

码字不易,给孩子点点赞呗!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitlab和jenkins连接

一&#xff1a;jenkins 配置 安装gitlab插件 生成密钥 id_rsa 要上传到jenkins&#xff0c;id_rsa.pub要上传到gitlab cat /root/.ssh/id_rsa 复制查看的内容 可以看到已经成功创建出来了对于gitlab的认证凭据 二&#xff1a;配置gitlab cat /root/.ssh/id_rsa.pub 复制查…

Modbus TCP转Modbus ASCII解决方案

Modbus TCP和Modbus ASCII是两种不同的通信协议。Modbus TCP是一种二进制协议&#xff0c;Modbus ASCII是一种基于文本的协议。二者不能直接转换&#xff0c;因为它们的数据表示方式、消息结构、字符编码等都不相同。 如果你需要将Modbus TCP转换为Modbus ASCII&#xff0c;你…

十三、注解配置SpringMVC

文章目录 1. 创建初始化类&#xff0c;代替web.xml2. 创建SpringConfig配置类&#xff0c;代替spring的配置文件3. 创建WebConfig配置类&#xff0c;代替SpringMVC的配置文件4. 测试功能 1. 创建初始化类&#xff0c;代替web.xml 2. 创建SpringConfig配置类&#xff0c;代替spr…

全新升级!立迈胜STMP57系列防水一体化步进伺服电机:IP65+多圈绝对值编码器+EtherCAT通信+内置刹车

在这个科技日新月异的时代&#xff0c;每一步创新都意味着行业的一次飞跃。 回想当初&#xff0c;我们做防水电机的初衷只是因为客户的应用场景涉水&#xff0c;从而定做了IP65防护等级的一体式电机。 后来发现很多客户也有类似的需求&#xff0c;比如机械加工、户外照明、自…

5G CPE:为什么活动会场与商铺的网络成为最新选择

在快节奏的现代社会中&#xff0c;无论是举办一场盛大的活动还是经营一家繁忙的商铺&#xff0c;稳定的网络连接都是不可或缺的基石。然而&#xff0c;面对复杂的布线难题或高昂的商业宽带费用&#xff0c;许多场所往往陷入两难境地。幸运的是&#xff0c;5G CPE&#xff08;Cu…

React-redux 实战案例,自定义useSelector

创建一个新的 React 工程&#xff0c;并配置 Redux 和 Ant Design&#xff0c;你可以按以下步骤操作。我将使用 create-react-app 脚手架工具来快速创建一个基于 TypeScript 的 React 项目 1. 创建新项目 使用 create-react-app 创建一个新的 React 项目&#xff0c;带 TypeS…

【C++】list 类深度解析:探索双向链表的奇妙世界

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 如果你对string&#xff0c;vector还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; 之前文章&#x1f525;&#x1…

uniapp如何i18n国际化

1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖&#xff0c;如果没有可以自行使用如下命令下载&#xff1a; npm install vue-i18n --save 2、创建相关文件 en文件下&#xff1a; zh文件下&#xff1a; index文件下&#xff1a; 3、在main.js中注册&#xff1a…

VScode-Java开发常用插件

中文——界面易读 字体主题——代码可观 头注释——项目信息明了 java开发包——java必备 git协作开发——版本控制

前端(3)——快速入门JaveScript

参考&#xff1a; 罗大富 JavaScript 教程 | 菜鸟教程 JavaScript 教程 1. JaveScript JavaScript 简称 JS JavaScript 是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果&#xff0c;增加用户与网页的交互性。作为一种客户端脚本语言&#…

FRP 实现内网穿透

如何通过 FRP 实现内网穿透&#xff1a;群晖 NAS 的 Gitea 和 GitLab 访问配置指南 在自建服务的过程中&#xff0c;经常会遇到内网访问受限的问题。本文将介绍如何利用 FRP&#xff08;Fast Reverse Proxy&#xff09;来实现内网穿透&#xff0c;以便在外网访问群晖 NAS 上的…

我们来学mysql -- EXPLAIN之select_type(原理篇)

EXPLAIN之select_type 题记select_type 题记 书接上文《 EXPLAIN之ID》2024美国大选已定&#xff0c;川普剑登上铁王座&#xff0c;在此过程中出谋划策的幕僚很重要&#xff0c;是他们决定了最终的执行计划在《查询成本之索引选择》中提到&#xff0c;explain的输出&#xff0…

uni-app快速入门(五)--判断运行环境及针对不同平台的条件编译

一、判断运行环境 在实际项目开发中&#xff0c;经常需要进行开发环境和生产环境的切换&#xff0c;uni-app可根据process.env.NODE_ENV判断当前运行环境是开发环境和生产环境&#xff0c;根据不同的环境调用不同的后台接口&#xff0c;具体实现方式: 在项目的static目录下建…

北京大学c++程序设计听课笔记101

基本概念 程序运行期间&#xff0c;每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址&#xff08;也称“入口地址”&#xff09;。我们可以将函数的入口地址赋给一个指针变量&#xff0c;使该指针变量指向该函数。然后通过指针变量就可以调用这个…

构建客服知识库:企业效率提升的关键步骤

客服知识库是企业提升客户服务效率和质量的重要工具。它不仅帮助客服团队快速准确地回答客户问题&#xff0c;还能通过数据分析来优化服务流程和提升客户满意度。 1. 明确知识库的目标和范围 构建客服知识库的第一步是明确其目标和范围。这包括确定知识库的主要用户群体、需要…

Linux运维工程师推荐学习的开发语言

前言&#xff1a;会开发的运维和不会开发的运维可以说是两个世界的运维。 个人推荐python和go&#xff0c;前者可以做自动化运维&#xff0c;后者可以深挖k8s&#xff1b;最近就不先演示运维服务技术的部署和架构搭建了&#xff0c;在深挖自动化运维&#xff0c;为了让现在的工…

整合seata遇到的问题

自己遇到的问题&#xff0c;记录一下。 1、版本问题 我seata用的是1.7&#xff0c; 数据库驱动是 <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.31</version><scope>…

从零到一:利用 AI 开发 iOS App 《震感》的编程之旅

在网上看到一篇关于使用AI开发的编程经历&#xff0c;分享给大家 作者是如何在没有 iOS 开发经验的情况下&#xff0c;借助 AI&#xff08;如 Claude 3 模型&#xff09;成功开发并发布《震感》iOS 应用。 正文开始 2022 年 11 月&#xff0c;ChatGPT 诞生并迅速引发全球关注。…

.netcore + postgis 保存地图围栏数据

一、数据库字段 字段类型选择(Type) 设置对象类型为&#xff1a;geometry 二、前端传递的Json格式转换 前端传递围栏的各个坐标点数据如下&#xff1a; {"AreaRange": [{"lat": 30.123456,"lng": 120.123456},{"lat": 30.123456…

系统掌握大语言模型提示词 - 从理论到实践

以下是我目前的一些主要个人标签&#xff1a; 6 年多头部大厂软件开发经验&#xff1b;1 年多 AI 业务应用经验&#xff0c;拥有丰富的业务提示词调优经验和模型微调经验。信仰 AGI&#xff0c;已经将 AI 通过自定义 Chatbot /搭建 Agent 融合到我的工作流中。头部大厂技术大学…