Tailwind Interactivity

CSS交互

元素外观appearance

CSS3中appearance属性用于设置元素模仿系统原生控件的外观

appearace: normal | icon | window | button | menu | field
属性值 描述
normal 设置元素外观为常规元素
icon 设置元素外观呈现为图标或小图片
window 设置元素外观呈现为窗口
button 设置元素外观呈现为按钮
menu 设置元素外观呈现为一套供用户选择的菜单
field 设置元素外观呈现为输入字段

Tailwind提供了.appearance-none工具类用于禁用 元素模仿系统原生控件的外观

工具类 属性
.appearance-none appearance:none;

光标外观cursor

CSS的cursor属性用于规定显示光标的类型或形状,Tailwind提供以.cursor-前缀的工具类用于控制贯标的显示。

工具类 属性 描述
.cursor-auto cursor:auto; 默认,浏览器设置的光标。
.cursor-default cursor:default; 默认光标显示为一个箭头
.cursor-pointer cursor:pointer; 光标呈现为指示链接的指针,即一只小手的图标。
.cursor-wait cursor:wait; 光标指示某对象可被移动
.cursor-text cursor:wait; 光标指示为文本
.cursor-move cursor:move; 光标指示某对象可被移动
.cursor-not-allowed cursor:not-allowed; 禁用光标指示效果

轮廓线条outline

CSS中outline属性用于绘制元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。轮廓线不会占据空间,也不一定是矩形。

outline属性的实际包含三个子属性

outline: outline-color outline-style outline-width;
子属性 描述
outline-color 设置轮廓线的颜色
outline-style 设置轮廓线的样式
outline-width 设置轮廓线的宽度

outline轮廓线与border边框线不同之处在于,outline轮廓线并不会增加边框的宽度,也就是说outline不会占据布局空间,也不会影响元素的尺寸。

Tailwind为轮廓线新增了.outline-none工具类,用于移除浏览器默认的轮廓线和元素聚焦效果。

工具类 属性
.outline-none outline:0;

指针事件pointer events

CSS中pointer-events指针事件属性是一个与JavaScript相关的属性,即指定在何种情况下特定图形元素可以设置成为鼠标事件的target目标。

pointer-events: auto | none | visiblepainted | visiblefill | visiblestroke | visible | painted | fill |stroke | all;

使用pointer-events属性用来设置事件穿透,即如果给父元素设置了pointer-events:none属性,那么父元素将不再监听鼠标事件。

pointer-events:none;

当设置元素的pointer-events属性为none后会产生如下特性

  • 阻止用户点击动作产生的任何效果
  • 阻止缺省鼠标指针的显示
  • 阻止CSS中的hoveractive状态的变化以触发事件
  • 阻止JavaScript点击动作触发的事件

使用场景

当页面中使用canvas绘制雨雪效果,为了避免这些悬浮物遮挡页面而影响鼠标点击,可使用pointer-events:none,设置悬浮物上方的canvas画布不会遮挡鼠标事件,让鼠标事件可以穿透上方的canvas画布来点击页面。

注意事项

  • 当设置pointer-events:none时,如果元素是绝对定位的,那在它下一层的元素可以被选中。
  • 设置pointer-events:none只是用来禁用鼠标事件,可通过其它方式绑定的事件还是会触发的,比如键盘事件等。
  • 如果将元素的子元素的pointer-events设置成非none值,当点击子元素是会通过事件冒泡的方式触发父级元素的事件。

设置元素的pointerr-events属性来阻止元素成为鼠标事件目标,并不一定意味着元素上的事件监听器永远不会触发。如果元素后代明确指定了pointer-events属性并允许其成为鼠标事件的目标,那么指向该元素的任何事件在事件传播过程中都将通过父元素,并以适当的方式触发其上的事件监听器。当然,位于父元素但不再后代元素上的鼠标活动都不会被父元素和后代元素捕获,因为鼠标活动将会传过父元素而指向位于其下的元素。

Tailwind为pointer-events属性提供了两个常用的工具类

工具类 属性
.pointer-events-none pointer-events:none;
.pointer-events-auto pointer-events:auto;
  • 使用.pointer-events-auto工具类可以还原指针事件为默认的浏览器行为
  • 使用.pointer-events-none工具类可以使元素忽略指针事件,但指针事件仍将会在子元素上触发并出传递到低于目标的元素。

例如:自定义选项组件

pointer events
<link href="https://unpkg.com/tailwindcss/dist/tailwind.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js" integrity="sha256-KzZiKy0DWYsnwMF+X1DvQngQ2/FxF7MF3Ff72XcpuPs=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.min.js" defer></script>

