豆瓣首页话题输入框的实现

  在做问答的时候,遇到一个需求,用户的问题需要限制字数,不仅显示计算的超出字数,还需在超出的内容上加一些提醒的效果,例如豆瓣首页的话题输入框,抽时间研究了下,需要考虑下面几个问题:

1、输入框的高度是固定的,如果超出高度需要滚动显示(可上下键移动显示)

2、随时计算输入的字数,并显示在下方

3、根据计算结果将多出的部分加背景显示(textarea里是不可以加背景的 :< )

4、根据3分析,需要加个hack实现(加个highlight的div),如果超出此div需要根据teatarea的scrollTop添加移动的距离

5、考虑输入的各种内容及粘贴的情况

下面就一步一步来实现这种效果,先贴个图看看效果:

html代码如下:

<div id="container">
  <div class="text-wrap"><div class="highlight"></div></div>
  <textarea autocomplete="false"></textarea>
  <p class="count">140</p>
</div>

因为要考虑到textarea的文字与highlight的代码完全重合,那么定义的样式需要完全相同,且因输入的文字有限制,所以考虑去掉输入框的滚动条:

textarea::-webkit-scrollbar {display:none}

完整的css如下:

      #container {
        position: relative;
      }
      .text-wrap {
        height: 200px;
        width: 500px;
        padding: 5px 5px 5px 5px;
        overflow: hidden;
        position: absolute;
        top: 0;
        left: 0;
        z-index: 9;
      }
      textarea, .highlight {
        width: 500px;
        font-family: arial,sans-serif;
        font-size: 14px;
      }
      textarea {
        min-height: 200px;
        border: 1px solid #ccc;
        padding: 5px 5px 5px 5px;
        position: relative;
        background: none;
        resize: none;
        z-index: 10;
      }
      textarea::-webkit-scrollbar {display:none}
      .highlight {
        min-height: 200px;
        white-space: pre-wrap;
        word-wrap: break-word;
        color: transparent;
      }
      .highlight span {
        background: #fcc;
      }
      .error {
        color: red;
      }

除了html、css外,最最重要的就是js了,只有她才可以带来神奇的效果,她是不可替代的唯一,她是实现你与机器之间的纽带,有了她,不困了、不累了、不饿了,O(∩_∩)O~~

既然考虑到每次输入的时候去查字数,那么就涉及到了事件,keyup和input,所以在textarea上添加这两个事件,只有触发这两个事件时才执行下面的一系列操作。

查字:首先计算是否超出字数,这是常见的限定字数输入框,各种微博、评论基本上都用到这个,定义两个变量,考虑会粘贴或输入代码,所以替换了‘<‘ 和 ‘>‘,len等于文字的长度,

如果len大于设定的最大值需要处理两步:

1、显示当前字数为醒目的红色,提醒用户超出字数限定范围

2、给超出的字数加背景

text = $.trim($this.val().replace(/</g, ‘&gt;‘).replace(/>/g, ‘&lt;‘))
len = text.length

全部js代码如下,注释非常清楚的说明了各部分的内容

        var MAX = 140,
          $text = $(‘textarea‘),
          $highlight = $(‘div.highlight‘);
        $text.on(‘keyup input‘, function() {
          var $this = $(this),
            text = $.trim($this.val().replace(/</g, ‘&gt;‘).replace(/>/g, ‘&lt;‘)),
            len = text.length,
            count = Math.floor(MAX-len);
          if(count < 0) {
            $(‘p.count‘).addClass(‘error‘)
          }else{
            $(‘p.count‘).removeClass(‘error‘)
          }
          // 显示当前字数
          $(‘p.count‘).text(count)
          // 将文字分成两部分,超出的内容用span包起来,css加红色背景样式
          $highlight.html(text.slice(0, MAX) + ‘<span>‘ + text.slice(MAX) + ‘</span>‘)
          // 考虑粘贴时,内容超出,高亮部分需要重置位置
          resetMask()
        }).on(‘scroll‘, function() {
          // textarea滚动时,重置高亮部分的位置
          resetMask()
        })
        // 高亮内容位置随文本框内容的位置重置
        function resetMask() {
          var textScrollTop = $text.scrollTop();
          if(textScrollTop > 0) {
            $highlight.css(‘margin-top‘, -textScrollTop);
            return
          }
          $highlight.css(‘margin-top‘, 0)
        }   

