AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76936328
Accepted
Sougata Mukherjee
Sougata Mukherjee
Asked: 2023-08-20 01:35:45 +0800 CST2023-08-20 01:35:45 +0800 CST 2023-08-20 01:35:45 +0800 CST

如何使用 CSS 创建仅背景更改的切换滑块开关

  • 772

在这里,我想创建一个切换开关滑块按钮。我已经创建了它,但是当我单击它时,“它的背景将是蓝色的,当我单击关闭时,”它的背景将是蓝色的,但这里的文本被隐藏和关闭并显示。我想要像这张照片一样:

每次我只将背景颜色切换为蓝色时,我想连续显示打开和关闭按钮,如下图所示:

因此,当我单击切换背景颜色时,会通过一些过渡从一种颜色切换到另一种颜色,下面给出如何使用代码实现此目的。

import React, { useState } from 'react';
import './styles.css'; 

const App = () => {
  const [isOn, setIsOn] = useState(false);

  const toggleSwitch = () => {
    setIsOn(!isOn);
  };

  return (<>
    <div className="toggle-container">
      <button
        className={`toggle-button ${isOn ? 'on' : 'off'}`}
        onClick={toggleSwitch}
        style={{color:isOn?'blue':'white',textAlign:isOn?'left':'right'}}
      >
        {isOn ? 'On' : 'Off'}
      </button>
    </div>
    
    </>
  );
};

export default App;

css 如下

.toggle-button {
  border:2px solid blue;
  outline: none;
  cursor: pointer;
  width: 100px;
  padding: 10px 20px;
  border-radius: 25px;
  font-weight: bold;
  font-size: 16px;
  transition: background-color 0.3s;
  position: relative;
  overflow: hidden;
}

.toggle-button:before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 50%;
  height: 100%;
  background-color: blue;
  transition: left 0.3s, background-color 0.3s;
}

.toggle-button.on:before {
  left: 50%;
  background-color: white;
}

.toggle-button.off {
  background-color: blue;
}

.toggle-button.on {
  background-color: white;
}

.toggle-button.on.off:before {
  background-color: blue;
}

.toggle-button.off.on:before {
  background-color: white;
}
html
  • 1 1 个回答
  • 41 Views

1 个回答

  • Voted
  1. Best Answer
    Cristóbal Díaz Álvarez
    2023-08-20T04:23:50+08:002023-08-20T04:23:50+08:00

    我想我明白你想做什么,但我认为这应该用不同的方法来完成,像这样的东西怎么样,底部有一个 div 指示所选的选项。

    这只是一个示例,您必须应用外部逻辑和事件。

    祝你好运!

    https://codesandbox.io/s/weathered-brook-yzkv2n?file=/src/App.js 反应代码:

    CSS:

    .btn__container {
      display: inline-flex;
      justify-content: center;
      align-items: center;
      border: 2px solid gray;
      border-radius: 3px;
      position: relative;
    }
    
    .btn__option {
      border-radius: 3px;
      padding: 8px;
      position: relative;
      z-index: 2;
      transition: all 0.3s linear;
      cursor: pointer;
    }
    
    .btn__option:hover {
      background-color: rgba(0, 0, 0, 0.2);
    }
    
    .btn__container.btn__container--left .btn__option--left {
      color: white;
    }
    
    .btn__container.btn__container--right .btn__option--right {
      color: white;
    }
    
    .btn__option--selection {
      padding: 8px;
      border-radius: 3px;
      position: absolute;
      top: 0;
      bottom: 0;
      background-color: purple;
      color: purple;
      z-index: 1;
    }
    

    JSX:

    import "./styles.css";
    import { useState, useRef } from "react";
    
    export default function App() {
      const [selected, setSelected] = useState("Text");
    
      const leftDiv = useRef(null);
    
      const rightDiv = useRef(null);
    
      const left = "Text";
    
      const right = "File";
    
      const getContainerClass = () => {
        if (selected === left) {
          return "btn__container btn__container--left";
        }
        return "btn__container btn__container--right";
      };
    
      const getSelectionStyle = () => {
        if (leftDiv && leftDiv.current && rightDiv && rightDiv.current) {
          if (selected === left) {
            return {
              left: "0",
              width: `${leftDiv.current.clientWidth}px`,
              padding: "0"
            };
          } else {
            return {
              left: `${leftDiv.current.clientWidth}px`,
              width: `${rightDiv.current.clientWidth}px`,
              padding: "0"
            };
          }
        }
        return { left: "0" };
      };
    
      return (
        <div className={getContainerClass()}>
          <div
            className="btn__option btn__option--selection"
            style={getSelectionStyle()}
          >
            {left}
          </div>
          <div
            ref={leftDiv}
            className="btn__option btn__option--left"
            onClick={() => setSelected(left)}
          >
            {left}
          </div>
          <div
            ref={rightDiv}
            className="btn__option btn__option--right"
            onClick={() => setSelected(right)}
          >
            {right}
          </div>
        </div>
      );
    }
    
    • 1

相关问题

  • 使用代码点渲染轮廓图标,而不是从 Material Design Google Fonts 中填充

  • 如何使用CSS将选项卡制作为箭头形状

  • 在 html 和 css 中绘制表格内的倾斜线

  • HTML 表格,一行中有 2 行单元格

  • 如何创建 mat-grid-list 角度材质

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve