关于css3动画:10个css实现特效

52次阅读

共计 7156 个字符,预计需要花费 18 分钟才能阅读完成。

  1. 打字成果

阐明:

通过 steps() 属性来实现宰割文本的成果。首先,你必须指定 step() 中传入的数量,在这个例子中就是文本的长度。

接着,第二步,咱们应用 @keyframes 去申明什么时候开始执行动画

<div class="typing">
    <div class="typing-effect">Typing effect for text</div>
</div>

.typing {
  height: 80vh;
  display: flex;
  align-items: center;
  justify-content: center;
}
.typing-effect {
  width: 22ch;
  white-space: nowrap;
  overflow: hidden;
  border-right: 3px solid;
  font-family: monospace;
  font-size: 2em;
  animation: typing 2s steps(22), effect .5s step-end infinite alternate;
}

@keyframes typing {
  from {width: 0;}
}

@keyframes effect {
  50% {border-color: transparent;}
}
  1. 通明图片暗影成果

阐明:

应用:drop-shadow

drop-shadow 的工作形式是,其遵循给给定图片的 Alpha 通道。因而暗影是基于图片的外部形态,而不是显示在图片里面。

<div class="transparent-shadow">
  <div class="margin-right">
    <div class="margin-bottom align-center">
      box-shadow
    </div>
    
    <img class="box-shadow" src="https://stackdiary.com/wp-content/uploads/2022/02/logo.png" alt="box-shadow example (transparent)">
  </div>
    
  <div>
    <div class="margin-bottom align-center">
      drop-shadow
    </div>
    
    <img class="drop-shadow" src="https://stackdiary.com/wp-content/uploads/2022/02/logo.png" alt="drop-shadow example (transparent)">
  </div>
</div>

.transparent-shadow {
  height: 80vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

.margin-right {margin-right: 2em;}

.margin-bottom {margin-bottom: 1em;}

.align-center {text-align: center;}

.box-shadow {box-shadow: 2px 4px 8px #3723a1;}

.drop-shadow {filter: drop-shadow(2px 4px 8px #3723a1);
}
  1. 自定义 Cursor

<div class="custom-cursor">
  <div class="card">
    Default
  </div>
  
  <div class="card card-image-cursor">
    Image
  </div>
  
  <div class="card card-emoji-cursor">
    Emoji
  </div>
</div>

.custom-cursor {
  display: flex;
  height: 80vh;
  align-items: center;
  justify-content: center;
  background: #f3f3f3;
  padding: 0 10px;
}

.card {
    width: 200px;
    height: 200px;display: flex;
    align-items: center;
    justify-content: center;
    background-color: #D29A5A;
    margin-right: 10px;color: #fff;
    font-size: 1.4em;
    text-align: center;
  }

.card-image-cursor {
  background-color: #D11A5A;
  cursor: url("https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0ac1d8cb2b1b46a384e986a7461df26a~tplv-k3u1fbpfcp-watermark.image?"), auto;
}

.card-emoji-cursor {
  background-color: #D29B22;
  cursor: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'width='48'height='48'viewport='0 0 100 100'style='fill:black;font-size:24px;'><text y='50%'>🚀</text></svg>"), auto;
}
  1. 应用 attr() 展现 tooltip

<h1>
  HTML/CSS tooltip
</h1>
<p>
  Hover <span class="tooltip" tooltip-data="Tooltip Content">Here</span> to see the tooltip.
</p>
<p>
  You can also hover <span class="tooltip" tooltip-data="This is another Tooltip Content">here</span> to see another example.
</p>

.tooltip {
  position: relative;
  border-bottom: 1px dotted black;
}

.tooltip:before {content: attr(tooltip-data); 
  position: absolute;
  width: 250px;
  background-color: #efba93;
  color: #fff;
  text-align: center;
  padding: 15px;
  line-height: 1.1;
  border-radius: 5px;
  z-index: 1;
  opacity: 0;
  transition: opacity .5s;
  bottom: 125%;
  left: 50%;
  margin-left: -60px;
  font-size: 0.70em;
  visibility: hidden;
}

.tooltip:after {
  content: "";
  position: absolute;
  bottom: 75%;
  left: 50%;
  margin-left: -5px;
  border-width: 5px;
  border-style: solid;
  opacity: 0;
  transition: opacity .5s;
  border-color: #000 transparent transparent transparent;
  visibility: hidden;
}

.tooltip:hover:before, 
.tooltip:hover:after {
  opacity: 1;
  visibility: visible;
}
  1. 纯 CSS 实现核算清单
<div class="checklist">
  <h2>Item Checklist with CSS</h2>
  <label>
    <input type="checkbox" name=""id="" />
    <i></i>
    <span>Item #1</span>
  </label>
  <label>
    <input type="checkbox" name=""id="" />
    <i></i>
    <span>Item #2</span>
  </label>
  <label>
    <input type="checkbox" name=""id="" />
    <i></i>
    <span>Item #3</span>
  </label>
</div>

.checklist {
    padding: 50px;
    position: relative;
    background: #043b3e;
    border-top: 50px solid #03a2f4;
}
.checklist h2 {
    color: #f3f3f3;
    font-size: 25px;
    padding: 10px 0;
    margin-left: 10px;
    display: inline-block;
    border-bottom: 4px solid #f3f3f3;
}
.checklist label {
    position: relative;
    display: block;
    margin: 40px 0;
    color: #fff;
    font-size: 24px;
    cursor: pointer;
}
.checklist input[type="checkbox"] {-webkit-appearance: none;}
.checklist i {
    position: absolute;
    top: 2px;
    display: inline-block;
    width: 25px;
    height: 25px;
    border: 2px solid #fff;
}
.checklist input[type="checkbox"]:checked ~ i {
    top: 1px;
    height: 15px;
    width: 25px;
    border-top: none;
    border-right: none;
    transform: rotate(-45deg);
}
.checklist span {
    position: relative;
    left: 40px;
    transition: 0.5s;
}
.checklist span:before {
    content: '';
    position: absolute;
    top: 50%;
    left: 0;
    width: 100%;
    height: 1px;
    background: #fff;
    transform: translateY(-50%) scaleX(0);
    transform-origin: left;
    transition: transform 0.5s;
}
.checklist input[type="checkbox"]:checked ~ span:before {transform: translateY(-50%) scaleX(1);
    transform-origin: right;
    transition: transform 0.5s;
}
.checklist input[type="checkbox"]:checked ~ span {color: #154e6b;}
  1. 应用 :is() 和 :where() 增加元素款式

<h2 class="content-title">Header 2 <b>content title</span></h2>

:where(h2,h3,h4) > b {color: blue;}

:is(h2):where(.content-title) {text-transform: uppercase;}
  1. 应用关键帧实现手风琴下拉成果
<main>
    <details open>
        <summary>Accordion Tab #1</summary>
        <div class="tab-content">
          <p>your text goes here</p>
        </div>
    </details>
    <details>
        <summary>Accordion Tab #2</summary>
        <div class="tab-content">
          <p>your text goes here</p>
        </div>
  </details>
  <details>
    <summary>Accordion Tab #3</summary>
    <div class="tab-content">
      <p>your text goes here</p>
    </div>
  </details>
</main>

main {
  max-width: 400px;
  margin: 0 auto;
}
p {
    text-align: justify;
    font-family: monospace;
    font-size: 13px;
}
summary {
  font-size: 1rem;
  font-weight: 600;
  background-color: #f3f3f3;
  color: #000;
  padding: 1rem;
  margin-bottom: 1rem;
  outline: none;
  border-radius: 0.25rem;
  cursor: pointer;
  position: relative;
}
details[open] summary ~ * {animation: sweep .5s ease-in-out;}
@keyframes sweep {0%    {opacity: 0; margin-top: -10px}
  100%  {opacity: 1; margin-top: 0px}
}
details > summary::after {
  position: absolute;
  content: "+";
  right: 20px;
}
details[open] > summary::after {
  position: absolute;
  content: "-";
  right: 20px;
}
details > summary::-webkit-details-marker {display: none;}
  1. 侧边栏的 Hover 成果

<div class="css-dynamic-sidebar">

  <nav>
    <a class=""href="#">Menu #1</a>
    <a class=""href="#">Menu #2</a>
    <a class=""href="#">Menu #3</a>
  </nav>
 
<div class="site-content">
  <p>Hover over the sidebar</p>
  <p>Also work with Tab selector (for accessibility)</p>
</div>
</div>

.css-dynamic-sidebar {
    overflow: hidden;
    position: relative;
    height: 15em;
    max-width: 15em;
    margin: auto;
}
.site-content {margin: auto;}
nav {
    display: flex;
    flex-direction: column;
    position: absolute;
    right: 100%;
    padding: 1em;
    background-color: #f3f3f3;
    transform: translateX(1em);
    transition: 0.2s transform;
}
nav:hover,
nav:focus-within {transform: translateX(100%);
}
a {
    white-space: pre;
    color: black;
}
p {
    font-size: 2em;
    font-family: monospace;
    text-align: center;
}
  1. 应用 first-letter 实现首字母大写

<div class="content-section">
  <p>here we target the  wrapper and select the p element. then append first-of-type and target first-letter specifically. you can then reuse the same option in other parts of your design by changing the wrapper variable</p>
</div>

.content-section p:first-of-type::first-letter {
    color: #f3f3f3;
    float:  left;
    font-size: 4rem;
    line-height: 4vw;
    padding-right: 8px;
 /* border: 0.25em double; */
}
  1. 应用 ::before 增加按钮的图标

<div class="card">
  <div class="card-body">
    <a href=""target="_blank"class="btn btn-docu"rel="noopener">Documentation</a>
  </div>
</div>

.card .card-body .btn {
  display: block;
  width: 200px;
  height: 48px;
  line-height: 48px;
  background-color: blue;
  border-radius: 4px;
  text-align: center;
  color: #fff;
  font-weight: 700;
}
.card .card-body .btn-docu:before {
    content:"\0000a0";
    display:inline-flex;
    height:24px;
    width:24px;
    line-height:24px;
    margin:0px 10px 0px 0px;
    position:relative;
    top:0px;
    left:0px;
    background:url(https://stackdiary.com/docu.svg) no-repeat left center transparent;
    background-size:100% 100%;
}

正文完
 0