xml地图|网站地图|网站标签 [设为首页] [加入收藏]
结构性伪类选择器,单行居中
分类:web前端

有趣的CSS题目(14): 纯 CSS 方式实现 CSS 动画的暂停与播放!

2017/04/20 · CSS · 动画

本文作者: 伯乐在线 - chokcoco 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

使用纯 CSS 的方法,能否暂停、播放 CSS 动画?看起来不可能,至少很麻烦。

我们知道,在 CSS3 animation 中,有这样一个属性可以暂停、播放动画:

{ animation-play-state: paused | running; }

1
2
3
{
    animation-play-state: paused | running;
}

animation-play-state: 属性定义一个动画是否运行或者暂停。可以通过查询它来确定动画是否正在运行。另外,它的值可以被设置为暂停和恢复的动画的重放。

如果借助 Javascript,我们可以实现控制 CSS 动画的运行和播放,下面列出部分关键代码:

XHTML

<div class="btn">stop</div> <div class="animation"></div> <style> .animation { animation: move 2s linear infinite alternate; } @keyframes move { 0% { transform: translate(-100px, 0); } 100% { transform: translate(100px, 0); } } </style>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<div class="btn">stop</div>
<div class="animation"></div>
<style>
.animation {
    animation: move 2s linear infinite alternate;
}
@keyframes move {
    0% {
        transform: translate(-100px, 0);
    }
    100% {
        transform: translate(100px, 0);
    }
}
</style>

document.querySelector('.btn').addEventListener('click', function() { let btn = document.querySelector('.btn'); let elem = document.querySelector('.animation'); let state = elem.style['animationPlayState']; if(state === 'paused') { elem.style['animationPlayState'] = 'running'; btn.innerText = 'stop'; } else { elem.style['animationPlayState'] = 'paused'; btn.innerText = 'play'; } });

1
2
3
4
5
6
7
8
9
10
11
12
13
14
document.querySelector('.btn').addEventListener('click', function() {
    let btn = document.querySelector('.btn');
    let elem = document.querySelector('.animation');
    let state = elem.style['animationPlayState'];
    
    if(state === 'paused') {
        elem.style['animationPlayState'] = 'running';
        btn.innerText = 'stop';
    } else {
        elem.style['animationPlayState'] = 'paused';
        btn.innerText = 'play';
    }
    
});

Demo — pause CSS Animation

有趣的CSS题目(10):结构性伪类选择器

2016/11/17 · CSS · 选择器

本文作者: 伯乐在线 - chokcoco 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

有趣的CSS题目(5): 单行居中,两行居左,超过两行省略

2016/09/29 · CSS · CSS

本文作者: 伯乐在线 - chokcoco 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节。

解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧。

不断更新,不断更新,不断更新,重要的事情说三遍。

谈谈一些有趣的CSS题目(1): 左边竖条的实现方法

谈谈一些有趣的CSS题目(2): 从条纹边框的实现谈盒子模型

谈谈一些有趣的CSS题目(3): 层叠顺序与堆栈上下文知多少

谈谈一些有趣的CSS题目(4): 从倒影说起,谈谈 CSS 继承 inherit

所有题目汇总在我的 Github 。

 

纯 CSS 实现

下面我们探讨下,使用纯 CSS 的方式能否实现。

