前言:
在网页设计中,CSS hover 伪类为用户交互提供了丰富的视觉反馈,使得界面更加生动和吸引人。本文将深入探讨 hover 伪类的基本用法,包括如何改变元素自身的样式、影响子元素以及相邻或后续兄弟元素的样式。此外,我们还将介绍 :before 和 :after 伪元素的使用方法,这些伪元素可以在不增加额外 HTML 元素的情况下,丰富页面的样式。
hover
hover用法
这个表示的是:当鼠标悬浮在a这个样式上的时候,a的背景颜色设置为黄色
a:hover
background-color:yellow;
}
这个是最普通的用法了,只是通过a改变了style
2
A元素:hover B元素 鼠标悬停在A元素时,改变A元素的子元素B的样式
<style> .main { width: 400px; height: 400px; border: 1px solid black; } .main:hover .box1 { background-color: black; height: 100px; width: 100px; } </style> </head> <body> <div class="main"> <div class="box1"> </div> </div> </body>
3
A元素:hover + B元素 鼠标悬停在A元素时,改变与A相邻的兄弟元素B的样式(A必须与B 相邻)
<style> .main { width: 400px; height: 400px; border: 1px solid black; } .main:hover+.box1 { background-color: black; height: 100px; width: 100px; } </style> </head> <body> <div class="main"> </div> <div class="box1"> </div> </body>
4
A元素:hover ~ B元素 鼠标悬停在A元素时,改变A的指定兄弟元素B的样式表示(A B可以不相邻,但B必须在A元素之后。)
<style> .main { width: 400px; height: 400px; border: 1px solid black; } .main:hover~.box2 { background-color: black; height: 100px; width: 100px; } </style> </head> <body> <div class="main"> </div> <div class="box1"> </div> <div class="box2"> </div> </body>
::after 和 ::before
“:before” 伪元素可以在元素的内容前面插入新内容。
“:after” 伪元素可以在元素的内容之后插入新内容。
::before或::after都必须和content属性结合使用,content不能没有,内容至少为空;伪元素的display默认为inline,可以自己改.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .box { position: relative; width: 200px; height: 50px; background-color: pink; } .box::before { position: absolute; content: ""; width: 12px; height: 12px; border: 1px solid black; border-bottom-color: transparent; border-right-color: transparent; transform: translate(-50%, -50%) rotate(-45deg); left: 20px; top: 50%; } .box::after { position: absolute; content: ""; width: 12px; height: 12px; border: 1px solid black; border-bottom-color: transparent; border-right-color: transparent; transform: translate(-50%, -50%) rotate(135deg); right: 20px; top: 50%; } </style> </head> <body> <div class="box"></div> </body> </html>
小demo
边框流动
<template> <div class="box"> <h2>CSS</h2> </div> </template> <script setup> </script> <style scoped lang="less"> .box { position: relative; width: 180px; height: 250px; background: rgba(0, 0, 0, 0.8); border-radius: 20px; display: flex; justify-content: center; align-items: center; overflow: hidden; h2 { color: white; font-size: 4em; text-shadow: 2px 2px pink; z-index: 1; } &::before { content: ''; position: absolute; width: 120px; height: 120%; background: linear-gradient(#00ccff, #d500f9); animation: rotate 5s linear infinite; } &::after { content: ''; position: absolute; background: #0e1238; inset: 5px; border-radius: 20px; } } @keyframes rotate { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } </style>
一个登录页面
<div> <form action="" class="login"> <p>Login</p> <input type="text" placeholder="username"> <input type="password" placeholder="password"> <input type="submit" class="btn" value="Login"> </form> </div>
* { user-select: none; } body { background: url(./res/computer.webp) no-repeat; background-size: cover; background-attachment: fixed; } .login { position: absolute; top: 50%; margin-top: -200px; left: 50%; margin-left: -200px; background-color: whitesmoke; width: 400px; height: 400px; border-radius: 25px; text-align: center; padding: 5px 40px; box-sizing: border-box; } p { font-size: 42px; font-weight: 600; } input { background: whitesmoke; width: 100%; height: 48px; margin-bottom: 10px; border: none; border-bottom: 2px solid silver; outline: none; font-size: 20px; } .btn { background: #59c2c5; width: 38%; height: 48px; border-radius: 8px; margin-top: 40px; font-size: 28px; font-weight: 300; color: white; } .btn:hover { background-color: #59c2a0; }
轮盘
<script setup > import {onMounted, ref} from "vue"; onMounted(()=>{ }) let d = 0; let line=ref() const start=()=>{ line.value.style.transform=`rotate(0)` const rotate=setInterval(()=>{ d++ let a = d +"deg" line.value.style.transform=`rotate(${a})` },10) // let time = (Math.random()*10) // let time =(Math.floor(Math.random()*5)+1)*(Math.random().toFixed(2))*1000 // 生成3到5之间的随机数 const time = (Math.floor(Math.random() * 3) + 5)*(Math.random().toFixed(2))*1000; console.log(time) setTimeout(()=>{ clearInterval(rotate) },time) } </script> <template> <div> <div class="circle"> <div class="box1 box"></div> <div class="box2 box"></div> <div class="box3 box"></div> <div class="box4 box"></div> <div class="line" ref="line"></div> </div> <div> <el-button @click = start>start</el-button> </div> </div> </template> <style scoped lang="scss"> .circle{ width: 400px; height: 400px; overflow: hidden; .box{ height: 200px; width: 200px; transform: rotate(0deg) !important; } .box1{ background: red; border-top-left-radius:100%; } .box2{ position: relative; background: yellow; top: -200px; left: 200px; border-top-right-radius:100%; } .box3{ position: relative; background: green; top: -200px; border-bottom-left-radius:100%; } .box4{ background: #1c37e1; position: relative; top: -400px; left: 200px; border-bottom-right-radius:100%; } .line{ height: 8px; width: 150px; background: #af09e3; position: fixed; top: 205px; left: 207px; border-radius: 10px; transform-origin: left ; //transform: rotate(45deg); } } </style>
页面上可以平滑
用 自动 换行 ,强制 不换行,强制 换行 超出显示省略号
white-space: nowrap; nowrap 不换行 wrap 换行 包裹 的英文 意思 会 自动 换行 换行 p { word-wrap:break-word; } 断行 注意:设置强制将英文单词断行,需要将行内元素设置为块级元素。 p { word-break:break-all; } 超出显示省略号: p{text-overflow:ellipsis;overflow:hidden;}
white-space: normal|pre|nowrap|pre-wrap|pre-line|inherit; white-space: 属性设置如何处理元素内的空白 normal: 默认。空白会被浏览器忽略。 pre: 空白会被浏览器保留。其行为方式类似 HTML 中的 pre 标签。 nowrap: 文本不会换行,文本会在在同一行上继续,直到遇到 br 标签为止。 pre-wrap: 保留空白符序列,但是正常地进行换行。 pre-line: 合并空白符序列,但是保留换行符。 inherit: 规定应该从父元素继承 white-space 属性的值。
word-wrap: normal|break-word; word-wrap: 属性用来标明是否允许浏览器在单词内进行断句,这是为了防止当一个字符串太长而找不到它的自然断句点时产生溢出现象。 normal: 只在允许的断字点换行(浏览器保持默认处理) break-word: 在长单词或URL地址内部进行换行
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <style> .horizontal-scroll { width: 100%; height: 200px; overflow-x: auto; /* 改为 overflow-x 以允许水平滚动 */ overflow-y: hidden; /* 确保垂直方向不出现滚动条 */ scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* IE 10+ */ } /* 隐藏滚动条,但允许内容滚动(WebKit) */ .horizontal-scroll::-webkit-scrollbar { display: none; } /* 其他样式保持不变 */ .scroll-container { white-space: nowrap; } .display-item { width: 200px; height: 200px; display: inline-block; } .box1{ background-color: black; } .box2{ background-color: blue; } .box3{ background-color: green; } .box4{ background-color: red; } </style> </head> <body> <div class="horizontal-scroll"> <div class="scroll-container"> <div class="display-item box1"> </div> <div class="display-item box2"> </div> <div class="display-item box3"> </div> <div class="display-item box4"> </div> </div> </div> </body> </html>