最终效果地址:https://codepen.io/mengyun/pen/eEbryJ

时间: 2024-10-11 09:39:06

豆瓣首页话题输入框的实现的相关文章

豆瓣首页

㈠豆瓣首页HTML代码 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>项目实战-豆瓣首页</title> 6 <link rel="shortcut icon" type="image/x-icon" href="img/fav

Python3 爬虫实例(三) -- 爬取豆瓣首页图片

序 前面已经完成了简单网页以及伪装浏览器的学习.下面,实现对豆瓣首页所有图片爬取程序,把图片保存到本地一个路径下. 首先,豆瓣首页部分图片展示 这只是截取的一部分.下面给出,整个爬虫程序. 爬虫程序 这个爬取图片的程序采用伪装浏览器的方式,只不过是加了处理图片的模块. ''' 批量下载豆瓣首页的图片 采用伪装浏览器的方式爬取豆瓣网站首页的图片,保存到指定路径文件夹下 ''' #导入所需的库 import urllib.request,socket,re,sys,os #定义文件保存路径 targ

python爬取豆瓣首页热门栏目详细流程

记录一下爬取豆瓣热门专栏的经过,通过这篇文章,你能学会requests,HTMLParser,json的基本使用,以及爬取网页内容的基本思路. 使用模块 1,获取豆瓣首页代码:首先我们需要访问豆瓣页面,获取首页的源码.这里推荐使用第三方库:requests,相比python内置的 urllib 模块,requests使用起来更简单,功能更全面 2,对获取的代码进行解析:对于解析html代码,已经有很多功能强大的框架能使用,如Scrapy,PySpider,Beautiful Soup等,这里我们

Python爬虫实战(4):豆瓣小组话题数据采集—动态网页

1, 引言 注释:上一篇<Python爬虫实战(3):安居客房产经纪人信息采集>,访问的网页是静态网页,有朋友模仿那个实战来采集动态加载豆瓣小组的网页,结果不成功.本篇是针对动态网页的数据采集编程实战. Python开源网络爬虫项目启动之初,我们就把网络爬虫分成两类:即时爬虫和收割式网络爬虫.为了适应各种应用场景,GooSeeker的整个网络爬虫产品线包含了四类产品,如下图所示: 本实战是上图中的"独立python爬虫"的一个实例,以采集豆瓣小组讨论话题(https://w

豆瓣首页模仿

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="description" content="小清新 文艺青年的聚集地"> 6 <title>豆瓣</title> 7 <script src="JS/base.js"></scr

如何用微信小程序模仿豆瓣首页

程序思路: 用微信自带组件swiper来实现轮播图 用豆瓣提供的api(这里使用的电影api)来获取最近的电影数据[豆瓣api地址] 获取数据用微信的request方法,只需要提供豆瓣api的url链接,就能够get到数据 用setData()方法来将数据存进对应的page里面,在视图层(html)用wx:for来进行列表渲染 在渲染过程中加一个加载提示框(微信的showToast,API),等到数据请求并渲染完成后,结束提示框 1.app.js   获取用户登录状态并获取用户信息 //app.

小白学 Python 爬虫(28):自动化测试框架 Selenium 从入门到放弃(下)

人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装 小白学 Python 爬虫(7):HTTP 基础 小白学 Python 爬虫(8):网页基

urllib

urllib提供了一系列用于操作URL的功能. Get urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应: 例如,对豆瓣的一个URLhttps://api.douban.com/v2/book/2129650进行抓取,并返回响应: from urllib import request with request.urlopen('https://api.douban.com/v2/book/2129650') as f: d

我是怎么找电子书的?

网盘搜索引擎 http://so.baiduyun.me/ 备注:提供百度谷歌双索,几乎包含所有的网盘,默认搜索百度网盘,如果百度网盘搜不到,各位可以选择其他网盘再进行搜索. 找文件 http://www.zhaofile.com/ 备注:搜索的网盘有限,备用网盘搜索引擎. 掌上书苑 备注:主提供Epub格式电子书,下载需积分,上传赚积分,资源十分十分多. 微盘 http://vdisk.weibo.com/share/hot?log_target=navigation_hot_file 备注: