在contenteditable的div中的段落文字中获取光标位置,并在光标处插入字符
作者:admin 日期:2021-12-23vue项目中的一个小需求如题,代码整理如下:
- <template>
- <el-container class="about">
- <el-main>
- <section class="bgBox">
- <h1>在诗句上任意位置点击,再点击“插入字符”按钮,即可在光标处插入字符</h1>
- <div class="h20"></div>
- <el-button type="primary" @click="insertChar">插入字符</el-button>
- <div class="h30"></div>
- <div class="edit" contenteditable>
- <p
- v-for="(item, index) in sentenses"
- :key="item"
- @click="getCurrentSent(index)"
- >
- {{ item }}
- </p>
- </div>
- </section>
- </el-main>
- </el-container>
- </template>
- <script>
- const insertStr = (soure, start, newStr)=>{
- return soure.slice(0, start) + newStr + soure.slice(start);
- }
- import { getTableList, uploadFile } from "@/api/system/api_user";
- export default {
- data() {
- return {
- current_sent: null,
- sentenses: [
- "凌波不过横塘路。但目送、芳尘去。",
- "锦瑟华年谁与度。月桥花院,琐窗朱户。只有春知处。 ",
- "飞云冉冉蘅皋暮。彩笔新题断肠句。若问闲情都几许。",
- "一川烟草,满城风絮。梅子黄时雨。"
- ]
- };
- },
- computed: { },
- methods: {
- getCurrentSent(index) {
- // 获取当前句子
- this.current_sent = index;
- },
- insertChar() {
- // 获取getSelection对象,这个对象有很多内容,自己找到有用的数据
- let select = window.getSelection();
- // 利用insertStr函数,在光标位置插入###三个字符
- let newSent = insertStr(
- this.sentenses[this.current_sent],
- select.anchorOffset - 1,
- "###"
- );
- // 更新sentenses数组视图
- Vue.set(this.sentenses, this.current_sent, newSent);
- }
- }
- };
- </script>
- <style lang="scss"></style>
用moment.js构造带操作区的VUE个性化日历
作者:admin 日期:2021-12-01
这次项目需要用到这样一个稍有点特别的日历,每一天有一个“操作区”(根据数据有不同的操作),因为这个形态有点特殊,所以无法直接使用vant的日历组件。之前这个日历列表是由后端同事提供的。后来我自己对moment.js的操作比较熟练了,自己构造了一个,主要代码如下。
- initCale(){
- const NOW = moment('2021-05-16')
- let _first = _.cloneDeep(NOW).startOf('month') //月头
- let _last = _.cloneDeep(NOW).endOf('month') //月尾
- // 计算本月数据
- let days = NOW.daysInMonth() //本月天数
- let list = [] //最终日期列表,存入这个数组
- for (let ii = 0; ii < days; ii++) {
- let dd = _.cloneDeep(_first).add(ii, 'days') //从月头开始往后推算整月
- list.push(
- {
- date:dd.format('YYYY-MM-DD'),
- sd:dd.format('DD'),
- day:dd.day(), //星期几
- used:true,
- today:dd.format('YYYY-MM-DD')==NOW.format('YYYY-MM-DD') //今天
- }
- )
- }
- // 补月头(上个月剩下的几天)
- let lenHead = _first.day()-1 //本月第一天是星期几?从而推算月头天数
- for (let ii = 1; ii <= lenHead; ii++) {
- let dddd = _.cloneDeep(_first).add(-ii, 'days')
- list.unshift(
- {
- date:dddd.format('YYYY-MM-DD'),
- sd:dddd.format('DD'),
- day:dddd.day(),
- used:false
- }
- )
- }
- // 补月尾
- let lenTail = 7 - _last.day() //月尾天数
- for (let ii = 1; ii <= lenTail; ii++) {
- let dddd = _.cloneDeep(_last).add(ii, 'days')
- list.push(
- {
- date:dddd.format('YYYY-MM-DD'),
- sd:dddd.format('DD'),
- day:dddd.day(),
- used:false
- }
- )
- }
- this.caleList = list //caleList是VUE中用于渲染出日历的变量
- },
- 主要HTML:
- <ul class="caleList">
- <li class="top">一</li>
- <li class="top">二</li>
- <li class="top">三</li>
- <li class="top">四</li>
- <li class="top">五</li>
- <li class="top">六</li>
- <li class="top">日</li>
- <li v-for="item in caleList" :key="item.date"
- :class="[{'used':item.used},{'today':item.today}]"
- >
- <div class="date">{{item.sd}}</div>
- <div class="opt" v-if="item.used">操作</div>
- </li>
- </ul>
- 主要CSS(LESS):
- .caleList{
- display: flex; flex-wrap: wrap;
- li{
- flex:1 0 100%/7;
- border: 1px #fff solid;
- background-color: #aaa;
- color: #777;
- &.top{
- background-color: #fff; color: #900;
- border: none;
- height: 40px; display: flex; align-items: center; justify-content: center;
- }
- &.used{
- background-color: #eee;
- color: #333;
- }
- &.today{
- background-color: rgb(163, 10, 31); color: #fff;
- }
- .date{
- font-size: 24px;
- display: flex; align-items: center; justify-content: center;height: 35px;
- }
- .opt{
- font-size: 12px;
- padding: 0px 15px 10px; text-align: center;
- color: rgb(112, 11, 11);
- line-height: 120%;
- }
- }
- }
因为逻辑比较简单,此处并没有抽象成组件,有需要再说。
特别感谢知友的这篇文章:
一页面试题
作者:admin 日期:2021-11-20
- // 第1题
- let str = "2434cab"
- let arr = [...str]
- console.log(arr)
- let sss = []
- do {
- let rrr = _.takeRight(arr, 2)
- arr.length = arr.length - 2
- sss.push(rrr[0]+rrr[1])
- } while (arr.length>2);
- sss.push(_.replace(_.toString(arr),',',''))
- console.log("第1题答案:",sss)
- // 第2题
- let sss = []
- for (let i = 1; i < 101; i++) {
- let flag35 = (i % 3 == 0) && (i % 5 == 0)
- let flag3 = (i % 3 == 0)
- let flag5 = (i % 5 == 0)
- if(flag35){sss.push("bb35");continue;}
- if(flag3){sss.push("bb3");continue;}
- if(flag5){sss.push("bb5");continue;}
- sss.push(i)
- }
- console.log("第2题答案:",sss)
- //第3题
- let rect = document.getElementById('rect')
- console.log("第3题答案:", [rect.getBoundingClientRect().width,rect.getBoundingClientRect().height])
纯CSS实现文字水波动画
作者:admin 日期:2021-10-11vite2+vue2.6.12+vant2.12.12提速移动端开发
作者:admin 日期:2021-06-25试着用网上的一个vite2的脚手架做了个移动端的尝试。vite最大的好处就是--真的快!也可能是我页面比较少,但是每次热更新,基本就是一存盘,浏览器就完成了变更,体验太好了。
换新脚手架,要把所有常用配置都验证一下,并且把原来webpack中的选项都做到在vite中等价实现。
包括:
* px2rem的解决方案,在postcss.config.js中配置,转化为vw单位,比rem方式要先进点。
* vant基础样式定义,在theme.less中。
* lodash及moment全局引入,在/index.html中直接用<script>标签引入的,在vue文件中和.js中直接可用,但是在.ts文件中,如果不做import,会有红色的错误波浪线出现,但不影响使用。
* import后缀为vue的组件时,必须带上vue后缀,但js/ts不用带后缀。
* 有时候大的变化要CTRL+F5强制刷新页面,热更新才会生效。
* 图片引入方式:
<img :src="require('@img/aaa.png')" />
background-image: url("@img/aaa.png");
* 静态资源在/public目录下,在页面中用/images这样的路径引入即可。
* webpack允许的require在此都不能用,要改为import。写法方面,@import "~@/assets/less/_variable.less" vite中要去掉~写成:@import "@/assets/less/_variable.less";
* 控制台过滤。vite会出现一些控制台输出,暂时没有配置方法屏蔽,折中办法,在控制台搜索框输入-vite,可以过滤掉这些输出。
* 运行命令与环境变量。跟webpack略有不同。运行方式看package.json就知道了。环境变量可放在.env.development这样的文件中,跟webpack一致。在所有代码中输出import.meta.env,可以看到环境变量的所有。具体看文档。
我本人对于vue3和ts不是很熟悉(学不动了),所以宁愿工作在vue2+js的环境中。在vite脚手架中,这两种方式是可以混用的。所以按自己合适的模式使用就行了。
放心去享受vite带来的快速体验吧!
本次YT项目的一些收获
作者:admin 日期:2021-06-02今年4月1号开始在YT公司参与一个商业管理系统的开发,担任前端开发,跟十几个同事一起工作了二个月时间。
moment定义日期针对苹果手机的一个小bug
作者:admin 日期:2021-05-08大屏展示典型案例,SVG+CANVAS动画效果,flexible响应式尺寸
作者:admin 日期:2021-03-24演示在此: http://258754.cn/2020/ehs/canvas_and_svg.html
技术要点:
- 异形边框,自适应尺寸。已经做成了VUE标准组件。边框的宽、高可以使用px,也可以使用rem。
- 边框SVG+MASK+路径动画,底部CANVAS动画。
- flexible.js,每个块的宽、高,会根据整个页面的宽度自适应变化 。
SVG异形边框及路径动画+CSS动画演示
作者:admin 日期:2021-03-19演示地址:
http://blog.258754.cn/2021/vue_svg_tweenmax_demo/index.html
- 根据窗体的width/height参数,自动计算生成SVG的path路径
- tweenmax+MorphSVGPlugin生成小光点绕路径环游的动画,tweenmax的CSS动画生成右下角的色彩变化
- VUE组件化,方便复用