JavaScript实战(原生range和自定义特效)简单实例


Posted in Javascript onAugust 21, 2016

今天我又码了两个特效:一个是用原生input[type=range]的,另一个完全自定义的;下面是完整代码和演示:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
  <style>
    #tip{
      position: absolute;
      top: 30px;
      left: 0;
      right: 0;
      width: 200px;
      height: 160px;
      margin: auto;
      border: 1px solid gray;
      background-color: cornsilk;
    }
    #tip div{
      position: relative;
      width: 100%;
      height: 80px;
      border-bottom: 1px solid gray;
    }
    .out{
      position: relative;
      left: 16%;
      display: inline-block;
      border: 2px solid royalblue;
      margin-top: 20px;
      width: 130px;
      height: 20px;
      background-color: lightgoldenrodyellow;
    }
    .in{
      display: block;
      height: 20px;
      line-height: 20px;
      text-align: right;
      color: white;
      width: 50%;
      background-image: linear-gradient(to right,powderblue 0%,#336699 50%,red 100%);
      -webkit-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
      user-select: none;
    }
    input[type="range"] {
      position: relative;
      left: 19%;
      top: 5px;
      box-shadow: 0 1px 0 0px #424242, 0 1px 0 #060607 inset, 0px 2px 10px 0px black inset, 1px 0px 2px rgba(0, 0, 0, 0.4) inset, 0 0px 1px rgba(0, 0, 0, 0.6) inset;
      background-color: lightskyblue;
      border-radius: 15px;
      width: 60%;
      -webkit-appearance: none;
      -moz-appearance: none;
      appearance: none;
      height:15px;
    }
    input[type="range"]::-webkit-slider-thumb {
      -webkit-appearance: none;
      -moz-appearance: none;
      appearance: none;
      height: 20px;
      width: 10px;
      background-color: coral;
      border-radius: 15px;
      -webkit-box-shadow: 0 -1px 1px black inset;
      -moz-box-shadow: 0 -1px 1px black inset;
      box-shadow: 0 -1px 1px black inset;
    }
    input[type="range"]:before{
      content: attr(value);
      color: white;
      border-radius: 5px 0 0 5px;
      background-color: lightskyblue;
    }
    input[type="range"]:after{
      content: attr(max);
      color: white;
      border-radius:0 5px 5px 0;
      background-color: lightskyblue;
    }
    .b{
      display: inline-block;
      width: 22px;
      padding: 0;
    }
    #outer2{left: 5px}
    #btn1{
      position: relative;
      left: 5px;
    }
    #btn2{
      position: relative;
      left: 5px;
    }
  </style>
  <script>
    window.onload = function(){
      //原生组件range
      var inner = document.getElementById('inner1');
      var range = document.getElementById('range');
      range.onclick = function(){
          inner.innerHTML = range.value;
          inner.style.width = range.value+'%';
      };
      range.onmousemove = function(){
          inner.innerHTML = range.value;
          inner.style.width = range.value+'%';
      };
      //自定义组件
      var outer2 = document.getElementById('outer2');
      var inner2 = document.getElementById('inner2');
      var btn1 = document.getElementById('btn1');
      var btn2 = document.getElementById('btn2');
      var id,id1;
      var value = parseInt(inner2.innerHTML);
      var a = parseFloat(window.getComputedStyle(outer2,null).width)/100;
      //减---
      btn1.onmousedown = function(){
        id1 = setTimeout(function change(){
              if(value>0) {
                value--;
                inner2.innerHTML = value;
                inner2.style.width = (value) * a + 'px';
                id = setTimeout(function(){
                  clearTimeout(id);
                  change();
                },16.7);
              }else{clearTimeout(id);}
            },500);
      };
      btn1.onmouseup = function(){clearTimeout(id1);clearTimeout(id)};
      btn1.onclick = function(){
        console.log('a:'+a+','+'value:'+value);
        if(value>0){
          value--;
          inner2.innerHTML = value;
          inner2.style.width = (value)*a+'px';
        }
      };
      //加+++
      btn2.onmousedown = function(){
        id1 = setTimeout(function change(){
          if(value<100) {
            value++;
            inner2.innerHTML = value;
            inner2.style.width = value * a + 'px';
            id = setTimeout(function(){
              clearTimeout(id);
              change();
            },16.7);
          }else{clearTimeout(id);}
        },500);
      };
      btn2.onmouseup = function(){clearTimeout(id1);clearTimeout(id)};
      btn2.onclick = function(){
        if(value<100){
          value++;
          inner2.innerHTML = value;
          inner2.style.width = value*a+'px';
        }
      }
    }
  </script>