十、结构性伪类选择器(:root,:target,:empty,:not

每一个 CSS 伪类及伪元素的出现,肯定都是为了解决某些先前难以解决的问题而应运而生的。

学习了解它们,是解决许多其他复杂 CSS 问题或者前沿技术的基础。

这里是 4 个基本的结构性伪类选择器,结构性伪类选择器的共同特征是允许开发者根据文档树中的结构来指定元素的样式。

5、单行居中显示文字,多行居左显示,最多两行超过用省略号结尾

这题就厉害了我的哥。

题目就是如上要求,使用纯 CSS,完成单行文本居中显示文字,多行居左显示,最多两行超过用省略号结尾,效果如下:

不愿看长篇大论的可以先看看效果:-webkit- 内核下 Demo 戳我

图片 1

接下来就一步一步来实现这个效果。

 

hover 伪类实现

使用 hover 伪类,在鼠标悬停在按钮上面时,控制动画样式的暂停。

关键代码如下:

XHTML

<div class="btn stop">stop</div> <div class="animation"></div> <style> .stop:hover ~ .animation { animation-play-state: paused; } </style>

1
2
3
4
5
6
7
8
<div class="btn stop">stop</div>
<div class="animation"></div>
<style>
.stop:hover ~ .animation {
    animation-play-state: paused;
}
</style>

Demo — 纯 CSS 方式实现 CSS 动画的暂停与播放 (Hover):

当然,这个方法不够智能,如果释放鼠标的自由,点击一下暂停、再点击一下播放就好了。还有其他方法吗?

首先是单行居中,多行居左

居中需要用到 text-align:center,居左是默认值也就是text-align:left。如合让两者结合起来达到单行居中,多行居左呢?这就需要多一个标签,假设一开始我们定义如下:

XHTML

<h2>单行居中,多行居左</h2>

1
<h2>单行居中,多行居左</h2>

现在,我们在 h2 中间,嵌套多一层标签 p

XHTML

<h2><p>单行居中,多行居左</p></h2>

1
<h2><p>单行居中,多行居左</p></h2>

我们让内层 p 居左 text-align:left,外层 h2 居中 text-align:center,并且将 p 设置为display:inline-block ,利用 inline-block 元素可以被父级 text-align:center 居中的特性,这样就可以实现单行居中,多行居左,CSS 如下:

CSS

p { display: inline-block; text-align: left; } h2{ text-align: center; }

1
2
3
4
5
6
7
p {
    display: inline-block;
    text-align: left;
}
h2{
    text-align: center;
}

得到的效果如下:
图片 2

checked 伪类实现

之前的文章《有趣的CSS题目(8):纯CSS的导航栏Tab切换方案》也谈过,使用 radio 标签的 checked 伪类,加上 `` 实现纯 CSS 捕获点击事情。

并且利用被点击的元素可以控制一些 CSS 样式。实现如下:

XHTML

<input id="stop" type="radio" name="playAnimation" /> <input id="play" type="radio" name="playAnimation" /> <div class="box"> <label for="stop"> <div class="btn">stop</div> </label> <label for="play"> <div class="btn">play</div> </label> </div> <div class="animation"></div>

1
2
3
4
5
6
7
8
9
10
11
12
13
<input id="stop" type="radio" name="playAnimation" />
<input id="play" type="radio" name="playAnimation" />
<div class="box">
    <label for="stop">
        <div class="btn">stop</div>
    </label>
    <label for="play">
        <div class="btn">play</div>
    </label>
</div>
<div class="animation"></div>

部分关键 CSS 代码:

.animation { animation: move 2s linear infinite alternate; } #stop:checked ~ .animation { animation-play-state: paused; } #play:checked ~ .animation { animation-play-state: running; }

1
2
3
4
5
6
7
8
9
10
11
.animation {
    animation: move 2s linear infinite alternate;
}
 
#stop:checked ~ .animation {
    animation-play-state: paused;
}
 
#play:checked ~ .animation {
    animation-play-state: running;
}

我们希望当 #stop 和 #play 两个 radio 被点击时,给 .animation 元素分别赋予 animation-play-state: paused 或是 animation-play-state: running 。而且二者只能生效其一,所以需要给两个 radio 标签赋予相同的 name 属性。

DEMO — 纯 CSS 方式实现 CSS 动画的暂停与播放:

上面的示例 Demo 中,实现了纯 CSS 方式实现 CSS 动画的暂停与播放。

