能用CSS实现的就不要麻烦JavaScript了


Posted in HTML / CSS onOctober 05, 2021

能用CSS实现的就不要麻烦JavaScript了
 

前言

凡是可以用 JavaScript 来写的应用,最终都会用 JavaScript 来写。——Atwood定律

虽然万物都可以是JavaScript,但某种程度css的运行效率会比JavaScript高,所以笔者认为:能用CSS实现的就不用麻烦JavaScript。

两种语言都有不同的用途随着浏览器版本特性和属性的增加,CSS正成为一种功能强大的语言,能够处理我们以前依赖JavaScript实现的功能。

平滑滚动

曾经有一段时间,我们不得不依靠JavaScript的window.scrollY来实现来执行此操作,如果想平滑滚动还要依赖定时器增加一个动画。随着scroll-behavior属性的新增,我们可以使用一行CSS代码来处理网站上的平滑滚动!浏览器支持约为75%,兼容性还是挺不错的。

html {
  scroll-behavior: smooth;
}

能用CSS实现的就不要麻烦JavaScript了

 

 

屏幕录制2021-07-18 上午10.14.21.gif

 

完整代码[1]

滚动捕抓

幻灯片、图片库这些也是前端高频使用功能,上一代CSS能力有限,我们不得不依赖JavaScript来完成这功能。现在只要几行代码就可以实现此功能。从某种意义上说,它与Flexbox或CSS Grid的工作原理类似,即您需要一个容器元素,在该容器元素上设置scrolln-snap-type和多个为其设置了scroll-snap-align的子元素,如下所示:

<main class=”parent”>
  <section class=”child”></section>
  <section class=”child”></section>
  <section class=”child”></section>
</main>
.parent {
  scroll-snap-type: x mandatory;
}

.child {
  scroll-snap-align: start;
}

能用CSS实现的就不要麻烦JavaScript了

 

 

屏幕录制2021-07-17 下午10.23.04.gif

 

完整代码[2]

CSS动画

曾经某个时期,大多数开发者使用 JavaScript(或者jQuery) 给浏览器中的元素添加动画。让这个淡化,让那个扩大,很简单。随着互动的项目越来越复杂,移动设备的大量增加,表现性能变得越来越重要。Flash 被抛弃,有天赋的动画开发者使用 HTML5 去实现过去从未实现的效果。他们需要更好的工具去开发复杂的动画序列并获得最好的性能。JavaScript(或者jQuery) 并不能够做到。浏览器日渐成熟的同时也开始提供了一些解决方案。最被广泛接受的方案是使用 CSS 动画。

能用CSS实现的就不要麻烦JavaScript了

 

 

屏幕录制2021-07-17 下午10.38.14.gif

 

完整代码[3]

表单验证

html5 丰富了表单元素,提供了类似 required , email , tel 等表单元素属性。同样的,我们可以利用 :valid 和 :invalid 来做针对html5表单属性的校验。

  • :required 伪类指定具有required 属性的表单元素
  • :valid 伪类指定一个通过匹配正确的所要求的表单元素
  • :invalid 伪类指定一个不匹配指定要求的表单元素

能用CSS实现的就不要麻烦JavaScript了

 

 

屏幕录制2021-07-18 上午9.15.50.gif

 

利用 CSS 的 content 属性 attr 抓取资料

想必大家都想到了伪元素 after ,但是文字怎么获得呢,又不能用 JavaScript 。

CSS 的伪元素是个很??大的东西,我们可以利用他做很多运用,通常为了做一些效果, content:" " 多半会留空,但其实可以在里面写上 attr 抓资料哦!

<div data-msg="这里是获取content的内容">  
hover
</div>
div{
width:100px;
border:1px solid red;  
position:relative;
}
div:hover:after{
content:attr(data-msg);
position:absolute;
font-size: 12px;
width:200%;
line-height:30px;
text-align:center;
left:0;
top:25px;
border:1px solid green;
}

能用CSS实现的就不要麻烦JavaScript了

 

 

屏幕录制2021-07-18 上午9.42.38.gif

 

鼠标悬浮时显示

鼠标悬浮的场景十分常见,例如导航的菜单:

能用CSS实现的就不要麻烦JavaScript了

 

 

image.png

 

一般要把隐藏的东西如菜单作为hover目标的子元素或者相邻元素,才方便用css控制,例如上面的菜单,是把menu当作导航的一个相邻元素:

<!--menu为相邻的li-->
<li class="user">用户</li>
<li class="menu">
    <ul>
       <li>账户设置</li>
       <li>登出</li>
    </ul>
</li>

menu在正常态下是隐藏的:

.menu{
  display: none;
}

而当导航hover时显示:

