html 怎么让div和div中svg的高度一样_html5网页特效-svg实现不同投票不同表情

0d67873d4cc6d7c8c82f492b1d14539f.png

特点:

  • 根据不同评分显示不同表情,并且这些表情看起来像是在一个传送带上可以滚动
  • 使用纯代码(svg)绘制表情以及用于评分的星星
  • html+css,无javascript,上手难度:很简单

笔记

flex

布局使用flex,这是一种自适应屏幕的布局。注意align-items和justify-content也和flex有关。

.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来绘制评分的星星。

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

星星显示规则

不过,根据评分怎么显示对应的星星数呢?假设我点了第四颗星,为什么第一到第三颗星也亮了呢?
注意这儿的选择器,星星实际上是。

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

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

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

.rating { flex-direction: row-reverse;}

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

表情绘制

b7bd35407fddf6d85be2190d2e57aaf1.png

使用svg纯代码绘制。例如下面这段代码就是绘制了左图最上方那个扁嘴的表情,项目中只有黑白色是因为用了grayscale滤镜,之前说过。

web前端开发学习Q-q-u-n:784783012 ,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(学习工具,详细的前端项目实战教程,PDF) 

表情滚动

#rating-1:checked ~ .emoji-wrapper > .emoji { -webkit-transform: translateY(-100px); transform: translateY(-100px);}

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

源码:

html

 不同投票不同表情

css

web前端开发学习Q-q-u-n:784783012 ,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(学习工具,详细的前端项目实战教程,PDF) * { 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、付费专栏及课程。

余额充值