当然,还有一些其他方法,例如 radio 替换成 checkbox ,或者使用 :target 伪类选择器也能实现上面同样的效果,感兴趣的可以尝试一下。

到此本文结束,如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节。

解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉到生僻的 CSS 属性,赶紧去补习一下吧。

不断更新,不断更新,不断更新,重要的事情说三遍。

所有题目汇总在我的 Github 。

  • 有趣的CSS题目(1): 左边竖条的实现方法
  • 有趣的CSS题目(2): 从条纹边框的实现谈盒子模型
  • 有趣的CSS题目(3): 层叠顺序与堆栈上下文知多少
  • 有趣的CSS题目(4): 从倒影说起,谈谈 CSS 继承 inherit
  • 有趣的CSS题目(5): 单行居中,两行居左,超过两行省略
  • 有趣的CSS题目(6): 全兼容的多列均匀布局问题
  • 有趣的CSS题目(7):消失的边界线问题
  • 有趣的CSS题目(8):纯CSS的导航栏Tab切换方案
  • 有趣的CSS题目(9):巧妙实现 CSS 斜线
  • 有趣的CSS题目(10):结构性伪类选择器
  • 有趣的CSS题目(11):reset.css 知多少?
  • 有趣的CSS题目(12):你该知道的字体 font-family
  • 有趣的CSS题目(13):巧妙地制作背景色渐变动画!

打赏支持我写出更多好文章,谢谢!

打赏作者

:root 伪类

:root 伪类匹配文档树的根元素。应用到HTML,:root 即表示为元素,除了优先级更高外,相当于html标签选择器。

超出两行省略

完成了第一步,接下来要实现的是超出两行显示省略符号。

多行省略是有专门的新 CSS 属性可以实现的,但是有些兼容性不大好。主要用到如下几个:

  • display: -webkit-box; // 设置display,将对象作为弹性伸缩盒子模型显示
  • -webkit-line-clamp: 2; // 限制在一个块元素显示的文本的行数
  • -webkit-box-orient: vertical; // 规定框的子元素应该被水平或垂直排列

上述 3 条样式配合 overflow : hidden 和 text-overflow: ellipsis 即可实现 webkit 内核下的多行省略。好,我们将上述说的一共 5 条样式添加给 p 元素

CSS

p { display: inline-block; text-align: left; } h2{ text-align: center; }

1
2
3
4
5
6
7
p {
    display: inline-block;
    text-align: left;
}
h2{
    text-align: center;
}

看看效果如下:

图片 3

(在 -webkit- 内核浏览器下)发现,虽然超出两行的是被省略了,但是第一行也变回了居左,而没有居中

看回上面的 CSS 中的 p 元素,原因在于我们第一个设置的 display: inline-block ,被接下来设置的display: -webkit-box 给覆盖掉了,所以不再是 inline-block 特性的内部 p 元素占据了一整行,也就自然而然的不再居中,而变成了正常的居左展示。

记得上面我们解决单行居中,多行居左时的方法吗?上面我们添加多了一层标签解决了问题,这里我们再添加多一层标签,如下:

XHTML

<h2><p><em>单行居中,多行居左<em></p></h2>

1
<h2><p><em>单行居中,多行居左<em></p></h2>

这里,我们再添加一层 em 标签,接下来,

  • 设置 em 为 display: -webkit-box
  • 设置 p 为 inline-block
  • 设置 h2 为 text-align: center

嘿!通过再设置多一层标签,解决 display 的问题,完美解决问题,再看看效果,和一开始的示意图一样:

图片 4

See the Pen ALpdLj by Chokcoco (@Chokcoco) on CodePen.

-webkit- 内核下 Demo 戳我

本文由澳门新葡亰手机版发布于web前端,转载请注明出处:结构性伪类选择器,单行居中

上一篇:响应式设计的5个CSS实用技巧,SO热门问答 下一篇:没有了
猜你喜欢
热门排行
精彩图文