从编辑器中总结的css知识

前言

最近在做公司的编辑器项目,遇到了好些问题,有js的,也有css的,今天总结下从编辑器学到的css知识。

正文

我们的编辑器是基于quill.js开发的,它有一套自己的样式,正常使用是没问题的。

但是我们基于它们原来的样式改了一些,然后测试有一天提出一个问题,就是在文本高亮后一直按空格,会超出编辑器的宽度。

如图

因为ql-editor默认设置了overflow-y: auto,不会超出显示。

但是我们的滚动条需求,需要把它改成visible,所以导致它超出显示了。

那还有什么办法能不让它们不超出现示?

这时候看到ql-editor使用了white-space属性,它是处理元素的空白字符的,它的值是pre-wrap

我们对white-space这个属性很熟,经常用来处理不换行(nowrap),它还有其它值,下面介绍一下。

white-space属性

属性值如下:

  • normal 默认样式,空白符会被合并,换行符会替换成空白符,再合并,开头如果有换行符或者空白符会被过滤

  • nowrap 空白符会被合并,遇到换行符也不会换行,除非是br标签

  • break-spaces 空白符会被保留,超出盒子会主动换行,遇到换行符或者br标签会换行

  • pre-wrap 空白符会被保留 ,超出盒子不会主动换行(文本会主动换行,空白符不会主动换行),导致元素的宽度会超出父元素宽度

  • pre 空白符会被保留,不会主动换行(文本会超出),只有遇到换行符或者br标签才会换行

  • pre-line 空白符会被合并,然后超出盒子会主动换行,或者遇到换行符或者br标签也会换行

下面通过例子来看一下:

html 复制代码
  <style>
    .line {
      margin: 20px;
      width: 200px;
      height: 100px;
      border: 1px solid red;
    }
  </style>
  <div class="line">
    测试换行             测试换行                         
                  测试换行             测试换行                     
  </div>

normal

nowrap

break-spaces

pre-wrap

pre

pre-line

为了空格符不超出盒子,同时也要保留空格符,我们最终选择了break-spaces

编辑器设置其它字体,加粗没效果(mac)

这一天,测试又找到我,说编辑器的默认字体加粗有效果 ,但是设置成宋体加粗没效果

我排查了一下,window是没有这个问题,mac是有这个问题。

查阅了一些资料,发现有个字体平滑属性 可以解决, font-smoothing

在chrome使用-webkit-font-smoothing,值有auto,none,antialiased(字体像素级别平滑)和subpixel-antialiased(非视网膜更好的显示)

在firefox里使用-moz-osx-font-smoothing,值有autograyscale(等同于antialiased)。

通过例子演示一下:

html 复制代码
  <style>
    .font {
      margin: 0 20px;
      line-height: 24px;
      font-family: SimSun,STSong;
    }

    .bold {
      font-weight: bold;
    }

    .smoothing {
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }
  </style>
  <div class="font">我是宋体,但不加粗</div>
  <div class="font bold">我是宋体,但是加粗</div>
  <div class="font bold smoothing">我是宋体,但是加粗,并且使用了smoothing</div>

默认字体:

宋体:

可以看到,默认字体没问题。

宋体没有设置font-smoothing,加粗没效果,且有锯齿。

设置了font-smoothing之后,加粗有效果,字体很平滑。

resize属性

quill支持图片上传,会转成base64显示,但是它默认不支持对图片进行操作,比如放大缩小。 产品就提出看看能不能支持一下。

这天,突然看到有个resize属性textarea默认是设置了这个属性,所以它默认可以拖动改变尺寸。

感觉resize属性也可以用在图片上,让它支持放大缩小。

resize属性不能用在inline元素,或者overflow:visible的block元素

默认值是none(不拖动)。 both代表它可以在垂直和水平方向拖动,其他值还有horizontal(仅水平方向)和vertical(仅垂直方向)。

实测发现,reize属性不能直接用在img标签上,可以用在它外层的p元素。

css 复制代码
    p:has(img) {
      overflow: auto;
      resize: both;
    }

可以通过拖动这个图标实现放大缩小。

备注:这个属性在这里仅仅只是演示,让大家更了解这个属性。

相关推荐
你挚爱的强哥20 分钟前
✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
javascript·vue.js·jquery
y先森1 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy1 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189111 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿2 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡3 小时前
commitlint校验git提交信息
前端
虾球xz4 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇4 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒4 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员4 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js