<div class="container mx-auto my-12">
  <!--pointer-events-auto-->
  <div class="relative overflow-hidden mb-4">
    <select name="" class="block appearance-none px-4 py-3 pr-8 w-full bg-gray-100 border-l border-gray-200 rounded leading-tight text-gray-700 focus:outline-none focus:bg-white focus:border-gray-500">
      <option value="">pointer-events-auto</option>
      <option value="">appearance-none</option>
      <option value="">outline-none</option>
    </select>
    <div class="absolute inset-y-0 right-0 px-3 bg-gray-300 rounded-r text-gray-700 flex items-center appearance-none pointer-events-auto">
      <i class="fas fa-angle-down fill-current w-4 h-4"></i>
    </div>
  </div>
  <!--pointer-events-none-->
  <div class="relative overflow-hidden mb-4">
    <select name="" class="block appearance-none px-4 py-3 pr-8 w-full bg-gray-100 border-l border-gray-200 rounded leading-tight text-gray-700 focus:outline-none focus:bg-white focus:border-gray-500">
      <option value="">pointer-events-none</option>
      <option value="">appearance-none</option>
      <option value="">outline-none</option>
    </select>
    <div class="absolute inset-y-0 right-0 px-3 bg-gray-300 rounded-r text-gray-700 flex items-center appearance-none pointer-events-none">
      <i class="fas fa-angle-down fill-current w-4 h-4"></i>
    </div>
  </div>
</div>

源代码效果:https://codepen.io/junchow/pen/NWxRwmX?editors=1000

调整尺寸reseize

CSS的resize属性用于指定一个元素是否可以由用户调整大小,即可以设置是否允许用户缩放页面中元素的尺寸。

resize: none | both | horizontal | vertical;
属性值 描述
none 默认值,禁止用户调整元素尺寸。
both 允许用户可调整元素的宽度和高度
horizontal 允许用户可以调整元素的宽度
vertical 允许用户可以调整元素的高度

使用注意

  • resize属性生效需要提前设置元素的overflow属性,其值可以是autohiddenscroll
  • 通过设置max-widthmax-height最大宽高加以限制范围
  • 当为元素定义了resize属性后,元素的右下角会出现允许拖动的标志,用户可以点击右下角拖动来随意改变元素的尺寸。
  • 为增强用户体验建议配置cursor属性通过设置对应的鼠标样式来增强用户体验感

例如:拖动边框缩放背景图片

demo
<div class="resize"></div>
<style>
.resize{
  background-image:url('http://source.unsplash.com/800x800');
  background-repeat:no-repeat;
  background-position:center;
  background-clip:content;
  width: 200px;
  height: 200px;
  max-width: 800px;
  max-height:800px;
  padding:10px;
  border:1px solid #888;
  resize:both;
  overflow:auto;
}
</style>

Tailwind为resize属性设置常用的工具类

工具类 属性 描述
.resize-none resize:none; 禁止用户调整尺寸
.resize resize:both; 允许用户调整宽高尺寸
.resize-x resize:horizontal; 允许用户调整水平尺寸
.resizee-y resize:vertical; 允许用户调整垂直尺寸

例如:设置文本域可手动调整宽高

demo
<link href="https://unpkg.com/tailwindcss/dist/tailwind.min.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js" integrity="sha256-KzZiKy0DWYsnwMF+X1DvQngQ2/FxF7MF3Ff72XcpuPs=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.min.js" defer></script>

<div class="container mx-auto my-12 p-12 bg-gray-100">
  <textarea class="border rounded resize focus:outline-none focus:shadow-outline"></textarea>
</div>

用户选中user-select

CSS3新增的user-select属性用于设置用户是否能够选中文本,可用于除替换元素外的所有元素。

user-select: none | text | all | element;
属性值 描述
none 设置文本不能被选择
text 默认值,设置可以选择文本。
all 当内容作为整体时可被选择,若双击或在上下文上点击子元素,被选中部分将以从该子元素向上回溯到最高祖先元素。
element 可选择文本,但选择范围受元素边界约束。

使用场景

  • user-select之前可用来保护网站内容,不能被选择以禁止复制和转载,进而保护内容的版权,但这种做法对普通用户的体验会造成伤害,而且并不能真正的保护页面内容,通过查看源代码也可以复制。
  • 当使用字体图标时,字体图标所在元素会被频繁点击时可添加user-select:none以防止图标字体作为文本被选择而影响使用。

Tailwind为user-select属性提供常用工具类

工具类 属性 描述
.select-none user-select:none; 禁止用户选中文本
.select-text user-select:text; 允许用户选择文本
.select-all user-select:all; 允许用户选择上下文
.select-auto user-select:auto; 自动取值

展示地址:https://codepen.io/junchow/pen/YzwGexO?editors=1000

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343