/*使用相邻选择器和hover*/
.user:hover + .menu{
  display: list-item;
}

注意这里使用了一个相邻选择器,这也是上面说的为什么要写成相邻的元素。menu的位置可以用absolute定位。

同时menu自已本身hover的时候也要显示,否则鼠标一离开导航的时候,菜单就消失了:

.menu:hover{
    display: list-item;
}

这里会有一个小问题,即menu和导航需要挨着一起,否则中间有空隙的话,上面添加的菜单hover就不能发挥作用了,但是实际情况下从美观的角度,两者是要有点距离的。这个其实也好解决,只要在menu上面再画一个透明的区域就好了,如下蓝色的方块:

可以用before/after伪类用absoute定位实现:

ul.menu:before{
    content: "";
    position: absolute;
    left: 0;
    top: -20px;
    width: 100%;
    height: 20px;
    /*background-color: rgba(0,0,0,0.2);*/
}

如果我既写了css的hover,又监听了mouse事件,用mouse控制显示隐藏,双重效果会有什么情况发生,如果按正常套路,在mouse事件里面hover的时候,添加了一个display: block的style,会覆盖掉CSS的设置。也就是说,只要hover一次,css的代码就不管用了,因为内联样式的优先级会高于外链的。但是实际情况下会有意外发生,那就是在移动端iphone上面,触摸会触发CSS的hover,并且这个的触发会很高概率地先于touchstart事件,在这个事件里面会判断当前是显示还是隐藏的状态,由于css的hover发挥了作用,所以判断为显示,然后又把它隐藏了。也就是说,点一次不出来,要点两次。所以最好别两个同时写。第二种场景,使用子元素,这个更简单。把hover的目标和隐藏的对象当作同一个父容器的子元素,然后hover写在这个父容器上面就可以了,不用像上面那样,隐藏元素也要写个hover:

.marker-container .detail-info{
    display: none
}
.marker-container:hover .detail-info{
   display: block
}

最后

这里展示也只是一些常用的功能,其实还有很多可以通过CSS实现的功能,有兴趣的同学继续研究一下更多不依赖JavaScript完成的CSS功能。

到此这篇关于能用CSS实现的就不要麻烦JavaScript了的文章就介绍到这了,更多相关css平滑滚动内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
10分钟理解CSS3 Grid布局
Dec 20 HTML / CSS
如何使用localstorage代替cookie实现跨域共享数据问题
Apr 18 HTML / CSS
关于HTML5的安全问题开发人员需要牢记的
Jun 21 HTML / CSS
HTML 5.1来了 9月份正式发布 更新内容预览
Apr 26 HTML / CSS
LocalStorage记住用户和密码功能
Jul 24 HTML / CSS
canvas 如何绘制线段的实现方法
Jul 12 HTML / CSS
html5 制作地图当前定位箭头的方法示例
Jan 10 HTML / CSS
html5视频常用API接口的实战示例
Mar 20 HTML / CSS
HTML5给汉字加拼音收起展开组件的实现代码
Apr 08 HTML / CSS
浅析数据存储的三种方式 cookie sessionstorage localstorage 的异同
Jun 04 HTML / CSS
教你做个可爱的css滑动导航条
Jun 15 HTML / CSS
如何利用 CSS Overview 面板重构优化你的网站
Oct 24 HTML / CSS
浅析CSS在DevTools 中架构演变
CSS布局之浮动(float)和定位(position)属性的区别
Sep 25 #HTML / CSS
Canvas绘制像素风图片的示例代码
Canvas如何做个雪花屏版404的实现
使用canvas对video视频某一刻截图功能
Sep 25 #HTML / CSS
使用CSS实现一个搜索引擎的原理解析
sass 常用备忘案例详解
Sep 15 #HTML / CSS
You might like
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
2016/08/01 PHP
jquery控制listbox中项的移动并排序
2009/11/12 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
javascript字符串替换函数如何一次性全部替换掉
2015/10/30 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
jQuery鼠标事件总结
2016/10/13 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
使用Math.max,Math.min获取数组中的最值实例
2017/04/25 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
Vue 路由切换时页面内容没有重新加载的解决方法
2018/09/01 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
[48:39]Ti4主赛事胜者组第一天 EG vs NEWBEE 2
2014/07/19 DOTA
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
在PyCharm中实现添加快捷模块
2020/02/12 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
意大利男装网店:Vrients
2019/05/02 全球购物
int和Integer有什么区别
2013/05/25 面试题
投标承诺书范本
2014/03/27 职场文书
冬季施工防火方案
2014/05/17 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
Linux安装apache服务器的配置过程
2021/11/27 Servers
MySQL数据库实验实现简单数据库应用系统设计
2022/06/21 MySQL