好看反馈html特效,好看漂亮的html5网页特效学习笔记(2)_svg实现不同投票不同表情...

bVbwOQe?w=254&h=198

特点:

根据不同评分显示不同表情,并且这些表情看起来像是在一个传送带上可以滚动

使用纯代码(svg)绘制表情以及用于评分的星星

html+css,无javascript,上手难度:很简单

源码:

学习笔记

flex

布局使用flex,这是一种自适应屏幕的布局。注意align-items和justify-content也和flex有关。具体请看https://www.runoob.com/cssref...

.container {

display: flex;

}

星星绘制

background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' width='126.729' height='126.73'%3e%3cpath fill='%23fcd93a' d='M121.215 44.212l-34.899-3.3c-2.2-.2-4.101-1.6-5-3.7l-12.5-30.3c-2-5-9.101-5-11.101 0l-12.4 30.3c-.8 2.1-2.8 3.5-5 3.7l-34.9 3.3c-5.2.5-7.3 7-3.4 10.5l26.3 23.1c1.7 1.5 2.4 3.7 1.9 5.9l-7.9 32.399c-1.2 5.101 4.3 9.3 8.9 6.601l29.1-17.101c1.9-1.1 4.2-1.1 6.1 0l29.101 17.101c4.6 2.699 10.1-1.4 8.899-6.601l-7.8-32.399c-.5-2.2.2-4.4 1.9-5.9l26.3-23.1c3.8-3.5 1.6-10-3.6-10.5z'/%3e%3c/svg%3e");

css中有这么一大段代码,共有三处。用svg来绘制评分的星星。

关于svg如何绘制具体请看https://www.runoob.com/svg/sv...

这三处代码,从上往下,第一处是绘制用于评分的灰色星星,第二处是用于当评出某个分数后,代表评分的星星的样子。第三处是用于,当鼠标碰到某个星星时,该星星和之前的星星所显示的样子。这三处代码不同的地方是fill 后面的数值,这代表着颜色。

星星显示规则

不过,根据评分怎么显示对应的星星数呢?假设我点了第四颗星,为什么第一到第三颗星也亮了呢?

注意这儿的选择器,星星实际上是。

A~B 匹配B元素,满足条件:B是A之后的任意一个兄弟节点(AB有相同的父节点,B在A之后,但不一定是紧挨着A)

A>B 匹配B元素,满足条件:B是A的直接子节点

表格详细版本:https://developer.mozilla.org...

这儿的css样式代码即为,当选择某颗星后,这颗星的lable,即用来显示星星样子的元素变亮,以及,和这颗星label为兄弟元素但在此星lable之后的label元素也变亮。为什么可以这么设置呢?看看html

第一星到第五星其实是倒着排的,所以当选择了第四星,第四星之前的三,二,一星也亮了。但是问题时,倒着排,那么显示出来不也是倒着的,从右往左么?再看看css

.rating {

flex-direction: row-reverse;

}

嗯,css再倒着来一遍,保证了第三星是第四星后面的元素,同时第三星还是在第四星左边。简直巧妙。

表情绘制

bVbwORa?w=133&h=549

使用svg纯代码绘制。例如下面这段代码就是绘制了左图最上方那个扁嘴的表情,项目中只有黑白色是因为用了grayscale滤镜,之前说过。其它表情请看源代码。关于svg如何绘制具体请看https://www.runoob.com/svg/sv...

表情滚动

#rating-1:checked ~ .emoji-wrapper > .emoji {

-webkit-transform: translateY(-100px);

transform: translateY(-100px);

}

如上图所示,表情被绘制在一张高度很大的元素上,但只显示最上面的部分。当评分改变,这个高度很大的元素就向上移动,把需要的表情显示出来。

源码:

html

不同投票不同表情

css

* {

box-sizing: border-box;

}

.container {

display: flex;

flex-wrap: wrap;

height: 100vh;

align-items: center;

justify-content: center;

padding: 0 20px;

}

.rating {

display: flex;

width: 100%;

justify-content: center;

overflow: hidden;

flex-direction: row-reverse;

height: 150px;

position: relative;

}

.rating-0 {

-webkit-filter: grayscale(100%);

filter: grayscale(100%);

}

.rating > input {

display: none;

}

