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

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(使用前将#替换为@)

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

  • Azure Functions [JavaScript / Node.js] - HTTP 调用,良好实践

    从我的 Azure 函数 在 Node js 中运行 由 EventHub 消息触发 中 我想向某个外部页面发出发布请求 就像是 module exports function context eventHubMessages var ht
  • 跨域iframe自动调整大小

    我正在使用 iframe 和 javascript 制作一个 Web 小部件 我想让我的 iframe 能够根据其内容 从其他域加载 调整大小 我做了一些搜索 包括在 Stack Overflow 上 我找到了几个主题 但我找不到关于这个问
  • WebGL iOS 渲染为浮点纹理

    我正在尝试在 iOS Safari 上的 WebGL 中渲染浮点纹理 而不是在本机应用程序中 我已经设法让 iOS 读取手动 例如从 JavaScript 创建的浮点纹理 但是当我创建浮点类型的帧缓冲区并使用 GPU 渲染到其中时 它不起作
  • jQuery - 将所有展开的文本包装在 p 标签中

    我遇到以下情况 以下代码被写入我的页面 div Some text here which is not wrapped in tags p Some more text which is fine p p Blah blah another
  • 解释 javascript 中的奇怪行为

    我在推特上看到了这个 我也无法解释 定义一个onload函数按以下两种方式工作 1 JSFiddle http jsfiddle net 6rq9k 2 JSFiddle http jsfiddle net 6rq9k 1
  • 通过搜索查找下一个文本并突出显示不起作用

    当在搜索框中搜索任何文本时 它可以找到并突出显示正确的文本 但是当搜索下一个 新文本时 它无法找到下一个 新文本 再次搜索时它不起作用 我无法找到问题 这JS below JS button search click function va
  • Javascript:如何根据 html 标签扩展用户选择?

    乐代码 http jsfiddle net frf7w 12 http jsfiddle net frf7w 12 所以现在 当前的方法将完全按照 选择的方式获取所选文本 并添加标签 以便在显示时页面不会爆炸 但我想做的是 就是说 当用户选
  • JavaScript:参数列表后缺少 )

    这个 JavaScript 产生一个错误 参数列表后缺少 在 firebug 中使用代码 我究竟做错了什么 功能d缺少左括号 answer after 不应该逃避 只需常规报价即可
  • Sequelize 4.3.2 n:m(多对多)关联:未处理的拒绝 SequelizeEagerLoadingError

    我有 3 个模型 用户 项目 UserProject module exports function sequelize DataTypes var User sequelize define User title DataTypes ST
  • Backbone.js 与 Google 地图 - 有关此问题和侦听器的问题

    我有一个为 Google Maps v3 创建的模块 我正在尝试将其转换为 Backbone js 视图构造函数 到目前为止 这是我的视图模块 我将解释代码后遇到的问题 pg views CreateMap Backbone View ex
  • 如何在WebBrowser控件中注入Javascript?

    我试过这个 string newScript textBox1 Text HtmlElement head browserCtrl Document GetElementsByTagName head 0 HtmlElement scrip
  • 以编程方式触发 highchart 散点图上某个点的单击事件

    实际上 我有一个小要求 其中有一个带有点列表和下拉列表的散点图 当我从下拉列表中选择一个项目时 应触发其相应的数据点单击 当我在图表上选择一个数据点时 必须执行一些操作 并且下拉列表应根据选择进行更新 我们有什么办法可以做到这一点吗 我尝试
  • 测量填写部分的时间 - 谷歌表单

    我正在尝试使用谷歌表单进行研究调查问卷 对于某些部分 我想自动测量用户填写所需的时间 谷歌表单中没有这样的选项 我尝试复制表单源 并用 javascript 填充时间 但它不起作用 跨源问题 未能成功托管复制的表单 如何做到 我如何衡量回答
  • apollo 客户端从存储中删除而不发生突变

    我需要通过 id 从本地存储中删除一条 记录 而不使用突变 因为服务器不支持突变 我尝试像这样手动访问商店 delete this apolloClient store getState apollo data 1112 这会删除记录 但是
  • select 元素是否具有标准值属性?

    这是一个简单的问题 但我找不到任何参考资料 所以就在这里 假设我有一个选择元素
  • backbone.js:视图中影响集合中不同模型的按钮

    我刚刚开始使用backbone js 到目前为止 我真的很喜欢它 我有这样的事情 ModelA ModelB ViewA ViewB ModelA 持有 ModelB 的集合 如何使用按钮构建模型 B 的视图 单击该按钮会更改集合中下一个
  • 需要根据用户选择有条件地渲染具有 X 行数的部分

    我有一个反应组件 其中包含一个下拉列表 其中的选项包括none 1 5 and 13 根据用户选择的数字 我需要渲染一个部分 其中包括许多行 每个行都有字段名称和下拉列表 如果用户不选择任何一个 我需要整个附加配置部分消失 新部分中的每个下
  • Skrollr 添加空白

    我已经尝试了一切 我在谷歌上阅读了 4 5 页试图找到适合我的修复程序 已经筋疲力尽了 即使我使用 skrollr 示例 我的问题仍然存在 不是说他们做错了什么 我知道我只是没有正确理解它 因此 我上传了一个演示 仅在移动设备上展示这个尴尬
  • 如何在 WebView 中添加 JavaScript 函数并稍后在提交 reCAPTCHA 时从 HTML 调用它

    我在 WebView 中添加一个 JavaScript 函数 如下所示 Kotlin val webView findViewById R id webview as WebView webView getSettings setJavaS
  • 将 javascript 变量作为参数传递给 @url.Action()

    是否可以将javascript变量作为参数传递给 url Action 因为据我所知可能存在服务器和客户端问题 我的要求是我必须根据过滤器下载文件 并进行ajax调用不适用于下载文件 所以我对 url Action 进行了编码 但无法实现这

随机推荐

  • 该捆绑包在 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 有多行时显示阅读更多 隐藏按钮 这就是我到目前为止所做的 我的阅读更多 隐藏按钮可以工作 因为我添加了一个计算的线夹 使内容仅在存在多行时才显示两行