广告
返回顶部
首页 > 资讯 > 精选 >使用Unity怎么实现一个虚拟键盘功能
  • 625
分享到

使用Unity怎么实现一个虚拟键盘功能

2023-06-09 09:06:59 625人浏览 八月长安
摘要

使用Unity怎么实现一个虚拟键盘功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下using UnityEngine;using System

使用Unity怎么实现一个虚拟键盘功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

具体内容如下

using UnityEngine;using System.Collections.Generic; public enum ShiftState { Off, Shift, CapsLock } public class OnScreenKeyboard : MonoBehaviour {  // INSPECTOR VISIBLE PROPERTIES -------------------------------------------  // Skinning public GUIStyle boardStyle; public GUIStyle keyStyle; public Texture2D selectionImage;  // Board and button sizes public Rect screenRect = new Rect(0, 0, 0, 0); public Vector2 stdKeySize = new Vector2(32, 32); public Vector2 lgeKeySize = new Vector2(64, 32);  // Key audio public Audioclip keySelectSound = null; public AudioClip keyPressSound = null;  // Shift settings public bool shiftStateSwitchEnabled = true; public ShiftState shiftStateDefault = ShiftState.Off;  // Joystick settings public bool joystickEnabled = true; public string joyPressButton = "Fire1"; public string joyCapsButton = "Fire2";  // Our keys. By default we'll include a simplified QWERTY keyboard handy  // for name entry, but this can literally be anything you want. Either the  // two arrays must be of matching length, or lowerKeys must be of size 0. public string[] upperKeys = { "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "<<", "<row>",      "A", "S", "D", "F", "G", "H", "J", "K", "L", "Done", "<row>",      "Z", "X", "C", "V", "B", "N", "M", "Caps", "Space" };  public string[] lowerKeys = { "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "<<", "<row>",      "a", "s", "d", "f", "g", "h", "j", "k", "l", "Done", "<row>",      "z", "x", "c", "v", "b", "n", "m", "Caps", "Space" };  // The size must match the number of rows, or be 0 public float[] rowIndents = { 0.0f, 0.2f, 0.5f };  // Delays for repeated events public float initialRepeatDelay = 0.8f; public float continuedRepeatDelay = 0.2f; public float moveRepeatDelay = 0.3f;   // INTERNAL DATA MEMBERS -------------------------------------------------- private string keyPressed = ""; private int pSelectedButton;  private GUIStyle pressedStyle = null;  private float keyRepeatTimer = 0; private bool keyDownPrevFrame = false; private bool keyReleased = false; private bool lasTKEyWasshift = false;  private float moveTimer = 0;  private ShiftState shiftState;  private bool[] keySizes; private Rect[] keyRects; private int[] rowMarkers;  private int selectedButton;  private AudiOSource keySelectSource = null; private AudioSource keyPressSource = null;  // Change this if it's conflicting with your own GUI's windows private int windowId = 0;   /// <summary> /// 新增属性,控制虚拟键盘在屏幕中的位置 /// </summary> [Header("June_Add_Attribute_Control_keyBoardTF---------------------------------------")] public float _keyBoardTF_X; public float _keyBoardTF_Y;    // INITIALISATION --------------------------------------------------------- void Awake() { // Check that our key array sizes match if (upperKeys.Length != lowerKeys.Length && !(lowerKeys.Length == 0 && !shiftStateSwitchEnabled)) { print("Error: OnScreenKeyboard needs the same number of upper and lower case keys, or there must be no lower keys and caps switch must be disabled"); Destroy(this); }  // Check for row markers and count row lengths List<int> rowMarkersTemp = new List<int>(); for (int i = 0; i < upperKeys.Length; i++)  if (upperKeys[i] == "<row>") rowMarkersTemp.Add(i); rowMarkers = rowMarkersTemp.ToArray();  // Check row indents if (rowIndents.Length < rowMarkers.Length + 1) {  float[] rowIndentsTemp = new float[rowMarkers.Length + 1];  for (int i = 0; i < rowIndentsTemp.Length; i++)  {  if (i < rowIndents.Length) rowIndentsTemp[i] = rowIndents[i];  else rowIndentsTemp[i] = 0;  } }  // Check button sizes - anything that's not a single character is a "large" key keySizes = new bool[upperKeys.Length]; for (int i = 0; i < upperKeys.Length; i++) keySizes[i] = upperKeys[i].Length > 1;  // Populate the array of key rectangles keyRects = new Rect[upperKeys.Length]; int currentRow = 0; float xPos = (rowIndents.Length > 0 ? rowIndents[currentRow] : 0) + stdKeySize.x*0.33f; float yPos = stdKeySize.y*1.33f*currentRow + stdKeySize.y*0.33f; for (int i = 0; i < upperKeys.Length; i++) { // On the start of a new line, position the new key accordingly  if (IsRowMarker(i))  {  if (i != 0) currentRow++;  xPos = (rowIndents.Length > 0 ? rowIndents[currentRow] : 0) + stdKeySize.x * 0.33f;  yPos = stdKeySize.y*1.33f*currentRow + stdKeySize.y * 0.33f;  }  else  {  // Draw the key, and set keyPressed accordingly  keyRects[i] = new Rect(screenRect.x + xPos, screenRect.y + yPos, keySizes[i] ? lgeKeySize.x : stdKeySize.x, keySizes[i] ? lgeKeySize.y : stdKeySize.y);   // Move over to the next key's position on this line  xPos += keySizes[i] ? lgeKeySize.x + stdKeySize.x*0.33f : stdKeySize.x*1.33f;  } }  // Put ourselves in a default screen position if we haven't been explicitly placed yet if (screenRect.x == 0 && screenRect.y == 0 && screenRect.width == 0 && screenRect.height == 0) {  // Figure out how big we need to be  float maxWidth = 0; float maxHeight = 0; for (int i = 0; i < keyRects.Length; i++) { if (keyRects[i].xMax > maxWidth) maxWidth = keyRects[i].xMax; if (keyRects[i].yMax > maxHeight) maxHeight = keyRects[i].yMax; } maxWidth += stdKeySize.x*0.33f; maxHeight += stdKeySize.y*0.33f;   screenRect = new Rect(_keyBoardTF_X, _keyBoardTF_Y, maxWidth, maxHeight); }  // If we've Got audio, create sources so we can play it if (keySelectSound != null) { keySelectSource = gameObject.AddComponent<AudioSource>() as AudioSource; keySelectSource.spatialBlend = 0; keySelectSource.clip = keySelectSound; } if (keyPressSound != null) { keyPressSource = gameObject.AddComponent<AudioSource>() as AudioSource; keyPressSource.spatialBlend = 0; keyPressSource.clip = keyPressSound; }  // Set the initial shift state if (shiftStateSwitchEnabled) SetShiftState(shiftStateDefault);  // Create a pressed button skin for joysticks pressedStyle = new GUIStyle(); pressedStyle.nORMal.background = keyStyle.active.background; pressedStyle.border = keyStyle.border; pressedStyle.normal.textColor = keyStyle.active.textColor; pressedStyle.alignment = keyStyle.alignment; //新增字体样式------->按钮按下的时候调用 pressedStyle.font = keyStyle.font;  }   // GAME LOOP --------------------------------------------------------------  void Update()  { // Handle keys being released if (!keyDownPrevFrame)  { keyRepeatTimer = 0; if (!keyReleased) KeyReleased(); } keyDownPrevFrame = false;  // Check mouse input Vector3 guiMousePos = Input.mousePosition; guiMousePos.y = Screen.height - guiMousePos.y; for (int i = 0; i < keyRects.Length; i++) { Rect clickRect = keyRects[i]; clickRect.x += screenRect.x; clickRect.y += screenRect.y; // Check for the click ourself, because we want to do it differently to usual if (clickRect.Contains(guiMousePos))  { selectedButton = i; if (Input.GetMouseButtonDown(0)) KeyPressed();  else if (Input.GetMouseButton(0)) KeyHeld(); else if (Input.GetMouseButtonUp(0)) KeyReleased(); } }  // If the joystick is in use, update accordingly if (joystickEnabled) CheckJoystickInput(); }  private void CheckJoystickInput() {  // KEY SELECTION  float horiz = Input.GetAxis("Horizontal"); float vert = Input.GetAxis("Vertical");  moveTimer -= Time.deltaTime; if (moveTimer < 0) moveTimer = 0;  bool hadInput = false; bool moved = false; if (horiz > 0.5f) { if (moveTimer <= 0)  { SelectRight(); moved = true; } hadInput = true; } else if (horiz < -0.5f) { if (moveTimer <= 0)  { SelectLeft(); moved = true; } hadInput = true; } if (vert < -0.5f) { if (moveTimer <= 0)  { SelectDown(); moved = true; } hadInput = true; } else if (vert > 0.5f) { if (moveTimer <= 0)  { SelectUp(); moved = true; } hadInput = true;  } if (!hadInput) moveTimer = 0; if (moved)  { moveTimer += moveRepeatDelay; if (keySelectSource != null) keySelectSource.Play(); } selectedButton = Mathf.Clamp(selectedButton, 0, upperKeys.Length - 1);  // CapiTALS if (shiftStateSwitchEnabled &&  (Input.GetKeyDown(KeyCode.LeftShift) ||  Input.GetButtonDown(joyCapsButton)))  shiftState = (shiftState == ShiftState.CapsLock ? ShiftState.Off : ShiftState.CapsLock);  // TYPING if (Input.GetButtonDown(joyPressButton)) KeyPressed(); else if (Input.GetButton(joyPressButton)) KeyHeld(); }  // Called on the first frame where a new key is pressed private void KeyPressed() { keyPressed = (shiftState != ShiftState.Off) ? upperKeys[selectedButton] : lowerKeys[selectedButton]; pSelectedButton = selectedButton; keyRepeatTimer = initialRepeatDelay;  keyDownPrevFrame = true; keyReleased = false; lastKeyWasShift = false;  if (keyPressSource != null) keyPressSource.Play(); }  // Called for every frame AFTER the first while a key is being held private void KeyHeld() { // If the key being pressed has changed, revert to an initial press if (selectedButton != pSelectedButton) { KeyReleased(); KeyPressed(); return; }  // Check if we're ready to report another press yet keyRepeatTimer -= Time.deltaTime; if (keyRepeatTimer < 0) { keyPressed = (shiftState != ShiftState.Off) ? upperKeys[selectedButton] : lowerKeys[selectedButton]; keyRepeatTimer += continuedRepeatDelay;   if (keyPressSource != null) keyPressSource.Play(); }  keyDownPrevFrame = true; keyReleased = false; }  // Called the frame after a key is released private void KeyReleased() { keyDownPrevFrame = false; keyReleased = true;  if (shiftState == ShiftState.Shift && !lastKeyWasShift) SetShiftState(ShiftState.Off); }  // Selects the key to the left of the currently selected key private void SelectLeft() { selectedButton--;  // If we've hit the start of a row, wrap to the end of it instead if (IsRowMarker(selectedButton) || selectedButton < 0) {  selectedButton++;  while (!IsRowMarker(selectedButton+1) && selectedButton+1 < upperKeys.Length) selectedButton++; } }  // Selects the key to the right of the currently selected key private void SelectRight() { selectedButton++;  // If we've hit the end of a row, wrap to the start of it instead if (IsRowMarker(selectedButton) || selectedButton >= upperKeys.Length) {  selectedButton--;  while (!IsRowMarker(selectedButton-1) && selectedButton-1 >= 0) selectedButton--; } }  // Selects the key above the currently selected key private void SelectUp() { // Find the center of the currently selected button float selCenter = keyRects[selectedButton].x + keyRects[selectedButton].width/2;  // Find the start of the next button; int tgtButton = selectedButton; while (!IsRowMarker(tgtButton) && tgtButton >= 0) tgtButton--; if (IsRowMarker(tgtButton)) tgtButton--; if (tgtButton < 0) tgtButton = upperKeys.Length-1;  // Find the button with the closest center on that line float nDist = float.MaxValue; while (!IsRowMarker(tgtButton) && tgtButton >= 0) { float tgtCenter = keyRects[tgtButton].x + keyRects[tgtButton].width/2; float tDist = Mathf.Abs(tgtCenter - selCenter); if (tDist < nDist)  { nDist = tDist; } else  { selectedButton = tgtButton+1;  return; } tgtButton--; } selectedButton = tgtButton+1; }  // Selects the key below the currently selected key private void SelectDown() { // Find the center of the currently selected button float selCenter = keyRects[selectedButton].x + keyRects[selectedButton].width/2;  // Find the start of the next button; int tgtButton = selectedButton; while (!IsRowMarker(tgtButton) && tgtButton < upperKeys.Length) tgtButton++; if (IsRowMarker(tgtButton)) tgtButton++; if (tgtButton >= upperKeys.Length) tgtButton = 0;  // Find the button with the closest center on that line float nDist = float.MaxValue; while (!IsRowMarker(tgtButton) && tgtButton < upperKeys.Length) { float tgtCenter = keyRects[tgtButton].x + keyRects[tgtButton].width/2; float tDist = Mathf.Abs(tgtCenter - selCenter); if (tDist < nDist)  { nDist = tDist; } else  { selectedButton = tgtButton-1;  return; } tgtButton++; } selectedButton = tgtButton-1; }  // Returns the row number of a specified button private int ButtonRow(int buttonIndex) { for (int i = 0; i < rowMarkers.Length; i++)  if (buttonIndex < rowMarkers[i]) return i;  return rowMarkers.Length; }   // GUI FUNCTIONALITY ------------------------------------------------------  void OnGUI()  {  GUI.Window(windowId, screenRect, WindowFunc, "", boardStyle); }  private void WindowFunc(int id) { for (int i = 0; i < upperKeys.Length; i++) {  if (!IsRowMarker(i))  {  // Draw a glow behind the selected button  if (i == selectedButton)   GUI.DrawTexture(new Rect(keyRects[i].x-5, keyRects[i].y-5, keyRects[i].width+10, keyRects[i].height+10), selectionImage);  // Draw the key // Note that we don't do click detection here, we do it in update GUI.Button(keyRects[i], (shiftState != ShiftState.Off) ? upperKeys[i] : lowerKeys[i],   (joystickEnabled && selectedButton == i && Input.GetButton(joyPressButton) ? pressedStyle : keyStyle));  } } }  // Returns true if they item at a specified index is a row end marker private bool IsRowMarker(int currentKeyIndex) { for (int i = 0; i < rowMarkers.Length; i++) if (rowMarkers[i] == currentKeyIndex) return true; return false; }   // CONTROL INTERFACE ------------------------------------------------------  // Returns the latest key to be pressed, or null if no new key was pressed  // since last time you checked. This means that you can only grab a single  // keypress once, as it's cleared once you've read it. It also means that  // if you let the user press multiple keys between checks only the most  // recent one will be picked up each time. public string GetKeyPressed()  { if (keyPressed == null) keyPressed = "";  string key = keyPressed; keyPressed = ""; return key;  }  // Toggle the caps state from elsewhere public void SetShiftState(ShiftState newShiftState) { if (!shiftStateSwitchEnabled) return;  shiftState = newShiftState; if (shiftState == ShiftState.Shift) lastKeyWasShift = true; }  public ShiftState GetShiftState() { return shiftState; }}
using UnityEngine;using UnityEngine.UI;  /// <summary>/// 这是虚拟键盘插件脚本,June于2020.4.16改/// </summary>  public class OnScreenKeyboardExample : MonoBehaviour { public OnScreenKeyboard osk; /// <summary>  /// 输入文字  /// </summary> private string _inputString;  /// <summary>  /// 输入文本框  /// </summary>  public InputField _inputField;   //每次激活清空文本框内容  private void OnEnable()  {    _inputString = "";  }   void Update ()   {  // You can use input from the OSK just by asking for the most recent  // pressed key, which will be returned to you as a string, or null if  // no key has been pressed since you last checked. Note that if more  // than one key has been pressed you will only be given the most recent. string keyPressed = osk.GetKeyPressed(); if (keyPressed != "") {        // Take different action depending on what key was pressed  if (keyPressed == "Backspace" || keyPressed == "<<")  {  // Remove a character  if (_inputString.Length > 0)          _inputString = _inputString.Substring(0, _inputString.Length-1);  }  else if (keyPressed == "Space")  {        // Add a space        _inputString += " ";      }  else if (keyPressed == "Enter" || keyPressed == "Done")  {        // Change screens, or do whatever you want to         // do when your user has finished typing :-)      }  else if (keyPressed == "Caps")  {  // Toggle the capslock state yourself  osk.SetShiftState(osk.GetShiftState() == ShiftState.CapsLock ? ShiftState.Off : ShiftState.CapsLock);      }  else if (keyPressed == "Shift")  {  // Toggle shift state ourselves  osk.SetShiftState(osk.GetShiftState() == ShiftState.Shift ? ShiftState.Off : ShiftState.Shift);      }  else  {        //限制输入        if (_inputField.text.Length >= _inputField.characterLimit) return;        // Add a letter to the existing string        _inputString += keyPressed;  }      //将文字赋值给文本框中的文本属性      _inputField.text = _inputString;     } }}

看完上述内容,你们掌握使用Unity怎么实现一个虚拟键盘功能的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: 使用Unity怎么实现一个虚拟键盘功能

本文链接: https://www.lsjlt.com/news/255455.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用Unity怎么实现一个虚拟键盘功能
    使用Unity怎么实现一个虚拟键盘功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下using UnityEngine;using System...
    99+
    2023-06-09
  • Android应用中怎么实现一个软键盘隐藏功能
    这篇文章将为大家详细讲解有关Android应用中怎么实现一个软键盘隐藏功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体方法如下:...public static void hideKe...
    99+
    2023-05-31
    android roi
  • 使用vue怎么实现一个转盘抽奖功能
    本篇文章为大家展示了使用vue怎么实现一个转盘抽奖功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运...
    99+
    2023-06-07
  • Android应用中怎么实现一个隐藏与显示键盘功能
    Android应用中怎么实现一个隐藏与显示键盘功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。隐藏键盘: public static void hideSoftInp...
    99+
    2023-05-31
    android roi
  • 怎么实现一个按Home键退出应用的功能
    怎么实现一个按Home键退出应用的功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实例如下:func exitApplication() { let app = ...
    99+
    2023-05-31
    home键
  • 使用java怎么实现一个ATM功能
    使用java怎么实现一个ATM功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言...
    99+
    2023-06-14
  • 使用unity怎么实现一个贪吃蛇游戏
    使用unity怎么实现一个贪吃蛇游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下using UnityEngine;using UnityEn...
    99+
    2023-06-14
  • 使用canvas怎么实现一个拼图功能
    使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后...
    99+
    2023-06-09
  • 使用JavaScript怎么实现一个圆角功能
    使用JavaScript怎么实现一个圆角功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。找在IE下实现css3效果的圆角时找到的一个实例,没有测试,不知道使用起来怎么样,...
    99+
    2023-06-08
  • 使用ajax怎么实现一个登录功能
    本篇文章给大家分享的是有关使用ajax怎么实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ajax的优点:最大的一点是页面无刷新,用户的体验非常好。使用异步方式与...
    99+
    2023-06-08
  • 使用Django怎么实现一个分页功能
    这篇文章主要为大家详细介绍了使用Django怎么实现一个分页功能,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:创建项目创建APP,添加APP这些就不在多说我们这次重点来看到视图函数下面是路由设置视图函数继承T...
    99+
    2023-06-06
  • 使用CSS3怎么实现一个弹幕功能
    本篇文章给大家分享的是有关使用CSS3怎么实现一个弹幕功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.首先创建弹幕区域<div class="b...
    99+
    2023-06-08
  • 使用canvas怎么实现一个滤镜功能
    使用canvas怎么实现一个滤镜功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1 了解 canvas?1.1 什么是 canvas?这个 HTML 元素是为...
    99+
    2023-06-09
  • 使用Python怎么实现一个词云功能
    使用Python怎么实现一个词云功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言...
    99+
    2023-06-14
  • 使用ajax怎么实现一个实时验证功能
    本篇文章给大家分享的是有关使用ajax怎么实现一个实时验证功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是ajaxAjax 即“Asynchronous Javascr...
    99+
    2023-06-08
  • 使用Java怎么实现一个记事本功能
    今天就跟大家聊聊有关使用Java怎么实现一个记事本功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。源码: import java.awt.*; import java.awt.ev...
    99+
    2023-05-31
    java ava
  • 使用Reactor怎么实现一个Flink操作功能
    这篇文章给大家介绍使用Reactor怎么实现一个Flink操作功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现过程Flink对流式处理做的很好的封装,使用Flink的时候几乎不用关心线程池、积压、数据丢失等问题,...
    99+
    2023-06-06
  • 使用ajax怎么实现一个验证码功能
    本篇文章给大家分享的是有关使用ajax怎么实现一个验证码功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先创建一个验证码:<%@ page con...
    99+
    2023-06-08
  • 使用vue怎么实现一个倒计时功能
    这期内容当中小编将会给大家带来有关使用vue怎么实现一个倒计时功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。通过父组件传入的结束时间减去当前日期得到剩余时间子组件部分<div clas...
    99+
    2023-06-14
  • 使用bootstrap怎么实现一个轮播图功能
    使用bootstrap实现轮播图的方法:1.新建html项目,导入bootstrap;2.添加轮播图容器;3.添加计数器;4.设置播放区域;具体步骤如下:首先,新建一个html项目,并使用link标签导入bootstrap;<!DOC...
    99+
    2022-10-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作