.rating > label {

cursor: pointer;

width: 40px;

height: 40px;

margin-top: auto;

background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' width='126.729' height='126.73'%3e%3cpath fill='%23e3e3e3' d='M121.215 44.212l-34.899-3.3c-2.2-.2-4.101-1.6-5-3.7l-12.5-30.3c-2-5-9.101-5-11.101 0l-12.4 30.3c-.8 2.1-2.8 3.5-5 3.7l-34.9 3.3c-5.2.5-7.3 7-3.4 10.5l26.3 23.1c1.7 1.5 2.4 3.7 1.9 5.9l-7.9 32.399c-1.2 5.101 4.3 9.3 8.9 6.601l29.1-17.101c1.9-1.1 4.2-1.1 6.1 0l29.101 17.101c4.6 2.699 10.1-1.4 8.899-6.601l-7.8-32.399c-.5-2.2.2-4.4 1.9-5.9l26.3-23.1c3.8-3.5 1.6-10-3.6-10.5z'/%3e%3c/svg%3e");

background-repeat: no-repeat;

background-position: center;

background-size: 76%;

transition: .3s;

}

.rating > input:checked ~ label,

.rating > input:checked ~ label ~ label {

background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' width='126.729' height='126.73'%3e%3cpath fill='%23fcd93a' d='M121.215 44.212l-34.899-3.3c-2.2-.2-4.101-1.6-5-3.7l-12.5-30.3c-2-5-9.101-5-11.101 0l-12.4 30.3c-.8 2.1-2.8 3.5-5 3.7l-34.9 3.3c-5.2.5-7.3 7-3.4 10.5l26.3 23.1c1.7 1.5 2.4 3.7 1.9 5.9l-7.9 32.399c-1.2 5.101 4.3 9.3 8.9 6.601l29.1-17.101c1.9-1.1 4.2-1.1 6.1 0l29.101 17.101c4.6 2.699 10.1-1.4 8.899-6.601l-7.8-32.399c-.5-2.2.2-4.4 1.9-5.9l26.3-23.1c3.8-3.5 1.6-10-3.6-10.5z'/%3e%3c/svg%3e");

}

.rating > input:not(:checked) ~ label:hover,

.rating > input:not(:checked) ~ label:hover ~ label {

background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' width='126.729' height='126.73'%3e%3cpath fill='%23d8b11e' d='M121.215 44.212l-34.899-3.3c-2.2-.2-4.101-1.6-5-3.7l-12.5-30.3c-2-5-9.101-5-11.101 0l-12.4 30.3c-.8 2.1-2.8 3.5-5 3.7l-34.9 3.3c-5.2.5-7.3 7-3.4 10.5l26.3 23.1c1.7 1.5 2.4 3.7 1.9 5.9l-7.9 32.399c-1.2 5.101 4.3 9.3 8.9 6.601l29.1-17.101c1.9-1.1 4.2-1.1 6.1 0l29.101 17.101c4.6 2.699 10.1-1.4 8.899-6.601l-7.8-32.399c-.5-2.2.2-4.4 1.9-5.9l26.3-23.1c3.8-3.5 1.6-10-3.6-10.5z'/%3e%3c/svg%3e");

}

.emoji-wrapper {

width: 100%;

text-align: center;

height: 100px;

overflow: hidden;

position: absolute;

top: 0;

left: 0;

}

.emoji-wrapper:before,

.emoji-wrapper:after {

content: "";

height: 15px;

width: 100%;

position: absolute;

left: 0;

z-index: 1;

}

.emoji-wrapper:before {

top: 0;

background: linear-gradient(to bottom, white 0%, white 35%, rgba(255, 255, 255, 0) 100%);

}

.emoji-wrapper:after {

bottom: 0;

background: linear-gradient(to top, white 0%, white 35%, rgba(255, 255, 255, 0) 100%);

}

.emoji {

display: flex;

flex-direction: column;

align-items: center;

transition: .3s;

}

.emoji > svg {

margin: 15px 0;

width: 70px;

height: 70px;

flex-shrink: 0;

}

#rating-1:checked ~ .emoji-wrapper > .emoji {

-webkit-transform: translateY(-100px);

transform: translateY(-100px);

}

#rating-2:checked ~ .emoji-wrapper > .emoji {

-webkit-transform: translateY(-200px);

transform: translateY(-200px);

}

#rating-3:checked ~ .emoji-wrapper > .emoji {

-webkit-transform: translateY(-300px);

transform: translateY(-300px);

}

#rating-4:checked ~ .emoji-wrapper > .emoji {

-webkit-transform: translateY(-400px);

transform: translateY(-400px);

}

#rating-5:checked ~ .emoji-wrapper > .emoji {

-webkit-transform: translateY(-500px);

transform: translateY(-500px);

}

.feedback {

max-width: 360px;

background-color: #fff;

width: 100%;

padding: 30px;

border-radius: 8px;

display: flex;

flex-direction: column;

flex-wrap: wrap;

align-items: center;

box-shadow: 0 4px 30px rgba(0, 0, 0, 0.05);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值