仅当内容超过两行时显示只读/隐藏按钮

2024-05-05

我正在创建一个评论部分(类似于 youtube 的东西),并且我希望能够在 {{content}} 有多行时显示阅读更多/隐藏按钮。这就是我到目前为止所做的,我的阅读更多/隐藏按钮可以工作,因为我添加了一个计算的线夹,使内容仅在存在多行时才显示两行,我只想在存在多行的情况下显示该按钮。但如果您有任何其他建议使其发挥作用,我愿意接受。

<template>
  <div>
    <div class="d-flex flex-row align-items-center">
      <h4 class="card-title">{{ author }}</h4>

      <h6 class="card-subtitle text-muted ml-3">
        {{ timeAgo(createdAt) }} ago
      </h6>
    </div>

    <p
      class="multiline"
      :style="{'-webkit-line-clamp': computedLineclamp }"
    >
      <b
        class="timestamp"
        v-if="timestamp !== null"
      >
        @{{ timeToHHMMSS(timestamp) }}
      </b>

      {{ content }}
    </p>

    <div>
      <base-button
        v-show="!readmore"
        @click="changeLineclamp()"
        link
        class="text-white p-0"
        size="sm"
      >
        Read more
      </base-button>

      <base-button
        v-show="readmore"
        @click="hideContent()"
        link
        class="text-white p-0"
        size="sm"
      >
        Hide
      </base-button>
    </div> 
  </div>
</template>
  
<script>
// Internal modules
import { timeSince, toHHMMSS } from "@/plugins/timeControls.js";

export default {
    name: "comment-item",
    data() {
        return {
            lineclamp: 2,
            readmore: false,
            showButton: false,
            isMultiline: false,
        }
    },
    props: {
        id: {
            type: String,
            required: true,
        },
        author: {
            type: String,
            required: true,
        },
        createdAt: {
            type: Number,
            required: true,
        },
        timestamp: {
            type: Number,
            required: true,
        },
        content: {
            type: String,
            required: true,
        }
    },
    methods: {
        hideButton(){
            if (this.computedLineclamp) {
                this.readmore;
            }
        },
        changeLineclamp() {
            this.lineclamp = 'initial';
            this.readmore = true;
            this.showButton = false;
        },
        hideContent() {
            this.lineclamp = 2;
            this.readmore = false
        },
        timeAgo(date) {
            return timeSince(date);
        },
        timeToHHMMSS(time) {
            return toHHMMSS(time);
        },
    },
    computed: {
        computedLineclamp() {
            return this.lineclamp;
        },
    },
};
</script>
  
<style lang="scss" scoped>
@import "@/assets/sass/dashboard/custom/_variables.scss";
ul {
    list-style-type: none;
    padding: 0;
}

.button {
    visibility: none;
}
.timestamp {
    color: $primary;
}

.multiline {
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    &.__lineclamp{
        -webkit-line-clamp: 2;
    }
    &.__none{
        -webkit-line-clamp: initial;
    }
}

.button-visible {
    display: block;
    color: red;

    &.__none {
        display: none;
    }
}

.hide {
    line-clamp: none;
}
</style>

我尝试在内容中添加 v-bind:class="{multiline__lineclamp:showButton==='button-visible', multiline__none:showButton==='button-visible__none'}" 但它不起作用,我也尝试在脚本部分创建一个方法,但没有成功

<p
  class="multiline"
  :class="{
    multiline__lineclamp:showButton === 'button-visible',
    multiline__none:showButton === 'button-visible__none'
  }"
  :style="{ '-webkit-line-clamp': computedLineclamp }"
>
  <b
    class="timestamp"
    v-if="timestamp !== null"
  >
    @{{ timeToHHMMSS(timestamp) }}
  </b>

  {{ content }}
</p>

如你所说-“我只是想展示一下是否存在优于 2 的线夹。”
我的理解是你想展示read_more/hide仅当文本夹超过 2 时才使用按钮。

因此,要做到这一点,您可以检查这两个条件 -

scroll height == client height (Text is fully rendered)
scroll height > client height (Text is clamped)

这是工作演示,它将像这样工作-

程序是——

  1. 默认情况下,line-clamp: 2属性将应用于文本。
  2. The read_more/hide仅当段落内的文本超过两行时按钮才可见,并且您可以显示/隐藏内容。
  3. 演示中有三个按钮可将文本更改为一行、两行和三行,因此您可以在它们之间切换并查看结果。

技术部分是-

  1. 我创建了一个名为的数据属性hide_btns隐藏两个按钮(read_more/hide)如果文本限制小于 2。
  2. 然后,我创建了一个名为的方法,checkIfElClamped这将检查文本夹紧长度并切换数据属性hide_btns因此。
  3. 我还使用了观察者钩子来监视文本,当文本发生变化时,它会调用相同的方法checkIfElClamped再次对文本采取动作夹紧。
