前端css实例
一、带条纹的表格
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>条纹样式的表格</title><style>table {widh: 50%;border-collapse: collapse;}th, td {text-align: left;padding: 8px;}.tab tr:nth-child(odd) {background-color: #f2f2f2;}.tab tr:nth-child(even) {background-color: slategray;}</style>
</head>
<body><table class="tab"><tr><th>表头1</th><th>表头2</th><th>表头3</th></tr><tr><td>数据1</td><td>数据2</td><td>数据3</td></tr><tr><td>数据4</td><td>数据5</td><td>数据6</td></tr><tr><td>数据7</td><td>数据8</td><td>数据9</td></tr></table>
</body>
</html>
在 CSS 中,tr:nth-child(odd)
是一个伪类选择器,用于选择所有在其父元素(比如 <table>
)中的奇数位置的 <tr>
元素。
解释:
nth-child()
是 CSS 中的一个伪类,用来根据元素在父元素中的位置来选择子元素odd
是nth-child()
中的一个关键字,表示选择奇数位置的元素(例如:1、3、5、7…),even
表示偶数位置的元素(例如:2、4、6、8…)- 由于在 CSS 中,元素的计数是从 1 开始的,所以
tr:nth-child(odd)
会选择所有在父元素中处于奇数位置的<tr>
元素
核心思路:
使用表格中的行的伪类选择器,改变奇数行或偶数行表格的背景颜色即可
tr:nth-child(odd)
表示奇数行tr:nth-child(even)
表示偶数行
二、带下拉菜单的水平导航栏
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>带下拉菜单的水平导航栏</title><style>ul {list-style-type: none;margin: 0px;padding: 0px;background-color: yellowgreen;display: flex;justify-content: center;height: 75px;}li {display: inline;}a {display: block;height: 100%;text-decoration: none;padding: 0 20px;line-height: 75px;font-weight: 600;font-size: large;}a:hover {background-color: aliceblue;color: black;}.bar {position: relative;}.mean {position: absolute;list-style-type: none;margin: 0px;padding: 0px;background-color: skyblue;display: none;width: 120px;z-index: 1;}.mean a {text-align: center;background-color: skyblue;}.bar:hover .mean{display: block;}.mean a:hover {background-color: lightyellow;}</style>
</head>
<body><ul><li><a href="#">关于</a></li><li><a href="#">新闻</a></li><li class="bar"><a href="#">练习</a><ul class="mean"><li><a href="#">css</a></li><li><a href="#">html</a></li><li><a href="#">js</a></li><li><a href="#">vue</a></li></ul></li><li><a href="#">我们</a></li><li><a href="#">合作</a></li></ul>
</body>
</html>
核心思路:
先使用无序列表实现水平导航栏:
- 水平导航栏中的元素要想居中,可以先将
ul
标签设置为弹性盒子模型,在通过justify-content: center;
居中即可- 将块级标签
li
改变为行内标签display: inline;
- 设置a标签为块级标签
display: block;
,在通过height: 100%
从而来撑满标签- 最后在设置a标签的
:hover
中(鼠标聚焦即实现)改变背景颜色和字体颜色再在要添加下拉菜单的
li
标签中添加另一个无序列表:
- 先给指定的
li
标签设置为相对位置,以便先拉菜单出现在正确位置position: relative;
- 设置下拉菜单的列表标签
ul
设置为绝对位置,接收最近已定位的父元素li
的相对位置;再将显示关闭display: none;
并设置下拉菜单框的宽度;最后确保下拉菜单显示在其他元素之上定义z-index: 1;
mean
下的a
标签设置为文本居中text-align: center;
- 设置指定
li
标签的:hover
并改变.mean
中的显示状态display: block;
- 设置在
mean
的a
标签的:hover
,改变鼠标聚焦时的背景颜色
三、带悬浮动漫的按钮
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>带悬浮动漫的按钮</title><style>.btn {background-color: skyblue;padding: 15px;border: none;border-radius: 5px;cursor: pointer;transition: background-color 0.3s, transform 0.3s;position: absolute;top: 50px;left: 50px;font-size: large;}.btn:hover {background-color: aqua;transform: scale(1.2);}</style>
</head>
<body><button class="btn">悬浮按钮</button>
</body>
</html>
核心思路:
直接设置按钮的样式:
- 设置鼠标光标聚焦按钮变为手指
cursor: pointer;
- 设置变化效果,使用
transition
属性(用于指定元素在状态变化时的过渡效果)transition: background-color 0.3s, transform 0.3s;
,改变背景颜色和大小,时间均为0.3s(transform
可以scale(比例)
——缩放、translate(x,y)
——平移、rotate(度数deg)
——旋转,……)- 给按钮设置
:hover
,使得光标聚焦时,设置改变后的背景颜色background-color
和transform
缩放属性
四、带阴影的卡片
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>带阴影的卡片</title><style>.card {box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.3);padding: 14px 16px;}.card1 {box-shadow: inset 0px 4px 8px rgba(0, 0, 0, 0.3);padding: 14px 16px;}</style>
</head>
<body><div class="card"><h2>带阴影的卡片</h2><p>这是卡片的内容</p></div><br><br><div class="card1"><h2>内阴影</h2><p>这是卡片的内容</p></div>
</body>
</html>
核心思路:
直接设置卡片的样式即可:
- 使用
box-shadow
属性,box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.3)
,第一个属性是水平偏移量,第二个属性是垂直偏移量,第三个属性是模糊半径,第四个是阴影颜色rgba(0,0,0,0.3)
其中的0.3是透明度- *如果要使用内阴影,即在
box-shadow
属性前面加inset
*即可
五、图片的提示文本
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>图片的提示文本</title><style>.img-container {position: relative;display: inline-block;}.img-container img {width: 250px;height: auto;border-radius: 8px;}.tip {position: absolute;background-color: rgba(0, 0, 0, 2);color: white;padding: 10px;border-radius: 5px;opacity: 0;transition: opacity 0.3s ease;font-size: large;/* 禁用鼠标事件 */pointer-events: none;}.img-container:hover .tip{opacity: 1;}</style>
</head>
<body><div class="img-container"><img src="image\pexels-nascimento-vieira-455892312-19295658.jpg" alt="图片加载失败"><div class="tip">这是这个图片的提示文本</div></div>
</body>
</html>
核心思路:
先设置整个容器:
- 将父容器的位置改为相对定位
postion: relative;
,以便后面的提示文本内容位置的接收- 再将整个容器设置为行内块级元素,以便后面仅将光标移动到图片位置,而不是整行
再设置提示文本:
- 先设置提示文本的定位为,绝对定位
postion: absolute;
- 将元素的透明度设置为0,即不可见
opacity: 0;
- 设置平滑的过渡效果,
transition: opacity 0.3s ease;
其中ease
是一个过渡时间函数,表示过渡会以一种平滑的速度变化,开始和结束时较慢,中间较快- 最后禁用鼠标事件
pointer-events: none;
最后设置光标聚焦时,提示文本的展示:
- 设置整个容器的
:hover
(但在文本位置时不会展示,因为文本位置已经禁用了鼠标事件),此时设置tip
标签的opacity: 1
透明度设置为1,元素展示
六、折叠面板
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>折叠面板</title><style>.accordion {background-color: white;margin: 0 10px;}.accordion-header {background-color: aquamarine;border: none;border-radius: 5px;padding: 10px;cursor: pointer;font-size: large;font-weight: 500;}.accordion-content {padding: 10px 16px;display: none;background-color: aliceblue;border-radius: 5px;box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);}.active .accordion-content {display: block;}</style>
</head>
<body><h2>折叠面板</h2><div class="accordion"><button class="accordion-header">折叠面板</button><div class="accordion-content"><p>这是折叠面板的内容</p></div></div>
</body>
<script>const accord = document.querySelector('.accordion-header');accord.addEventListener('click', function() {const parent = this.parentElement;parent.classList.toggle('active');});
</script>
</html>
核心思路:
先设置整个容器:
- 定义
div
容器,并将背景定义为白色再设置容器中的按钮:
- 设置按钮的基本属性,并设置光标聚焦时,改变鼠标样式
cursor:pointer;
设置折叠面板的内容:
- 设置不展示
display: none;
,也可以设置成带阴影的卡片box-shadow
使用
JS
的DOM
给添加按钮添加事件:
- 定义一个常量使用类名接收按钮属性
const accord = document.querySelector('.accordion-header');
- 给这个常量添加点击事件监听
.addEventListener('click', 函数)
,并定义点击后的函数- 在这个函数中再定义一个常量来获取该点击元素的父元素
const parent = this.parentElement;
- 给父容器添加
.active
类(有这个类则删除,没有这个类则添加),parent.classList.toggle('active');
设置事件控制的
css
样式:
- 给要展示折叠面板的
css
加上父容器的前缀.active
,如果有则执行这段css
,.active .accordion-content {}
- 在这个
css
样式里面添加展示display: block;
七、网格布局
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>网格布局</title><style>.grid-container {display: grid;/* grid-template-columns: repeat(4, 1fr);grid-template-rows: repeat(2, 1fr); */grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));gap: 10px;padding: 20px;}.grid {display: flex;justify-content: center;background-color: greenyellow;/* width: 200px; */aspect-ratio: 1;color: blueviolet;align-items: center;font-size: large;font-weight: 700;}</style>
</head>
<body><div class="grid-container"><div class="grid">内容1</div><div class="grid">内容2</div><div class="grid">内容3</div><div class="grid">内容4</div><div class="grid">内容5</div><div class="grid">内容6</div><div class="grid">内容7</div><div class="grid">内容8</div></div>
</body>
</html>
核心思路:
先定义整个容器的样式:
- 先将整个容器设置为二维布局系统
display: grid;
- 再定义网格容器的列布局
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
使用repeat()
函数创建列数,设置为auto-fill
表示网格的列数会根据容器的宽度自动填充,使用minmax()
函数定义每一列的最小宽度和最大宽度,1fr
表示该列将分配容器可用空间的一部分- 设置各个网格项行列之间的间距
gap: 10px
再定义每个网格项的样式:
- 先将网格项的布局模式为
Flexbox
布局display: flex;
(可以帮助更好的控制内容再元素内的对齐方式)- 在
Flexbox
布局下,控制子元素的对齐方式,水平居中justify-content: center;
- 再设置元素的垂直居中
align-items: center;
(同样也适用于Flexbox
布局)- 将网格项设置为正方形,使用
aspect-ratio: 1;
,控制元素的宽高比。
-fill, minmax(200px, 1fr));使用
repeat()函数创建列数,设置为
auto-fill表示网格的列数会根据容器的宽度自动填充,使用
minmax()函数定义每一列的最小宽度和最大宽度,
1fr`表示该列将分配容器可用空间的一部分*- 设置各个网格项行列之间的间距
gap: 10px
再定义每个网格项的样式:
- 先将网格项的布局模式为
Flexbox
布局display: flex;
(可以帮助更好的控制内容再元素内的对齐方式)- 在
Flexbox
布局下,控制子元素的对齐方式,水平居中justify-content: center;
- 再设置元素的垂直居中
align-items: center;
(同样也适用于Flexbox
布局)- 将网格项设置为正方形,使用
aspect-ratio: 1;
,控制元素的宽高比。