</head>
<body>
  <form id="tip">
    <div>
      <span id="outer1" class="out">
        <span id="inner1" class="in">50</span>
      </span>
      <input id="range" class="ran" type="range" min="0" max="100" step="1" value="50">
    </div>
    <div id="d2">
      <input id="btn1" class="b" type="button" value="<">
      <span id="outer2" class="out">
        <span id="inner2" class="in">50</span>
      </span>
      <input id="btn2" class="b" type="button" value=">">
    </div>
    按住按钮0.5秒, 会持续变化!
  </form>
</body>
</html>

第一个的实现很简单,就不做解释了,自己看代码;

这里主要介绍第二个实例的实现:

在我们看到一个需求,或者别人的特效时,不急着去看别人的代码,先想想,要是你,该怎么实现?先把思路整理出来

该特效的实现原理:

1. 一个span内嵌套一个span;

•外面的span:只显示宽、高、边框,背景无

•里面的span:高度和外面一样,宽度为默认的50%,先设置好背景颜色为线性渐变

2. 按钮的onclick事件比较简单,点一下,就改变里面的span的宽度和显示数字

3. 当按钮的onmousedown时,启动计时器,等500ms后执行函数change函数,而change函数是一个用setTimeout回调自身的函数,他会没16.7ms回调一次,达到动画效果

难点解析:

1. 这一句 var a = parseFloat(window.getComputedStyle(outer2,null).width)/100;
用来获得初始值,如果你用outer2.style.width
是得不到值得,当然你也可以将a设个固定值,比如这里可以设为
var a = 1.3,
注意IE9以下不支持getComputedStyle方法,
IE的Element对象有currentStyle属性;

2. 这一句
btn1.onmouseup = function(){clearTimeout(id1);
clearTimeout(id)};
很关键,没了它,在onclick触发之前,会先触发onmosedown,在500ms后,开始执行,之后一直执行外层的计时器;
 
3. 其它的都不是难点;
这个实例其实扩展到其它很多应用,比如可以把中间的显示部分替换为文章、图片等等,再把按钮换成自定义的,效果将会很酷的!

如果您觉得我有写的不好的地方,欢迎指出!

以上这篇JavaScript实战(原生range和自定义特效)简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
10个实用的脚本代码工具
May 04 Javascript
jquery淡化版banner异步图片文字效果切换图片特效
Apr 08 Javascript
基于javascript实现的搜索时自动提示功能
Dec 26 Javascript
QQ登录背景闪动效果附效果演示源码下载
Sep 22 Javascript
基于React.js实现原生js拖拽效果引发的思考
Mar 30 Javascript
微信小程序 action-sheet底部菜单详解
Oct 27 Javascript
自动适应iframe右边的高度
Dec 22 Javascript
从零学习node.js之利用express搭建简易论坛(七)
Feb 25 Javascript
微信小程序 setData使用方法及常用错误解决办法
May 11 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
Jun 30 Javascript
Three.js利用dat.GUI如何简化试验流程详解
Sep 26 Javascript
vue favicon设置以及动态修改favicon的方法
Dec 21 Javascript
原生JS实现-星级评分系统的简单实例
Aug 21 #Javascript
JSONP和批量操作功能的实现方法
Aug 21 #Javascript
全面解析标签页的切换方式
Aug 21 #Javascript
JavaScript第一篇之实现按钮全选、功能
Aug 21 #Javascript
JS实现图片局部放大或缩小的方法
Aug 20 #Javascript
JS获取及验证开始结束日期的方法
Aug 20 #Javascript
jquery弹出框插件jquery.ui.dialog用法分析
Aug 20 #Javascript
You might like
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
浅谈php中mysql与mysqli的区别分析
2013/06/10 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
PHP使用函数用法详解
2018/09/30 PHP
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
js自带函数备忘 数组
2006/12/29 Javascript
sina的lightbox效果。
2007/01/09 Javascript
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
为javascript添加String.Format方法
2020/08/11 Javascript
javascript客户端解决方案 缓存提供程序
2010/07/14 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
javascript每日必学之继承
2016/02/23 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
JavaScript学习笔记整理_用于模式匹配的String方法
2016/09/19 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
深入理解vue Render函数
2017/07/19 Javascript
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
Vue 构造选项 - 进阶使用说明
2020/08/14 Javascript
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
python用for循环求和的方法总结
2019/07/08 Python
pytorch 彩色图像转灰度图像实例
2020/01/13 Python
Python环境管理virtualenv&amp;virtualenvwrapper的配置详解
2020/07/01 Python
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
优秀研究生自我鉴定
2013/12/04 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
关于运动会的宣传稿
2015/07/23 职场文书