p {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
  resize: both; /* allowing resize for this demo only */
}
<html>
  <div id="app">
    <div>
      <button @click="clampToOne()">One line content</button>
      <button @click="clampToTwo()">Two line content</button>
      <button @click="clampToMore()">More than two line</button>

      <p class="multiline" :style="styleObj">
        {{ content }}
      </p>
      
      <div v-if="!hide_btns">
        <button
          v-show="!readmore"
          @click="changeLineclamp()"
          link
          class="text-white p-0"
          size="sm"
        >
          Read more
        </button>
        <button
          v-show="readmore"
          @click="hideContent()"
          link
          class="text-white p-0"
          size="sm"
        >
          Hide
        </button>
      </div>
    </div>
  </div>

  <!-- Don't forget to include Vue from CDN! -->
  <script src="https://unpkg.com/vue@2"></script>
  <script>
    new Vue({
      el: "#app", //Tells Vue to render in HTML element with id "app"
      data() {
        return {
          lineclamp: 2,
          readmore: false,
          content: null,
          hide_btns: false
        };
      },

      watch: {
        content: {
         immediate: true, // to trigger upon creation
         handler(newVal) {
          this.checkIfElClamped();
         }
        },  
      },

      methods: {
        checkIfElClamped() {
          // to reset the line clamp and read more button state
          this.hideContent();
          
          this.$nextTick(() => {
            let el = document.querySelector(".multiline");
            if(el) {
              this.hide_btns = el.scrollHeight === el.clientHeight; 
            }
          });
        },

        hideButton() {
          if (this.computedLineclamp) {
            this.readmore = true;
          }
        },

        changeLineclamp() {
          this.lineclamp = "initial";
          this.readmore = true;
          this.showButton = false;
        },

        hideContent() {
          this.lineclamp = 2;
          this.readmore = false;
        },

        clampToOne() {
          this.content =
            "Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
        },

        clampToTwo() {
          this.content =
            "Lorem Ipsum is simply dummy text of the printing and typesetting industry.Lorem Ipsum is simply dummy text of the printing and typesetting industry.";
        },

        clampToMore() {
          this.content =
            "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting";
        }
      },
      
      computed: {
        computedLineclamp() {
          return this.lineclamp;
        },

        styleObj() {
          return {
            color: "red",
            "line-clamp": this.computedLineclamp + "!important",
            "-webkit-line-clamp": this.computedLineclamp + "!important"
          };
        }
      }
    });
  </script>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅当内容超过两行时显示只读/隐藏按钮 的相关文章

  • Javascript拆分正则表达式问题

    你好 我正在尝试我认为在 Javascript 中相当简单的正则表达式 但给我带来了很多麻烦 我希望能够通过 javascript 通过 和 分割日期 var date 02 25 2010 var myregexp2 new RegExp
  • 如何使用 HTML 元素阻止 THREE.js 光线投射?

    我希望页面上的 HTML 元素阻止 THREE js 光线投射 我该如何执行此操作 我遇到的问题是 当用户单击打开的 DIV 元素时 光线投射会检索场景中的对象 它会检索 DIV 后面的对象 我不想在 DIV 打开时禁用光线投射 我纯粹希望
  • iOS Javascript DOM“冻结?”

    这里有几个问题 有没有办法阻止 iOS 在滚动时冻结页面上的 javascript 当您在另一个选项卡中或切换应用程序时 iOS 是否会冻结 JavaScript iOS 上还有其他主要的 javascript 限制吗 iOS 6 x 会暂
  • Firebase HTTP Cloud Functions - 读取数据库一次

    我有 Firebase HTTPs 功能 该函数需要根据查询参数从 Firebase 数据库读取值 并根据该数据返回结果 Firebase JS SDK 表示要使用以下命令来执行此操作 return firebase database re
  • Chrome 模拟设备的 OnePlus 3 和 OnePlus 5 视口尺寸

    我想将 OnePlus 3 和 OnePlus 5 作为自定义设备添加到 Google Chrome 的模拟设备列表中 请提供视口大小 以便我可以用它来测试我的网站 像素 2 显示尺寸示例 提前致谢 我正在寻找同样的东西 我发现了这个 ht
  • 从 iframe 关闭父弹出窗口

    在domain1 com 上 我有一个链接 可以打开domain2 com 的弹出窗口 弹出窗口中有一个 iframe 也托管在 domain2 com 上 在 iframe 中 我试图关闭弹出窗口 我似乎对如何做到这一点感到困惑 在 if
  • 为什么Google的闭包库不使用真正的私有成员?

    我成为 JavaScript 开发人员已经有一段时间了 我一直认为在 JavaScript 中实现私有成员的正确方法是使用 Doug Crockford 在这里概述的技术 http javascript crockford com priv
  • Karma + JSPM + Typescript - 未找到“.ts.js”

    主要只是想让 Karma JSPM 在加载 ts 文件时发挥良好作用 但绝对没有运气 我看到一个讨论库 https github com Larchy karma jspm typescript coverage tree master一个
  • 根据用户的时间设置问候语(早上好,下午好......)

    任何人都可以推断如何根据用户的时间设置实现基本的 晚上好 或 早上好 也许 PHP 会获取服务器时间 但我希望用基于时间的适当问候语来问候网站访问者 并考虑到他们一天中的时间 E G 早上好 晚上好 下午好 基于它 getHours 日期对
  • Javascript 函数,我如何开始理解它们?

    我完全理解 为了学习 javascript 我需要知道函数是如何工作的 我了解传递参数的基础知识 然后使用值调用函数以将某些内容添加到一起 等等 我读过无数关于函数的文章 例如以及书籍等 但我只是不明白它们是如何使用的以及何时应该使用它们等
  • 什么是{| ... |} 在 JavaScript 中是什么意思? [复制]

    这个问题在这里已经有答案了 通读 javascript 代码库 我遇到了如下代码块 export type RouteReducerProps error Error isResolving boolean isResolved boole
  • GIT 或 SVN 或...适用于前端开发人员

    我最近开始将一些项目导入到工作中的 Subversion 存储库中 在接下来的几周内 我希望团队中的每个人都能负责自己的源代码控制管理 我选择 SVN 而不是 GIT 的原因是我想要everyone团队中的人员 包括设计师 前端人员 集成商
  • Angular2,测试和解析数据:如何测试 ngOnInit?

    我正在通过Angular2 测试指南 https angular io docs ts latest guide testing html并希望编写一个测试ngOnInit 功能 那个来自编程指南的路由部分 https angular io
  • 扩展html表格突出显示行和列并使当前单元格具有不同的颜色

    我找到了用鼠标悬停时突出显示行和列的示例 https stackoverflow com a 28312853 139698 https stackoverflow com a 28312853 139698 如何使鼠标悬停的一个单元格变为
  • 如何应对 WebStorm 中大量未解决的变量警告?

    我有一个从服务器获取数据的函数 function getData data console log data someVar 网络风暴说someVar是一个未解决的变量 我怎样才能摆脱这样的警告 我看到几个选项 禁止 IDE 设置中的警告
  • Electron 应用程序中的 NEDB 持久化

    我正在尝试从电子应用程序连接到 nedb CRUD 操作效果很好 但我没有看到 db 文件 D my db 检查隐藏文件 文件存在于某个地方 因为即使在机器重新启动后它也会保留数据 我怀疑电子威胁着我的相对路径 但我可以在任何地方找到它 v
  • CSS 或 Javascript - 如果背景图像未加载,则显示后备文本[重复]

    这个问题在这里已经有答案了 如果徽标图形文件未加载或丢失 如何显示文本而不是徽标 我有带有背景 PNG 图像的 div div class iHaveBgImage this text should be displayed if bg i
  • D3.js - 更改鼠标悬停时元素的不透明度 IF 条件 = false

    我正在制作一个带有过滤器的交互式 D3 js 图表 当用户单击选定的复选框时 该过滤器会显示点 此外 在鼠标悬停事件上 所选点旁边将出现一个弹出窗口 其中包含一些信息 由于图表上的点数量相对较多 因此我选择在取消选中相应复选框时使相关点变得
  • 如何在输入时格式化 contenteditable div?

    我正在尝试编写一个函数 允许 contenteditable div 在用户输入 div 时执行一些自动格式化 到目前为止我只能让它在 IE 中运行 有人可以帮助我吗 function formatOnKeyUp if window get
  • JavaScript 开关(真)

    你好 我正在尝试处理 ajax json 响应 这是我的代码 success function j switch true case j choice1 alert choice2 break case j choice2 alert ch

随机推荐

  • 该捆绑包在 Mac OS X 上无效

    我在将应用程序上传到应用程序商店时遇到问题 每次我将应用程序上传到苹果时 它都会显示 无效的二进制文件 因此我尝试在 Xcode Organizer 中验证存档的应用程序 但收到此错误 该捆绑包无效 Apple 目前不接受使用此版本 SDK
  • 根据给定的索引集获取参数包的子集

    好吧 这确实是一件困难的事情 我希望能够通过在给定的一组有效索引处选择参数类型来获取参数包的子集 然后使用该参数包作为函数的参数列表 IE template
  • React - Material-UI - 如何在react-hook-form中使用具有多个值的Select

    我正在尝试使用 UI 材质Select里面有多个选项react hook form没有成功 在尝试使用多种选项之前我已经完成了这项工作
  • cudaSetDevice() 对 CUDA 设备的上下文堆栈有何作用?

    假设我有一个与设备关联的活动 CUDA 上下文i 我现在打电话cudaSetDevice i 会发生什么 Nothing 主上下文取代了堆栈顶部 主上下文被压入堆栈 事实上 这似乎是不一致的 我编写了这个程序 在具有单个设备的机器上运行 i
  • java中的简单超时

    谁能指导我如何在java中使用简单的超时 基本上在我的项目中我正在执行一条语句br readLine 它正在读取调制解调器的响应 但有时调制解调器没有响应 为此 我想添加一个超时 我正在寻找类似的代码 try String s br rea
  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 无法执行 script.sh:未知错误

    我想使用 DTrace 来查看 我的 shell 脚本进行了哪些系统调用 我做了一个非常简单的shell脚本 shell sh 并赋予它执行权限 bin bash grep 1 lt lt lt 123 I cd进入其目录 并运行这个简单的
  • BigInteger 没有自动装箱吗?

    在修复代码时这个问题 https stackoverflow com q 30938610 4271479 我意识到自动装箱并不适用于所有类型 此代码编译 Integer y 3 但做同样的事情BigInteger不编译 BigIntege
  • 纯 Fortran 过程中的 I/O

    我正在尝试将错误检查合并到我正在编写的纯过程中 我想要这样的东西 pure real function func1 output unit a implicit none integer a output unit if a lt 0 th
  • 如何使用UIPageViewController跳转到特定页面?

    我正在使用 Xcode 8 的默认基于页面的应用程序 并且我一直在尝试跳转到特定页面 而不是左右滑动来转动 我在 StackOverflow 上发现了类似的问题 但答案大多建议使用这种方法 setViewControllers direct
  • 如何在 SQLite 中返回多行插入的 id?

    给定一个表 CREATE TABLE Foo Id INTEGER PRIMARY KEY AUTOINCREMENT Name TEXT 如何使用以下命令返回同时插入的多行的 id INSERT INTO Foo Name VALUES
  • 使用准备好的语句设置表名称

    我正在尝试使用准备好的语句来设置表名以从中选择数据 但在执行查询时不断收到错误 错误和示例代码如下所示 Microsoft ODBC Microsoft Access Driver Parameter Pa RaM000 specified
  • 如何在C#中模拟鼠标点击?

    如何在 C winforms 应用程序中模拟鼠标点击 我结合了多个来源来生成我当前正在使用的下面的代码 我还删除了 Windows Forms 引用 以便我可以从控制台和 WPF 应用程序使用它 而无需其他引用 using System u
  • 是否有可能在每个训练步骤中获得目标函数值?

    在通常的 TensorFlow 训练循环中 例如 train op tf train AdamOptimizer minimize cross entropy with tf Session as sess for i in range n
  • Azure Webjob 与云服务

    WebJob 和云服务有什么区别 我试图对两者进行概述 根据定义 它们似乎能够实现相同的目标 也许云服务有更多功能 云服务 Web Worker Role 将为您提供完整的虚拟机 VM 由于您想将 WebJobs 与云服务进行比较 我假设您
  • CUDD C++ 接口,用于将布尔值转换为 BDD 以及生成的最小项集(到割集)

    我正在与 https github com ivmai cudd https github com ivmai cudd 目标是进行以下重复过程 1 输入 连贯 非递减 布尔函数表达式 顶部 a 1a 2a 3 x 1x 2x 3 z 1z
  • 节点需要导入语句的文件扩展名

    我一直在构建一个打字稿应用程序 其中我从文件中导入了一些常量 VS Code 的自动导入为我完成了这项工作 但是当我编译并运行该文件时 它抛出了一个错误 因为它找不到该模块 似乎错误来自于导入语句没有文件扩展名 但它只出现在编译的 java
  • SSIS ODBC SQL 参数

    我在 odbc 源数据流任务中有一个 SQL 命令需要采用参数 但不存在添加参数的选项 我尝试将数据库添加为与 ODBC 提供程序的 ADO NET 连接 但也没有可用的参数 还尝试将其作为 OLEDB 连接 但没有可用于 ODBC 的提供
  • 如何从 Visual Studio 2013 将现有解决方案添加到 GitHub

    我浏览了许多关于 VS 2013 中新的 Git 集成的网页 它们不涉及向 Github 添加现有解决方案 事实上 我找不到太多关于使用 GitHub 而不是 Visual Studio Online 的信息 谁能告诉我如何从现有解决方案开
  • 仅当内容超过两行时显示只读/隐藏按钮

    我正在创建一个评论部分 类似于 youtube 的东西 并且我希望能够在 content 有多行时显示阅读更多 隐藏按钮 这就是我到目前为止所做的 我的阅读更多 隐藏按钮可以工作 因为我添加了一个计算的线夹 使内容仅在存在多行时才显示两行